Tiberian Technologies Scripts Reference Revision: 9000
Loading...
Searching...
No Matches
GameData.h
1/* Renegade Scripts.dll
2 Copyright 2013 Tiberian Technologies
3
4 This file is part of the Renegade scripts.dll
5 The Renegade scripts.dll is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version. See the file COPYING for more details.
9 In addition, an exemption is given to allow Run Time Dynamic Linking of this code with any closed source module that does not contain code covered by this licence.
10 Only the source code to the module(s) containing the licenced code has to be released.
11*/
12#ifndef TT_INCLUDE_GAMEDATA_H
13#define TT_INCLUDE_GAMEDATA_H
14
15#include "BaseControllerClass.h"
16#include "cPlayer.h"
17class cGameDataSkirmish;
18class cGameDataCnc;
19class cGameDataSinglePlayer;
20class cPacket;
21class WOLGameInfo;
22
23template<typename A, typename B> class TypedEventPair {
24public:
25 TypedEventPair(A itemA, B itemB) : mItemA(itemA),mItemB(itemB)
26 {
27 }
28 A GetItemA(void)
29 {
30 return mItemA;
31 }
32 B GetItemB(void)
33 {
34 return mItemB;
35 }
36protected:
37 A mItemA;
38 B mItemB;
39};
40
41template <class T> class Signaler {
42public:
43 Signaler *Forward; // 0004
44 Signaler() : Forward(0)
45 {
46 }
47 void SendSignal(T signal)
48 {
49 ReceiveSignal(signal);
50 }
51 virtual void ReceiveSignal(T &signal)
52 {
53 }
54 virtual void SignalDropped(Signaler &sig)
55 {
56 Forward = 0;
57 }
58 virtual ~Signaler()
59 {
60 if (Forward)
61 Forward->SignalDropped(*this);
62 Forward = 0;
63 }
64 void SignalMe(Signaler &sig)
65 {
66 if (Forward != &sig)
67 {
68 if (Forward)
69 Forward->SignalDropped(*this);
70 Forward = &sig;
71 sig.Forward = this;
72 }
73 }
74}; // 0008
75
76
77typedef TypedEventPair<bool, int> cGameDataEvent;
78class Render2DSentenceClass;
79class cGameData :
80 public Signaler<cGameDataEvent>
81{
82public:
83 enum WinTypeEnum
84 {
85 WIN_TYPE_SHUTDOWN = 0,
86 WIN_TYPE_ABANDON = 1,
87 WIN_TYPE_TIMEOUT = 2,
88 WIN_TYPE_BASEDESTRUCTION = 3,
89 WIN_TYPE_BEACON = 4
90 };
91 enum GameTypeEnum
92 {
93 GAME_TYPE_SINGLE_PLAYER = 0,
94 GAME_TYPE_SKIRMISH = 1,
95 GAME_TYPE_CNC = 2
96 };
97 cGameData();
98 virtual void ReceiveSignal(cGameDataEvent &signal);
99 virtual ~cGameData();
100 virtual void On_Game_Begin();
101 virtual void On_Game_End();
102 virtual void Think();
103 virtual void Render();
104 virtual void Reset_Game(bool skipPlayerReset);
105 virtual const wchar_t* Get_Game_Name() const = 0;
106 virtual GameTypeEnum Get_Game_Type() const = 0;
107 virtual int Choose_Player_Type(cPlayer *Player,int type,bool SkipAutoTeam);
108 virtual void Load_From_Server_Config();
109 virtual void Save_To_Server_Config();
110 virtual bool Is_Editable_Teaming() const;
111 virtual bool Is_Editable_Clan_Game() const;
112 virtual bool Is_Editable_Friendly_Fire() const;
113 virtual void Soldier_Added(SoldierGameObj *obj);
114 virtual void Show_Game_Settings_Limits();
115 virtual bool Is_Single_Player() const;
116 virtual bool Is_Skirmish() const;
117 virtual bool Is_Cnc() const;
118 virtual cGameDataSinglePlayer *As_Single_Player();
119 virtual cGameDataSkirmish *As_Skirmish();
120 virtual cGameDataCnc *As_Cnc();
121 virtual unsigned int Get_Min_Players() const;
122 virtual bool Is_Game_Over();
123 virtual bool Is_Limited() const;
124 virtual bool Is_Valid_Settings(WideStringClass &w,bool b);
125 virtual void Export_Tier_1_Data(cPacket &packet);
126 virtual void Import_Tier_1_Data(cPacket &packet);
127 virtual void Import_Tier_1_Data(const WOLGameInfo &packet);
128 virtual void Export_Tier_2_Data(cPacket &packet);
129 virtual void Import_Tier_2_Data(cPacket &packet);
130 virtual bool Is_Gameplay_Permitted();
131 virtual bool Remember_Inventory() const;
132 virtual void Get_Description(WideStringClass &w);
133 void Begin_Intermission();
134 void Game_Over_Processing();
135 bool Has_Config_File_Changed();
136 static cGameData *Create_Game_Of_Type(GameTypeEnum type);
137 TT_DEPRECATED("Use the TT game manager instead.") void Rotate_Map();
138 void Set_Game_Duration_S(uint32 uGameDuration);
139 void Increment_Mvp_Count();
140 void Set_Mvp_Count(uint32 uMvpCount);
141 void Set_Mvp_Name(WideStringClass oMvpName);
142 bool Set_Max_Players(int maxplayers);
143 bool Is_Map_Valid(char** _fileName) const;
144 const wchar_t* Get_Team_Word();
145 void Filter_Spawners();
146 void Swap_Team_Sides();
147 void Remix_Team_Sides();
148 void Rebalance_Team_Sides();
149 int Choose_Available_Team(int type);
150 int Choose_Smallest_Team();
151 void Set_Intermission_Time_Seconds(int time);
152 bool Set_Current_Players(int players);
153 void Set_Owner(WideStringClass &owner);
154 void Set_Min_Qualifying_Time_Minutes(int time);
155 int Get_Duration_Seconds();
156 void Add_Bottom_Text(WideStringClass &text);
157
158
159 void Reset_Time_Remaining_Seconds() { TimeRemaining_Seconds = (float)(TimeLimit_Minutes * 60); }
160 void Set_Time_Remaining_Seconds(float time) {TimeRemaining_Seconds = time;}
161 bool Is_Map_Cycle_Over() {return MapCycleOver;}
162 int Get_Winner_ID() const {return WinnerID;}
163 static void Set_Win_Text(const WideStringClass& _winText) { WinText = _winText; }
164 static bool Is_Manual_Exit() { return IsManualExit; }
165 static void Set_Manual_Exit(bool b) {IsManualExit = b;}
166 static bool Is_Manual_Restart() { return IsManualRestart; }
167 static void Set_Manual_Restart(bool b) {IsManualRestart = b;}
168 static void Onetime_Init();
169 static void Onetime_Shutdown();
170 void Set_Motd(const wchar_t *s) {Motd = s;}
171 void Set_Map_Name(const StringClass &map) {MapName = map;}
172 void Set_Mod_Name(const StringClass &mod);
173 void Set_Time_Limit_Minutes(int time);
174 void Set_Radar_Mode(RadarModeEnum mode) {RadarMode = mode;}
175 unsigned int Get_Config_File_Mod_Time();
176 void Load_From_Server_Config(const char *);
177 void Save_To_Server_Config(const char *);
178 const StringClass &Get_Map_Name() const {return MapName;}
179 const WideStringClass &Get_Mvp_Name() const {return MVPName;}
180 unsigned int Get_Mvp_Count() const {return MVPCount;}
181 unsigned int Get_Time_Limit_Minutes() const {return TimeLimit_Minutes;}
182 float Get_Time_Remaining_Seconds() {return TimeRemaining_Seconds;}
183 RadarModeEnum Get_Radar_Mode() const {return RadarMode;}
184 int Get_Current_Players() const {return CurrentPlayers;}
185 bool Is_Friendly_Fire_Permitted() const {return IsFriendlyFirePermitted;}
186 unsigned int Get_Game_Duration_S() const {return GameDuration_Seconds;}
187 StringClass &Get_Map_Cycle(int map) {return MapList[map];}
188 void Set_Map_Cycle(int map,const StringClass &name) {MapList[map] = name;}
189 const StringClass &Get_Mod_Name() const {return ModName;}
190 unsigned int Get_Map_Number() const {return MapNumber;}
191 bool Is_Dedicated() const {return IsDedicated;}
192 int Get_Max_Players() const {return MaxPlayers;}
193 bool Is_Laddered() const {return IsLaddered;}
194 bool Is_Intermission() const {return IsIntermission;}
195 bool Is_Team_Changing_Allowed() const {return IsTeamChangingAllowed;}
196 void Set_Is_Team_Changing_Allowed(bool b) {IsTeamChangingAllowed = b;}
197 void Set_Is_Laddered(bool b) {IsLaddered = b;}
198 void Set_Is_Clan_Game(bool b) {IsClanGame = b;}
199 void Set_Remix_Teams(bool b) {RemixTeams = b;}
200 void Set_Is_Friendly_Fire_Permitted(bool b) {IsFriendlyFirePermitted = b;}
201 void Set_Can_Repair_Buildings(bool b) {CanRepairBuildings = b;}
202 void Set_Spawn_Weapons(bool b) {SpawnWeapons = b;}
203 void Set_Driver_Is_Always_Gunner(bool b) {DriverIsAlwaysGunner = b;}
204 static int Get_Hosted_Game_Number() {return HostedGameNumber;}
205 static void Set_Hosted_Game_Number(int num) {HostedGameNumber = num;}
206 void Set_Password(const wchar_t *pw) {Password = pw;}
207 const wchar_t *Get_Password() const {return Password;}
208 unsigned int Get_Ip_Address() const {return IP;}
209 unsigned short Get_Port() const {return Port;}
210 void Set_Port(unsigned short port) {Port = port;}
211 void Set_Is_Intermission(bool b) {IsIntermission = b;}
212 const WideStringClass &Get_Motd() const {return Motd;}
213 float Get_Maximum_World_Distance() {return MaxWorldDistance;}
214 bool Is_Passworded() const {return IsPassworded;}
215 float Get_Intermission_Time_Remaining() {return IntermissionTimeLeft;}
216 bool Is_Clan_Game() const {return IsClanGame;}
217 void Set_Winner_ID(int id) {WinnerID = id;}
218 void Set_Win_Type(WinTypeEnum type) {WinType = type;}
219 WinTypeEnum Get_Win_Type() const {return WinType;}
220 void Set_Is_Map_Cycle_Over(bool b) {MapCycleOver = b;}
221 void Set_QuickMatch_Server(bool b) {IsQuickMatch = b;}
222 const WideStringClass &Get_Owner() const {return Owner;}
223 const WideStringClass &Get_Game_Title() const {return GameTitle;}
224 int Get_Version_Number() const {return ExeKey;}
225 bool Do_Exe_Versions_Match() {return ExeVersionsMatch;}
226 bool Do_String_Versions_Match() {return StringVersionsMatch;}
227 void Set_Is_Passworded(bool b) {IsPassworded = b;}
228 void Set_Game_Title(const wchar_t * w) {GameTitle = w;}
229 bool Is_Remix_Teams() const {return RemixTeams;}
230 bool Is_Auto_Restart() const {return IsAutoRestart;}
231 bool Is_QuickMatch_Server() const {return IsQuickMatch;}
232 bool Do_Maps_Loop() {return DoMapsLoop;}
233 void Set_Do_Maps_Loop(bool b) {DoMapsLoop = b;}
234 void Set_Is_Auto_Restart(bool b) {IsAutoRestart = b;}
235 void Set_Is_Dedicated(bool b) {IsDedicated = b;}
236 const StringClass &Get_Ini_Filename() {return INI;}
237 void Clear_Map_Cycle();
238 bool Can_Repair_Buildings() const {return CanRepairBuildings;}
239 bool Driver_Is_Always_Gunner() const {return DriverIsAlwaysGunner;}
240 bool Spawn_Weapons() const {return SpawnWeapons;}
241 void Set_Maximum_World_Distance(float distance);
242 void Set_Ip_And_Port();
243 void Set_Ini_Filename(StringClass const &ini)
244 {
245 INI = ini;
246 }
247 StringClass &Get_Settings_Description()
248 {
249 return SettingsDescription;
250 }
251 void Set_Settings_Description(StringClass w)
252 {
253 SettingsDescription = w;
254 }
255 static int Get_Mission_Number_From_Map_Name(const char *mapname)
256 {
257 int mission = 90;
258 if (_strnicmp(mapname,"M00_T",5))
259 {
260 if (strlen(mapname) == 1)
261 {
262 mission = 0;
263 }
264 else
265 {
266 mission = atoi(&(mapname[1]));
267 }
268 }
269 return mission;
270 }
271 bool Is_Valid_Player_Type(int playertype)
272 {
273 return Is_Single_Player() || playertype != -1;
274 }
275 int Get_Min_Qualifying_Time_Minutes()
276 {
277 return MinQualifyingTime_Minutes;
278 }
279 bool Does_Map_Exist()
280 {
281 return !ModName.Is_Empty() || !MapName.Is_Empty();
282 }
283 StringClass getMapBaseName()
284 {
285 if (MapName[MapName.Get_Length() - 4] != '.')
286 return MapName;
287 else
288 {
289 StringClass baseName = MapName;
290 baseName.TruncateRight(4);
291 return baseName;
292 }
293 }
294 void Set_Ip_Address(unsigned long ip)
295 {
296 IP = ip;
297 }
298 void Get_Time_Limit_Text(WideStringClass &str);
299 void Get_Dedicated_Server_Label(WideStringClass &str,uint &color);
300 void Get_Gameplay_Not_Permitted_Label(WideStringClass &str,uint &color);
301 int Get_Intermission_Time_Seconds() const {return IntermissionTime_Seconds;}
302 bool Is_Time_Limit() const {return TimeLimit_Minutes > 0;}
303 void Set_Version_Number(int num) {ExeKey = num;}
304 void Set_Intermission_Time_Remaining(float time) {IntermissionTimeLeft = time;}
305 unsigned long Get_Frame_Count() const {return FrameCount;}
306 void Increment_Hosted_Game_Number() {HostedGameNumber++;}
307 cGameData& operator=(const cGameData& rhs);
308protected:
309 static REF_DECL(bool, IsManualExit);
310 static REF_DECL(int, HostedGameNumber);
311 static REF_DECL(WideStringClass, WinText);
312 static REF_DECL(Render2DSentenceClass *, PTextRenderer);
313 bool IsIntermission; // 0008
314 bool IsDedicated; // 0009
315 bool IsAutoRestart; // 000A
316 bool IsFriendlyFirePermitted; // 000B
317 bool IsTeamChangingAllowed; // 000C
318 bool IsPassworded; // 000D
319 bool GrantWeapons; // 000E
320 bool IsLaddered; // 000F
321 bool IsClanGame; // 0010
322 bool UseLagReduction; // 0011
323 bool RemixTeams; // 0012
324 bool CanRepairBuildings; // 0013
325 bool DriverIsAlwaysGunner; // 0014
326 bool SpawnWeapons; // 0015
327 bool DoMapsLoop; // 0016
328 bool MapCycleOver; // 0017
329 unsigned int MapNumber; // 0018
330 WideStringClass GameTitle; // 001C
331 WideStringClass Motd; // 0020
332 WideStringClass Password; // 0024
333 StringClass MapName; // 0028
334 StringClass ModName; // 002C
335 StringClass MapList[100]; // 0030
336 WideStringClass Owner; // 01C0
337 DynamicVectorClass<WideStringClass> BottomText; // 01C4
338 DynamicVectorClass<WideStringClass> SettingsLimits; // 01DC
339 StringClass SettingsDescription; // 01F4; this is a WideStringClass on LFDS
340 int MaxPlayers; // 01F8
341 unsigned int TimeLimit_Minutes; // 01FC
342 int IntermissionTime_Seconds; // 0200
343 int ExeKey; // 0204
344 bool ExeVersionsMatch; // 0208
345 bool StringVersionsMatch; // 0209
346 unsigned int IP; // 020C
347 unsigned short Port; // 0210
348 StringClass INI; // 0214
349 RadarModeEnum RadarMode; // 0218
350 unsigned int CFGModTime; // 021C
351 int CurrentPlayers; // 0220
352 float IntermissionTimeLeft; // 0224
353 float TimeRemaining_Seconds; // 0228
354 float MaxWorldDistance; // 022C
355 int MinQualifyingTime_Minutes; // 0230
356 int WinnerID; // 0234
357 WinTypeEnum WinType; // 0238
358 SYSTEMTIME GameStartTime2; // 023C 023C
359 unsigned int GameStartTime; // 024C 0254
360 unsigned long FrameCount; // 0250 0258
361 WideStringClass MVPName; // 0254 025C
362 unsigned int MVPCount; // 0258 0260
363 unsigned int GameDuration_Seconds; // 025C 0264
364 bool IsQuickMatch; // 0260 0268
365 unsigned long Clans[2]; // 0264 026C
366 static REF_DECL(bool, IsManualRestart);
367}; // 026C 0274
368
369class cGameDataCnc : public cGameData {
370protected:
371 bool BaseDestructionEndsGame;
372 bool BeaconPlacementEndsGame;
373 int StartingCredits;
374 BaseControllerClass GDI;
375 BaseControllerClass Nod;
376 bool BasesInitalized;
377public:
378 cGameDataCnc();
379 ~cGameDataCnc();
380 void On_Game_Begin();
381 void On_Game_End();
382 void Think();
383 void Reset_Game(bool skipPlayerReset);
384 const wchar_t* Get_Game_Name() const;
385 static const wchar_t *Get_Static_Game_Name();
386 void Show_My_Money();
387 GameTypeEnum Get_Game_Type() const;
388 void Load_From_Server_Config();
389 void Save_To_Server_Config();
390 bool Is_Editable_Teaming() const;
391 bool Is_Editable_Clan_Game() const;
392 bool Is_Editable_Friendly_Fire() const;
393 void Soldier_Added(SoldierGameObj *obj);
394 void Show_Game_Settings_Limits();
395 bool Is_Cnc() const;
396 cGameDataCnc *As_Cnc();
397 bool Is_Game_Over();
398 bool Is_Limited() const;
399 bool Is_Valid_Settings(WideStringClass &w,bool b);
400 void Export_Tier_2_Data(cPacket &packet);
401 void Import_Tier_2_Data(cPacket &packet);
402 bool Is_Gameplay_Permitted();
403 void Get_Description(WideStringClass &w);
404 void Base_Destruction_Score_Tweaking();
405 void Set_Starting_Credits(int i) {StartingCredits = i;}
406 int Get_Starting_Credits() const {return StartingCredits;}
407 bool Base_Destruction_Ends_Game() {return BaseDestructionEndsGame;}
408 bool Beacon_Placement_Ends_Game() {return BeaconPlacementEndsGame;}
409 void Set_Base_Destruction_Ends_Game(bool b) {BaseDestructionEndsGame = b;}
410 void Set_Beacon_Placement_Ends_Game(bool b) {BeaconPlacementEndsGame = b;}
411 cGameDataCnc& operator=(const cGameDataCnc& rhs);
412};
413
414class cGameDataSkirmish : public cGameData {
415protected:
416 bool BaseDestructionEndsGame;
417 bool BeaconPlacementEndsGame;
418 unsigned int StartingCredits;
419 BaseControllerClass GDI;
420 BaseControllerClass Nod;
421 bool BasesInitalized;
422public:
423 cGameDataSkirmish();
424 ~cGameDataSkirmish();
425 void On_Game_Begin();
426 void On_Game_End();
427 void Think();
428 void Reset_Game(bool skipPlayerReset);
429 static const wchar_t *Get_Static_Game_Name();
430 const wchar_t* Get_Game_Name() const;
431 GameTypeEnum Get_Game_Type() const;
432 void Load_From_Server_Config();
433 void Save_To_Server_Config();
434 bool Is_Editable_Teaming() const;
435 bool Is_Editable_Clan_Game() const;
436 bool Is_Editable_Friendly_Fire() const;
437 void Soldier_Added(SoldierGameObj *obj);
438 void Show_Game_Settings_Limits();
439 bool Is_Skirmish() const;
440 cGameDataSkirmish *As_Skirmish();
441 bool Is_Game_Over();
442 bool Is_Limited() const;
443 void Get_Description(WideStringClass &w);
444 void Base_Destruction_Score_Tweaking();
445 void Show_My_Money();
446 void Filter_Soldiers();
447 void Set_Starting_Credits(int i) {StartingCredits = i;}
448 int Get_Starting_Credits() const {return StartingCredits;}
449 bool Base_Destruction_Ends_Game() {return BaseDestructionEndsGame;}
450 bool Beacon_Placement_Ends_Game() {return BeaconPlacementEndsGame;}
451 void Set_Base_Destruction_Ends_Game(bool b) {BaseDestructionEndsGame = b;}
452 void Set_Beacon_Placement_Ends_Game(bool b) {BeaconPlacementEndsGame = b;}
453 cGameDataSkirmish& operator=(const cGameDataSkirmish& rhs);
454};
455
456class cGameDataSinglePlayer : public cGameData {
457public:
458 cGameDataSinglePlayer();
459 ~cGameDataSinglePlayer();
460 static const wchar_t *Get_Static_Game_Name();
461 const wchar_t* Get_Game_Name() const;
462 GameTypeEnum Get_Game_Type() const;
463 int Choose_Player_Type(cPlayer *Player,int type,bool SkipAutoTeam);
464 bool Is_Single_Player() const;
465 cGameDataSinglePlayer *As_Single_Player();
466 bool Is_Limited() const;
467 bool Remember_Inventory() const;
468 cGameDataSinglePlayer& operator=(const cGameDataSinglePlayer& rhs);
469};
470
471#endif