12#ifndef TT_INCLUDE_GAMEDATA_H
13#define TT_INCLUDE_GAMEDATA_H
15#include "BaseControllerClass.h"
17class cGameDataSkirmish;
19class cGameDataSinglePlayer;
23template<
typename A,
typename B>
class TypedEventPair {
25 TypedEventPair(A itemA, B itemB) : mItemA(itemA),mItemB(itemB)
41template <
class T>
class Signaler {
44 Signaler() : Forward(0)
47 void SendSignal(T signal)
49 ReceiveSignal(signal);
51 virtual void ReceiveSignal(T &signal)
54 virtual void SignalDropped(Signaler &sig)
61 Forward->SignalDropped(*
this);
64 void SignalMe(Signaler &sig)
69 Forward->SignalDropped(*
this);
77typedef TypedEventPair<bool, int> cGameDataEvent;
78class Render2DSentenceClass;
80 public Signaler<cGameDataEvent>
85 WIN_TYPE_SHUTDOWN = 0,
88 WIN_TYPE_BASEDESTRUCTION = 3,
93 GAME_TYPE_SINGLE_PLAYER = 0,
94 GAME_TYPE_SKIRMISH = 1,
98 virtual void ReceiveSignal(cGameDataEvent &signal);
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);
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)
247 StringClass &Get_Settings_Description()
249 return SettingsDescription;
251 void Set_Settings_Description(StringClass w)
253 SettingsDescription = w;
255 static int Get_Mission_Number_From_Map_Name(
const char *mapname)
258 if (_strnicmp(mapname,
"M00_T",5))
260 if (strlen(mapname) == 1)
266 mission = atoi(&(mapname[1]));
271 bool Is_Valid_Player_Type(
int playertype)
273 return Is_Single_Player() || playertype != -1;
275 int Get_Min_Qualifying_Time_Minutes()
277 return MinQualifyingTime_Minutes;
279 bool Does_Map_Exist()
281 return !ModName.Is_Empty() || !MapName.Is_Empty();
283 StringClass getMapBaseName()
285 if (MapName[MapName.Get_Length() - 4] !=
'.')
289 StringClass baseName = MapName;
290 baseName.TruncateRight(4);
294 void Set_Ip_Address(
unsigned long ip)
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);
309 static REF_DECL(
bool, IsManualExit);
310 static REF_DECL(
int, HostedGameNumber);
311 static REF_DECL(WideStringClass, WinText);
312 static REF_DECL(Render2DSentenceClass *, PTextRenderer);
316 bool IsFriendlyFirePermitted;
317 bool IsTeamChangingAllowed;
322 bool UseLagReduction;
324 bool CanRepairBuildings;
325 bool DriverIsAlwaysGunner;
329 unsigned int MapNumber;
330 WideStringClass GameTitle;
331 WideStringClass Motd;
332 WideStringClass Password;
335 StringClass MapList[100];
336 WideStringClass Owner;
337 DynamicVectorClass<WideStringClass> BottomText;
338 DynamicVectorClass<WideStringClass> SettingsLimits;
339 StringClass SettingsDescription;
341 unsigned int TimeLimit_Minutes;
342 int IntermissionTime_Seconds;
344 bool ExeVersionsMatch;
345 bool StringVersionsMatch;
349 RadarModeEnum RadarMode;
350 unsigned int CFGModTime;
352 float IntermissionTimeLeft;
353 float TimeRemaining_Seconds;
354 float MaxWorldDistance;
355 int MinQualifyingTime_Minutes;
358 SYSTEMTIME GameStartTime2;
359 unsigned int GameStartTime;
360 unsigned long FrameCount;
361 WideStringClass MVPName;
362 unsigned int MVPCount;
363 unsigned int GameDuration_Seconds;
365 unsigned long Clans[2];
366 static REF_DECL(
bool, IsManualRestart);
369class cGameDataCnc :
public cGameData {
371 bool BaseDestructionEndsGame;
372 bool BeaconPlacementEndsGame;
374 BaseControllerClass GDI;
375 BaseControllerClass Nod;
376 bool BasesInitalized;
380 void On_Game_Begin();
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();
396 cGameDataCnc *As_Cnc();
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);
414class cGameDataSkirmish :
public cGameData {
416 bool BaseDestructionEndsGame;
417 bool BeaconPlacementEndsGame;
418 unsigned int StartingCredits;
419 BaseControllerClass GDI;
420 BaseControllerClass Nod;
421 bool BasesInitalized;
424 ~cGameDataSkirmish();
425 void On_Game_Begin();
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();
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);
456class cGameDataSinglePlayer :
public cGameData {
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);