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 };