CCampaignHandler.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #pragma once
  2. /*
  3. * CCampaignHandler.h, part of VCMI engine
  4. *
  5. * Authors: listed in file AUTHORS in main folder
  6. *
  7. * License: GNU General Public License v2.0 or later
  8. * Full text of license available in license.txt file, in main folder
  9. *
  10. */
  11. struct StartInfo;
  12. class CGHeroInstance;
  13. namespace CampaignVersion
  14. {
  15. enum Version
  16. {
  17. RoE = 4,
  18. AB = 5,
  19. SoD = 6,
  20. WoG = 6
  21. };
  22. }
  23. class DLL_LINKAGE CCampaignHeader
  24. {
  25. public:
  26. si32 version; //4 - RoE, 5 - AB, 6 - SoD and WoG
  27. ui8 mapVersion; //CampText.txt's format
  28. std::string name, description;
  29. ui8 difficultyChoosenByPlayer;
  30. ui8 music; //CmpMusic.txt, start from 0
  31. std::string filename;
  32. ui8 loadFromLod; //if true, this campaign must be loaded fro, .lod file
  33. template <typename Handler> void serialize(Handler &h, const int formatVersion)
  34. {
  35. h & version & mapVersion & name & description & difficultyChoosenByPlayer & music & filename & loadFromLod;
  36. }
  37. };
  38. class DLL_LINKAGE CScenarioTravel
  39. {
  40. public:
  41. ui8 whatHeroKeeps; //bitfield [0] - experience, [1] - prim skills, [2] - sec skills, [3] - spells, [4] - artifacts
  42. ui8 monstersKeptByHero[19];
  43. ui8 artifsKeptByHero[18];
  44. ui8 startOptions; //1 - start bonus, 2 - traveling hero, 3 - hero options
  45. ui8 playerColor; //only for startOptions == 1
  46. struct DLL_LINKAGE STravelBonus
  47. {
  48. ui8 type; //0 - spell, 1 - monster, 2 - building, 3 - artifact, 4 - spell scroll, 5 - prim skill, 6 - sec skill, 7 - resource,
  49. //8 - player from previous scenario, 9 - hero [???]
  50. si32 info1, info2, info3; //purpose depends on type
  51. bool isBonusForHero() const;
  52. template <typename Handler> void serialize(Handler &h, const int formatVersion)
  53. {
  54. h & type & info1 & info2 & info3;
  55. }
  56. };
  57. std::vector<STravelBonus> bonusesToChoose;
  58. template <typename Handler> void serialize(Handler &h, const int formatVersion)
  59. {
  60. h & whatHeroKeeps & monstersKeptByHero & artifsKeptByHero & startOptions & playerColor & bonusesToChoose;
  61. }
  62. };
  63. class DLL_LINKAGE CCampaignScenario
  64. {
  65. public:
  66. std::string mapName;
  67. ui32 packedMapSize; //generally not used
  68. std::set<ui8> preconditionRegions; //what we need to conquer to conquer this one (stored as bitfield in h3c)
  69. ui8 regionColor;
  70. ui8 difficulty;
  71. ui8 conquered;
  72. std::string regionText;
  73. struct DLL_LINKAGE SScenarioPrologEpilog
  74. {
  75. ui8 hasPrologEpilog;
  76. ui8 prologVideo; // from CmpMovie.txt
  77. ui8 prologMusic; // from CmpMusic.txt
  78. std::string prologText;
  79. template <typename Handler> void serialize(Handler &h, const int formatVersion)
  80. {
  81. h & hasPrologEpilog & prologVideo & prologMusic & prologText;
  82. }
  83. };
  84. SScenarioPrologEpilog prolog, epilog;
  85. CScenarioTravel travelOptions;
  86. std::vector<CGHeroInstance*> crossoverHeroes;
  87. void loadPreconditionRegions(ui32 regions);
  88. void prepareCrossoverHeroes(std::vector<CGHeroInstance *> heroes);
  89. bool isNotVoid() const;
  90. template <typename Handler> void serialize(Handler &h, const int formatVersion)
  91. {
  92. h & mapName & packedMapSize & preconditionRegions & regionColor & difficulty & conquered & regionText &
  93. prolog & epilog & travelOptions & crossoverHeroes;
  94. }
  95. };
  96. class DLL_LINKAGE CCampaign
  97. {
  98. public:
  99. CCampaignHeader header;
  100. std::vector<CCampaignScenario> scenarios;
  101. std::map<int, std::string> mapPieces; //binary h3ms, scenario number -> map data
  102. template <typename Handler> void serialize(Handler &h, const int formatVersion)
  103. {
  104. h & header & scenarios & mapPieces;
  105. }
  106. bool conquerable(int whichScenario) const;
  107. CCampaign();
  108. };
  109. class DLL_LINKAGE CCampaignState
  110. {
  111. public:
  112. CCampaign *camp;
  113. std::string campaignName;
  114. std::vector<ui8> mapsConquered, mapsRemaining;
  115. ui8 currentMap;
  116. void initNewCampaign(const StartInfo &si);
  117. void mapConquered(const std::vector<CGHeroInstance*> & heroes);
  118. template <typename Handler> void serialize(Handler &h, const int version)
  119. {
  120. h & camp & campaignName & mapsRemaining & mapsConquered & currentMap;
  121. }
  122. };
  123. class DLL_LINKAGE CCampaignHandler
  124. {
  125. static CCampaignHeader readHeaderFromMemory( const ui8 *buffer, int & outIt );
  126. static CCampaignScenario readScenarioFromMemory( const ui8 *buffer, int & outIt, int version, int mapVersion );
  127. static CScenarioTravel readScenarioTravelFromMemory( const ui8 * buffer, int & outIt , int version);
  128. static std::vector<ui32> locateH3mStarts(const ui8 * buffer, int start, int size);
  129. static bool startsAt( const ui8 * buffer, int size, int pos ); //a simple heuristic that checks if a h3m starts at given pos
  130. static ui8 * getFile(const std::string & name, bool fromLod, int & outSize);
  131. public:
  132. enum GetMode {RoE, AB, SoD, WoG, Custom, ALL};
  133. static std::vector<CCampaignHeader> getCampaignHeaders(GetMode mode);
  134. static CCampaignHeader getHeader( const std::string & name, bool fromLod ); //name - name of appropriate file
  135. static CCampaign * getCampaign(const std::string & name, bool fromLod); //name - name of appropriate file
  136. };