ChallengeGenerals.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. ** Command & Conquer Generals Zero Hour(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. // //
  20. // (c) 2001-2003 Electronic Arts Inc. //
  21. // //
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // FILE: ChallengeGenerals.h //////////////////////////////////////////////////////////////////////
  24. // Author: Steve Copeland, 6/24/2003
  25. // Desc: This is a manager for data pertaining to the Generals' Challenge personas and related GUI.
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////
  27. #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
  28. #include "GameClient/ChallengeGenerals.h"
  29. #ifdef _INTERNAL
  30. // for occasional debugging...
  31. //#pragma optimize("", off)
  32. //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes")
  33. #endif
  34. ChallengeGenerals *TheChallengeGenerals = NULL;
  35. ChallengeGenerals *createChallengeGenerals( void )
  36. {
  37. return MSGNEW("ChallengeGenerals") ChallengeGenerals;
  38. }
  39. ChallengeGenerals::ChallengeGenerals()
  40. {
  41. //ctor
  42. }
  43. ChallengeGenerals::~ChallengeGenerals()
  44. {
  45. //dtor
  46. }
  47. void ChallengeGenerals::init( void )
  48. {
  49. INI ini;
  50. ini.load( AsciiString( "Data\\INI\\ChallengeMode.ini" ), INI_LOAD_OVERWRITE, NULL );
  51. }
  52. void ChallengeGenerals::parseGeneralPersona(INI *ini, void *instance, void *store, const void *userData)
  53. {
  54. static const FieldParse dataFieldParse[] =
  55. {
  56. { "StartsEnabled", INI::parseBool, NULL, offsetof( GeneralPersona, m_bStartsEnabled ) },
  57. { "BioNameString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioName ) },
  58. { "BioDOBString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioDOB ) },
  59. { "BioBirthplaceString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioBirthplace ) },
  60. { "BioStrategyString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioStrategy ) },
  61. { "BioRankString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioRank ) },
  62. { "BioBranchString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioBranch ) },
  63. { "BioClassNumberString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strBioClassNumber ) },
  64. { "BioPortraitSmall", INI::parseMappedImage, NULL, offsetof( GeneralPersona, m_imageBioPortraitSmall ) },
  65. { "BioPortraitLarge", INI::parseMappedImage, NULL, offsetof( GeneralPersona, m_imageBioPortraitLarge ) },
  66. { "Campaign", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strCampaign ) },
  67. { "PlayerTemplate", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strPlayerTemplateName ) },
  68. { "PortraitMovieLeftName", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strPortraitMovieLeftName ) },
  69. { "PortraitMovieRightName", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strPortraitMovieRightName ) },
  70. { "DefeatedImage", INI::parseMappedImage, NULL, offsetof( GeneralPersona, m_imageDefeated ) },
  71. { "VictoriousImage", INI::parseMappedImage, NULL, offsetof( GeneralPersona, m_imageVictorious ) },
  72. { "DefeatedString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strDefeated ) },
  73. { "VictoriousString", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strVictorious ) },
  74. { "SelectionSound", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strSelectionSound ) },
  75. { "TauntSound1", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strTauntSound1 ) },
  76. { "TauntSound2", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strTauntSound2 ) },
  77. { "TauntSound3", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strTauntSound3 ) },
  78. { "WinSound", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strWinSound ) },
  79. { "LossSound", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strLossSound ) },
  80. { "PreviewSound", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strPreviewSound ) },
  81. { "NameSound", INI::parseAsciiString, NULL, offsetof( GeneralPersona, m_strNameSound ) },
  82. { 0, 0, 0, 0 }
  83. };
  84. ini->initFromINI(store, dataFieldParse);
  85. }
  86. const FieldParse ChallengeGenerals::s_fieldParseTable[] =
  87. {
  88. { "GeneralPersona0", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[0] ) },
  89. { "GeneralPersona1", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[1] ) },
  90. { "GeneralPersona2", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[2] ) },
  91. { "GeneralPersona3", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[3] ) },
  92. { "GeneralPersona4", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[4] ) },
  93. { "GeneralPersona5", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[5] ) },
  94. { "GeneralPersona6", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[6] ) },
  95. { "GeneralPersona7", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[7] ) },
  96. { "GeneralPersona8", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[8] ) },
  97. { "GeneralPersona9", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[9] ) },
  98. { "GeneralPersona10", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[10] ) },
  99. { "GeneralPersona11", ChallengeGenerals::parseGeneralPersona, NULL, offsetof( ChallengeGenerals, m_position[11] ) },
  100. { 0, 0, 0, 0 }
  101. };
  102. //-------------------------------------------------------------------------------------------------
  103. /** Parse Gen Challenge entries */
  104. //-------------------------------------------------------------------------------------------------
  105. void INI::parseChallengeModeDefinition( INI* ini )
  106. {
  107. if( TheChallengeGenerals )
  108. {
  109. ini->initFromINI( TheChallengeGenerals, TheChallengeGenerals->getFieldParse() );
  110. }
  111. }
  112. const GeneralPersona* ChallengeGenerals::getPlayerGeneralByCampaignName( AsciiString name ) const
  113. {
  114. for (Int i = 0; i < NUM_GENERALS; i++)
  115. {
  116. AsciiString campaignName = m_position[i].getCampaign();
  117. if (campaignName.compareNoCase( name.str() ) == 0)
  118. return &m_position[i];
  119. }
  120. DEBUG_ASSERTCRASH(NULL, ("Can't find General by Campaign Name"));
  121. return NULL;
  122. }
  123. const GeneralPersona* ChallengeGenerals::getGeneralByGeneralName( AsciiString name ) const
  124. {
  125. for (Int i = 0; i < NUM_GENERALS; i++)
  126. {
  127. AsciiString generalName = m_position[i].getBioName();
  128. if (generalName.compareNoCase( name.str() ) == 0)
  129. return &m_position[i];
  130. }
  131. return NULL;
  132. }
  133. const GeneralPersona* ChallengeGenerals::getGeneralByTemplateName( AsciiString name ) const
  134. {
  135. for (Int i = 0; i < NUM_GENERALS; i++)
  136. {
  137. AsciiString templateName = m_position[i].getPlayerTemplateName();
  138. if (templateName.compareNoCase( name.str() ) == 0)
  139. return &m_position[i];
  140. }
  141. return NULL;
  142. }