#ifndef MAPD_H #define MAPD_H #pragma warning (disable : 4482) #include #include #include #include "global.h" class CGDefInfo; class CGObjectInstance; class CGHeroInstance; class CGTownInstance; enum ESortBy{name,playerAm,size,format, viccon,loscon}; struct Sresource { std::string resName; //name of this resource int amount; //it can be greater and lesser than 0 }; struct TimeEvent { std::string eventName; std::string message; std::vector decIncRes; //decreases / increases of resources unsigned int whichPlayers; //which players are affected by this event (+1 - first, +2 - second, +4 - third, +8 - fourth etc.) bool areHumansAffected; bool areCompsAffected; int firstAfterNDays; //how many days after appears this event int nextAfterNDays; //how many days after the epperance before appaers this event }; struct TerrainTile { EterrainType tertype; // type of terrain unsigned char terview; // look of terrain Eriver nuine; // type of Eriver (0 if there is no Eriver) unsigned char rivDir; // direction of Eriver Eroad malle; // type of Eroad (0 if there is no Eriver) unsigned char roadDir; // direction of Eroad unsigned char siodmyTajemniczyBajt; // mysterius byte // jak bedzie waidomo co to, to sie nazwie inaczej }; struct SheroName //name of starting hero { int heroID; std::string heroName; }; struct PlayerInfo { int p7, p8, p9; bool canHumanPlay; bool canComputerPlay; unsigned int AITactic; //(00 - random, 01 - warrior, 02 - builder, 03 - explorer) unsigned int allowedFactions; //(01 - castle; 02 - rampart; 04 - tower; 08 - inferno; 16 - necropolis; 32 - dungeon; 64 - stronghold; 128 - fortress; 256 - conflux); bool isFactionRandom; unsigned int mainHeroPortrait; //it's ID of hero with choosen portrait; 255 if standard std::string mainHeroName; std::vector heroesNames; bool hasMainTown; bool generateHeroAtMainTown; int3 posOfMainTown; int team; bool generateHero; }; struct LossCondition { ElossCon typeOfLossCon; int3 castlePos; int3 heroPos; int timeLimit; // in days }; struct CspecificVictoryConidtions { bool allowNormalVictory; bool appliesToAI; }; struct VicCon0 : public CspecificVictoryConidtions //acquire artifact { int ArtifactID; }; struct VicCon1 : public CspecificVictoryConidtions //accumulate creatures { int monsterID; int neededQuantity; }; struct VicCon2 : public CspecificVictoryConidtions // accumulate resources { int resourceID; int neededQuantity; }; struct VicCon3 : public CspecificVictoryConidtions // upgrade specific town { int3 posOfCity; int councilNeededLevel; //0 - town; 1 - city; 2 - capitol int fortNeededLevel;// 0 - fort; 1 - citadel; 2 - castle }; struct VicCon4 : public CspecificVictoryConidtions // build grail structure { bool anyLocation; int3 whereBuildGrail; }; struct VicCon5 : public CspecificVictoryConidtions // defeat a specific hero { int3 locationOfHero; }; struct VicCon6 : public CspecificVictoryConidtions // capture a specific town { int3 locationOfTown; }; struct VicCon7 : public CspecificVictoryConidtions // defeat a specific monster { int3 locationOfMonster; }; struct VicCona : public CspecificVictoryConidtions //transport specific artifact { int artifactID; int3 destinationPlace; }; struct Rumor { std::string name, text; }; struct DisposedHero { int ID; int portrait; //0xFF - default std::string name; bool players[8]; //who can hire this hero }; class CMapEvent { public: std::string name, message; int wood, mercury, ore, sulfur, crystal, gems, gold; //gained / taken resources unsigned char players; //affected players bool humanAffected; bool computerAffected; int firstOccurence; int nextOccurence; //after nextOccurance day event will occure; if it it 0, event occures only one time; }; struct Mapa { Eformat version; // version of map Eformat int twoLevel; // if map has underground level int difficulty; // 0 easy - 4 impossible int levelLimit; bool areAnyPLayers; // if there are any playable players on map std::string name; //name of map std::string description; //and description int height, width; TerrainTile** terrain; TerrainTile** undergroungTerrain; // used only if there is underground level std::vector rumors; std::vector disposedHeroes; std::vector predefinedHeroes; std::vector defy; // list of .def files PlayerInfo players[8]; // info about players std::vector teams; // teams[i] = team of player no i LossCondition lossCondition; EvictoryConditions victoryCondition; //victory conditions CspecificVictoryConidtions * vicConDetails; // used only if vistory conditions aren't standard int howManyTeams; std::vector allowedSpell; //allowedSpell[spell_ID] - if the spell is allowed std::vector allowedArtifact; //allowedArtifact[artifact_ID] - if the artifact is allowed std::vector allowedAbilities; //allowedAbilities[ability_ID] - if the ability is allowed std::vector allowedHeroes; //allowedHeroes[hero_ID] - if the hero is allowed std::vector events; std::vector objects; std::vector heroes; std::vector towns; }; class CMapHeader { public: Eformat version; // version of map Eformat bool areAnyPLayers; // if there are any playable players on map int height, width; bool twoLevel; // if map has underground level std::string name; //name of map std::string description; //and description int difficulty; // 0 easy - 4 impossible int levelLimit; LossCondition lossCondition; EvictoryConditions victoryCondition; //victory conditions CspecificVictoryConidtions * vicConDetails; // used only if vistory conditions aren't standard PlayerInfo players[8]; // info about players std::vector teams; // teams[i] = team of player no i int howManyTeams; CMapHeader(unsigned char *map); //an argument is a reference to string described a map (unpacked) }; class CMapInfo : public CMapHeader { public: std::string filename; int playerAmnt, humenPlayers; CMapInfo(std::string fname, unsigned char *map):CMapHeader(map),filename(fname) { playerAmnt=humenPlayers=0; for (int i=0;i