gamedata.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Commando *
  23. * *
  24. * $Archive:: /Commando/Code/Commando/gamedata.h $*
  25. * *
  26. * $Author:: Steve_t $*
  27. * *
  28. * $Modtime:: 11/01/02 4:32p $*
  29. * *
  30. * $Revision:: 135 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #ifndef GAMEDATA_H
  36. #define GAMEDATA_H
  37. #if defined(_MSV_VER)
  38. #pragma once
  39. #endif
  40. #include "teammanager.h"
  41. #include "bittype.h"
  42. #include "boolean.h"
  43. #include "netinterface.h"
  44. #include "wwstring.h"
  45. #include "widestring.h"
  46. #include "radar.h"
  47. #include "DlgMPTeamSelect.h"
  48. #include <WWLib\Signaler.h>
  49. const int MAX_PASSWORD_SIZE = 16; //including NULL
  50. const int MAX_MAPNAME_SIZE = 28; //including NULL
  51. const LPCSTR SERVER_CONFIG_PREFIX = "svrcfg_";
  52. const int MAX_MOTD_LENGTH = 100;
  53. #define MAX_CLAN_SLOTS 2
  54. class SoldierGameObj;
  55. class cPacket;
  56. //class Render2DTextClass;
  57. class Render2DSentenceClass;
  58. class Font3DInstanceClass;
  59. //class cGameDataDeathMatch;
  60. //class cGameDataTeamDeathMatch;
  61. class cGameDataSinglePlayer;
  62. class cGameDataSkirmish;
  63. class cGameDataCnc;
  64. class WOLGameInfo;
  65. //
  66. // This class describes a server configuration. Dynamic instantiations
  67. // of related parameters are stored elsewhere.
  68. //
  69. class cGameData :
  70. public Signaler<MPChooseTeamSignal>
  71. {
  72. public:
  73. enum GameTypeEnum {
  74. GAME_TYPE_SINGLE_PLAYER = 0,
  75. GAME_TYPE_SKIRMISH,
  76. GAME_TYPE_CNC,
  77. };
  78. enum WinTypeEnum {
  79. WIN_TYPE_FORCED = 0, // gameover command, or server quits
  80. WIN_TYPE_COWARDICE, // opponents abandon game
  81. WIN_TYPE_TIME, // time expired
  82. WIN_TYPE_BASE_DESTRUCTION, // base was destroyed
  83. WIN_TYPE_BEACON, // beacon placed successfully
  84. };
  85. cGameData(void);
  86. virtual ~cGameData(void);
  87. cGameData& operator=(const cGameData& rhs);
  88. static void Onetime_Init(void);
  89. static void Onetime_Shutdown(void);
  90. virtual void On_Game_Begin(void);
  91. virtual void On_Game_End(void);
  92. virtual void Think(void);
  93. virtual void Render(void);
  94. virtual void Reset_Game(bool is_reloaded);
  95. void Swap_Team_Sides(void);
  96. void Remix_Team_Sides(void);
  97. void Rebalance_Team_Sides(void);
  98. void Add_Bottom_Text(WideStringClass & text);
  99. void Get_Time_Limit_Text(WideStringClass& text);
  100. void Get_Dedicated_Server_Label(WideStringClass& text,unsigned& color);
  101. void Get_Gameplay_Not_Permitted_Label(WideStringClass& text, unsigned& color);
  102. static cGameData * Create_Game_Of_Type(GameTypeEnum game_type);
  103. void Set_Game_Title(const WCHAR *title) { GameTitle = title; }
  104. void Set_Motd(const WCHAR * motd);
  105. void Set_Password(const WCHAR *password) { Password = password;}
  106. void Set_Map_Name(const StringClass & map_name);
  107. void Set_Mod_Name(const StringClass & mod_name);
  108. void Set_Map_Cycle(int map, const StringClass & map_name);
  109. void Set_Owner(WideStringClass & owner);
  110. bool Set_Max_Players(int max_players);
  111. bool Set_Time_Limit_Minutes(int time_limit_minutes);
  112. void Set_Radar_Mode(RadarModeEnum mode);
  113. void Set_Intermission_Time_Seconds(int time);
  114. void Set_Version_Number(int version_number) {VersionNumber = version_number;}
  115. bool Set_Current_Players(int current_players);
  116. void Set_Ip_Address(ULONG ip_address);
  117. void Set_Port(int port);
  118. void Set_QuickMatch_Server(bool isServer) {IsQuickMatchServer.Set(isServer);}
  119. bool Is_QuickMatch_Server(void) const {return IsQuickMatchServer.Get();}
  120. void Set_Clan(int slot, unsigned long clanID);
  121. unsigned long Get_Clan(int slot) const;
  122. void Clear_Clans(void);
  123. int Find_Free_Clan_Slot(void) const;
  124. bool Is_Clan_Competing(unsigned long clanID) const;
  125. bool Is_Clan_Game_Open(void) const;
  126. const WCHAR * Get_Game_Title(void) const {return GameTitle;}
  127. const WCHAR * Get_Motd(void) const {return Motd;}
  128. const WCHAR * Get_Password(void) const {return Password;}
  129. const StringClass& Get_Mod_Name() const {return ModName;}
  130. const StringClass& Get_Map_Name() const {return MapName;}
  131. const StringClass& Get_Map_Cycle(int map);
  132. bool Does_Map_Exist (void);
  133. const WideStringClass & Get_Owner(void) const {return Owner;}
  134. int Get_Max_Players(void) const {return MaxPlayers;}
  135. int Get_Time_Limit_Minutes(void) const {return TimeLimitMinutes;}
  136. int Get_Intermission_Time_Seconds(void) const {return IntermissionTimeSeconds;}
  137. int Get_Version_Number(void) const {return VersionNumber;}
  138. int Get_Current_Players(void) const {return CurrentPlayers;}
  139. ULONG Get_Ip_Address(void) const {return IpAddress;}
  140. int Get_Port(void) const {return Port;}
  141. RadarModeEnum Get_Radar_Mode(void) const {return RadarMode;}
  142. virtual const WCHAR* Get_Game_Name(void) const = 0;
  143. virtual GameTypeEnum Get_Game_Type(void) const = 0;
  144. const char * Get_Game_Type_Name(void) const;
  145. virtual int Choose_Player_Type(cPlayer* player, int team_choice, bool is_grunt);
  146. bool Is_Time_Limit(void) const {return TimeLimitMinutes > 0;}
  147. void Rotate_Map(void);
  148. void Clear_Map_Cycle(void);
  149. void Set_Ip_And_Port(void);
  150. virtual void Load_From_Server_Config(void) {}
  151. virtual void Save_To_Server_Config(void) {}
  152. virtual bool Is_Editable_Teaming(void) const {return false;}
  153. virtual bool Is_Editable_Clan_Game(void) const {return false;}
  154. virtual bool Is_Editable_Friendly_Fire(void) const {return false;}
  155. virtual void Soldier_Added(SoldierGameObj * p_soldier);
  156. virtual void Show_Game_Settings_Limits(void);
  157. //
  158. // Version information
  159. //
  160. bool Do_Exe_Versions_Match(void) { return DoExeVersionsMatch; }
  161. bool Do_String_Versions_Match(void) { return DoStringVersionsMatch; }
  162. //
  163. // Map cycle looping support
  164. //
  165. bool Is_Map_Cycle_Over (void) { return IsMapCycleOver; }
  166. void Set_Is_Map_Cycle_Over (bool onoff) { IsMapCycleOver = onoff; }
  167. bool Do_Maps_Loop (void) { return DoMapsLoop; }
  168. void Set_Do_Maps_Loop (bool onoff) { DoMapsLoop = onoff; }
  169. bool Is_Map_Valid(char **filename = NULL);
  170. //
  171. // Ideally, none of these would exist, so comment out any unused ones...
  172. //
  173. virtual bool Is_Single_Player(void) const {return false;}
  174. virtual bool Is_Skirmish(void) const {return false;}
  175. virtual bool Is_Cnc(void) const {return false;}
  176. virtual cGameDataSinglePlayer * As_Single_Player(void) {return NULL;}
  177. virtual cGameDataSkirmish * As_Skirmish(void) {return NULL;}
  178. virtual cGameDataCnc * As_Cnc(void) {return NULL;}
  179. virtual int Get_Min_Players(void) const {return 2;}
  180. int Choose_Available_Team(int preference);
  181. int Choose_Smallest_Team(void);
  182. virtual bool Is_Game_Over(void);
  183. void Game_Over_Processing(void);
  184. bool Set_Generic_Num(int generic_num,
  185. int lower_bound, int upper_bound, int & set_num);
  186. virtual bool Is_Limited(void) const;
  187. virtual bool Is_Valid_Settings(WideStringClass& outMsg, bool check_as_server = false);
  188. virtual void Export_Tier_1_Data(cPacket & packet);
  189. virtual void Import_Tier_1_Data(cPacket & packet);
  190. virtual void Import_Tier_1_Data(const WOLGameInfo& gameInfo);
  191. virtual void Export_Tier_2_Data(cPacket & packet);
  192. virtual void Import_Tier_2_Data(cPacket & packet);
  193. //
  194. // Dynamic data
  195. //
  196. void Begin_Intermission(void);
  197. float Get_Intermission_Time_Remaining(void) {return IntermissionTimeRemaining;}
  198. void Set_Intermission_Time_Remaining(float time) {IntermissionTimeRemaining = time;}
  199. float Get_Maximum_World_Distance(void) {return MaximumWorldDistance;}
  200. void Set_Maximum_World_Distance(float distance);
  201. unsigned long Get_Frame_Count(void) const {return FrameCount;}
  202. LPSYSTEMTIME Get_Game_Start_Time(void) {return &GameStartTime;}
  203. int Get_Duration_Seconds(void);
  204. void Set_Min_Qualifying_Time_Minutes(int minutes);
  205. int Get_Min_Qualifying_Time_Minutes(void) {return MinQualifyingTimeMinutes;}
  206. WideStringClass Get_Team_Word(void);
  207. void Set_Time_Remaining_Seconds(float time_remaining_seconds);
  208. void Reset_Time_Remaining_Seconds(void);
  209. float Get_Time_Remaining_Seconds(void);
  210. bool Is_Valid_Player_Type(int player_type);
  211. void Set_Ini_Filename(const StringClass& name) {IniFilename = name;}
  212. const StringClass& Get_Ini_Filename() { return IniFilename;}
  213. virtual bool Is_Gameplay_Permitted(void);
  214. virtual bool Remember_Inventory( void ) const { return false; }
  215. void Set_Winner_ID(int id) {mWinnerID = id;}
  216. int Get_Winner_ID(void) const {return mWinnerID;}
  217. static void Set_Hosted_Game_Number(int number) {HostedGameNumber = number;}
  218. static void Increment_Hosted_Game_Number(void) {HostedGameNumber++;}
  219. static int Get_Hosted_Game_Number(void) {return HostedGameNumber;}
  220. /*
  221. void Set_Server_Is_Gameplay_Permitted(bool flag) {ServerIsGameplayPermitted = flag;}
  222. bool Get_Server_Is_Gameplay_Permitted(void) {return ServerIsGameplayPermitted;}
  223. */
  224. static bool Is_Manual_Restart(void) {return IsManualRestart;}
  225. static void Set_Manual_Restart(bool is_manual_restart) {IsManualRestart = is_manual_restart;}
  226. static bool Is_Manual_Exit(void) {return IsManualExit;}
  227. static void Set_Manual_Exit(bool is_manual_exit) {IsManualExit = is_manual_exit;}
  228. static void Set_Win_Text(WideStringClass & text);
  229. static WideStringClass Get_Win_Text(void) {return WinText;}
  230. void Filter_Spawners(void);
  231. void Set_Mvp_Name(WideStringClass name);
  232. const WideStringClass & Get_Mvp_Name(void) const {return MvpName;}
  233. void Set_Mvp_Count(int count);
  234. void Increment_Mvp_Count(void) {MvpCount++;}
  235. const int Get_Mvp_Count(void) const {return MvpCount;}
  236. void Set_Win_Type(WinTypeEnum type);
  237. WinTypeEnum Get_Win_Type(void) const {return WinType;}
  238. void Set_Game_Duration_S(DWORD seconds);
  239. DWORD Get_Game_Duration_S(void) const {return GameDurationS;}
  240. virtual void Get_Description(WideStringClass & description);
  241. WideStringClass Get_Settings_Description(void) {return(SettingsDescription);}
  242. void Set_Settings_Description(WideStringClass desc) {SettingsDescription = desc;}
  243. cBoolean IsIntermission;
  244. cBoolean IsDedicated;
  245. cBoolean IsAutoRestart;
  246. cBoolean IsFriendlyFirePermitted;
  247. cBoolean IsTeamChangingAllowed;
  248. cBoolean IsPassworded;
  249. cBoolean IsFreeWeapons;
  250. cBoolean IsLaddered;
  251. cBoolean IsClanGame;
  252. cBoolean IsClientTrusted;
  253. cBoolean RemixTeams;
  254. cBoolean CanRepairBuildings;
  255. cBoolean DriverIsAlwaysGunner;
  256. cBoolean SpawnWeapons;
  257. enum {MAX_MAPS = 100};
  258. static int Get_Mission_Number_From_Map_Name( const char * map_name );
  259. void Load_From_Server_Config(LPCSTR config_file);
  260. void Save_To_Server_Config(LPCSTR config_file);
  261. protected:
  262. void ReceiveSignal(MPChooseTeamSignal&);
  263. static const StringClass INI_SECTION_NAME;
  264. static const float LIMITS_X_POS;
  265. bool DoMapsLoop;
  266. bool IsMapCycleOver;
  267. int MapCycleIndex;
  268. private:
  269. cGameData(const cGameData& rhs); // Disallow copy
  270. bool Has_Config_File_Changed(void);
  271. unsigned long Get_Config_File_Mod_Time(void);
  272. static const int MAX_TIME_LIMIT;
  273. #if(0)
  274. static Render2DTextClass * PTextRenderer;
  275. static Font3DInstanceClass * PFont;
  276. #endif
  277. static Render2DSentenceClass * PTextRenderer;
  278. static int HostedGameNumber; //temp hack 09/26/01
  279. static bool IsManualRestart;
  280. static bool IsManualExit;
  281. static WideStringClass WinText;
  282. WideStringClass GameTitle;
  283. WideStringClass Motd;
  284. WideStringClass Password;
  285. StringClass MapName;
  286. StringClass ModName;
  287. StringClass MapCycle[MAX_MAPS];
  288. WideStringClass Owner;
  289. DynamicVectorClass<WideStringClass> BottomText;
  290. DynamicVectorClass<WideStringClass> OldBottomText;
  291. StringClass SettingsDescription;
  292. int MaxPlayers;
  293. int TimeLimitMinutes;
  294. int IntermissionTimeSeconds;
  295. int VersionNumber; // for now use exe byte size
  296. bool DoExeVersionsMatch;
  297. bool DoStringVersionsMatch;
  298. ULONG IpAddress; // hosting address
  299. int Port;
  300. StringClass IniFilename;
  301. RadarModeEnum RadarMode;
  302. unsigned long LastServerConfigModTime;
  303. //
  304. // Dynamic data about game state
  305. //
  306. int CurrentPlayers;
  307. float IntermissionTimeRemaining;
  308. float TimeRemainingSeconds;
  309. float MaximumWorldDistance;
  310. int MinQualifyingTimeMinutes;
  311. int mWinnerID;
  312. WinTypeEnum WinType;
  313. SYSTEMTIME GameStartTime;
  314. DWORD GameStartTimeMs;
  315. unsigned long FrameCount;
  316. WideStringClass MvpName;
  317. int MvpCount;
  318. DWORD GameDurationS;
  319. cBoolean IsQuickMatchServer;
  320. //bool ServerIsGameplayPermitted;
  321. unsigned long mClanSlots[MAX_CLAN_SLOTS];
  322. };
  323. extern cGameData * PTheGameData;
  324. extern cGameData * The_Game(void);
  325. extern cGameDataSinglePlayer * The_Single_Player_Game(void);
  326. extern cGameDataSkirmish * The_Skirmish_Game(void);
  327. extern cGameDataCnc * The_Cnc_Game(void);
  328. #endif // GAMEDATA_H
  329. //extern cGameDataDeathMatch * The_Deathmatch_Game(void);
  330. //extern cGameDataTeamDeathMatch * The_Team_Deathmatch_Game(void);
  331. //GAME_TYPE_MULTIPLAY_FIRST,
  332. //GAME_TYPE_DEATHMATCH = GAME_TYPE_MULTIPLAY_FIRST,
  333. //GAME_TYPE_TEAM_DEATHMATCH,
  334. //GAME_TYPE_CNC = GAME_TYPE_MULTIPLAY_FIRST,
  335. //GAME_TYPE_MULTIPLAY_LAST = GAME_TYPE_CNC
  336. //virtual bool Is_Deathmatch(void) const {return false;}
  337. //virtual bool Is_Team_Deathmatch(void) const {return false;}
  338. //virtual cGameDataDeathMatch * As_Deathmatch(void) {return NULL;}
  339. //virtual cGameDataTeamDeathMatch * As_Team_Deathmatch(void) {return NULL;}
  340. //static const char* Get_Game_Type_Name(GameTypeEnum type);
  341. //virtual bool Is_Editable_Reload_Map(void) const {return false;}
  342. //virtual bool Is_Editable_Max_Players(void) const {return false;}
  343. //virtual bool Is_Team_Game(void) const {return false;}
  344. //virtual bool Is_Respawn_On_Demand(void) const {return true;}
  345. //void Set_Min_Game_Time_Required_Mins(int mins);
  346. //int Get_Min_Game_Time_Required_Mins(void) {return MinGameTimeRequiredMins;}
  347. //void Set_Full_Score_Time_Threshold_Mins(int mins);
  348. //int Get_Full_Score_Time_Threshold_Mins(void) {return FullScoreTimeThresholdMins;}
  349. //int MinGameTimeRequiredMins;
  350. //int FullScoreTimeThresholdMins;
  351. //cBoolean IsBloodShed;