mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	few more refactorings
This commit is contained in:
		| @@ -13,7 +13,7 @@ void CEmptyAI::yourTurn() | ||||
| 	cb->endTurn(); | ||||
| } | ||||
|  | ||||
| void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, int queryID) | ||||
| void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, PrimarySkill::PrimarySkill pskill, std::vector<SecondarySkill::SecondarySkill> &skills, int queryID) | ||||
| { | ||||
| 	cb->selectionMade(rand() % skills.size(), queryID); | ||||
| } | ||||
|   | ||||
| @@ -12,9 +12,9 @@ class CEmptyAI : public CGlobalAI | ||||
| public: | ||||
| 	void init(CCallback * CB) override; | ||||
| 	void yourTurn() override; | ||||
| 	void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, int queryID) override;  | ||||
| 	void heroGotLevel(const CGHeroInstance *hero, PrimarySkill::PrimarySkill pskill, std::vector<SecondarySkill::SecondarySkill> &skills, int queryID) override; | ||||
| 	void commanderGotLevel (const CCommanderInstance * commander, std::vector<ui32> skills, int queryID) override; | ||||
| 	void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) override;  | ||||
| 	void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) override; | ||||
| 	void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, int queryID) override; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,7 @@ using namespace boost::assign; | ||||
|  | ||||
| extern boost::rand48 ran; | ||||
|  | ||||
| const std::map<std::string, CArtifact::EartClass> artifactClassMap = boost::assign::map_list_of  | ||||
| const std::map<std::string, CArtifact::EartClass> artifactClassMap = boost::assign::map_list_of | ||||
| 	("TREASURE", CArtifact::ART_TREASURE) | ||||
| 	("MINOR", CArtifact::ART_MINOR) | ||||
| 	("MAJOR", CArtifact::ART_MAJOR) | ||||
| @@ -38,7 +38,7 @@ const std::map<std::string, CArtifact::EartClass> artifactClassMap = boost::assi | ||||
|  | ||||
| #define ART_POS(x) ( #x, ArtifactPosition::x ) | ||||
|  | ||||
| const std::map<std::string, int> artifactPositionMap = boost::assign::map_list_of  | ||||
| const std::map<std::string, int> artifactPositionMap = boost::assign::map_list_of | ||||
| 	ART_POS(HEAD) | ||||
| 	ART_POS(SHOULDERS) | ||||
| 	ART_POS(NECK) | ||||
| @@ -424,7 +424,7 @@ CArtifact * CArtHandler::loadArtifact(const JsonNode & node) | ||||
| 			art->aClass = CArtifact::ART_SPECIAL; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	int bearerType = -1; | ||||
| 	bool heroArt = false; | ||||
|  | ||||
| @@ -707,7 +707,7 @@ void CArtHandler::addBonuses() | ||||
| 	BOOST_FOREACH (auto & artifact, config["artifacts"].Struct()) //pair <string, JsonNode> (id, properties) | ||||
| 	{ | ||||
| 		auto ga = artifacts[artifact.second["id"].Float()].get(); | ||||
| 		 | ||||
|  | ||||
| 		BOOST_FOREACH (auto b, artifact.second["bonuses"].Vector()) | ||||
| 		{ | ||||
| 			auto bonus = JsonUtils::parseBonus (b); | ||||
| @@ -783,7 +783,7 @@ bool CArtHandler::legalArtifact(int id) | ||||
| 			(artifacts[id]->possibleSlots[ArtBearer::CREATURE].size() && VLC->modh->modules.STACK_ARTIFACT); | ||||
| } | ||||
|  | ||||
| void CArtHandler::initAllowedArtifactsList(const std::vector<ui8> &allowed) | ||||
| void CArtHandler::initAllowedArtifactsList(const std::vector<bool> &allowed) | ||||
| { | ||||
| 	allowedArtifacts.clear(); | ||||
| 	clearHlpLists(); | ||||
| @@ -812,12 +812,12 @@ void CArtHandler::initAllowedArtifactsList(const std::vector<ui8> &allowed) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| std::vector<ui8> CArtHandler::getDefaultAllowedArtifacts() const | ||||
| std::vector<bool> CArtHandler::getDefaultAllowedArtifacts() const | ||||
| { | ||||
| 	std::vector<ui8> allowedArtifacts; | ||||
| 	allowedArtifacts.resize(127, 1); | ||||
| 	allowedArtifacts.resize(141, 0); | ||||
| 	allowedArtifacts.resize(GameConstants::ARTIFACTS_QUANTITY, 1); | ||||
| 	std::vector<bool> allowedArtifacts; | ||||
| 	allowedArtifacts.resize(127, true); | ||||
| 	allowedArtifacts.resize(141, false); | ||||
| 	allowedArtifacts.resize(GameConstants::ARTIFACTS_QUANTITY, true); | ||||
| 	return allowedArtifacts; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -248,7 +248,7 @@ public: | ||||
| 	void getAllowed(std::vector<ConstTransitivePtr<CArtifact> > &out, int flags); | ||||
| 	void erasePickedArt (TArtifactInstanceID id); | ||||
| 	bool isBigArtifact (TArtifactID artID) const {return bigArtifacts.find(artID) != bigArtifacts.end();} | ||||
| 	void initAllowedArtifactsList(const std::vector<ui8> &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed | ||||
| 	void initAllowedArtifactsList(const std::vector<bool> &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed | ||||
| 	static int convertMachineID(int id, bool creToArt); | ||||
| 	void makeItCreatureArt (CArtifact * a, bool onlyCreature = true); | ||||
| 	void makeItCreatureArt (TArtifactInstanceID aid, bool onlyCreature = true); | ||||
| @@ -260,9 +260,9 @@ public: | ||||
| 	/** | ||||
| 	 * Gets a list of default allowed artifacts. | ||||
| 	 * | ||||
| 	 * @return a list of allowed artifacts, the index is the artifact id and the value either 0 for not allowed or 1 for allowed | ||||
| 	 * @return a list of allowed artifacts, the index is the artifact id | ||||
| 	 */ | ||||
| 	std::vector<ui8> getDefaultAllowedArtifacts() const; | ||||
| 	std::vector<bool> getDefaultAllowedArtifacts() const; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
|   | ||||
| @@ -359,7 +359,7 @@ void CHeroHandler::loadObstacles() | ||||
| { | ||||
| 	auto loadObstacles = [](const JsonNode &node, bool absolute, std::map<int, CObstacleInfo> &out) | ||||
| 	{ | ||||
| 		BOOST_FOREACH(const JsonNode &obs, node.Vector())  | ||||
| 		BOOST_FOREACH(const JsonNode &obs, node.Vector()) | ||||
| 		{ | ||||
| 			int ID = obs["id"].Float(); | ||||
| 			CObstacleInfo & obi = out[ID]; | ||||
| @@ -500,10 +500,10 @@ void CHeroHandler::loadTerrains() | ||||
| 		terrCosts.push_back(config[name]["moveCost"].Float()); | ||||
| } | ||||
|  | ||||
| std::vector<ui8> CHeroHandler::getDefaultAllowedHeroes() const | ||||
| std::vector<bool> CHeroHandler::getDefaultAllowedHeroes() const | ||||
| { | ||||
| 	// Look Data/HOTRAITS.txt for reference | ||||
| 	std::vector<ui8> allowedHeroes; | ||||
| 	std::vector<bool> allowedHeroes; | ||||
| 	allowedHeroes.reserve(heroes.size()); | ||||
|  | ||||
| 	BOOST_FOREACH(const CHero * hero, heroes) | ||||
| @@ -514,9 +514,9 @@ std::vector<ui8> CHeroHandler::getDefaultAllowedHeroes() const | ||||
| 	return allowedHeroes; | ||||
| } | ||||
|  | ||||
| std::vector<ui8> CHeroHandler::getDefaultAllowedAbilities() const | ||||
| std::vector<bool> CHeroHandler::getDefaultAllowedAbilities() const | ||||
| { | ||||
| 	std::vector<ui8> allowedAbilities; | ||||
| 	allowedAbilities.resize(GameConstants::SKILL_QUANTITY, 1); | ||||
| 	std::vector<bool> allowedAbilities; | ||||
| 	allowedAbilities.resize(GameConstants::SKILL_QUANTITY, true); | ||||
| 	return allowedAbilities; | ||||
| } | ||||
|   | ||||
| @@ -185,7 +185,7 @@ public: | ||||
|  | ||||
| 	//default costs of going through terrains. -1 means terrain is impassable | ||||
| 	std::vector<int> terrCosts; | ||||
| 	 | ||||
|  | ||||
| 	struct SBallisticsLevelInfo | ||||
| 	{ | ||||
| 		ui8 keep, tower, gate, wall; //chance to hit in percent (eg. 87 is 87%) | ||||
| @@ -233,14 +233,14 @@ public: | ||||
| 	 * | ||||
| 	 * @return a list of allowed heroes, the index is the hero id and the value either 0 for not allowed or 1 for allowed | ||||
| 	 */ | ||||
| 	std::vector<ui8> getDefaultAllowedHeroes() const; | ||||
| 	std::vector<bool> getDefaultAllowedHeroes() const; | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets a list of default allowed abilities. OH3 abilities/skills are all allowed by default. | ||||
| 	 * | ||||
| 	 * @return a list of allowed abilities, the index is the ability id and the value either 0 for not allowed or 1 for allowed | ||||
| 	 * @return a list of allowed abilities, the index is the ability id | ||||
| 	 */ | ||||
| 	std::vector<ui8> getDefaultAllowedAbilities() const; | ||||
| 	std::vector<bool> getDefaultAllowedAbilities() const; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
|   | ||||
| @@ -679,7 +679,7 @@ public: | ||||
| 	si32 manaDiff; //amount of gained / lost mana | ||||
| 	si32 moraleDiff; //morale modifier | ||||
| 	si32 luckDiff; //luck modifier | ||||
| 	std::vector<si32> resources;//gained / lost resources | ||||
| 	TResources resources;//gained / lost resources | ||||
| 	std::vector<si32> primskills;//gained / lost prim skills | ||||
| 	std::vector<SecondarySkill::SecondarySkill> abilities; //gained abilities | ||||
| 	std::vector<si32> abilityLevels; //levels of gained abilities | ||||
| @@ -730,7 +730,7 @@ public: | ||||
| 	ui32 identifier; //unique code for this monster (used in missions) | ||||
| 	si8 character; //character of this set of creatures (0 - the most friendly, 4 - the most hostile) => on init changed to -4 (compliant) ... 10 value (savage) | ||||
| 	std::string message; //message printed for attacking hero | ||||
| 	std::vector<ui32> resources; //[res_id], resources given to hero that has won with monsters | ||||
| 	TResources resources; // resources given to hero that has won with monsters | ||||
| 	TArtifactID gainedArtifact; //ID of artifact gained to hero, -1 if none | ||||
| 	bool neverFlees; //if true, the troops will never flee | ||||
| 	bool notGrowingTeam; //if true, number of units won't grow | ||||
|   | ||||
| @@ -527,9 +527,9 @@ void CSpellHandler::loadSpells() | ||||
| 	boost::replace_first(spells[Spells::FORGETFULNESS]->attributes, "CREATURE_TARGET", "CREATURE_TARGET_2"); //TODO: use flags instead? | ||||
| } | ||||
|  | ||||
| std::vector<ui8> CSpellHandler::getDefaultAllowedSpells() const | ||||
| std::vector<bool> CSpellHandler::getDefaultAllowedSpells() const | ||||
| { | ||||
| 	std::vector<ui8> allowedSpells; | ||||
| 	allowedSpells.resize(GameConstants::SPELLS_QUANTITY, 1); | ||||
| 	std::vector<bool> allowedSpells; | ||||
| 	allowedSpells.resize(GameConstants::SPELLS_QUANTITY, true); | ||||
| 	return allowedSpells; | ||||
| } | ||||
|   | ||||
| @@ -187,7 +187,7 @@ public: | ||||
| 	 * | ||||
| 	 * @return a list of allowed spells, the index is the spell id and the value either 0 for not allowed or 1 for allowed | ||||
| 	 */ | ||||
| 	std::vector<ui8> getDefaultAllowedSpells() const; | ||||
| 	std::vector<bool> getDefaultAllowedSpells() const; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
|   | ||||
| @@ -580,10 +580,10 @@ public: | ||||
| 	ui8 howManyTeams; | ||||
|  | ||||
| 	/** | ||||
| 	 * A list of allowed heroes. The index is the hero id and the value is either 0 for not allowed or 1 for allowed. | ||||
| 	 * A list of allowed heroes. The index is the hero id and the value = hero allowed. | ||||
| 	 * The default value is a list of default allowed heroes. See CHeroHandler::getDefaultAllowedHeroes for more info. | ||||
| 	 */ | ||||
| 	std::vector<ui8> allowedHeroes; | ||||
| 	std::vector<bool> allowedHeroes; | ||||
|  | ||||
| 	/** A list of placeholded heroes. The index is the id of a hero type. */ | ||||
| 	std::vector<ui16> placeholdedHeroes; | ||||
| @@ -734,13 +734,13 @@ public: | ||||
| 	std::vector<ConstTransitivePtr<CGDefInfo> > customDefs; | ||||
|  | ||||
| 	/** list of allowed spells, index is the spell id */ | ||||
| 	std::vector<ui8> allowedSpell; | ||||
| 	std::vector<bool> allowedSpell; | ||||
|  | ||||
| 	/** list of allowed artifacts, index is the artifact id */ | ||||
| 	std::vector<ui8> allowedArtifact; | ||||
| 	std::vector<bool> allowedArtifact; | ||||
|  | ||||
| 	/** list of allowed abilities, index is the ability id */ | ||||
| 	std::vector<ui8> allowedAbilities; | ||||
| 	std::vector<bool> allowedAbilities; | ||||
|  | ||||
| 	/** list of map events */ | ||||
| 	std::list<ConstTransitivePtr<CMapEvent> > events; | ||||
|   | ||||
| @@ -405,24 +405,11 @@ void CMapLoaderH3M::readTeamInfo() | ||||
|  | ||||
| void CMapLoaderH3M::readAllowedHeroes() | ||||
| { | ||||
| 	int lim = mapHeader->version == EMapFormat::ROE ? 16 : 20; | ||||
|  | ||||
| 	mapHeader->allowedHeroes.resize(VLC->heroh->heroes.size(), true); | ||||
|  | ||||
| 	for(int i = 0; i<lim; ++i) | ||||
| 	{ | ||||
| 		ui8 c = readUI8(); | ||||
| 		for(int yy = 0; yy < 8; ++yy) | ||||
| 		{ | ||||
| 			if(i * 8 + yy < GameConstants::HEROES_QUANTITY) | ||||
| 			{ | ||||
| 				if(c != (c | static_cast<ui8>(std::pow(2., yy)))) | ||||
| 				{ | ||||
| 					mapHeader->allowedHeroes[i * 8 + yy] = false; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	const int bytes = mapHeader->version == EMapFormat::ROE ? 16 : 20; | ||||
|  | ||||
| 	readBitmask(mapHeader->allowedHeroes,bytes,GameConstants::HEROES_QUANTITY, false); | ||||
|  | ||||
| 	// Probably reserved for further heroes | ||||
| 	if(mapHeader->version > EMapFormat::ROE) | ||||
| @@ -457,31 +444,15 @@ void CMapLoaderH3M::readDisposedHeroes() | ||||
|  | ||||
| void CMapLoaderH3M::readAllowedArtifacts() | ||||
| { | ||||
| 	map->allowedArtifact.resize (VLC->arth->artifacts.size()); //handle new artifacts, make them allowed by default | ||||
| 	for (ui32 x = 0; x < map->allowedArtifact.size(); ++x) | ||||
| 	{ | ||||
| 		map->allowedArtifact[x] = true; | ||||
| 	} | ||||
| 	map->allowedArtifact.resize (VLC->arth->artifacts.size(),true); //handle new artifacts, make them allowed by default | ||||
|  | ||||
| 	// Reading allowed artifacts:  17 or 18 bytes | ||||
| 	if(map->version != EMapFormat::ROE) | ||||
| 	{ | ||||
| 		int lim = map->version == EMapFormat::AB ? 17 : 18; | ||||
| 		const int bytes = map->version == EMapFormat::AB ? 17 : 18; | ||||
|  | ||||
| 		readBitmask(map->allowedArtifact,bytes,GameConstants::ARTIFACTS_QUANTITY); | ||||
|  | ||||
| 		for(int i = 0; i < lim; ++i) | ||||
| 		{ | ||||
| 			ui8 c = readUI8(); | ||||
| 			for(int yy = 0; yy < 8; ++yy) | ||||
| 			{ | ||||
| 				if(i * 8 + yy < GameConstants::ARTIFACTS_QUANTITY) | ||||
| 				{ | ||||
| 					if(c == (c | static_cast<ui8>(std::pow(2., yy)))) | ||||
| 					{ | ||||
| 						map->allowedArtifact[i * 8 + yy] = false; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// ban combo artifacts | ||||
| @@ -513,53 +484,20 @@ void CMapLoaderH3M::readAllowedArtifacts() | ||||
| void CMapLoaderH3M::readAllowedSpellsAbilities() | ||||
| { | ||||
| 	// Read allowed spells | ||||
| 	map->allowedSpell.resize(GameConstants::SPELLS_QUANTITY); | ||||
| 	for(ui32 x = 0; x < map->allowedSpell.size(); x++) | ||||
| 	{ | ||||
| 		map->allowedSpell[x] = true; | ||||
| 	} | ||||
| 	map->allowedSpell.resize(GameConstants::SPELLS_QUANTITY, true); | ||||
|  | ||||
| 	// Read allowed abilities | ||||
| 	map->allowedAbilities.resize(GameConstants::SKILL_QUANTITY); | ||||
| 	for(ui32 x = 0; x < map->allowedAbilities.size(); x++) | ||||
| 	{ | ||||
| 		map->allowedAbilities[x] = true; | ||||
| 	} | ||||
| 	map->allowedAbilities.resize(GameConstants::SKILL_QUANTITY, true); | ||||
|  | ||||
| 	if(map->version >= EMapFormat::SOD) | ||||
| 	{ | ||||
| 		// Reading allowed spells (9 bytes) | ||||
| 		for(int i = 0; i < 9; ++i) | ||||
| 		{ | ||||
| 			ui8 c = readUI8(); | ||||
| 			for(int yy = 0; yy < 8; ++yy) | ||||
| 			{ | ||||
| 				if(i * 8 + yy < GameConstants::SPELLS_QUANTITY) | ||||
| 				{ | ||||
| 					if(c == (c | static_cast<ui8>(std::pow(2., yy)))) | ||||
| 					{ | ||||
| 						map->allowedSpell[i* 8 + yy] = false; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		const int spell_bytes = 9; | ||||
| 		readBitmask(map->allowedSpell, spell_bytes, GameConstants::SPELLS_QUANTITY); | ||||
|  | ||||
| 		// Allowed hero's abilities (4 bytes) | ||||
| 		for(int i = 0; i < 4; ++i) | ||||
| 		{ | ||||
| 			ui8 c = readUI8(); | ||||
| 			for(int yy = 0; yy < 8; ++yy) | ||||
| 			{ | ||||
| 				if(i * 8 + yy < GameConstants::SKILL_QUANTITY) | ||||
| 				{ | ||||
| 					if(c == (c | static_cast<ui8>(std::pow(2., yy)))) | ||||
| 					{ | ||||
| 						map->allowedAbilities[i * 8 + yy] = false; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		const int abil_bytes = 4; | ||||
| 		readBitmask(map->allowedAbilities, abil_bytes, GameConstants::SKILL_QUANTITY); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -629,20 +567,7 @@ void CMapLoaderH3M::readPredefinedHeroes() | ||||
| 				// are spells | ||||
| 				if(readBool()) | ||||
| 				{ | ||||
| 					for(int i = 0; i < 9; ++i) | ||||
| 					{ | ||||
| 						ui8 c = readUI8(); | ||||
| 						for(int yy = 0; yy < 8; ++yy) | ||||
| 						{ | ||||
| 							if(i * 8 + yy < GameConstants::SPELLS_QUANTITY) | ||||
| 							{ | ||||
| 								if(c == (c | static_cast<ui8>(std::pow(2., yy)))) | ||||
| 								{ | ||||
| 									hero->spells.insert(i * 8 + yy); | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 					readSpells(hero->spells); | ||||
| 				} | ||||
|  | ||||
| 				// customPrimSkills | ||||
| @@ -914,7 +839,7 @@ void CMapLoaderH3M::readObjects() | ||||
|  | ||||
| 					if(readBool()) | ||||
| 					{ | ||||
| 						readCreatureSet(evnt, 7, map->version > EMapFormat::ROE); | ||||
| 						readCreatureSet(evnt, 7); | ||||
| 					} | ||||
| 					skip(4); | ||||
| 				} | ||||
| @@ -923,11 +848,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 				evnt->moraleDiff = readSI8(); | ||||
| 				evnt->luckDiff = readSI8(); | ||||
|  | ||||
| 				evnt->resources.resize(GameConstants::RESOURCE_QUANTITY); | ||||
| 				for(int x = 0; x < 7; ++x) | ||||
| 				{ | ||||
| 					evnt->resources[x] = readUI32(); | ||||
| 				} | ||||
| 				readResourses(evnt->resources); | ||||
|  | ||||
| 				evnt->primskills.resize(GameConstants::PRIMARY_SKILLS); | ||||
| 				for(int x = 0; x < 4; ++x) | ||||
| @@ -962,7 +883,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 				} | ||||
|  | ||||
| 				int gcre = readUI8(); //number of gained creatures | ||||
| 				readCreatureSet(&evnt->creatures, gcre, map->version > EMapFormat::ROE); | ||||
| 				readCreatureSet(&evnt->creatures, gcre); | ||||
|  | ||||
| 				skip(8); | ||||
| 				evnt->availableFor = readUI8(); | ||||
| @@ -1059,11 +980,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 				if(readBool()) //true if there is message or treasury | ||||
| 				{ | ||||
| 					cre->message = readString(); | ||||
| 					cre->resources.resize(GameConstants::RESOURCE_QUANTITY); | ||||
| 					for(int j = 0; j < 7; ++j) | ||||
| 					{ | ||||
| 						cre->resources[j] = readUI32(); | ||||
| 					} | ||||
| 					readResourses(cre->resources); | ||||
|  | ||||
| 					int artID; | ||||
| 					if (map->version == EMapFormat::ROE) | ||||
| @@ -1167,7 +1084,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 				nobj = gar; | ||||
| 				nobj->setOwner(readUI8()); | ||||
| 				skip(3); | ||||
| 				readCreatureSet(gar, 7, map->version > EMapFormat::ROE); | ||||
| 				readCreatureSet(gar, 7); | ||||
| 				if(map->version > EMapFormat::ROE) | ||||
| 				{ | ||||
| 					gar->removableUnits = readBool(); | ||||
| @@ -1197,7 +1114,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 					art->message = readString(); | ||||
| 					if(readBool()) | ||||
| 					{ | ||||
| 						readCreatureSet(art, 7, map->version > EMapFormat::ROE); | ||||
| 						readCreatureSet(art, 7); | ||||
| 					} | ||||
| 					skip(4); | ||||
| 				} | ||||
| @@ -1227,7 +1144,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 					res->message = readString(); | ||||
| 					if(readBool()) | ||||
| 					{ | ||||
| 						readCreatureSet(res, 7, map->version > EMapFormat::ROE); | ||||
| 						readCreatureSet(res, 7); | ||||
| 					} | ||||
| 					skip(4); | ||||
| 				} | ||||
| @@ -1289,7 +1206,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 					box->message = readString(); | ||||
| 					if(readBool()) | ||||
| 					{ | ||||
| 						readCreatureSet(box, 7, map->version > EMapFormat::ROE); | ||||
| 						readCreatureSet(box, 7); | ||||
| 					} | ||||
| 					skip(4); | ||||
| 				} | ||||
| @@ -1299,11 +1216,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 				box->moraleDiff = readSI8(); | ||||
| 				box->luckDiff = readSI8(); | ||||
|  | ||||
| 				box->resources.resize(GameConstants::RESOURCE_QUANTITY); | ||||
| 				for(int x = 0; x < 7; ++x) | ||||
| 				{ | ||||
| 					box->resources[x] = readUI32(); | ||||
| 				} | ||||
| 				readResourses(box->resources); | ||||
|  | ||||
| 				box->primskills.resize(GameConstants::PRIMARY_SKILLS); | ||||
| 				for(int x = 0; x < 4; ++x) | ||||
| @@ -1335,7 +1248,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 					box->spells.push_back(readUI8()); | ||||
| 				} | ||||
| 				int gcre = readUI8(); //number of gained creatures | ||||
| 				readCreatureSet(&box->creatures, gcre, map->version > EMapFormat::ROE); | ||||
| 				readCreatureSet(&box->creatures, gcre); | ||||
| 				skip(8); | ||||
| 				break; | ||||
| 			} | ||||
| @@ -1591,8 +1504,9 @@ void CMapLoaderH3M::readObjects() | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number, bool version) | ||||
| void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number) | ||||
| { | ||||
| 	const bool version = (map->version > EMapFormat::ROE); | ||||
| 	const int maxID = version ? 0xffff : 0xff; | ||||
|  | ||||
| 	for(int ir = 0; ir < number; ++ir) | ||||
| @@ -1720,7 +1634,7 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven) | ||||
| 	// True if hero has nonstandard garrison | ||||
| 	if(readBool()) | ||||
| 	{ | ||||
| 		readCreatureSet(nhi, 7, map->version > EMapFormat::ROE); | ||||
| 		readCreatureSet(nhi, 7); | ||||
| 	} | ||||
|  | ||||
| 	nhi->formation = readUI8(); | ||||
| @@ -1761,20 +1675,8 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven) | ||||
| 		if(readBool()) | ||||
| 		{ | ||||
| 			nhi->spells.insert(0xffffffff); //placeholder "preset spells" | ||||
| 			for(int i = 0; i < 9; ++i) | ||||
| 			{ | ||||
| 				ui8 c = readUI8(); | ||||
| 				for(int yy = 0; yy < 8; ++yy) | ||||
| 				{ | ||||
| 					if(i * 8 + yy < GameConstants::SPELLS_QUANTITY) | ||||
| 					{ | ||||
| 						if(c == (c | static_cast<ui8>(std::pow(2., yy)))) | ||||
| 						{ | ||||
| 							nhi->spells.insert(i * 8 + yy); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			readSpells(nhi->spells); | ||||
| 		} | ||||
| 	} | ||||
| 	else if(map->version == EMapFormat::AB) | ||||
| @@ -2017,7 +1919,7 @@ CGTownInstance * CMapLoaderH3M::readTown(int castleID) | ||||
| 	// True if garrison isn't empty | ||||
| 	if(readBool()) | ||||
| 	{ | ||||
| 		readCreatureSet(nt, 7, map->version > EMapFormat::ROE); | ||||
| 		readCreatureSet(nt, 7); | ||||
| 	} | ||||
| 	nt->formation = readUI8(); | ||||
|  | ||||
| @@ -2107,6 +2009,9 @@ CGTownInstance * CMapLoaderH3M::readTown(int castleID) | ||||
| 		nce->town = nt; | ||||
| 		nce->name = readString(); | ||||
| 		nce->message = readString(); | ||||
|  | ||||
| 		readResourses(nce->resources); | ||||
|  | ||||
| 		for(int x = 0; x < 7; ++x) | ||||
| 		{ | ||||
| 			nce->resources[x] = readUI32(); | ||||
| @@ -2230,10 +2135,7 @@ void CMapLoaderH3M::readEvents() | ||||
| 		ne->name = readString(); | ||||
| 		ne->message = readString(); | ||||
|  | ||||
| 		for(int k = 0; k < 7; ++k) | ||||
| 		{ | ||||
| 			ne->resources[k] = readUI32(); | ||||
| 		} | ||||
| 		readResourses(ne->resources); | ||||
| 		ne->players = readUI8(); | ||||
| 		if(map->version > EMapFormat::AB) | ||||
| 		{ | ||||
| @@ -2253,6 +2155,52 @@ void CMapLoaderH3M::readEvents() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMapLoaderH3M::readSpells(std::set<TSpell>& dest) | ||||
| { | ||||
| 	for(int byte  = 0; byte < 9; ++byte) | ||||
| 	{ | ||||
| 		ui8 c = readUI8(); | ||||
| 		for(int bit = 0; bit < 8; ++bit) | ||||
| 		{ | ||||
| 			if(byte * 8 + bit < GameConstants::SPELLS_QUANTITY) | ||||
| 			{ | ||||
| 				if(c & (1 << bit)) | ||||
| 				{ | ||||
| 					dest.insert(byte * 8 + bit); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMapLoaderH3M::readResourses(TResources& resources) | ||||
| { | ||||
| 	resources.resize(GameConstants::RESOURCE_QUANTITY); //needed? | ||||
| 	for(int x = 0; x < 7; ++x) | ||||
| 	{ | ||||
| 		resources[x] = readUI32(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| void CMapLoaderH3M::readBitmask(std::vector<bool>& dest, const int byteCount, const int limit, bool negate) | ||||
| { | ||||
| 	for(int byte = 0; byte < byteCount; ++byte) | ||||
| 	{ | ||||
| 		const ui8 mask = readUI8(); | ||||
| 		for(int bit = 0; bit < 8; ++bit) | ||||
| 		{ | ||||
| 			if(byte * 8 + bit < limit) | ||||
| 			{ | ||||
| 				const bool flag = mask & (1 << bit); | ||||
| 				if((negate && flag) || (!negate && !flag)) | ||||
| 					dest[byte * 8 + bit] = false; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| ui8 CMapLoaderH3M::reverse(ui8 arg) | ||||
| { | ||||
| 	ui8 ret = 0; | ||||
|   | ||||
| @@ -12,6 +12,8 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "CMapService.h" | ||||
| #include "../GameConstants.h" | ||||
| #include "../ResourceSet.h" | ||||
|  | ||||
| #include "../vcmi_endian.h" | ||||
| #include "../int3.h" | ||||
| @@ -159,9 +161,8 @@ private: | ||||
| 	 * | ||||
| 	 * @param out the loaded creature set | ||||
| 	 * @param number the count of creatures to read | ||||
| 	 * @param version true for > ROE maps | ||||
| 	 */ | ||||
| 	void readCreatureSet(CCreatureSet * out, int number, bool version); | ||||
| 	void readCreatureSet(CCreatureSet * out, int number); | ||||
|  | ||||
| 	/** | ||||
| 	 * Reads a hero. | ||||
| @@ -208,6 +209,18 @@ private: | ||||
| 	 */ | ||||
| 	void readEvents(); | ||||
|  | ||||
| 	void readSpells(std::set<TSpell> & dest); | ||||
|  | ||||
| 	void readResourses(TResources& resources); | ||||
|  | ||||
| 	/** Reads bitmask to boolean vector | ||||
| 	* @param dest destination vector, shall be filed with "true" values | ||||
| 	* @param byteCount size in bytes of bimask | ||||
| 	* @param limit max count of vector elements to alter | ||||
| 	* @param negate if true then set bit in mask means clear flag in vertor | ||||
| 	*/ | ||||
| 	void readBitmask(std::vector<bool> & dest, const int byteCount, const int limit, bool negate = true); | ||||
|  | ||||
| 	/** | ||||
| 	 * Reverses the input argument. | ||||
| 	 * | ||||
| @@ -216,8 +229,6 @@ private: | ||||
| 	 */ | ||||
| 	ui8 reverse(ui8 arg); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	* Helper to read ui8 from buffer | ||||
| 	*/ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user