1 /*------------------------------------------------------------------------------- 2 3 BARONY 4 File: steam.hpp 5 Desc: various definitions and prototypes for steam.cpp 6 7 Copyright 2013-2016 (c) Turning Wheel LLC, all rights reserved. 8 See LICENSE for details. 9 10 -------------------------------------------------------------------------------*/ 11 12 #pragma once 13 14 #include "game.hpp" 15 16 //TODO: Bugger all void pointers and helper funcs on these. 17 void steam_OnP2PSessionRequest(void* p_Callback); //TODO: Finalize porting. 18 //void steam_OnGameOverlayActivated(void *callback); 19 void steam_OnLobbyMatchListCallback(void* pCallback, bool bIOFailure); 20 void steam_OnLobbyDataUpdatedCallback(void* pCallback); 21 void steam_OnLobbyCreated(void* pCallback, bool bIOFailure); 22 void processLobbyInvite(); 23 void steam_OnGameJoinRequested(void* pCallback); 24 void steam_ConnectToLobby(); 25 void steam_OnLobbyEntered(void* pCallback, bool bIOFailure); 26 void steam_GameServerPingOnServerResponded(void* steamID); 27 void steam_OnP2PSessionConnectFail(void* pCallback); 28 void steam_OnRequestEncryptedAppTicket(void* pCallback, bool bIOFailure); 29 30 #define MAX_STEAM_LOBBIES 100 31 32 extern Uint32 numSteamLobbies; 33 extern int selectedSteamLobby; 34 extern char lobbyText[MAX_STEAM_LOBBIES][64]; 35 extern void* lobbyIDs[MAX_STEAM_LOBBIES]; 36 extern int lobbyPlayers[MAX_STEAM_LOBBIES]; 37 38 extern void* steamIDRemote[MAXPLAYERS]; //TODO: Bugger void pointer. 39 40 extern bool requestingLobbies; 41 42 extern bool serverLoadingSaveGame; // determines whether lobbyToConnectTo is loading a savegame or not 43 extern void* currentLobby; // CSteamID to the current game lobby 44 extern void* lobbyToConnectTo; // CSteamID of the game lobby that user has been invited to 45 extern char pchCmdLine[1024]; // for game join requests 46 #ifdef STEAMWORKS 47 extern char currentLobbyName[32]; 48 extern ELobbyType currentLobbyType; 49 extern bool connectingToLobby, connectingToLobbyWindow; 50 extern bool stillConnectingToLobby; 51 extern bool joinLobbyWaitingForHostResponse; 52 extern bool denyLobbyJoinEvent; 53 extern int connectingToLobbyStatus; 54 #endif 55 56 57 58 //These are all an utter bodge. 59 //They should not exist, but potato. 60 //TODO: Remove all of these wrappers and access the steam stuff directly. 61 SteamAPICall_t cpp_SteamMatchmaking_RequestLobbyList(); 62 SteamAPICall_t cpp_SteamMatchmaking_JoinLobby(CSteamID steamIDLobby); 63 SteamAPICall_t cpp_SteamMatchmaking_CreateLobby(ELobbyType eLobbyType, int cMaxMembers); 64 SteamAPICall_t cpp_SteamMatchmaking_RequestAppTicket(); 65 66 void cpp_SteamServerWrapper_Instantiate(); 67 68 void cpp_SteamServerWrapper_Destroy(); 69 70 void cpp_SteamServerClientWrapper_Instantiate(); 71 72 void cpp_SteamServerClientWrapper_Destroy(); 73 74 //This function is an utter bodge. 75 void cpp_Free_CSteamID(void* steamID); 76 77 //TODO: Ugh. Bugger these, replace with directly accessing the relevant stuff. 78 extern void (*cpp_SteamServerWrapper_OnSteamServersConnected)(void* pLogonSuccess); 79 extern void (*cpp_SteamServerWrapper_OnSteamServersConnectFailure)(void* pConnectFailure); 80 extern void (*cpp_SteamServerWrapper_OnSteamServersDisconnected)(void* pLoggedOff); 81 extern void (*cpp_SteamServerWrapper_OnPolicyResponse)(void* pPolicyResponse); 82 extern void (*cpp_SteamServerWrapper_OnValidateAuthTicketResponse)(void* pResponse); 83 extern void (*cpp_SteamServerWrapper_OnP2PSessionRequest)(void* p_Callback); 84 extern void (*cpp_SteamServerWrapper_OnP2PSessionConnectFail)(void* pCallback); 85 86 extern void (*cpp_SteamServerClientWrapper_OnLobbyDataUpdate)(void* pCallback); 87 extern void (*cpp_SteamServerClientWrapper_OnLobbyGameCreated)(void* pCallback); 88 extern void (*cpp_SteamServerClientWrapper_OnGameJoinRequested)(void* pCallback); 89 extern void (*cpp_SteamServerClientWrapper_OnAvatarImageLoaded)(void* pCallback); 90 extern void (*cpp_SteamServerClientWrapper_OnSteamServersConnected)(void* callback); 91 extern void (*cpp_SteamServerClientWrapper_OnSteamServersDisconnected)(void* callback); 92 extern void (*cpp_SteamServerClientWrapper_OnSteamServerConnectFailure)(void* callback); 93 //extern void (*cpp_SteamServerClientWrapper_OnGameOverlayActivated)(void *callback); 94 extern void (*cpp_SteamServerClientWrapper_OnGameWebCallback)(void* callback); 95 extern void (*cpp_SteamServerClientWrapper_OnWorkshopItemInstalled)(void* pParam); 96 extern void (*cpp_SteamServerClientWrapper_OnP2PSessionConnectFail)(void* pCallback); 97 extern void (*cpp_SteamServerClientWrapper_OnP2PSessionRequest)(void* pCallback); 98 extern void (*cpp_SteamServerClientWrapper_OnIPCFailure)(void* failure); 99 extern void (*cpp_SteamServerClientWrapper_OnSteamShutdown)(void* callback); 100 extern void (*cpp_SteamServerClientWrapper_OnLobbyCreated)(void* pCallback, bool bIOFailure); //Where pCallback is a pointer to type LobbyCreated_t. 101 extern void (*cpp_SteamServerClientWrapper_OnLobbyEntered)(void* pCallback, bool bIOFailure); //Where pCallback is a pointer to type LobbyEnter_t. 102 extern void (*cpp_SteamServerClientWrapper_OnLobbyMatchListCallback)(void* pCallback, bool bIOFailure); //Where pCallback is a pointer to type LobbyMatchList_t. 103 extern void (*cpp_SteamServerClientWrapper_OnRequestEncryptedAppTicket)(void* pEncryptedAppTicketResponse, bool bIOFailure); //Where pEncryptedAppTicketResponse is of type 104 extern void (*cpp_SteamServerClientWrapper_GameServerPingOnServerResponded)(void* steamID); 105 106 class CSteamLeaderboards 107 { 108 private: 109 SteamLeaderboard_t m_CurrentLeaderboard; // Handle to leaderboard 110 public: 111 int m_nLeaderboardEntries; // How many entries do we have? 112 static const int k_numEntriesToRetrieve = 50; 113 LeaderboardEntry_t m_leaderboardEntries[k_numEntriesToRetrieve]; // The entries 114 std::string leaderBoardSteamUsernames[k_numEntriesToRetrieve]; 115 int currentLeaderBoardIndex; 116 static const int k_numLeaderboardTags = 64; 117 int downloadedTags[k_numEntriesToRetrieve][k_numLeaderboardTags]; 118 119 bool b_ScoresDownloaded; 120 bool b_LeaderboardInit; 121 bool b_ScoreUploaded; 122 bool b_ShowDLCScores; 123 124 static const int k_numLeaderboards = 33; 125 static const std::string leaderboardNames[k_numLeaderboards]; 126 CSteamLeaderboards()127 CSteamLeaderboards() : 128 m_CurrentLeaderboard(0), 129 m_nLeaderboardEntries(0), 130 b_ScoresDownloaded(false), 131 b_LeaderboardInit(false), 132 currentLeaderBoardIndex(0), 133 b_ScoreUploaded(false), 134 b_ShowDLCScores(false) 135 { 136 for ( int i = 0; i < k_numEntriesToRetrieve; ++i ) 137 { 138 for ( int j = 0; j < k_numLeaderboardTags; ++j ) 139 { 140 downloadedTags[i][j] = 0; 141 } 142 leaderBoardSteamUsernames[i] = ""; 143 } 144 } ~CSteamLeaderboards()145 ~CSteamLeaderboards() {}; 146 147 class LastUploadResult_t { 148 public: 149 bool b_ScoreUploadComplete; 150 int scoreUploaded; 151 bool b_ScoreChanged; 152 int globalRankNew; 153 int globalRankPrev; 154 LastUploadResult_t()155 LastUploadResult_t() : 156 b_ScoreUploadComplete(false), 157 scoreUploaded(0), 158 b_ScoreChanged(false), 159 globalRankNew(0), 160 globalRankPrev(0) 161 {} 162 } LastUploadResult; 163 164 class LeaderboardUpload_t { 165 public: 166 int status; 167 int score; 168 int time; 169 int tags[k_numLeaderboardTags]; 170 int boardIndex; 171 bool uploadInit; 172 LeaderboardUpload_t()173 LeaderboardUpload_t() : 174 status(0), 175 score(0), 176 time(0), 177 boardIndex(0), 178 uploadInit(false) 179 { 180 for ( int i = 0; i < k_numLeaderboardTags; ++i ) 181 { 182 tags[i] = 0; 183 } 184 } 185 } LeaderboardUpload; 186 187 class LeaderboardView_t { 188 public: 189 int boardToDownload; 190 ELeaderboardDataRequest requestType; 191 int rangeStart; 192 int rangeEnd; 193 int scrollIndex; 194 LeaderboardView_t()195 LeaderboardView_t() : 196 boardToDownload(LEADERBOARD_NORMAL_TIME), 197 requestType(k_ELeaderboardDataRequestGlobal), 198 rangeStart(0), 199 rangeEnd(k_numEntriesToRetrieve), 200 scrollIndex(0) 201 {} 202 } LeaderboardView; 203 204 void FindLeaderboard(const char *pchLeaderboardName); 205 //bool UploadScore(int score); 206 bool DownloadScores(ELeaderboardDataRequest dataRequestType, int rangeStart, int rangeEnd); 207 void UploadScore(int scoreToSet, int tags[k_numLeaderboardTags]); 208 void ClearUploadData(); 209 void ProcessLeaderboardUpload(); 210 211 void OnFindLeaderboard(LeaderboardFindResult_t *pResult, bool bIOFailure); 212 CCallResult<CSteamLeaderboards, LeaderboardFindResult_t> m_callResultFindLeaderboard; 213 void OnUploadScore(LeaderboardScoreUploaded_t *pResult, bool bIOFailure); 214 CCallResult<CSteamLeaderboards, LeaderboardScoreUploaded_t> m_callResultUploadScore; 215 void OnDownloadScore(LeaderboardScoresDownloaded_t *pResult, bool bIOFailure); 216 CCallResult<CSteamLeaderboards, LeaderboardScoresDownloaded_t> m_callResultDownloadScore; 217 }; 218 219 enum LeaderboardUploadState : int 220 { 221 LEADERBOARD_STATE_NONE, 222 LEADERBOARD_STATE_FIND_LEADERBOARD_TIME, 223 LEADERBOARD_STATE_READY_TIME, 224 LEADERBOARD_STATE_UPLOADING_TIME, 225 LEADERBOARD_STATE_UPLOADING_SCORE 226 }; 227 228 class CSteamWorkshop 229 { 230 private: 231 public: 232 SteamUGCDetails_t m_subscribedItemListDetails[50]; // The entries 233 SteamUGCDetails_t m_myWorkshopItemToModify; 234 int numSubcribedItemResults = 50; 235 int subscribedCallStatus; 236 237 CSteamWorkshop(); ~CSteamWorkshop()238 ~CSteamWorkshop() {}; 239 240 CreateItemResult_t createItemResult; 241 UGCUpdateHandle_t UGCUpdateHandle; 242 SubmitItemUpdateResult_t SubmitItemUpdateResult; 243 UGCQueryHandle_t UGCQueryHandle; 244 SteamUGCQueryCompleted_t SteamUGCQueryCompleted; 245 RemoteStorageUnsubscribePublishedFileResult_t UnsubscribePublishedFileResult; 246 class LastActionResult_t { 247 public: 248 EResult lastResult; 249 Uint32 creationTick; 250 std::string actionMsg; 251 LastActionResult_t()252 LastActionResult_t() : 253 lastResult(static_cast<EResult>(0)), 254 creationTick(0), 255 actionMsg("") 256 {} 257 } LastActionResult; 258 std::list<std::string> workshopItemTags; 259 Uint32 uploadSuccessTicks; 260 261 void StoreResultMessage(std::string message, EResult result); 262 void CreateItem(); 263 void StartItemUpdate(); 264 void SubmitItemUpdate(char* changeNote); 265 void StartItemExistingUpdate(PublishedFileId_t fileId); 266 void CreateQuerySubscribedItems(EUserUGCList itemListType, EUGCMatchingUGCType searchType, EUserUGCListSortOrder sortOrder); 267 void ReadSubscribedItems(); 268 void UnsubscribeItemFileID(PublishedFileId_t fileId); 269 270 CCallResult<CSteamWorkshop, CreateItemResult_t> m_callResultCreateItem; 271 CCallResult<CSteamWorkshop, SubmitItemUpdateResult_t> m_callResultSubmitItemUpdateResult; 272 CCallResult<CSteamWorkshop, SteamUGCQueryCompleted_t> m_callResultSendQueryUGCRequest; 273 CCallResult<CSteamWorkshop, RemoteStorageUnsubscribePublishedFileResult_t> m_callResultUnsubscribeItemRequest; 274 void OnCreateItem(CreateItemResult_t *pResult, bool bIOFailure); 275 void OnSubmitItemUpdate(SubmitItemUpdateResult_t *pResult, bool bIOFailure); 276 void OnSendQueryUGCRequest(SteamUGCQueryCompleted_t *pResult, bool bIOFailure); 277 void OnUnsubscribeItemRequest(RemoteStorageUnsubscribePublishedFileResult_t *pResult, bool bIOFailure); 278 //void OnStartItemUpdate(UGCUpdateHandle_t pResult, bool bIOFailure); 279 }; 280 281 class CSteamStatistics 282 { 283 private: 284 SteamStat_t *m_pStats; // Stats data 285 SteamGlobalStat_t *m_pGlobalStats; // Stats data 286 int m_iNumStats; // The number of Stats 287 int m_iNumGlobalStats; // The number of Global Stats 288 public: 289 290 bool m_bInitialized; // Have we called Request stats and received the callback? 291 CSteamStatistics(SteamStat_t* gStats, SteamGlobalStat_t* gGlobalStats, int numStatistics); ~CSteamStatistics()292 ~CSteamStatistics() {}; 293 294 bool RequestStats(); 295 bool StoreStats(); 296 bool ClearAllStats(); 297 298 STEAM_CALLBACK(CSteamStatistics, OnUserStatsReceived, UserStatsReceived_t, m_CallbackUserStatsReceived); 299 STEAM_CALLBACK(CSteamStatistics, OnUserStatsStored, UserStatsStored_t, m_CallbackUserStatsStored); 300 //STEAM_CALLBACK(CSteamStatistics, OnGlobalStatsReceived, GlobalStatsReceived_t, m_CallbackGlobalStatsReceived); 301 //NOTE FOR FUTURE GLOBAL STATS NEEDS CCallResult NOT STEAM_CALLBACK! 302 }; 303 304 enum LeaderboardScoreTags : int 305 { 306 TAG_MONSTER_KILLS_1, // store 4 monster kills per index. 307 TAG_MONSTER_KILLS_2, 308 TAG_MONSTER_KILLS_3, 309 TAG_MONSTER_KILLS_4, 310 TAG_MONSTER_KILLS_5, 311 TAG_MONSTER_KILLS_6, 312 TAG_MONSTER_KILLS_7, 313 TAG_MONSTER_KILLS_8, 314 TAG_MONSTER_KILLS_9, 315 TAG_MONSTER_KILLS_10, 316 TAG_NAME1, // 4 chars per index 317 TAG_NAME2, 318 TAG_NAME3, 319 TAG_NAME4, 320 TAG_NAME5, 321 TAG_NAME6, 322 TAG_NAME7, 323 TAG_NAME8, 324 TAG_RACESEXAPPEARANCECLASS, // each offset by 8 bits 325 TAG_VICTORYDUNGEONLEVELCONDUCTORIGINAL, // offset by 8 bits, 8 bits, 16 bits (4 original conducts fit into the 16 wide field) 326 TAG_CONDUCT_2W_1, // each offset by 2 bits 327 TAG_CONDUCT_2W_2, // each offset by 2 bits 328 TAG_CONDUCT_4W_1, // each offset by 4 bits 329 TAG_CONDUCT_4W_2, // each offset by 4 bits 330 TAG_CONDUCT_4W_3, // each offset by 4 bits 331 TAG_CONDUCT_4W_4, // each offset by 4 bits 332 TAG_GAMEPLAY_STATS_16W_1, // each offset by 16 bits 333 TAG_GAMEPLAY_STATS_16W_2, // each offset by 16 bits 334 TAG_GAMEPLAY_STATS_16W_3, // each offset by 16 bits 335 TAG_GAMEPLAY_STATS_16W_4, // each offset by 16 bits 336 TAG_GAMEPLAY_STATS_8W_1, // each offset by 8 bits 337 TAG_GAMEPLAY_STATS_8W_2, // each offset by 8 bits 338 TAG_GAMEPLAY_STATS_4W_1, // each offset by 4 bits 339 TAG_GAMEPLAY_STATS_4W_2, // each offset by 4 bits 340 TAG_GAMEPLAY_STATS_2W_1, // each offset by 2 bits 341 TAG_GAMEPLAY_STATS_2W_2, // each offset by 2 bits 342 TAG_HEALTH, // offset by 16 bits 343 TAG_MANA, // offset by 16 bits 344 TAG_STRDEXCONINT, // offset by 8 bits 345 TAG_PERCHREXPLVL, // offset by 8 bits 346 TAG_GOLD, 347 TAG_PROFICIENCY1, // each offset by 8 bits 348 TAG_PROFICIENCY2, // each offset by 8 bits 349 TAG_PROFICIENCY3, // each offset by 8 bits 350 TAG_PROFICIENCY4, // each offset by 8 bits 351 TAG_PROFICIENCY5, // each offset by 8 bits 352 TAG_EQUIPMENT1, // each offset by 8 bits 353 TAG_EQUIPMENT2, // each offset by 8 bits 354 TAG_EQUIPMENT3, // each offset by 8 bits 355 TAG_EQUIPMENT_BEATITUDE1, // each offset by 8 bits 356 TAG_EQUIPMENT_BEATITUDE2, // each offset by 8 bits 357 TAG_EQUIPMENT_BEATITUDE3, // each offset by 8 bits 358 TAG_EQUIPMENT_APPEARANCE, // helm, cloak, breastplate, shield offset 4 bits each 359 TAG_TOTAL_SCORE, 360 TAG_COMPLETION_TIME 361 };