mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	* refactoring, including a generic solution for IDs
This commit is contained in:
		| @@ -1126,7 +1126,7 @@ void VCAI::performObjectInteraction(const CGObjectInstance * obj, HeroPtr h) | ||||
| 			{ | ||||
| 				townVisitsThisWeek[h].push_back(h->visitedTown); | ||||
| 				if (!h->hasSpellbook() && cb->getResourceAmount(Res::GOLD) >= GameConstants::SPELLBOOK_GOLD_COST + saving[Res::GOLD] && | ||||
| 					h->visitedTown->hasBuilt (EBuilding::MAGES_GUILD_1)) | ||||
| 					h->visitedTown->hasBuilt (BuildingID::MAGES_GUILD_1)) | ||||
| 					cb->buyArtifact(h.get(), ArtifactID::SPELLBOOK); | ||||
| 			} | ||||
| 			break; | ||||
| @@ -1243,7 +1243,7 @@ void VCAI::recruitCreatures(const CGDwelling * d) | ||||
| 			continue; | ||||
|  | ||||
| 		int count = d->creatures[i].first; | ||||
| 		CreatureID::CreatureID creID = d->creatures[i].second.back(); | ||||
| 		CreatureID creID = d->creatures[i].second.back(); | ||||
| //		const CCreature *c = VLC->creh->creatures[creID]; | ||||
| // 		if(containsSavedRes(c->cost)) | ||||
| // 			continue; | ||||
| @@ -1348,20 +1348,22 @@ bool VCAI::tryBuildNextStructure(const CGTownInstance * t, std::vector<int> buil | ||||
|  | ||||
| void VCAI::buildStructure(const CGTownInstance * t) | ||||
| { | ||||
| 	using namespace EBuilding; | ||||
| 	//TODO make *real* town development system | ||||
| 	//TODO: faction-specific development: use special buildings, build dwellings in better order, etc | ||||
| 	//TODO: build resource silo, defences when needed | ||||
| 	//Possible - allow "locking" on specific building (build prerequisites and then building itself) | ||||
|  | ||||
| 	//Set of buildings for different goals. Does not include any prerequisites. | ||||
| 	const int essential[] = {TAVERN, TOWN_HALL}; | ||||
| 	const int goldSource[] = {TOWN_HALL, CITY_HALL, CAPITOL}; | ||||
| 	const int essential[] = {BuildingID::TAVERN, BuildingID::TOWN_HALL}; | ||||
| 	const int goldSource[] = {BuildingID::TOWN_HALL, BuildingID::CITY_HALL, BuildingID::CAPITOL}; | ||||
| 	const int unitsSource[] = { 30, 31, 32, 33, 34, 35, 36}; | ||||
| 	const int unitsUpgrade[] = { 37, 38, 39, 40, 41, 42, 43}; | ||||
| 	const int unitGrowth[] = { FORT, CITADEL, CASTLE, HORDE_1, HORDE_1_UPGR, HORDE_2, HORDE_2_UPGR}; | ||||
| 	const int spells[] = {MAGES_GUILD_1, MAGES_GUILD_2, MAGES_GUILD_3, MAGES_GUILD_4, MAGES_GUILD_5}; | ||||
| 	const int extra[] = {RESOURCE_SILO, SPECIAL_1, SPECIAL_2, SPECIAL_3, SPECIAL_4, SHIPYARD}; // all remaining buildings | ||||
| 	const int unitGrowth[] = { BuildingID::FORT, BuildingID::CITADEL, BuildingID::CASTLE, BuildingID::HORDE_1, | ||||
| 		BuildingID::HORDE_1_UPGR, BuildingID::HORDE_2, BuildingID::HORDE_2_UPGR}; | ||||
| 	const int spells[] = {BuildingID::MAGES_GUILD_1, BuildingID::MAGES_GUILD_2, BuildingID::MAGES_GUILD_3, | ||||
| 		BuildingID::MAGES_GUILD_4, BuildingID::MAGES_GUILD_5}; | ||||
| 	const int extra[] = {BuildingID::RESOURCE_SILO, BuildingID::SPECIAL_1, BuildingID::SPECIAL_2, BuildingID::SPECIAL_3, | ||||
| 		BuildingID::SPECIAL_4, BuildingID::SHIPYARD}; // all remaining buildings | ||||
|  | ||||
| 	TResources currentRes = cb->getResourceAmount(); | ||||
| 	TResources income = estimateIncome(); | ||||
| @@ -2014,7 +2016,7 @@ void VCAI::tryRealize(CGoal g) | ||||
| const CGTownInstance * VCAI::findTownWithTavern() const | ||||
| { | ||||
| 	BOOST_FOREACH(const CGTownInstance *t, cb->getTownsInfo()) | ||||
| 		if(t->hasBuilt(EBuilding::TAVERN) && !t->visitingHero) | ||||
| 		if(t->hasBuilt(BuildingID::TAVERN) && !t->visitingHero) | ||||
| 			return t; | ||||
|  | ||||
| 	return NULL; | ||||
| @@ -2445,7 +2447,7 @@ TResources VCAI::estimateIncome() const | ||||
| 		ret[Res::GOLD] += t->dailyIncome(); | ||||
|  | ||||
| 		//TODO duplikuje newturn | ||||
| 		if(t->hasBuilt(EBuilding::RESOURCE_SILO)) //there is resource silo | ||||
| 		if(t->hasBuilt(BuildingID::RESOURCE_SILO)) //there is resource silo | ||||
| 		{ | ||||
| 			if(t->town->primaryRes == 127) //we'll give wood and ore | ||||
| 			{ | ||||
| @@ -2779,10 +2781,10 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 					if(auto h = ai->getHeroWithGrail()) | ||||
| 					{ | ||||
| 						//hero is in a town that can host Grail | ||||
| 						if(h->visitedTown && !vstd::contains(h->visitedTown->forbiddenBuildings, EBuilding::GRAIL)) | ||||
| 						if(h->visitedTown && !vstd::contains(h->visitedTown->forbiddenBuildings, BuildingID::GRAIL)) | ||||
| 						{ | ||||
| 							const CGTownInstance *t = h->visitedTown; | ||||
| 							return CGoal(BUILD_STRUCTURE).setbid(EBuilding::GRAIL).settown(t); | ||||
| 							return CGoal(BUILD_STRUCTURE).setbid(BuildingID::GRAIL).settown(t); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| @@ -2790,7 +2792,7 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 							towns.erase(boost::remove_if(towns, | ||||
| 												[](const CGTownInstance *t) -> bool | ||||
| 												{ | ||||
| 													return vstd::contains(t->forbiddenBuildings, EBuilding::GRAIL); | ||||
| 													return vstd::contains(t->forbiddenBuildings, BuildingID::GRAIL); | ||||
| 												}), | ||||
| 										towns.end()); | ||||
| 							boost::sort(towns, isCloser); | ||||
| @@ -2951,7 +2953,7 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 			{ | ||||
| 				if (vstd::contains(ai->alreadyVisited, obj)) | ||||
| 					return true; | ||||
| 				switch (obj->ID) | ||||
| 				switch (obj->ID.num) | ||||
| 				{ | ||||
| 					case Obj::REDWOOD_OBSERVATORY: | ||||
| 					case Obj::PILLAR_OF_FIRE: | ||||
| @@ -2997,7 +2999,7 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 				{ | ||||
| 					erase_if (objs, [&](const CGObjectInstance *obj) -> bool | ||||
| 					{ | ||||
| 						switch (obj->ID) | ||||
| 						switch (obj->ID.num) | ||||
| 						{ | ||||
| 							case Obj::CARTOGRAPHER: | ||||
| 							case Obj::SUBTERRANEAN_GATE: | ||||
| @@ -3061,7 +3063,7 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 		{ | ||||
| 			const CGTownInstance *t = ai->findTownWithTavern(); | ||||
| 			if(!t) | ||||
| 				return CGoal(BUILD_STRUCTURE).setbid(EBuilding::TAVERN); | ||||
| 				return CGoal(BUILD_STRUCTURE).setbid(BuildingID::TAVERN); | ||||
|  | ||||
| 			if(cb->getResourceAmount(Res::GOLD) < HERO_GOLD_COST) | ||||
| 				return CGoal(COLLECT_RES).setresID(Res::GOLD).setvalue(HERO_GOLD_COST); | ||||
| @@ -3162,8 +3164,8 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 			{ | ||||
| 				BOOST_FOREACH(const CGTownInstance *t, cb->getTownsInfo()) | ||||
| 				{ | ||||
| 					if(cb->canBuildStructure(t, EBuilding::MARKETPLACE) == EBuildingState::ALLOWED) | ||||
| 						return CGoal(BUILD_STRUCTURE).settown(t).setbid(EBuilding::MARKETPLACE); | ||||
| 					if(cb->canBuildStructure(t, BuildingID::MARKETPLACE) == EBuildingState::ALLOWED) | ||||
| 						return CGoal(BUILD_STRUCTURE).settown(t).setbid(BuildingID::MARKETPLACE); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| @@ -3202,7 +3204,7 @@ TSubgoal CGoal::whatToDoToAchieve() | ||||
| 					auto creatures = t->town->creatures[creature->level]; | ||||
| 					int upgradeNumber = std::find(creatures.begin(), creatures.end(), creature->idNumber) - creatures.begin(); | ||||
|  | ||||
| 					int bid = EBuilding::DWELL_FIRST + creature->level + upgradeNumber * GameConstants::CREATURES_PER_TOWN; | ||||
| 					int bid = BuildingID::DWELL_FIRST + creature->level + upgradeNumber * GameConstants::CREATURES_PER_TOWN; | ||||
| 					if (t->hasBuilt(bid)) //this assumes only creatures with dwellings are assigned to faction | ||||
| 					{ | ||||
| 						dwellings.push_back(t); | ||||
| @@ -3758,7 +3760,7 @@ int3 SectorMap::firstTileToGet(HeroPtr h, crint3 dst) | ||||
| 					std::vector<const IShipyard *> shipyards; | ||||
| 					BOOST_FOREACH(const CGTownInstance *t, cb->getTownsInfo()) | ||||
| 					{ | ||||
| 						if(t->hasBuilt(EBuilding::SHIPYARD)) | ||||
| 						if(t->hasBuilt(BuildingID::SHIPYARD)) | ||||
| 							shipyards.push_back(t); | ||||
| 					} | ||||
|  | ||||
|   | ||||
| @@ -69,7 +69,7 @@ int CCallback::selectionMade(int selection, int queryID) | ||||
| 	return sendRequest(&pack); | ||||
| } | ||||
|  | ||||
| void CCallback::recruitCreatures(const CGObjectInstance *obj, CreatureID::CreatureID ID, ui32 amount, si32 level/*=-1*/) | ||||
| void CCallback::recruitCreatures(const CGObjectInstance *obj, CreatureID ID, ui32 amount, si32 level/*=-1*/) | ||||
| { | ||||
| 	if(player!=obj->tempOwner  &&  obj->ID != Obj::WAR_MACHINE_FACTORY) | ||||
| 		return; | ||||
| @@ -88,7 +88,7 @@ bool CCallback::dismissCreature(const CArmedInstance *obj, int stackPos) | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| bool CCallback::upgradeCreature(const CArmedInstance *obj, int stackPos, CreatureID::CreatureID newID) | ||||
| bool CCallback::upgradeCreature(const CArmedInstance *obj, int stackPos, CreatureID newID) | ||||
| { | ||||
| 	UpgradeCreature pack(stackPos,obj->id,newID); | ||||
| 	sendRequest(&pack); | ||||
| @@ -205,7 +205,7 @@ void CCallback::swapGarrisonHero( const CGTownInstance *town ) | ||||
| 	sendRequest(&pack); | ||||
| } | ||||
|  | ||||
| void CCallback::buyArtifact(const CGHeroInstance *hero, ArtifactID::ArtifactID aid) | ||||
| void CCallback::buyArtifact(const CGHeroInstance *hero, ArtifactID aid) | ||||
| { | ||||
| 	if(hero->tempOwner != player) return; | ||||
|  | ||||
| @@ -329,7 +329,7 @@ void CCallback::dig( const CGObjectInstance *hero ) | ||||
| 	sendRequest(&dwh); | ||||
| } | ||||
|  | ||||
| void CCallback::castSpell(const CGHeroInstance *hero, int spellID, const int3 &pos) | ||||
| void CCallback::castSpell(const CGHeroInstance *hero, SpellID spellID, const int3 &pos) | ||||
| { | ||||
| 	CastAdvSpell cas; | ||||
| 	cas.hid = hero->id; | ||||
|   | ||||
							
								
								
									
										16
									
								
								CCallback.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								CCallback.h
									
									
									
									
									
								
							| @@ -45,13 +45,13 @@ public: | ||||
| 	virtual bool moveHero(const CGHeroInstance *h, int3 dst) =0; //dst must be free, neighbouring tile (this function can move hero only by one tile) | ||||
| 	virtual bool dismissHero(const CGHeroInstance * hero)=0; //dismisses given hero; true - successfuly, false - not successfuly | ||||
| 	virtual void dig(const CGObjectInstance *hero)=0;  | ||||
| 	virtual void castSpell(const CGHeroInstance *hero, int spellID, const int3 &pos = int3(-1, -1, -1))=0; //cast adventure map spell | ||||
| 	virtual void castSpell(const CGHeroInstance *hero, SpellID spellID, const int3 &pos = int3(-1, -1, -1))=0; //cast adventure map spell | ||||
|  | ||||
| 	//town | ||||
| 	virtual void recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero)=0; | ||||
| 	virtual bool buildBuilding(const CGTownInstance *town, si32 buildingID)=0; | ||||
| 	virtual void recruitCreatures(const CGObjectInstance *obj, CreatureID::CreatureID ID, ui32 amount, si32 level=-1)=0; | ||||
| 	virtual bool upgradeCreature(const CArmedInstance *obj, int stackPos, CreatureID::CreatureID newID=CreatureID::NONE)=0; //if newID==-1 then best possible upgrade will be made | ||||
| 	virtual void recruitCreatures(const CGObjectInstance *obj, CreatureID ID, ui32 amount, si32 level=-1)=0; | ||||
| 	virtual bool upgradeCreature(const CArmedInstance *obj, int stackPos, CreatureID newID=CreatureID::NONE)=0; //if newID==-1 then best possible upgrade will be made | ||||
| 	virtual void swapGarrisonHero(const CGTownInstance *town)=0; | ||||
|  | ||||
| 	virtual void trade(const CGObjectInstance *market, EMarketMode::EMarketMode mode, int id1, int id2, int val1, const CGHeroInstance *hero = NULL)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce | ||||
| @@ -66,7 +66,7 @@ public: | ||||
| 	virtual bool assembleArtifacts(const CGHeroInstance * hero, ArtifactPosition::ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo)=0; | ||||
| 	virtual bool dismissCreature(const CArmedInstance *obj, int stackPos)=0; | ||||
| 	virtual void endTurn()=0; | ||||
| 	virtual void buyArtifact(const CGHeroInstance *hero, ArtifactID::ArtifactID aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith) | ||||
| 	virtual void buyArtifact(const CGHeroInstance *hero, ArtifactID aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith) | ||||
| 	virtual void setFormation(const CGHeroInstance * hero, bool tight)=0; | ||||
| 	virtual void setSelection(const CArmedInstance * obj)=0; | ||||
|  | ||||
| @@ -128,12 +128,12 @@ public: | ||||
| 	//bool moveArtifact(const CStackInstance * stack, ui16 src , const CGHeroInstance * hero, ui16 dest); // TODO: unify classes | ||||
| 	bool assembleArtifacts(const CGHeroInstance * hero, ArtifactPosition::ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo); | ||||
| 	bool buildBuilding(const CGTownInstance *town, si32 buildingID); | ||||
| 	void recruitCreatures(const CGObjectInstance *obj, CreatureID::CreatureID ID, ui32 amount, si32 level=-1); | ||||
| 	void recruitCreatures(const CGObjectInstance *obj, CreatureID ID, ui32 amount, si32 level=-1); | ||||
| 	bool dismissCreature(const CArmedInstance *obj, int stackPos); | ||||
| 	bool upgradeCreature(const CArmedInstance *obj, int stackPos, CreatureID::CreatureID newID=CreatureID::NONE) OVERRIDE; | ||||
| 	bool upgradeCreature(const CArmedInstance *obj, int stackPos, CreatureID newID=CreatureID::NONE) OVERRIDE; | ||||
| 	void endTurn(); | ||||
| 	void swapGarrisonHero(const CGTownInstance *town); | ||||
| 	void buyArtifact(const CGHeroInstance *hero, ArtifactID::ArtifactID aid) OVERRIDE; | ||||
| 	void buyArtifact(const CGHeroInstance *hero, ArtifactID aid) OVERRIDE; | ||||
| 	void trade(const CGObjectInstance *market, EMarketMode::EMarketMode mode, int id1, int id2, int val1, const CGHeroInstance *hero = NULL); | ||||
| 	void setFormation(const CGHeroInstance * hero, bool tight); | ||||
| 	void setSelection(const CArmedInstance * obj); | ||||
| @@ -142,7 +142,7 @@ public: | ||||
| 	void sendMessage(const std::string &mess); | ||||
| 	void buildBoat(const IShipyard *obj); | ||||
| 	void dig(const CGObjectInstance *hero);  | ||||
| 	void castSpell(const CGHeroInstance *hero, int spellID, const int3 &pos = int3(-1, -1, -1)); | ||||
| 	void castSpell(const CGHeroInstance *hero, SpellID spellID, const int3 &pos = int3(-1, -1, -1)); | ||||
|  | ||||
| //friends | ||||
| 	friend class CClient; | ||||
|   | ||||
| @@ -1615,12 +1615,12 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc ) | ||||
|  | ||||
| 	switch(sc->id) | ||||
| 	{ | ||||
| 	case Spells::MAGIC_ARROW: | ||||
| 	case SpellID::MAGIC_ARROW: | ||||
| 		{ | ||||
| 			//initialization of anims | ||||
| 			anims.push_back("C20SPX0.DEF"); anims.push_back("C20SPX1.DEF"); anims.push_back("C20SPX2.DEF"); anims.push_back("C20SPX3.DEF"); anims.push_back("C20SPX4.DEF"); | ||||
| 		} | ||||
| 	case Spells::ICE_BOLT: | ||||
| 	case SpellID::ICE_BOLT: | ||||
| 		{ | ||||
| 			if(anims.size() == 0) //initialization of anims | ||||
| 			{ | ||||
| @@ -1669,33 +1669,33 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc ) | ||||
|  | ||||
| 			break; //for 15 and 16 cases | ||||
| 		} | ||||
| 	case Spells::LIGHTNING_BOLT: | ||||
| 	case Spells::TITANS_LIGHTNING_BOLT: | ||||
| 	case Spells::THUNDERBOLT: | ||||
| 	case Spells::CHAIN_LIGHTNING: //TODO: zigzag effect | ||||
| 	case SpellID::LIGHTNING_BOLT: | ||||
| 	case SpellID::TITANS_LIGHTNING_BOLT: | ||||
| 	case SpellID::THUNDERBOLT: | ||||
| 	case SpellID::CHAIN_LIGHTNING: //TODO: zigzag effect | ||||
| 		for (auto it = sc->affectedCres.begin(); it != sc->affectedCres.end(); ++it) //in case we have multiple targets | ||||
| 		{ | ||||
| 			displayEffect(1, curInt->cb->battleGetStackByID(*it, false)->position); | ||||
| 			displayEffect(spell.mainEffectAnim, curInt->cb->battleGetStackByID(*it, false)->position); | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::DISPEL: | ||||
| 	case Spells::CURE: | ||||
| 	case Spells::RESURRECTION: | ||||
| 	case Spells::ANIMATE_DEAD: | ||||
| 	case Spells::DISPEL_HELPFUL_SPELLS: | ||||
| 	case Spells::SACRIFICE: //TODO: animation upon killed stack | ||||
| 	case SpellID::DISPEL: | ||||
| 	case SpellID::CURE: | ||||
| 	case SpellID::RESURRECTION: | ||||
| 	case SpellID::ANIMATE_DEAD: | ||||
| 	case SpellID::DISPEL_HELPFUL_SPELLS: | ||||
| 	case SpellID::SACRIFICE: //TODO: animation upon killed stack | ||||
| 		for(std::set<ui32>::const_iterator it = sc->affectedCres.begin(); it != sc->affectedCres.end(); ++it) | ||||
| 		{ | ||||
| 			displayEffect(spell.mainEffectAnim, curInt->cb->battleGetStackByID(*it, false)->position); | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::SUMMON_FIRE_ELEMENTAL: | ||||
| 	case Spells::SUMMON_EARTH_ELEMENTAL: | ||||
| 	case Spells::SUMMON_WATER_ELEMENTAL: | ||||
| 	case Spells::SUMMON_AIR_ELEMENTAL: | ||||
| 	case Spells::CLONE: | ||||
| 	case Spells::REMOVE_OBSTACLE: | ||||
| 	case SpellID::SUMMON_FIRE_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_EARTH_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_WATER_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_AIR_ELEMENTAL: | ||||
| 	case SpellID::CLONE: | ||||
| 	case SpellID::REMOVE_OBSTACLE: | ||||
| 		addNewAnim(new CDummyAnimation(this, 2)); //interface won't return until animation is played. TODO: make it smarter? | ||||
| 		break; | ||||
| 	} //switch(sc->id) | ||||
| @@ -1724,32 +1724,32 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc ) | ||||
| 		{ | ||||
| 			switch(sc->id) | ||||
| 			{ | ||||
| 				case Spells::STONE_GAZE: | ||||
| 				case SpellID::STONE_GAZE: | ||||
| 					customSpell = true; | ||||
| 					plural = true; | ||||
| 					textID = 558; | ||||
| 					break; | ||||
| 				case Spells::POISON: | ||||
| 				case SpellID::POISON: | ||||
| 					customSpell = true; | ||||
| 					plural = true; | ||||
| 					textID = 561; | ||||
| 					break; | ||||
| 				case Spells::BIND: | ||||
| 				case SpellID::BIND: | ||||
| 					customSpell = true; | ||||
| 					text = CGI->generaltexth->allTexts[560]; | ||||
| 					boost::algorithm::replace_first(text, "%s", curInt->cb->battleGetStackByID(*sc->affectedCres.begin(), false)->getCreature()->namePl ); | ||||
| 					break;	//Roots and vines bind the %s to the ground! | ||||
| 				case Spells::DISEASE: | ||||
| 				case SpellID::DISEASE: | ||||
| 					customSpell = true; | ||||
| 					plural = true; | ||||
| 					textID = 553; | ||||
| 					break; | ||||
| 				case Spells::PARALYZE: | ||||
| 				case SpellID::PARALYZE: | ||||
| 					customSpell = true; | ||||
| 					plural = true; | ||||
| 					textID = 563; | ||||
| 					break; | ||||
| 				case Spells::AGE: | ||||
| 				case SpellID::AGE: | ||||
| 				{ | ||||
| 					customSpell = true; | ||||
| 					if (curInt->cb->battleGetStackByID(*sc->affectedCres.begin())->count > 1) | ||||
| @@ -1768,7 +1768,7 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc ) | ||||
| 					boost::algorithm::replace_first(text, "%d", boost::lexical_cast<std::string>(bl->totalValue()/2)); | ||||
| 				} | ||||
| 					break; | ||||
| 				case Spells::THUNDERBOLT: | ||||
| 				case SpellID::THUNDERBOLT: | ||||
| 					text = CGI->generaltexth->allTexts[367]; | ||||
| 					boost::algorithm::replace_first(text, "%s", curInt->cb->battleGetStackByID(*sc->affectedCres.begin())->type->namePl); | ||||
| 					console->addText(text); | ||||
| @@ -1778,12 +1778,12 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc ) | ||||
| 					customSpell = true; | ||||
| 					text = ""; //yeah, it's a terrible mess | ||||
| 					break; | ||||
| 				case Spells::DISPEL_HELPFUL_SPELLS: | ||||
| 				case SpellID::DISPEL_HELPFUL_SPELLS: | ||||
| 					text = CGI->generaltexth->allTexts[555]; | ||||
| 					boost::algorithm::replace_first(text, "%s", curInt->cb->battleGetStackByID(*sc->affectedCres.begin())->type->namePl); | ||||
| 					customSpell = true; | ||||
| 					break; | ||||
| 				case Spells::DEATH_STARE: | ||||
| 				case SpellID::DEATH_STARE: | ||||
| 					customSpell = true; | ||||
| 					if (sc->dmgToDisplay) | ||||
| 					{ | ||||
| @@ -1942,7 +1942,7 @@ void CBattleInterface::castThisSpell(int spellID) | ||||
| 		spellSelMode = ANY_LOCATION; | ||||
| 	} | ||||
|  | ||||
| 	if(spellID == Spells::FIRE_WALL  ||  spellID == Spells::FORCE_FIELD) | ||||
| 	if(spellID == SpellID::FIRE_WALL  ||  spellID == SpellID::FORCE_FIELD) | ||||
| 	{ | ||||
| 		spellSelMode = FREE_LOCATION; | ||||
| 	} | ||||
| @@ -2126,7 +2126,7 @@ void CBattleInterface::getPossibleActionsForStack(const CStack * stack) | ||||
| 					{ | ||||
| 						switch (spellBonus->subtype) | ||||
| 						{ | ||||
| 							case Spells::REMOVE_OBSTACLE: | ||||
| 							case SpellID::REMOVE_OBSTACLE: | ||||
| 								possibleActions.push_back (OBSTACLE); | ||||
| 								break; | ||||
| 							default: | ||||
| @@ -2897,7 +2897,7 @@ void CBattleInterface::handleHex(BattleHex myNumber, int eventType) | ||||
| 			{ | ||||
| 				ui8 skill = 0; | ||||
| 				if (creatureCasting) | ||||
| 					skill = sactive->valOfBonuses(Selector::typeSubtype(Bonus::SPELLCASTER, Spells::TELEPORT)); | ||||
| 					skill = sactive->valOfBonuses(Selector::typeSubtype(Bonus::SPELLCASTER, SpellID::TELEPORT)); | ||||
| 				else | ||||
| 					skill = getActiveHero()->getSpellSchoolLevel (CGI->spellh->spells[spellToCast->additionalInfo]);  | ||||
| 				//TODO: explicitely save power, skill | ||||
| @@ -3060,8 +3060,8 @@ void CBattleInterface::handleHex(BattleHex myNumber, int eventType) | ||||
| 				consoleMsg = boost::str(boost::format(CGI->generaltexth->allTexts[27]) % sp->name % shere->getName()); //Cast %s on %s | ||||
| 				switch (sp->id) | ||||
| 				{ | ||||
| 					case Spells::SACRIFICE: | ||||
| 					case Spells::TELEPORT: | ||||
| 					case SpellID::SACRIFICE: | ||||
| 					case SpellID::TELEPORT: | ||||
| 						selectedStack = shere; //remember firts target | ||||
| 						secondaryTarget = true; | ||||
| 						break; | ||||
| @@ -3177,13 +3177,13 @@ void CBattleInterface::handleHex(BattleHex myNumber, int eventType) | ||||
| 			if (secondaryTarget) //select that target now | ||||
| 			{ | ||||
| 				possibleActions.clear(); | ||||
| 				switch (sp->id) | ||||
| 				switch (sp->id.toEnum()) | ||||
| 				{ | ||||
| 					case Spells::TELEPORT: //don't cast spell yet, only select target		 | ||||
| 					case SpellID::TELEPORT: //don't cast spell yet, only select target		 | ||||
| 						possibleActions.push_back (TELEPORT); | ||||
| 						spellToCast->selectedStack = selectedStack->ID; | ||||
| 						break; | ||||
| 					case Spells::SACRIFICE: | ||||
| 					case SpellID::SACRIFICE: | ||||
| 						possibleActions.push_back (SACRIFICE); | ||||
| 						break; | ||||
| 				} | ||||
| @@ -3204,9 +3204,9 @@ void CBattleInterface::handleHex(BattleHex myNumber, int eventType) | ||||
| 				else | ||||
| 				{ | ||||
| 					assert (sp); | ||||
| 					switch (sp->id) | ||||
| 					switch (sp->id.toEnum()) | ||||
| 					{ | ||||
| 						case Spells::SACRIFICE: | ||||
| 						case SpellID::SACRIFICE: | ||||
| 							spellToCast->destinationTile = selectedStack->position; //cast on first creature that will be resurrected | ||||
| 							break; | ||||
| 						default: | ||||
|   | ||||
| @@ -799,7 +799,7 @@ void CAdvMapInt::keyPressed(const SDL_KeyboardEvent & key) | ||||
|  | ||||
| 		{ | ||||
| 			//find first town with tavern | ||||
| 			auto itr = range::find_if(LOCPLINT->towns, boost::bind(&CGTownInstance::hasBuilt, _1, EBuilding::TAVERN)); | ||||
| 			auto itr = range::find_if(LOCPLINT->towns, boost::bind(&CGTownInstance::hasBuilt, _1, BuildingID::TAVERN)); | ||||
| 			if(itr != LOCPLINT->towns.end()) | ||||
| 				LOCPLINT->showThievesGuildWindow(*itr); | ||||
| 			else | ||||
| @@ -877,7 +877,7 @@ void CAdvMapInt::keyPressed(const SDL_KeyboardEvent & key) | ||||
| 				const CGTownInstance *townWithMarket = NULL; | ||||
| 				BOOST_FOREACH(const CGTownInstance *t, LOCPLINT->cb->getTownsInfo()) | ||||
| 				{ | ||||
| 					if(t->hasBuilt(EBuilding::MARKETPLACE)) | ||||
| 					if(t->hasBuilt(BuildingID::MARKETPLACE)) | ||||
| 					{ | ||||
| 						townWithMarket = t; | ||||
| 						break; | ||||
| @@ -1140,11 +1140,11 @@ void CAdvMapInt::tileLClicked(const int3 &mapPos) | ||||
|  | ||||
| 		switch(spellBeingCasted->id) | ||||
| 		{ | ||||
| 		case Spells::SCUTTLE_BOAT: //Scuttle Boat | ||||
| 		case SpellID::SCUTTLE_BOAT: //Scuttle Boat | ||||
| 			if(topBlocking && topBlocking->ID == Obj::BOAT) | ||||
| 				leaveCastingMode(true, mapPos); | ||||
| 			break; | ||||
| 		case Spells::DIMENSION_DOOR: | ||||
| 		case SpellID::DIMENSION_DOOR: | ||||
| 			if(!tile || tile->isClear(heroTile)) | ||||
| 				leaveCastingMode(true, mapPos); | ||||
| 			break; | ||||
| @@ -1244,13 +1244,13 @@ void CAdvMapInt::tileHovered(const int3 &mapPos) | ||||
| 	{ | ||||
| 		switch(spellBeingCasted->id) | ||||
| 		{ | ||||
| 		case Spells::SCUTTLE_BOAT: | ||||
| 		case SpellID::SCUTTLE_BOAT: | ||||
| 			if(objAtTile && objAtTile->ID == Obj::BOAT) | ||||
| 				CCS->curh->changeGraphic(ECursor::ADVENTURE, 42); | ||||
| 			else | ||||
| 				CCS->curh->changeGraphic(ECursor::ADVENTURE, 0); | ||||
| 			return; | ||||
| 		case Spells::DIMENSION_DOOR: | ||||
| 		case SpellID::DIMENSION_DOOR: | ||||
| 			{ | ||||
| 				const TerrainTile *t = LOCPLINT->cb->getTile(mapPos, false); | ||||
| 				int3 hpos = selection->getSightCenter(); | ||||
| @@ -1436,8 +1436,7 @@ void CAdvMapInt::tileRClicked(const int3 &mapPos) | ||||
|  | ||||
| void CAdvMapInt::enterCastingMode(const CSpell * sp) | ||||
| { | ||||
| 	using namespace Spells; | ||||
| 	assert(sp->id == SCUTTLE_BOAT  ||  sp->id == DIMENSION_DOOR); | ||||
| 	assert(sp->id == SpellID::SCUTTLE_BOAT  ||  sp->id == SpellID::DIMENSION_DOOR); | ||||
| 	spellBeingCasted = sp; | ||||
|  | ||||
| 	deactivate(); | ||||
| @@ -1448,7 +1447,7 @@ void CAdvMapInt::enterCastingMode(const CSpell * sp) | ||||
| void CAdvMapInt::leaveCastingMode(bool cast /*= false*/, int3 dest /*= int3(-1, -1, -1)*/) | ||||
| { | ||||
| 	assert(spellBeingCasted); | ||||
| 	int id = spellBeingCasted->id; | ||||
| 	SpellID id = spellBeingCasted->id; | ||||
| 	spellBeingCasted = NULL; | ||||
| 	terrain.deactivate(); | ||||
| 	activate(); | ||||
|   | ||||
| @@ -107,14 +107,14 @@ void CBuildingRect::clickRight(tribool down, bool previousState) | ||||
| 	{ | ||||
| 		int bid = str->building->bid; | ||||
| 		const CBuilding *bld = town->town->buildings[bid]; | ||||
| 		if (bid < EBuilding::DWELL_FIRST) | ||||
| 		if (bid < BuildingID::DWELL_FIRST) | ||||
| 		{ | ||||
| 			CRClickPopup::createAndPush(CInfoWindow::genText(bld->Name(), bld->Description()), | ||||
| 			                            new CComponent(CComponent::building, bld->tid, bld->bid)); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			int level = ( bid - EBuilding::DWELL_FIRST ) % GameConstants::CREATURES_PER_TOWN; | ||||
| 			int level = ( bid - BuildingID::DWELL_FIRST ) % GameConstants::CREATURES_PER_TOWN; | ||||
| 			GH.pushInt(new CDwellingInfoBox(parent->pos.x+parent->pos.w/2, parent->pos.y+parent->pos.h/2, town, level)); | ||||
| 		} | ||||
| 	} | ||||
| @@ -471,13 +471,13 @@ void CCastleBuildings::recreate() | ||||
|  | ||||
| 	auto buildingsCopy = town->builtBuildings;// a bit modified copy of built buildings | ||||
|  | ||||
| 	if(vstd::contains(town->builtBuildings, EBuilding::SHIPYARD)) | ||||
| 	if(vstd::contains(town->builtBuildings, BuildingID::SHIPYARD)) | ||||
| 	{ | ||||
| 		std::vector <const CGObjectInstance *> vobjs = LOCPLINT->cb->getVisitableObjs(town->bestLocation()); | ||||
| 		//there is visitable obj at shipyard output tile and it's a boat or hero (on boat) | ||||
| 		if(!vobjs.empty() && (vobjs.front()->ID == Obj::BOAT || vobjs.front()->ID == Obj::HERO)) | ||||
| 		{ | ||||
| 			buildingsCopy.insert(EBuilding::SHIP); | ||||
| 			buildingsCopy.insert(BuildingID::SHIP); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -573,52 +573,52 @@ void CCastleBuildings::buildingClicked(int building) | ||||
| 	tlog5<<"You've clicked on "<<building<<std::endl; | ||||
| 	const CBuilding *b = town->town->buildings.find(building)->second; | ||||
|  | ||||
| 	if(building >= EBuilding::DWELL_FIRST) | ||||
| 	if(building >= BuildingID::DWELL_FIRST) | ||||
| 	{ | ||||
| 		enterDwelling((building-EBuilding::DWELL_FIRST)%GameConstants::CREATURES_PER_TOWN); | ||||
| 		enterDwelling((building-BuildingID::DWELL_FIRST)%GameConstants::CREATURES_PER_TOWN); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		switch(building) | ||||
| 		{ | ||||
| 		case EBuilding::MAGES_GUILD_1: | ||||
| 		case EBuilding::MAGES_GUILD_2: | ||||
| 		case EBuilding::MAGES_GUILD_3: | ||||
| 		case EBuilding::MAGES_GUILD_4: | ||||
| 		case EBuilding::MAGES_GUILD_5: | ||||
| 		case BuildingID::MAGES_GUILD_1: | ||||
| 		case BuildingID::MAGES_GUILD_2: | ||||
| 		case BuildingID::MAGES_GUILD_3: | ||||
| 		case BuildingID::MAGES_GUILD_4: | ||||
| 		case BuildingID::MAGES_GUILD_5: | ||||
| 				enterMagesGuild(); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::TAVERN: | ||||
| 		case BuildingID::TAVERN: | ||||
| 				LOCPLINT->showTavernWindow(town); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::SHIPYARD: | ||||
| 		case BuildingID::SHIPYARD: | ||||
| 				LOCPLINT->showShipyardDialog(town); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::FORT: | ||||
| 		case EBuilding::CITADEL: | ||||
| 		case EBuilding::CASTLE: | ||||
| 		case BuildingID::FORT: | ||||
| 		case BuildingID::CITADEL: | ||||
| 		case BuildingID::CASTLE: | ||||
| 				GH.pushInt(new CFortScreen(town)); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::VILLAGE_HALL: | ||||
| 		case EBuilding::CITY_HALL: | ||||
| 		case EBuilding::TOWN_HALL: | ||||
| 		case EBuilding::CAPITOL: | ||||
| 		case BuildingID::VILLAGE_HALL: | ||||
| 		case BuildingID::CITY_HALL: | ||||
| 		case BuildingID::TOWN_HALL: | ||||
| 		case BuildingID::CAPITOL: | ||||
| 				enterTownHall(); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::MARKETPLACE: | ||||
| 		case BuildingID::MARKETPLACE: | ||||
| 				GH.pushInt(new CMarketplaceWindow(town, town->visitingHero)); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::BLACKSMITH: | ||||
| 		case BuildingID::BLACKSMITH: | ||||
| 				enterBlacksmith(town->town->warMachine); | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::SPECIAL_1: | ||||
| 		case BuildingID::SPECIAL_1: | ||||
| 				switch(town->subID) | ||||
| 				{ | ||||
| 				case ETownType::RAMPART://Mystic Pond | ||||
| @@ -640,11 +640,11 @@ void CCastleBuildings::buildingClicked(int building) | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::SHIP: | ||||
| 		case BuildingID::SHIP: | ||||
| 				LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[51]); //Cannot build another boat | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::SPECIAL_2: | ||||
| 		case BuildingID::SPECIAL_2: | ||||
| 				switch(town->subID) | ||||
| 				{ | ||||
| 				case ETownType::RAMPART: //Fountain of Fortune | ||||
| @@ -671,7 +671,7 @@ void CCastleBuildings::buildingClicked(int building) | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 		case EBuilding::SPECIAL_3: | ||||
| 		case BuildingID::SPECIAL_3: | ||||
| 				switch(town->subID) | ||||
| 				{ | ||||
| 				case ETownType::CASTLE: //Brotherhood of sword | ||||
| @@ -710,7 +710,7 @@ void CCastleBuildings::buildingClicked(int building) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CCastleBuildings::enterBlacksmith(ArtifactID::ArtifactID artifactID) | ||||
| void CCastleBuildings::enterBlacksmith(ArtifactID artifactID) | ||||
| { | ||||
| 	const CGHeroInstance *hero = town->visitingHero; | ||||
| 	if(!hero) | ||||
| @@ -744,12 +744,12 @@ void CCastleBuildings::enterCastleGate() | ||||
| 	{ | ||||
| 		const CGTownInstance *t = Towns[i]; | ||||
| 		if (t->id != this->town->id && t->visitingHero == NULL && //another town, empty and this is | ||||
| 			t->hasBuilt(EBuilding::CASTLE_GATE, ETownType::INFERNO)) | ||||
| 			t->hasBuilt(BuildingID::CASTLE_GATE, ETownType::INFERNO)) | ||||
| 		{ | ||||
| 			availableTowns.push_back(t->id);//add to the list | ||||
| 		} | ||||
| 	} | ||||
| 	CPicture *titlePic = new CPicture (LOCPLINT->castleInt->bicons->ourImages[EBuilding::CASTLE_GATE].bitmap, 0,0, false);//will be deleted by selection window | ||||
| 	CPicture *titlePic = new CPicture (LOCPLINT->castleInt->bicons->ourImages[BuildingID::CASTLE_GATE].bitmap, 0,0, false);//will be deleted by selection window | ||||
| 	GH.pushInt (new CObjectListWindow(availableTowns, titlePic, CGI->generaltexth->jktexts[40], | ||||
| 	    CGI->generaltexth->jktexts[41], boost::bind (&CCastleInterface::castleTeleport, LOCPLINT->castleInt, _1))); | ||||
| } | ||||
| @@ -766,8 +766,8 @@ void CCastleBuildings::enterFountain(int building) | ||||
|  | ||||
| 	std::string descr = town->town->buildings.find(building)->second->Description(); | ||||
|  | ||||
| 	if ( building == EBuilding::FOUNTAIN_OF_FORTUNE) | ||||
| 		descr += "\n\n"+town->town->buildings.find(EBuilding::MYSTIC_POND)->second->Description(); | ||||
| 	if ( building == BuildingID::FOUNTAIN_OF_FORTUNE) | ||||
| 		descr += "\n\n"+town->town->buildings.find(BuildingID::MYSTIC_POND)->second->Description(); | ||||
|  | ||||
| 	if (town->bonusValue.first == 0)//fountain was builded this week | ||||
| 		descr += "\n\n"+ CGI->generaltexth->allTexts[677]; | ||||
| @@ -810,12 +810,12 @@ void CCastleBuildings::enterMagesGuild() | ||||
| void CCastleBuildings::enterTownHall() | ||||
| { | ||||
| 	if(town->visitingHero && town->visitingHero->hasArt(2) && | ||||
| 		!vstd::contains(town->builtBuildings, EBuilding::GRAIL)) //hero has grail, but town does not have it | ||||
| 		!vstd::contains(town->builtBuildings, BuildingID::GRAIL)) //hero has grail, but town does not have it | ||||
| 	{ | ||||
| 		if(!vstd::contains(town->forbiddenBuildings, EBuilding::GRAIL)) | ||||
| 		if(!vstd::contains(town->forbiddenBuildings, BuildingID::GRAIL)) | ||||
| 		{ | ||||
| 			LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[597], //Do you wish this to be the permanent home of the Grail? | ||||
| 			                            boost::bind(&CCallback::buildBuilding, LOCPLINT->cb, town, EBuilding::GRAIL), | ||||
| 			                            boost::bind(&CCallback::buildBuilding, LOCPLINT->cb, town, BuildingID::GRAIL), | ||||
| 			                            boost::bind(&CCastleBuildings::openTownHall, this), true); | ||||
| 		} | ||||
| 		else | ||||
| @@ -1175,7 +1175,7 @@ void CCastleInterface::keyPressed( const SDL_KeyboardEvent & key ) | ||||
| 		heroes->swapArmies(); | ||||
| 		break; | ||||
| 	case SDLK_t: | ||||
| 		if(town->hasBuilt(EBuilding::TAVERN)) | ||||
| 		if(town->hasBuilt(BuildingID::TAVERN)) | ||||
| 			LOCPLINT->showTavernWindow(town); | ||||
| 		break; | ||||
| 	default: | ||||
| @@ -1285,7 +1285,7 @@ CHallInterface::CHallInterface(const CGTownInstance *Town): | ||||
| 	Rect barRect(5, 556, 740, 18); | ||||
| 	statusBar = new CGStatusBar(new CPicture(*background, barRect, 5, 556, false)); | ||||
|  | ||||
| 	title = new CLabel(399, 12, FONT_MEDIUM, CENTER, Colors::WHITE, town->town->buildings[town->hallLevel()+EBuilding::VILLAGE_HALL]->Name()); | ||||
| 	title = new CLabel(399, 12, FONT_MEDIUM, CENTER, Colors::WHITE, town->town->buildings[town->hallLevel()+BuildingID::VILLAGE_HALL]->Name()); | ||||
| 	exit = new CAdventureMapButton(CGI->generaltexth->hcommands[8], "",  | ||||
| 	           boost::bind(&CHallInterface::close,this), 748, 556, "TPMAGE1.DEF", SDLK_RETURN); | ||||
| 	exit->assignedKeys.insert(SDLK_ESCAPE); | ||||
| @@ -1435,10 +1435,10 @@ CFortScreen::CFortScreen(const CGTownInstance * town): | ||||
| 		int buildingID; | ||||
| 		if (fortSize == GameConstants::CREATURES_PER_TOWN) | ||||
| 		{ | ||||
| 			if (vstd::contains(town->builtBuildings, EBuilding::DWELL_UP_FIRST+i)) | ||||
| 				buildingID = EBuilding::DWELL_UP_FIRST+i; | ||||
| 			if (vstd::contains(town->builtBuildings, BuildingID::DWELL_UP_FIRST+i)) | ||||
| 				buildingID = BuildingID::DWELL_UP_FIRST+i; | ||||
| 			else | ||||
| 				buildingID = EBuilding::DWELL_FIRST+i; | ||||
| 				buildingID = BuildingID::DWELL_FIRST+i; | ||||
| 		} | ||||
| 		else | ||||
| 			buildingID = 22; | ||||
| @@ -1653,7 +1653,7 @@ void CMageGuildScreen::Scroll::hover(bool on) | ||||
|  | ||||
| } | ||||
|  | ||||
| CBlacksmithDialog::CBlacksmithDialog(bool possible, int creMachineID, ArtifactID::ArtifactID aid, int hid): | ||||
| CBlacksmithDialog::CBlacksmithDialog(bool possible, int creMachineID, ArtifactID aid, int hid): | ||||
|     CWindowObject(PLAYER_COLORED, "TPSMITH") | ||||
| { | ||||
| 	OBJ_CONSTRUCTION_CAPTURING_ALL; | ||||
|   | ||||
| @@ -123,7 +123,7 @@ class CCastleBuildings : public CIntObject | ||||
|  | ||||
| 	const CGHeroInstance* getHero();//Select hero for buildings usage | ||||
|  | ||||
| 	void enterBlacksmith(ArtifactID::ArtifactID artifactID);//support for blacksmith + ballista yard | ||||
| 	void enterBlacksmith(ArtifactID artifactID);//support for blacksmith + ballista yard | ||||
| 	void enterBuilding(int building);//for buildings with simple description + pic left-click messages | ||||
| 	void enterCastleGate(); | ||||
| 	void enterFountain(int building);//Rampart's fountains | ||||
| @@ -369,5 +369,5 @@ class CBlacksmithDialog : public CWindowObject | ||||
| 	CGStatusBar *statusBar; | ||||
|  | ||||
| public: | ||||
| 	CBlacksmithDialog(bool possible, int creMachineID, ArtifactID::ArtifactID aid, int hid); | ||||
| 	CBlacksmithDialog(bool possible, int creMachineID, ArtifactID aid, int hid); | ||||
| }; | ||||
|   | ||||
| @@ -66,7 +66,7 @@ CCreatureWindow::CCreatureWindow (const CStackInstance &stack, CreWinType Type): | ||||
| 	init(&stack, &stack, dynamic_cast<const CGHeroInstance*>(stack.armyObj)); | ||||
| } | ||||
|  | ||||
| CCreatureWindow::CCreatureWindow(CreatureID::CreatureID Cid, CreWinType Type, int creatureCount): | ||||
| CCreatureWindow::CCreatureWindow(CreatureID Cid, CreWinType Type, int creatureCount): | ||||
|    CWindowObject(PLAYER_COLORED | (Type == OTHER ? RCLICK_POPUP : 0 ) ), | ||||
|     type(Type) | ||||
| { | ||||
| @@ -903,7 +903,7 @@ CIntObject * createCreWindow( | ||||
| 	} | ||||
| } | ||||
|  | ||||
| CIntObject * createCreWindow(CreatureID::CreatureID Cid, CCreatureWindow::CreWinType Type, int creatureCount) | ||||
| CIntObject * createCreWindow(CreatureID Cid, CCreatureWindow::CreWinType Type, int creatureCount) | ||||
| { | ||||
| 	if(settings["general"]["classicCreatureWindow"].Bool()) | ||||
| 		return new CCreInfoWindow(Cid, Type, creatureCount); | ||||
|   | ||||
| @@ -91,7 +91,7 @@ public: | ||||
| 	CCreatureWindow(const CStackInstance &st, CreWinType Type, boost::function<void()> Upg, boost::function<void()> Dsm, UpgradeInfo *ui); //full garrison window | ||||
| 	CCreatureWindow(const CCommanderInstance * commander, const CStack * stack = NULL); //commander window | ||||
| 	CCreatureWindow(std::vector<ui32> &skills, const CCommanderInstance * commander, boost::function<void(ui32)> callback);  | ||||
| 	CCreatureWindow(CreatureID::CreatureID Cid, CreWinType Type, int creatureCount); //c-tor | ||||
| 	CCreatureWindow(CreatureID Cid, CreWinType Type, int creatureCount); //c-tor | ||||
|  | ||||
| 	void init(const CStackInstance *stack, const CBonusSystemNode *stackNode, const CGHeroInstance *heroOwner); | ||||
| 	void showAll(SDL_Surface * to); | ||||
| @@ -159,5 +159,5 @@ public: | ||||
| }; | ||||
|  | ||||
| CIntObject *createCreWindow(const CStack *s, bool lclick = false); | ||||
| CIntObject *createCreWindow(CreatureID::CreatureID Cid, CCreatureWindow::CreWinType Type, int creatureCount); | ||||
| CIntObject *createCreWindow(CreatureID Cid, CCreatureWindow::CreWinType Type, int creatureCount); | ||||
| CIntObject *createCreWindow(const CStackInstance *s, CCreatureWindow::CreWinType type, boost::function<void()> Upg = 0, boost::function<void()> Dsm = 0, UpgradeInfo *ui = NULL); | ||||
|   | ||||
| @@ -1498,7 +1498,7 @@ void CPlayerInterface::newObject( const CGObjectInstance * obj ) | ||||
| 		&&  obj->pos-obj->getVisitableOffset() == LOCPLINT->castleInt->town->bestLocation()) | ||||
| 	{ | ||||
| 		CCS->soundh->playSound(soundBase::newBuilding); | ||||
| 		LOCPLINT->castleInt->addBuilding(EBuilding::SHIP); | ||||
| 		LOCPLINT->castleInt->addBuilding(BuildingID::SHIP); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -2096,7 +2096,7 @@ void CPlayerInterface::showPuzzleMap() | ||||
| void CPlayerInterface::advmapSpellCast(const CGHeroInstance * caster, int spellID) | ||||
| { | ||||
| 	EVENT_HANDLER_CALLED_BY_CLIENT; | ||||
| 	if (spellID == Spells::FLY || spellID == Spells::WATER_WALK) | ||||
| 	if (spellID == SpellID::FLY || spellID == SpellID::WATER_WALK) | ||||
| 	{ | ||||
| 		eraseCurrentPathOf(caster, false); | ||||
| 	} | ||||
|   | ||||
| @@ -82,7 +82,7 @@ CSpellWindow::CSpellWindow(const SDL_Rect &, const CGHeroInstance * _myHero, CPl | ||||
| 	for(ui32 v=0; v<CGI->spellh->spells.size(); ++v) | ||||
| 	{ | ||||
| 		if( !CGI->spellh->spells[v]->creatureAbility && myHero->canCastThisSpell(CGI->spellh->spells[v]) ) | ||||
| 			mySpells.insert(v); | ||||
| 			mySpells.insert(SpellID(v)); | ||||
| 	} | ||||
|  | ||||
| 	//initializing sizes of spellbook's parts | ||||
| @@ -91,9 +91,9 @@ CSpellWindow::CSpellWindow(const SDL_Rect &, const CGHeroInstance * _myHero, CPl | ||||
| 	for(int b=0; b<5; ++b) | ||||
| 		sitesPerTabBattle[b] = 0; | ||||
|  | ||||
| 	for(std::set<ui32>::const_iterator g = mySpells.begin(); g!=mySpells.end(); ++g) | ||||
| 	BOOST_FOREACH(auto g, mySpells) | ||||
| 	{ | ||||
| 		const CSpell &s = *CGI->spellh->spells[*g]; | ||||
| 		const CSpell &s = *CGI->spellh->spells[g]; | ||||
| 		Uint8 *sitesPerOurTab = s.combatSpell ? sitesPerTabBattle : sitesPerTabAdv; | ||||
|  | ||||
| 		++sitesPerOurTab[4]; | ||||
| @@ -386,8 +386,8 @@ public: | ||||
|  | ||||
| void CSpellWindow::computeSpellsPerArea() | ||||
| { | ||||
| 	std::vector<ui32> spellsCurSite; | ||||
| 	for(std::set<ui32>::const_iterator it = mySpells.begin(); it != mySpells.end(); ++it) | ||||
| 	std::vector<SpellID> spellsCurSite; | ||||
| 	for(auto it = mySpells.cbegin(); it != mySpells.cend(); ++it) | ||||
| 	{ | ||||
| 		if(CGI->spellh->spells[*it]->combatSpell ^ !battleSpellsOnly | ||||
| 			&& ((CGI->spellh->spells[*it]->air && selectedTab == 0) ||  | ||||
| @@ -405,7 +405,7 @@ void CSpellWindow::computeSpellsPerArea() | ||||
| 	{ | ||||
| 		if(spellsCurSite.size() > 12) | ||||
| 		{ | ||||
| 			spellsCurSite = std::vector<ui32>(spellsCurSite.begin() + currentPage*12, spellsCurSite.end()); | ||||
| 			spellsCurSite = std::vector<SpellID>(spellsCurSite.begin() + currentPage*12, spellsCurSite.end()); | ||||
| 			if(spellsCurSite.size() > 12) | ||||
| 			{ | ||||
| 				spellsCurSite.erase(spellsCurSite.begin()+12, spellsCurSite.end()); | ||||
| @@ -422,7 +422,7 @@ void CSpellWindow::computeSpellsPerArea() | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				spellsCurSite = std::vector<ui32>(spellsCurSite.begin() + (currentPage-1)*12 + 10, spellsCurSite.end()); | ||||
| 				spellsCurSite = std::vector<SpellID>(spellsCurSite.begin() + (currentPage-1)*12 + 10, spellsCurSite.end()); | ||||
| 				if(spellsCurSite.size() > 12) | ||||
| 				{ | ||||
| 					spellsCurSite.erase(spellsCurSite.begin()+12, spellsCurSite.end()); | ||||
| @@ -441,20 +441,20 @@ void CSpellWindow::computeSpellsPerArea() | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				spellAreas[c]->setSpell(-1); | ||||
| 				spellAreas[c]->setSpell(SpellID::NONE); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		spellAreas[0]->setSpell(-1); | ||||
| 		spellAreas[1]->setSpell(-1); | ||||
| 		spellAreas[0]->setSpell(SpellID::NONE); | ||||
| 		spellAreas[1]->setSpell(SpellID::NONE); | ||||
| 		for(size_t c=0; c<10; ++c) | ||||
| 		{ | ||||
| 			if(c<spellsCurSite.size()) | ||||
| 				spellAreas[c+2]->setSpell(spellsCurSite[c]); | ||||
| 			else | ||||
| 				spellAreas[c+2]->setSpell(-1); | ||||
| 				spellAreas[c+2]->setSpell(SpellID::NONE); | ||||
| 		} | ||||
| 	} | ||||
| 	redraw(); | ||||
| @@ -587,7 +587,7 @@ Uint8 CSpellWindow::pagesWithinCurrentTab() | ||||
| void CSpellWindow::teleportTo( int town, const CGHeroInstance * hero ) | ||||
| { | ||||
| 	const CGTownInstance * dest = LOCPLINT->cb->getTown(town); | ||||
| 	LOCPLINT->cb->castSpell(hero, Spells::TOWN_PORTAL, dest->visitablePos()); | ||||
| 	LOCPLINT->cb->castSpell(hero, SpellID::TOWN_PORTAL, dest->visitablePos()); | ||||
| } | ||||
|  | ||||
| CSpellWindow::SpellArea::SpellArea(SDL_Rect pos, CSpellWindow * owner) | ||||
| @@ -596,7 +596,8 @@ CSpellWindow::SpellArea::SpellArea(SDL_Rect pos, CSpellWindow * owner) | ||||
| 	this->owner = owner; | ||||
| 	addUsedEvents(LCLICK | RCLICK | HOVER); | ||||
|  | ||||
| 	spellCost = mySpell = whichSchool = schoolLevel = -1; | ||||
| 	spellCost = whichSchool = schoolLevel = -1; | ||||
| 	mySpell = SpellID::NONE; | ||||
| } | ||||
|  | ||||
| void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState) | ||||
| @@ -694,14 +695,13 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState) | ||||
| 		} | ||||
| 		else if(!sp->combatSpell && !owner->myInt->battleInt) //adventure spell | ||||
| 		{ | ||||
| 			using namespace Spells; | ||||
| 			int spell = mySpell; | ||||
| 			SpellID spell = mySpell; | ||||
| 			const CGHeroInstance *h = owner->myHero; | ||||
| 			owner->fexitb(); | ||||
|  | ||||
| 			switch(spell) | ||||
| 			{ | ||||
| 			case SUMMON_BOAT: | ||||
| 			case SpellID::SUMMON_BOAT: | ||||
| 				{ | ||||
| 					int3 pos = h->bestLocation(); | ||||
| 					if(pos.x < 0) | ||||
| @@ -711,18 +711,18 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState) | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 			case SCUTTLE_BOAT: | ||||
| 			case DIMENSION_DOOR: | ||||
| 			case SpellID::SCUTTLE_BOAT: | ||||
| 			case SpellID::DIMENSION_DOOR: | ||||
| 				adventureInt->enterCastingMode(sp); | ||||
| 				return; | ||||
| 			case VISIONS: | ||||
| 			case VIEW_EARTH: | ||||
| 			case DISGUISE: | ||||
| 			case VIEW_AIR: | ||||
| 			case FLY: | ||||
| 			case WATER_WALK: | ||||
| 			case SpellID::VISIONS: | ||||
| 			case SpellID::VIEW_EARTH: | ||||
| 			case SpellID::DISGUISE: | ||||
| 			case SpellID::VIEW_AIR: | ||||
| 			case SpellID::FLY: | ||||
| 			case SpellID::WATER_WALK: | ||||
| 				break; | ||||
| 			case TOWN_PORTAL: | ||||
| 			case SpellID::TOWN_PORTAL: | ||||
| 				{ | ||||
| 					std::vector <int> availableTowns; | ||||
| 					std::vector <const CGTownInstance*> Towns = LOCPLINT->cb->getTownsInfo(true); | ||||
| @@ -828,7 +828,7 @@ void CSpellWindow::SpellArea::showAll(SDL_Surface * to) | ||||
| 	if(mySpell < 0) | ||||
| 		return; | ||||
|  | ||||
| 	const CSpell * spell = CGI->spellh->spells[mySpell]; | ||||
| 	const CSpell * spell = mySpell.toSpell(); | ||||
|  | ||||
| 	blitAt(owner->spells->ourImages[mySpell].bitmap, pos.x, pos.y, to); | ||||
| 	blitAt(owner->schoolBorders[owner->selectedTab >= 4 ? whichSchool : owner->selectedTab]->ourImages[schoolLevel].bitmap, pos.x, pos.y, to); //printing border (indicates level of magic school) | ||||
| @@ -855,7 +855,7 @@ void CSpellWindow::SpellArea::showAll(SDL_Surface * to) | ||||
| 	printAtMiddleLoc(ss.str(), 39, 94, FONT_TINY, secondLineColor, to); | ||||
| } | ||||
|  | ||||
| void CSpellWindow::SpellArea::setSpell(int spellID) | ||||
| void CSpellWindow::SpellArea::setSpell(SpellID spellID) | ||||
| { | ||||
| 	mySpell = spellID; | ||||
| 	if(mySpell < 0) | ||||
|   | ||||
| @@ -45,7 +45,7 @@ private: | ||||
| 	class SpellArea : public CIntObject | ||||
| 	{ | ||||
| 	public: | ||||
| 		int mySpell; | ||||
| 		SpellID mySpell; | ||||
| 		int schoolLevel; //range: 0 none, 3 - expert | ||||
| 		int whichSchool; //0 - air magic, 1 - fire magic, 2 - water magic, 3 - earth magic, | ||||
| 		int spellCost; | ||||
| @@ -53,7 +53,7 @@ private: | ||||
|  | ||||
| 		SpellArea(SDL_Rect pos, CSpellWindow * owner); | ||||
|  | ||||
| 		void setSpell(int spellID); | ||||
| 		void setSpell(SpellID spellID); | ||||
|  | ||||
| 		void clickLeft(tribool down, bool previousState); | ||||
| 		void clickRight(tribool down, bool previousState); | ||||
| @@ -79,7 +79,7 @@ private: | ||||
| 	bool battleSpellsOnly; //if true, only battle spells are displayed; if false, only adventure map spells are displayed | ||||
| 	Uint8 selectedTab; // 0 - air magic, 1 - fire magic, 2 - water magic, 3 - earth magic, 4 - all schools | ||||
| 	Uint8 currentPage; //changes when corners are clicked | ||||
| 	std::set<ui32> mySpells; //all spels in this spellbook | ||||
| 	std::set<SpellID> mySpells; //all spels in this spellbook | ||||
|  | ||||
| 	const CGHeroInstance * myHero; //hero whose spells are presented | ||||
|  | ||||
|   | ||||
| @@ -162,7 +162,7 @@ public: | ||||
|  | ||||
| 	////////////////////////////////////////////////////////////////////////// | ||||
| 	//not working yet, will be implement somewhen later with support for local-sim-based gameplay | ||||
| 	void changeSpells(const CGHeroInstance * hero, bool give, const std::set<ui32> &spells) OVERRIDE {}; | ||||
| 	void changeSpells(const CGHeroInstance * hero, bool give, const std::set<SpellID> &spells) OVERRIDE {}; | ||||
| 	bool removeObject(const CGObjectInstance * obj) OVERRIDE {return false;}; | ||||
| 	void setBlockVis(int objid, bool bv) OVERRIDE {}; | ||||
| 	void setOwner(const CGObjectInstance * obj, TPlayerColor owner) OVERRIDE {}; | ||||
| @@ -201,7 +201,7 @@ public: | ||||
| 	void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, boost::function<void(BattleResult*)> cb = 0, bool creatureBank = false) OVERRIDE {}; //if any of armies is hero, hero will be used | ||||
| 	void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, boost::function<void(BattleResult*)> cb = 0, bool creatureBank = false) OVERRIDE {}; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle | ||||
| 	void setAmount(int objid, ui32 val) OVERRIDE {}; | ||||
| 	bool moveHero(si32 hid, int3 dst, ui8 instant, ui8 asker = 255) OVERRIDE {return false;}; | ||||
| 	bool moveHero(si32 hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER) OVERRIDE {return false;}; | ||||
| 	void giveHeroBonus(GiveBonus * bonus) OVERRIDE {}; | ||||
| 	void setMovePoints(SetMovePoints * smp) OVERRIDE {}; | ||||
| 	void setManaPoints(int hid, int val) OVERRIDE {}; | ||||
|   | ||||
| @@ -1467,7 +1467,7 @@ void CRecruitmentWindow::select(CCreatureCard *card) | ||||
|  | ||||
| void CRecruitmentWindow::buy() | ||||
| { | ||||
| 	CreatureID::CreatureID crid =  selected->creature->idNumber; | ||||
| 	CreatureID crid =  selected->creature->idNumber; | ||||
| 	TSlot dstslot = dst-> getSlotFor(crid); | ||||
|  | ||||
| 	if(dstslot < 0 && !vstd::contains(CGI->arth->bigArtifacts,CGI->arth->creatureToMachineID(crid))) //no available slot | ||||
| @@ -1510,7 +1510,7 @@ void CRecruitmentWindow::showAll(SDL_Surface * to) | ||||
| 	drawBorder(to, pos.x + 289, pos.y + 312, 66, 34, int3(173,142,66)); | ||||
| } | ||||
|  | ||||
| CRecruitmentWindow::CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(CreatureID::CreatureID,int)> &Recruit, int y_offset): | ||||
| CRecruitmentWindow::CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(CreatureID,int)> &Recruit, int y_offset): | ||||
|     CWindowObject(PLAYER_COLORED, "TPRCRT"), | ||||
| 	onRecruit(Recruit), | ||||
|     level(Level), | ||||
| @@ -2568,14 +2568,14 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan | ||||
| 		switch (mode) | ||||
| 		{ | ||||
| 		break; case EMarketMode::CREATURE_RESOURCE: | ||||
| 			title = CGI->townh->towns[ETownType::STRONGHOLD].buildings[EBuilding::FREELANCERS_GUILD]->Name(); | ||||
| 			title = CGI->townh->towns[ETownType::STRONGHOLD].buildings[BuildingID::FREELANCERS_GUILD]->Name(); | ||||
|  | ||||
| 		break; case EMarketMode::RESOURCE_ARTIFACT: | ||||
| 			title = CGI->townh->towns[market->o->subID].buildings[EBuilding::ARTIFACT_MERCHANT]->Name(); | ||||
| 			title = CGI->townh->towns[market->o->subID].buildings[BuildingID::ARTIFACT_MERCHANT]->Name(); | ||||
| 			sliderNeeded = false; | ||||
|  | ||||
| 		break; case EMarketMode::ARTIFACT_RESOURCE: | ||||
| 			title = CGI->townh->towns[market->o->subID].buildings[EBuilding::ARTIFACT_MERCHANT]->Name(); | ||||
| 			title = CGI->townh->towns[market->o->subID].buildings[BuildingID::ARTIFACT_MERCHANT]->Name(); | ||||
| 			sliderNeeded = false; | ||||
|  | ||||
| 		break; default: | ||||
| @@ -5467,7 +5467,7 @@ CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket | ||||
| 	CIntObject * titlePic = nullptr; | ||||
|  | ||||
| 	if (market->o->ID == Obj::TOWN) | ||||
| 		titlePic = new CAnimImage(CGI->townh->towns[ETownType::CONFLUX].clientInfo.buildingsIcons, EBuilding::MAGIC_UNIVERSITY); | ||||
| 		titlePic = new CAnimImage(CGI->townh->towns[ETownType::CONFLUX].clientInfo.buildingsIcons, BuildingID::MAGIC_UNIVERSITY); | ||||
| 	else | ||||
| 		titlePic = new CPicture("UNIVBLDG"); | ||||
|  | ||||
|   | ||||
| @@ -430,7 +430,7 @@ class CRecruitmentWindow : public CWindowObject | ||||
| 		void createItems(TResources res); | ||||
| 	}; | ||||
|  | ||||
| 	boost::function<void(CreatureID::CreatureID,int)> onRecruit; //void (int ID, int amount) <-- call to recruit creatures | ||||
| 	boost::function<void(CreatureID,int)> onRecruit; //void (int ID, int amount) <-- call to recruit creatures | ||||
|  | ||||
| 	int level; | ||||
| 	const CArmedInstance *dst; | ||||
| @@ -454,7 +454,7 @@ class CRecruitmentWindow : public CWindowObject | ||||
| 	void showAll(SDL_Surface *to); | ||||
| public: | ||||
| 	const CGDwelling * const dwelling; | ||||
| 	CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(CreatureID::CreatureID,int)> & Recruit, int y_offset = 0); //creatures - pairs<creature_ID,amount> //c-tor | ||||
| 	CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(CreatureID,int)> & Recruit, int y_offset = 0); //creatures - pairs<creature_ID,amount> //c-tor | ||||
| 	void availableCreaturesChanged(); | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -406,11 +406,11 @@ void NewStructures::applyCl( CClient *cl ) | ||||
| 	CGTownInstance *town = GS(cl)->getTown(tid); | ||||
| 	BOOST_FOREACH(si32 id, bid) | ||||
| 	{ | ||||
| 		if(id== EBuilding::CAPITOL) //fort or capitol | ||||
| 		if(id== BuildingID::CAPITOL) //fort or capitol | ||||
| 		{ | ||||
| 			town->defInfo = const_cast<CGDefInfo*>(CGI->dobjinfo->capitols[town->subID].get()); | ||||
| 		} | ||||
| 		if(id == EBuilding::FORT) | ||||
| 		if(id == BuildingID::FORT) | ||||
| 		{ | ||||
| 			town->defInfo = const_cast<CGDefInfo*>(CGI->dobjinfo->gobjs[Obj::TOWN][town->subID].get()); | ||||
| 		} | ||||
|   | ||||
| @@ -36,7 +36,7 @@ const CStack * BattleInfo::getNextStack() const | ||||
| 		return NULL; | ||||
| } | ||||
|  | ||||
| int BattleInfo::getAvaliableHex(CreatureID::CreatureID creID, bool attackerOwned, int initialPos) const | ||||
| int BattleInfo::getAvaliableHex(CreatureID creID, bool attackerOwned, int initialPos) const | ||||
| { | ||||
| 	bool twoHex = VLC->creh->creatures[creID]->isDoubleWide(); | ||||
| 	//bool flying = VLC->creh->creatures[creID]->isFlying(); | ||||
| @@ -131,7 +131,7 @@ int BattleInfo::calculateSpellDuration( const CSpell * spell, const CGHeroInstan | ||||
| 	} | ||||
| 	switch(spell->id) | ||||
| 	{ | ||||
| 	case Spells::FRENZY: | ||||
| 	case SpellID::FRENZY: | ||||
| 		return 1; | ||||
| 	default: //other spells | ||||
| 		return caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER) + caster->valOfBonuses(Bonus::SPELL_DURATION); | ||||
| @@ -166,7 +166,7 @@ ui32 BattleInfo::calculateHealedHP(const CGHeroInstance * caster, const CSpell * | ||||
| { | ||||
| 	bool resurrect = resurrects(spell->id); | ||||
| 	int healedHealth; | ||||
| 	if (spell->id == Spells::SACRIFICE && sacrificedStack) | ||||
| 	if (spell->id == SpellID::SACRIFICE && sacrificedStack) | ||||
| 		healedHealth = (caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER) + sacrificedStack->MaxHealth() + spell->powers[caster->getSpellSchoolLevel(spell)]) * sacrificedStack->count; | ||||
| 	else | ||||
| 		healedHealth = caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER) * spell->power + spell->powers[caster->getSpellSchoolLevel(spell)]; | ||||
| @@ -186,7 +186,7 @@ ui32 BattleInfo::calculateHealedHP(const CSpell * spell, int usedSpellPower, int | ||||
| 	int healedHealth = usedSpellPower * spell->power + spell->powers[spellSchoolLevel]; | ||||
| 	return std::min<ui32>(healedHealth, stack->MaxHealth() - stack->firstHPleft + (resurrect ? stack->baseAmount * stack->MaxHealth() : 0)); | ||||
| } | ||||
| bool BattleInfo::resurrects(TSpell spellid) const | ||||
| bool BattleInfo::resurrects(SpellID spellid) const | ||||
| { | ||||
| 	return VLC->spellh->spells[spellid]->isRisingSpell(); | ||||
| } | ||||
| @@ -512,7 +512,7 @@ BattleInfo * BattleInfo::setupBattle( int3 tile, ETerrainType::ETerrainType terr | ||||
| 	if(!creatureBank) | ||||
| 	{ | ||||
| 		//Checks if hero has artifact and create appropriate stack | ||||
| 		auto handleWarMachine= [&](int side, ArtifactPosition::ArtifactPosition artslot, CreatureID::CreatureID cretype, BattleHex hex) | ||||
| 		auto handleWarMachine= [&](int side, ArtifactPosition::ArtifactPosition artslot, CreatureID cretype, BattleHex hex) | ||||
| 		{ | ||||
| 			if(heroes[side] && heroes[side]->getArt(artslot)) | ||||
| 				stacks.push_back(curB->generateNewStack(CStackBasicDescriptor(cretype, 1), !side, 255, hex)); | ||||
| @@ -748,7 +748,7 @@ std::vector<ui32> BattleInfo::calculateResistedStacks(const CSpell * sp, const C | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	if(sp->id == Spells::HYPNOTIZE) //hypnotize | ||||
| 	if(sp->id == SpellID::HYPNOTIZE) //hypnotize | ||||
| 	{ | ||||
| 		for(auto it = affectedCreatures.begin(); it != affectedCreatures.end(); ++it) | ||||
| 		{ | ||||
| @@ -908,7 +908,7 @@ ui32 CStack::Speed( int turn /*= 0*/ , bool useBind /* = false*/) const | ||||
| 	speed = ((100 + percentBonus) * speed)/100; | ||||
|  | ||||
| 	//bind effect check - doesn't influence stack initiative | ||||
| 	if (useBind && getEffect (Spells::BIND)) | ||||
| 	if (useBind && getEffect (SpellID::BIND)) | ||||
| 	{ | ||||
| 		return 0; | ||||
| 	} | ||||
|   | ||||
| @@ -90,7 +90,7 @@ struct DLL_LINKAGE BattleInfo : public CBonusSystemNode, public CBattleInfoCallb | ||||
|  | ||||
| 	//void getAccessibilityMap(bool *accessibility, bool twoHex, bool attackerOwned, bool addOccupiable, std::set<BattleHex> & occupyable, bool flying, const CStack* stackToOmmit = NULL) const; //send pointer to at least 187 allocated bytes | ||||
| 	//static bool isAccessible(BattleHex hex, bool * accessibility, bool twoHex, bool attackerOwned, bool flying, bool lastPos); //helper for makeBFS | ||||
| 	int getAvaliableHex(CreatureID::CreatureID creID, bool attackerOwned, int initialPos = -1) const; //find place for summon / clone effects | ||||
| 	int getAvaliableHex(CreatureID creID, bool attackerOwned, int initialPos = -1) const; //find place for summon / clone effects | ||||
| 	//void makeBFS(BattleHex start, bool*accessibility, BattleHex *predecessor, int *dists, bool twoHex, bool attackerOwned, bool flying, bool fillPredecessors) const; //*accessibility must be prepared bool[187] array; last two pointers must point to the at least 187-elements int arrays - there is written result | ||||
| 	std::pair< std::vector<BattleHex>, int > getPath(BattleHex start, BattleHex dest, const CStack *stack); //returned value: pair<path, length>; length may be different than number of elements in path since flying vreatures jump between distant hexes | ||||
| 	//std::vector<BattleHex> getAccessibility(const CStack * stack, bool addOccupiable, std::vector<BattleHex> * attackable = NULL, bool forPassingBy = false) const; //returns vector of accessible tiles (taking into account the creature range) | ||||
| @@ -113,7 +113,7 @@ struct DLL_LINKAGE BattleInfo : public CBonusSystemNode, public CBattleInfoCallb | ||||
| 	ui32 calculateHealedHP(const CGHeroInstance * caster, const CSpell * spell, const CStack * stack, const CStack * sacrificedStack = NULL) const; //Sacrifice | ||||
| 	ui32 calculateHealedHP(int healedHealth, const CSpell * spell, const CStack * stack) const; //for Archangel | ||||
| 	ui32 calculateHealedHP(const CSpell * spell, int usedSpellPower, int spellSchoolLevel, const CStack * stack) const; //healing spells casted by stacks | ||||
| 	bool resurrects(TSpell spellid) const; //TODO: move it to spellHandler? | ||||
| 	bool resurrects(SpellID spellid) const; //TODO: move it to spellHandler? | ||||
|  | ||||
| 	const CGHeroInstance * getHero(TPlayerColor player) const; //returns fighting hero that belongs to given player | ||||
|  | ||||
|   | ||||
| @@ -271,7 +271,7 @@ CArtHandler::CArtHandler() | ||||
| 	//VLC->arth = this; | ||||
|  | ||||
| 	// War machines are the default big artifacts. | ||||
| 	for (ArtifactID::ArtifactID i = ArtifactID::CATAPULT; i <= ArtifactID::FIRST_AID_TENT; vstd::advance(i, 1)) | ||||
| 	for (ArtifactID i = ArtifactID::CATAPULT; i <= ArtifactID::FIRST_AID_TENT; i.advance(1)) | ||||
| 		bigArtifacts.insert(i); | ||||
| } | ||||
|  | ||||
| @@ -302,7 +302,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt) | ||||
|  | ||||
| 	std::map<ui32,ui8>::iterator itr; | ||||
|  | ||||
| 	for (ArtifactID::ArtifactID i=static_cast<ArtifactID::ArtifactID>(0); i<GameConstants::ARTIFACTS_QUANTITY; vstd::advance(i, 1)) | ||||
| 	for (ArtifactID i=ArtifactID(0); i<GameConstants::ARTIFACTS_QUANTITY; i.advance(1)) | ||||
| 	{ | ||||
| 		CArtifact *art; | ||||
| 		if (vstd::contains (growingArtifacts, i)) | ||||
| @@ -371,7 +371,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt) | ||||
| 			BOOST_FOREACH(ui32 constituentID, *artifact->constituents) | ||||
| 			{ | ||||
| 				if (artifacts[constituentID]->constituentOf == NULL) | ||||
| 					artifacts[constituentID]->constituentOf = new std::vector<ArtifactID::ArtifactID>(); | ||||
| 					artifacts[constituentID]->constituentOf = new std::vector<ArtifactID>(); | ||||
| 				artifacts[constituentID]->constituentOf->push_back(artifact->id); | ||||
| 			} | ||||
| 		} | ||||
| @@ -385,7 +385,7 @@ void CArtHandler::load(const JsonNode & node) | ||||
| 		if (!entry.second.isNull()) // may happens if mod removed creature by setting json entry to null | ||||
| 		{ | ||||
| 			CArtifact * art = loadArtifact(entry.second); | ||||
| 			art->id = static_cast<ArtifactID::ArtifactID>(artifacts.size()); | ||||
| 			art->id = ArtifactID(artifacts.size()); | ||||
|  | ||||
| 			artifacts.push_back(art); | ||||
| 			tlog5 << "Added artifact: " << entry.first << "\n"; | ||||
| @@ -495,13 +495,13 @@ CArtifact * CArtHandler::loadArtifact(const JsonNode & node) | ||||
| 	return art; | ||||
| } | ||||
|  | ||||
| void CArtifact::addConstituent (ArtifactID::ArtifactID component) | ||||
| void CArtifact::addConstituent (ArtifactID component) | ||||
| { | ||||
| 	assert (constituents); | ||||
| 	constituents->push_back (component); | ||||
| } | ||||
|  | ||||
| ArtifactID::ArtifactID CArtHandler::creatureToMachineID(CreatureID::CreatureID id) | ||||
| ArtifactID CArtHandler::creatureToMachineID(CreatureID id) | ||||
| { | ||||
| 	int dif = 142; | ||||
| 	switch (id) | ||||
| @@ -514,10 +514,10 @@ ArtifactID::ArtifactID CArtHandler::creatureToMachineID(CreatureID::CreatureID i | ||||
| 		break; | ||||
| 	} | ||||
| 	dif = -dif; | ||||
| 	return static_cast<ArtifactID::ArtifactID>(id+dif); | ||||
| 	return ArtifactID(id+dif); | ||||
| } | ||||
|  | ||||
| CreatureID::CreatureID CArtHandler::machineIDToCreature(ArtifactID::ArtifactID id) | ||||
| CreatureID CArtHandler::machineIDToCreature(ArtifactID id) | ||||
| { | ||||
| 	int dif = 142; | ||||
|  | ||||
| @@ -530,7 +530,7 @@ CreatureID::CreatureID CArtHandler::machineIDToCreature(ArtifactID::ArtifactID i | ||||
| 		dif++; | ||||
| 		break; | ||||
| 	} | ||||
| 	return static_cast<CreatureID::CreatureID>(id + dif); | ||||
| 	return CreatureID(id + dif); | ||||
| } | ||||
|  | ||||
| void CArtHandler::sortArts() | ||||
| @@ -651,17 +651,17 @@ Bonus *createBonus(Bonus::BonusType type, int val, int subtype, shared_ptr<IProp | ||||
| 	return added; | ||||
| } | ||||
|  | ||||
| void CArtHandler::giveArtBonus( ArtifactID::ArtifactID aid, Bonus::BonusType type, int val, int subtype, Bonus::ValueType valType, shared_ptr<ILimiter> limiter, int additionalInfo) | ||||
| void CArtHandler::giveArtBonus( ArtifactID aid, Bonus::BonusType type, int val, int subtype, Bonus::ValueType valType, shared_ptr<ILimiter> limiter, int additionalInfo) | ||||
| { | ||||
| 	giveArtBonus(aid, createBonus(type, val, subtype, valType, limiter, additionalInfo)); | ||||
| } | ||||
|  | ||||
| void CArtHandler::giveArtBonus(ArtifactID::ArtifactID aid, Bonus::BonusType type, int val, int subtype, shared_ptr<IPropagator> propagator /*= NULL*/, int additionalInfo) | ||||
| void CArtHandler::giveArtBonus(ArtifactID aid, Bonus::BonusType type, int val, int subtype, shared_ptr<IPropagator> propagator /*= NULL*/, int additionalInfo) | ||||
| { | ||||
| 	giveArtBonus(aid, createBonus(type, val, subtype, propagator, additionalInfo)); | ||||
| } | ||||
|  | ||||
| void CArtHandler::giveArtBonus(ArtifactID::ArtifactID aid, Bonus *bonus) | ||||
| void CArtHandler::giveArtBonus(ArtifactID aid, Bonus *bonus) | ||||
| { | ||||
| 	bonus->sid = aid; | ||||
| 	if(bonus->subtype == Bonus::MORALE || bonus->type == Bonus::LUCK) | ||||
| @@ -750,13 +750,13 @@ void CArtHandler::readComponents (const JsonNode & node, CArtifact * art) | ||||
| 	value = &node["components"]; | ||||
| 	if (!value->isNull()) | ||||
| 	{ | ||||
| 		art->constituents = new std::vector<ArtifactID::ArtifactID>(); | ||||
| 		art->constituents = new std::vector<ArtifactID>(); | ||||
| 		BOOST_FOREACH (auto component, value->Vector()) | ||||
| 		{ | ||||
| 			VLC->modh->identifiers.requestIdentifier(std::string("artifact.") + component.String(), | ||||
| 				[art](si32 id) | ||||
| 				{ | ||||
| 					art->addConstituent(static_cast<ArtifactID::ArtifactID>(id)); | ||||
| 					art->addConstituent(ArtifactID(id)); | ||||
| 				} | ||||
| 			); | ||||
| 		} | ||||
|   | ||||
| @@ -57,7 +57,7 @@ public: | ||||
| 	void setName (std::string desc); | ||||
| 	void setDescription (std::string desc); | ||||
| 	void setEventText (std::string desc); | ||||
| 	void addConstituent (ArtifactID::ArtifactID component); | ||||
| 	void addConstituent (ArtifactID component); | ||||
|  | ||||
| 	int getArtClassSerial() const; //0 - treasure, 1 - minor, 2 - major, 3 - relic, 4 - spell scroll, 5 - other | ||||
| 	std::string nodeName() const OVERRIDE; | ||||
| @@ -67,10 +67,10 @@ public: | ||||
|  | ||||
| 	ui32 price; | ||||
| 	bmap<ArtBearer::ArtBearer, std::vector<ArtifactPosition::ArtifactPosition> > possibleSlots; //Bearer Type => ids of slots where artifact can be placed | ||||
| 	std::vector<ArtifactID::ArtifactID> * constituents; // Artifacts IDs a combined artifact consists of, or NULL. | ||||
| 	std::vector<ArtifactID::ArtifactID> * constituentOf; // Reverse map of constituents. | ||||
| 	std::vector<ArtifactID> * constituents; // Artifacts IDs a combined artifact consists of, or NULL. | ||||
| 	std::vector<ArtifactID> * constituentOf; // Reverse map of constituents. | ||||
| 	EartClass aClass; | ||||
| 	ArtifactID::ArtifactID id; | ||||
| 	ArtifactID id; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
| @@ -189,15 +189,15 @@ public: | ||||
|  | ||||
| class DLL_LINKAGE CArtHandler //handles artifacts | ||||
| { | ||||
| 	void giveArtBonus(ArtifactID::ArtifactID aid, Bonus::BonusType type, int val, int subtype = -1, Bonus::ValueType valType = Bonus::BASE_NUMBER, shared_ptr<ILimiter> limiter = shared_ptr<ILimiter>(), int additionalinfo = 0); | ||||
| 	void giveArtBonus(ArtifactID::ArtifactID aid, Bonus::BonusType type, int val, int subtype, shared_ptr<IPropagator> propagator, int additionalinfo = 0); | ||||
| 	void giveArtBonus(ArtifactID::ArtifactID aid, Bonus *bonus); | ||||
| 	void giveArtBonus(ArtifactID aid, Bonus::BonusType type, int val, int subtype = -1, Bonus::ValueType valType = Bonus::BASE_NUMBER, shared_ptr<ILimiter> limiter = shared_ptr<ILimiter>(), int additionalinfo = 0); | ||||
| 	void giveArtBonus(ArtifactID aid, Bonus::BonusType type, int val, int subtype, shared_ptr<IPropagator> propagator, int additionalinfo = 0); | ||||
| 	void giveArtBonus(ArtifactID aid, Bonus *bonus); | ||||
| public: | ||||
| 	std::vector<CArtifact*> treasures, minors, majors, relics; | ||||
| 	std::vector< ConstTransitivePtr<CArtifact> > artifacts; | ||||
| 	std::vector<CArtifact *> allowedArtifacts; | ||||
| 	std::set<ArtifactID::ArtifactID> bigArtifacts; // Artifacts that cannot be moved to backpack, e.g. war machines. | ||||
| 	std::set<ArtifactID::ArtifactID> growingArtifacts; | ||||
| 	std::set<ArtifactID> bigArtifacts; // Artifacts that cannot be moved to backpack, e.g. war machines. | ||||
| 	std::set<ArtifactID> growingArtifacts; | ||||
|  | ||||
| 	void loadArtifacts(bool onlyTxt); | ||||
| 	/// load all artifacts from json structure | ||||
| @@ -217,10 +217,10 @@ public: | ||||
| 	void getAllowedArts(std::vector<ConstTransitivePtr<CArtifact> > &out, std::vector<CArtifact*> *arts, int flag); | ||||
| 	void getAllowed(std::vector<ConstTransitivePtr<CArtifact> > &out, int flags); | ||||
| 	void erasePickedArt (TArtifactInstanceID id); | ||||
| 	bool isBigArtifact (ArtifactID::ArtifactID artID) const {return bigArtifacts.find(artID) != bigArtifacts.end();} | ||||
| 	bool isBigArtifact (ArtifactID artID) const {return bigArtifacts.find(artID) != bigArtifacts.end();} | ||||
| 	void initAllowedArtifactsList(const std::vector<bool> &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed | ||||
| 	static ArtifactID::ArtifactID creatureToMachineID(CreatureID::CreatureID id); | ||||
| 	static CreatureID::CreatureID machineIDToCreature(ArtifactID::ArtifactID id); | ||||
| 	static ArtifactID creatureToMachineID(CreatureID id); | ||||
| 	static CreatureID machineIDToCreature(ArtifactID id); | ||||
| 	void makeItCreatureArt (CArtifact * a, bool onlyCreature = true); | ||||
| 	void makeItCreatureArt (TArtifactInstanceID aid, bool onlyCreature = true); | ||||
| 	void makeItCommanderArt (CArtifact * a, bool onlyCommander = true); | ||||
|   | ||||
| @@ -353,7 +353,7 @@ bool CBattleInfoEssentials::battleCanFlee(TPlayerColor player) const | ||||
| 	if(mySide == BattleSide::DEFENDER  &&  battleGetSiegeLevel()) | ||||
| 	{ | ||||
| 		auto town = battleGetDefendedTown(); | ||||
| 		if(!town->hasBuilt(EBuilding::ESCAPE_TUNNEL, ETownType::STRONGHOLD)) | ||||
| 		if(!town->hasBuilt(BuildingID::ESCAPE_TUNNEL, ETownType::STRONGHOLD)) | ||||
| 			return false; | ||||
| 	} | ||||
|  | ||||
| @@ -814,7 +814,7 @@ TDmgRange CBattleInfoCallback::calculateDmgRange(const BattleAttackInfo &info) c | ||||
| 	double multDefenceReduction = (100 - battleBonusValue (info.attackerBonuses, Selector::type(Bonus::ENEMY_DEFENCE_REDUCTION))) / 100.0; | ||||
| 	attackDefenceDifference -= info.defenderBonuses->Defense() * multDefenceReduction; | ||||
|  | ||||
| 	if(const Bonus *slayerEffect = info.attackerBonuses->getEffect(Spells::SLAYER)) //slayer handling //TODO: apply only ONLY_MELEE_FIGHT / DISTANCE_FIGHT? | ||||
| 	if(const Bonus *slayerEffect = info.attackerBonuses->getEffect(SpellID::SLAYER)) //slayer handling //TODO: apply only ONLY_MELEE_FIGHT / DISTANCE_FIGHT? | ||||
| 	{ | ||||
| 		std::vector<int> affectedIds; | ||||
| 		int spLevel = slayerEffect->val;  | ||||
| @@ -837,7 +837,7 @@ TDmgRange CBattleInfoCallback::calculateDmgRange(const BattleAttackInfo &info) c | ||||
| 		{ | ||||
| 			if(defenderType->idNumber == affectedIds[g]) | ||||
| 			{ | ||||
| 				attackDefenceDifference += VLC->spellh->spells[Spells::SLAYER]->powers[spLevel]; | ||||
| 				attackDefenceDifference += VLC->spellh->spells[SpellID::SLAYER]->powers[spLevel]; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| @@ -871,7 +871,7 @@ TDmgRange CBattleInfoCallback::calculateDmgRange(const BattleAttackInfo &info) c | ||||
| 		multBonus *= (std::max(0, 100 - info.defenderBonuses->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, SecondarySkill::ARMORER))) / 100.0; | ||||
|  | ||||
| 	//handling hate effect | ||||
| 	additiveBonus += info.attackerBonuses->valOfBonuses(Bonus::HATE, defenderType->idNumber) / 100.; | ||||
| 	additiveBonus += info.attackerBonuses->valOfBonuses(Bonus::HATE, defenderType->idNumber.toEnum()) / 100.; | ||||
|  | ||||
| 	//luck bonus | ||||
| 	if (info.luckyHit) | ||||
| @@ -913,7 +913,7 @@ TDmgRange CBattleInfoCallback::calculateDmgRange(const BattleAttackInfo &info) c | ||||
| 	auto isAdvancedAirShield = [](const Bonus *bonus) | ||||
| 	{ | ||||
| 		return bonus->source == Bonus::SPELL_EFFECT | ||||
| 			&& bonus->sid == Spells::AIR_SHIELD | ||||
| 			&& bonus->sid == SpellID::AIR_SHIELD | ||||
| 			&& bonus->val >= SecSkillLevel::ADVANCED; | ||||
| 	}; | ||||
|  | ||||
| @@ -1482,7 +1482,7 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleIsImmune(const C | ||||
|  | ||||
| 		switch (spell->id) //TODO: more general logic for new spells? | ||||
| 		{ | ||||
| 		case Spells::CLONE: | ||||
| 		case SpellID::CLONE: | ||||
| 			if (caster) //TODO: how about stacks casting Clone? | ||||
| 			{ | ||||
| 				if (vstd::contains(subject->state, EBattleStackState::CLONED)) | ||||
| @@ -1493,7 +1493,7 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleIsImmune(const C | ||||
| 					return ESpellCastProblem::STACK_IMMUNE_TO_SPELL; | ||||
| 			} | ||||
| 			break; | ||||
| 		case Spells::DISPEL_HELPFUL_SPELLS: | ||||
| 		case SpellID::DISPEL_HELPFUL_SPELLS: | ||||
| 			{ | ||||
| 				TBonusListPtr spellBon = subject->getSpellBonuses(); | ||||
| 				bool hasPositiveSpell = false; | ||||
| @@ -1593,8 +1593,8 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastThisSpell | ||||
| 		return ESpellCastProblem::SPELL_LEVEL_LIMIT_EXCEEDED; | ||||
|  | ||||
| 	//IDs of summon elemental spells (fire, earth, water, air) | ||||
| 	int spellIDs[] = {	Spells::SUMMON_FIRE_ELEMENTAL, Spells::SUMMON_EARTH_ELEMENTAL, | ||||
| 						Spells::SUMMON_WATER_ELEMENTAL, Spells::SUMMON_AIR_ELEMENTAL }; | ||||
| 	int spellIDs[] = {	SpellID::SUMMON_FIRE_ELEMENTAL, SpellID::SUMMON_EARTH_ELEMENTAL, | ||||
| 						SpellID::SUMMON_WATER_ELEMENTAL, SpellID::SUMMON_AIR_ELEMENTAL }; | ||||
| 	//(fire, earth, water, air) elementals | ||||
| 	int creIDs[] = {114, 113, 115, 112}; | ||||
|  | ||||
| @@ -1763,7 +1763,7 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastThisSpell | ||||
| 	{ | ||||
| 		if(!deadStack && !aliveStack) | ||||
| 			return ESpellCastProblem::NO_APPROPRIATE_TARGET; | ||||
| 		if(spell->id == Spells::ANIMATE_DEAD  &&  deadStack  &&  !deadStack->hasBonusOfType(Bonus::UNDEAD)) | ||||
| 		if(spell->id == SpellID::ANIMATE_DEAD  &&  deadStack  &&  !deadStack->hasBonusOfType(Bonus::UNDEAD)) | ||||
| 			return ESpellCastProblem::NO_APPROPRIATE_TARGET; | ||||
| 		if(deadStack && deadStack->owner != player) //you can resurrect only your own stacks //FIXME: it includes alive stacks as well | ||||
| 			return ESpellCastProblem::NO_APPROPRIATE_TARGET; | ||||
| @@ -1792,7 +1792,7 @@ ui32 CBattleInfoCallback::calculateSpellBonus(ui32 baseDamage, const CSpell * sp | ||||
| 	if(caster) | ||||
| 	{ | ||||
| 		ret *= (100.0 + caster->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, SecondarySkill::SORCERY)) / 100.0; | ||||
| 		ret *= (100.0 + caster->valOfBonuses(Bonus::SPELL_DAMAGE) + caster->valOfBonuses(Bonus::SPECIFIC_SPELL_DAMAGE, sp->id)) / 100.0; | ||||
| 		ret *= (100.0 + caster->valOfBonuses(Bonus::SPELL_DAMAGE) + caster->valOfBonuses(Bonus::SPECIFIC_SPELL_DAMAGE, sp->id.toEnum())) / 100.0; | ||||
|  | ||||
| 		if(sp->air) | ||||
| 			ret *= (100.0 + caster->valOfBonuses(Bonus::AIR_SPELL_DMG_PREMY)) / 100.0; | ||||
| @@ -1804,7 +1804,7 @@ ui32 CBattleInfoCallback::calculateSpellBonus(ui32 baseDamage, const CSpell * sp | ||||
| 			ret *= (100.0 + caster->valOfBonuses(Bonus::EARTH_SPELL_DMG_PREMY)) / 100.0; | ||||
|  | ||||
| 		if (affectedCreature && affectedCreature->getCreature()->level) //Hero specials like Solmyr, Deemer | ||||
| 			ret *= (100. + ((caster->valOfBonuses(Bonus::SPECIAL_SPELL_LEV, sp->id) * caster->level) / affectedCreature->getCreature()->level)) / 100.0; | ||||
| 			ret *= (100. + ((caster->valOfBonuses(Bonus::SPECIAL_SPELL_LEV, sp->id.toEnum()) * caster->level) / affectedCreature->getCreature()->level)) / 100.0; | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
| @@ -1854,7 +1854,7 @@ ui32 CBattleInfoCallback::calculateSpellDmg( const CSpell * sp, const CGHeroInst | ||||
| 		//dmg increasing | ||||
| 		if( affectedCreature->hasBonusOfType(Bonus::MORE_DAMAGE_FROM_SPELL, sp->id) ) | ||||
| 		{ | ||||
| 			ret *= 100 + affectedCreature->valOfBonuses(Bonus::MORE_DAMAGE_FROM_SPELL, sp->id); | ||||
| 			ret *= 100 + affectedCreature->valOfBonuses(Bonus::MORE_DAMAGE_FROM_SPELL, sp->id.toEnum()); | ||||
| 			ret /= 100; | ||||
| 		} | ||||
| 	} | ||||
| @@ -1868,15 +1868,15 @@ std::set<const CStack*> CBattleInfoCallback::getAffectedCreatures(const CSpell * | ||||
|  | ||||
| 	const ui8 attackerSide = playerToSide(attackerOwner) == 1; | ||||
| 	const auto attackedHexes = spell->rangeInHexes(destinationTile, skillLevel, attackerSide); | ||||
| 	const bool onlyAlive = spell->id != Spells::RESURRECTION && spell->id != Spells::ANIMATE_DEAD; //when casting resurrection or animate dead we should be allow to select dead stack | ||||
| 	const bool onlyAlive = spell->id != SpellID::RESURRECTION && spell->id != SpellID::ANIMATE_DEAD; //when casting resurrection or animate dead we should be allow to select dead stack | ||||
| 	//fixme: what about other rising spells (Sacrifice) ? | ||||
| 	if(spell->id == Spells::DEATH_RIPPLE || spell->id == Spells::DESTROY_UNDEAD || spell->id == Spells::ARMAGEDDON) | ||||
| 	if(spell->id == SpellID::DEATH_RIPPLE || spell->id == SpellID::DESTROY_UNDEAD || spell->id == SpellID::ARMAGEDDON) | ||||
| 	{ | ||||
| 		BOOST_FOREACH(const CStack *stack, battleGetAllStacks()) | ||||
| 		{ | ||||
| 			if((spell->id == Spells::DEATH_RIPPLE && !stack->getCreature()->isUndead()) //death ripple | ||||
| 				|| (spell->id == Spells::DESTROY_UNDEAD && stack->getCreature()->isUndead()) //destroy undead | ||||
| 				|| (spell->id == Spells::ARMAGEDDON) //Armageddon | ||||
| 			if((spell->id == SpellID::DEATH_RIPPLE && !stack->getCreature()->isUndead()) //death ripple | ||||
| 				|| (spell->id == SpellID::DESTROY_UNDEAD && stack->getCreature()->isUndead()) //destroy undead | ||||
| 				|| (spell->id == SpellID::ARMAGEDDON) //Armageddon | ||||
| 				) | ||||
| 			{ | ||||
| 				if(stack->isValidTarget()) | ||||
| @@ -1884,7 +1884,7 @@ std::set<const CStack*> CBattleInfoCallback::getAffectedCreatures(const CSpell * | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else if (spell->id == Spells::CHAIN_LIGHTNING) | ||||
| 	else if (spell->id == SpellID::CHAIN_LIGHTNING) | ||||
| 	{ | ||||
| 		std::set<BattleHex> possibleHexes; | ||||
| 		BOOST_FOREACH (auto stack, battleGetAllStacks()) | ||||
| @@ -2007,10 +2007,10 @@ std::set<const CStack*> CBattleInfoCallback:: batteAdjacentCreatures(const CStac | ||||
| 	return stacks; | ||||
| } | ||||
|  | ||||
| TSpell CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) const | ||||
| SpellID CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) const | ||||
| { | ||||
| 	RETURN_IF_NOT_BATTLE(-1); | ||||
| 	std::vector<TSpell> possibleSpells; | ||||
| 	RETURN_IF_NOT_BATTLE(SpellID::NONE); | ||||
| 	std::vector<SpellID> possibleSpells; | ||||
|  | ||||
| 	BOOST_FOREACH(const CSpell *spell, VLC->spellh->spells) | ||||
| 	{ | ||||
| @@ -2022,8 +2022,8 @@ TSpell CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) con | ||||
|  | ||||
| 			switch (spell->id) | ||||
| 			{ | ||||
| 			case Spells::SHIELD: | ||||
| 			case Spells::FIRE_SHIELD: // not if all enemy units are shooters | ||||
| 			case SpellID::SHIELD: | ||||
| 			case SpellID::FIRE_SHIELD: // not if all enemy units are shooters | ||||
| 				{ | ||||
| 					auto walker = getStackIf([&](const CStack *stack) //look for enemy, non-shooting stack | ||||
| 					{ | ||||
| @@ -2034,7 +2034,7 @@ TSpell CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) con | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::AIR_SHIELD: //only against active shooters | ||||
| 			case SpellID::AIR_SHIELD: //only against active shooters | ||||
| 				{ | ||||
|  | ||||
| 					auto shooter = getStackIf([&](const CStack *stack) //look for enemy, non-shooting stack | ||||
| @@ -2045,32 +2045,32 @@ TSpell CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) con | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::ANTI_MAGIC: | ||||
| 			case Spells::MAGIC_MIRROR: | ||||
| 			case SpellID::ANTI_MAGIC: | ||||
| 			case SpellID::MAGIC_MIRROR: | ||||
| 				{ | ||||
| 					if (!battleHasHero(subject->attackerOwned)) //only if there is enemy hero | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::CURE: //only damaged units - what about affected by curse? | ||||
| 			case SpellID::CURE: //only damaged units - what about affected by curse? | ||||
| 				{ | ||||
| 					if (subject->firstHPleft >= subject->MaxHealth()) | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::BLOODLUST: | ||||
| 			case SpellID::BLOODLUST: | ||||
| 				{ | ||||
| 					if (subject->shots) //if can shoot - only if enemy uits are adjacent | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::PRECISION: | ||||
| 			case SpellID::PRECISION: | ||||
| 				{ | ||||
| 					if (!(subject->hasBonusOfType(Bonus::SHOOTER) && subject->shots)) | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::SLAYER://only if monsters are present | ||||
| 			case SpellID::SLAYER://only if monsters are present | ||||
| 				{ | ||||
| 					auto kingMonster = getStackIf([&](const CStack *stack) //look for enemy, non-shooting stack | ||||
| 					{ | ||||
| @@ -2082,7 +2082,7 @@ TSpell CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) con | ||||
| 						continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			case Spells::CLONE: //not allowed | ||||
| 			case SpellID::CLONE: //not allowed | ||||
| 				continue; | ||||
| 				break; | ||||
| 			} | ||||
| @@ -2093,16 +2093,16 @@ TSpell CBattleInfoCallback::getRandomBeneficialSpell(const CStack * subject) con | ||||
| 	if (possibleSpells.size()) | ||||
| 		return possibleSpells[rand() % possibleSpells.size()]; | ||||
| 	else | ||||
| 		return -1; | ||||
| 		return SpellID::NONE; | ||||
| } | ||||
|  | ||||
| TSpell CBattleInfoCallback::getRandomCastedSpell(const CStack * caster) const | ||||
| SpellID CBattleInfoCallback::getRandomCastedSpell(const CStack * caster) const | ||||
| { | ||||
| 	RETURN_IF_NOT_BATTLE(-1); | ||||
| 	RETURN_IF_NOT_BATTLE(SpellID::NONE); | ||||
|  | ||||
| 	TBonusListPtr bl = caster->getBonuses(Selector::type(Bonus::SPELLCASTER)); | ||||
| 	if (!bl->size()) | ||||
| 		return -1; | ||||
| 		return SpellID::NONE; | ||||
| 	int totalWeight = 0; | ||||
| 	BOOST_FOREACH(Bonus * b, *bl) | ||||
| 	{ | ||||
| @@ -2114,11 +2114,11 @@ TSpell CBattleInfoCallback::getRandomCastedSpell(const CStack * caster) const | ||||
| 		randomPos -= std::max(b->additionalInfo, 1); | ||||
| 		if(randomPos < 0) | ||||
| 		{ | ||||
| 			return b->subtype; | ||||
| 			return SpellID(b->subtype); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return -1; | ||||
| 	return SpellID::NONE; | ||||
| } | ||||
|  | ||||
| int CBattleInfoCallback::battleGetSurrenderCost(TPlayerColor Player) const | ||||
|   | ||||
| @@ -260,8 +260,8 @@ public: | ||||
| 	std::set<const CStack*> getAffectedCreatures(const CSpell * s, int skillLevel, ui8 attackerOwner, BattleHex destinationTile); //calculates stack affected by given spell | ||||
|  | ||||
| 	si32 battleGetRandomStackSpell(const CStack * stack, ERandomSpell mode) const; | ||||
| 	TSpell getRandomBeneficialSpell(const CStack * subject) const; | ||||
| 	TSpell getRandomCastedSpell(const CStack * caster) const; //called at the beginning of turn for Faerie Dragon | ||||
| 	SpellID getRandomBeneficialSpell(const CStack * subject) const; | ||||
| 	SpellID getRandomCastedSpell(const CStack * caster) const; //called at the beginning of turn for Faerie Dragon | ||||
|  | ||||
| 	//checks for creature immunity / anything that prevent casting *at given hex* - doesn't take into acount general problems such as not having spellbook or mana points etc. | ||||
| 	ESpellCastProblem::ESpellCastProblem battleIsImmune(const CGHeroInstance * caster, const CSpell * spell, ECastingMode::ECastingMode mode, BattleHex dest) const;  | ||||
|   | ||||
| @@ -221,7 +221,7 @@ void CCreatureHandler::loadCreatures() | ||||
| 			parser.endLine(); | ||||
|  | ||||
| 		CCreature &ncre = *new CCreature; | ||||
| 		ncre.idNumber = static_cast<CreatureID::CreatureID>(creatures.size()); | ||||
| 		ncre.idNumber = CreatureID(creatures.size()); | ||||
| 		ncre.cost.resize(GameConstants::RESOURCE_QUANTITY); | ||||
| 		ncre.level=0; | ||||
| 		ncre.iconIndex = ncre.idNumber + 2; // +2 for empty\selection images | ||||
| @@ -544,7 +544,7 @@ void CCreatureHandler::load(const JsonNode & node) | ||||
| 		{ | ||||
| 			CCreature * creature = loadCreature(entry.second); | ||||
| 			creature->nameRef = entry.first; | ||||
| 			creature->idNumber = static_cast<CreatureID::CreatureID>(creatures.size()); | ||||
| 			creature->idNumber = CreatureID(creatures.size()); | ||||
|  | ||||
| 			creatures.push_back(creature); | ||||
| 			tlog5 << "Added creature: " << entry.first << "\n"; | ||||
| @@ -678,7 +678,7 @@ void CCreatureHandler::loadCreatureJson(CCreature * creature, const JsonNode & c | ||||
| 	{ | ||||
| 		VLC->modh->identifiers.requestIdentifier(std::string("creature.") + value.String(), [=](si32 identifier) | ||||
| 		{ | ||||
| 			creature->upgrades.insert(static_cast<CreatureID::CreatureID>(identifier)); | ||||
| 			creature->upgrades.insert(CreatureID(identifier)); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| @@ -1013,7 +1013,7 @@ CCreatureHandler::~CCreatureHandler() | ||||
| { | ||||
| } | ||||
|  | ||||
| CreatureID::CreatureID CCreatureHandler::pickRandomMonster(const boost::function<int()> &randGen, int tier) const | ||||
| CreatureID CCreatureHandler::pickRandomMonster(const boost::function<int()> &randGen, int tier) const | ||||
| { | ||||
| 	int r = 0; | ||||
| 	if(tier == -1) //pick any allowed creature | ||||
| @@ -1026,11 +1026,11 @@ CreatureID::CreatureID CCreatureHandler::pickRandomMonster(const boost::function | ||||
| 	else | ||||
| 	{ | ||||
| 		assert(vstd::iswithin(tier, 1, 7)); | ||||
| 		std::vector<CreatureID::CreatureID> allowed; | ||||
| 		std::vector<CreatureID> allowed; | ||||
| 		BOOST_FOREACH(const CBonusSystemNode *b, creaturesOfLevel[tier].getChildrenNodes()) | ||||
| 		{ | ||||
| 			assert(b->getNodeType() == CBonusSystemNode::CREATURE); | ||||
| 			CreatureID::CreatureID creid = static_cast<const CCreature*>(b)->idNumber; | ||||
| 			CreatureID creid = static_cast<const CCreature*>(b)->idNumber; | ||||
| 			if(!vstd::contains(notUsedMonsters, creid)) | ||||
| 				allowed.push_back(creid); | ||||
| 		} | ||||
| @@ -1043,7 +1043,7 @@ CreatureID::CreatureID CCreatureHandler::pickRandomMonster(const boost::function | ||||
|  | ||||
| 		return vstd::pickRandomElementOf(allowed, randGen); | ||||
| 	} | ||||
| 	return static_cast<CreatureID::CreatureID>(r); | ||||
| 	return CreatureID(r); | ||||
| } | ||||
|  | ||||
| void CCreatureHandler::addBonusForTier(int tier, Bonus *b) | ||||
|   | ||||
| @@ -28,7 +28,7 @@ public: | ||||
| 	std::string namePl, nameSing, nameRef; //name in singular and plural form; and reference name | ||||
| 	TResources cost; //cost[res_id] - amount of that resource | ||||
| 	std::set<std::string> upgradeNames; //for reference, they are later transformed info ui32 upgrades | ||||
| 	std::set<CreatureID::CreatureID> upgrades; // IDs of creatures to which this creature can be upgraded | ||||
| 	std::set<CreatureID> upgrades; // IDs of creatures to which this creature can be upgraded | ||||
| 	//damage, hp. etc are handled by Bonuses | ||||
| 	ui32 fightValue, AIValue, growth, hordeGrowth; | ||||
| 	ui32 ammMin, ammMax; | ||||
| @@ -36,7 +36,7 @@ public: | ||||
| 	std::string abilityRefs; //references to abilities, in text format | ||||
| 	std::string animDefName; | ||||
| 	std::string advMapDef; //for new creatures only | ||||
| 	CreatureID::CreatureID idNumber; | ||||
| 	CreatureID idNumber; | ||||
| 	si32 iconIndex; // index of icon in files like twcrport | ||||
| 	TFaction faction; //-1 = neutral | ||||
| 	ui8 level; // 0 - unknown | ||||
| @@ -132,7 +132,7 @@ private: | ||||
| 	void loadCreatureJson(CCreature * creature, const JsonNode & config); | ||||
| public: | ||||
| 	std::set<int> notUsedMonsters; | ||||
| 	std::set<CreatureID::CreatureID> doubledCreatures; //they get double week | ||||
| 	std::set<CreatureID> doubledCreatures; //they get double week | ||||
| 	std::vector<ConstTransitivePtr<CCreature> > creatures; //creature ID -> creature info | ||||
|  | ||||
| 	//stack exp | ||||
| @@ -169,7 +169,7 @@ public: | ||||
| 	~CCreatureHandler(); | ||||
|  | ||||
| 	void deserializationFix(); | ||||
| 	CreatureID::CreatureID pickRandomMonster(const boost::function<int()> &randGen = 0, int tier = -1) const; //tier <1 - CREATURES_PER_TOWN> or -1 for any | ||||
| 	CreatureID pickRandomMonster(const boost::function<int()> &randGen = 0, int tier = -1) const; //tier <1 - CREATURES_PER_TOWN> or -1 for any | ||||
| 	void addBonusForTier(int tier, Bonus *b); //tier must be <1-7> | ||||
| 	void addBonusForAllCreatures(Bonus *b); | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ const CCreature* CCreatureSet::getCreature(TSlot slot) const | ||||
| 		return NULL; | ||||
| } | ||||
|  | ||||
| bool CCreatureSet::setCreature(TSlot slot, CreatureID::CreatureID type, TQuantity quantity) /*slots 0 to 6 */ | ||||
| bool CCreatureSet::setCreature(TSlot slot, CreatureID type, TQuantity quantity) /*slots 0 to 6 */ | ||||
| { | ||||
| 	if(slot > 6 || slot < 0) | ||||
| 	{ | ||||
| @@ -60,7 +60,7 @@ bool CCreatureSet::setCreature(TSlot slot, CreatureID::CreatureID type, TQuantit | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| TSlot CCreatureSet::getSlotFor(CreatureID::CreatureID creature, ui32 slotsAmount/*=7*/) const /*returns -1 if no slot available */ | ||||
| TSlot CCreatureSet::getSlotFor(CreatureID creature, ui32 slotsAmount/*=7*/) const /*returns -1 if no slot available */ | ||||
| { | ||||
| 	return getSlotFor(VLC->creh->creatures[creature], slotsAmount); | ||||
| } | ||||
| @@ -162,7 +162,7 @@ void CCreatureSet::sweep() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CCreatureSet::addToSlot(TSlot slot, CreatureID::CreatureID cre, TQuantity count, bool allowMerging/* = true*/) | ||||
| void CCreatureSet::addToSlot(TSlot slot, CreatureID cre, TQuantity count, bool allowMerging/* = true*/) | ||||
| { | ||||
| 	const CCreature *c = VLC->creh->creatures[cre]; | ||||
|  | ||||
| @@ -463,7 +463,7 @@ CStackInstance::CStackInstance() | ||||
| 	init(); | ||||
| } | ||||
|  | ||||
| CStackInstance::CStackInstance(CreatureID::CreatureID id, TQuantity Count) | ||||
| CStackInstance::CStackInstance(CreatureID id, TQuantity Count) | ||||
| 	: armyObj(_armyObj) | ||||
| { | ||||
| 	init(); | ||||
| @@ -545,7 +545,7 @@ void CStackInstance::giveStackExp(TExpType exp) | ||||
| 	vstd::amin(experience += exp, maxExp); //can't get more exp than this limit | ||||
| } | ||||
|  | ||||
| void CStackInstance::setType(CreatureID::CreatureID creID) | ||||
| void CStackInstance::setType(CreatureID creID) | ||||
| { | ||||
| 	if(creID >= 0 && creID < VLC->creh->creatures.size()) | ||||
| 		setType(VLC->creh->creatures[creID]); | ||||
| @@ -977,7 +977,7 @@ void CStackInstance::deserializationFix() | ||||
| 	artDeserializationFix(this); | ||||
| } | ||||
|  | ||||
| CreatureID::CreatureID CStackInstance::getCreatureID() const | ||||
| CreatureID CStackInstance::getCreatureID() const | ||||
| { | ||||
| 	if(type) | ||||
| 		return type->idNumber; | ||||
| @@ -1007,7 +1007,7 @@ CCommanderInstance::CCommanderInstance() | ||||
| 	name = "Unnamed"; | ||||
| } | ||||
|  | ||||
| CCommanderInstance::CCommanderInstance (CreatureID::CreatureID id) | ||||
| CCommanderInstance::CCommanderInstance (CreatureID id) | ||||
| { | ||||
| 	init(); | ||||
| 	setType(id); | ||||
| @@ -1073,7 +1073,7 @@ CStackBasicDescriptor::CStackBasicDescriptor() | ||||
| 	count = -1; | ||||
| } | ||||
|  | ||||
| CStackBasicDescriptor::CStackBasicDescriptor(CreatureID::CreatureID id, TQuantity Count) | ||||
| CStackBasicDescriptor::CStackBasicDescriptor(CreatureID id, TQuantity Count) | ||||
| 	: type (VLC->creh->creatures[id]), count(Count) | ||||
| { | ||||
| } | ||||
| @@ -1107,7 +1107,7 @@ CSimpleArmy::operator bool() const | ||||
| 	return army.size(); | ||||
| } | ||||
|  | ||||
| bool CSimpleArmy::setCreature(TSlot slot, CreatureID::CreatureID cre, TQuantity count) | ||||
| bool CSimpleArmy::setCreature(TSlot slot, CreatureID cre, TQuantity count) | ||||
| { | ||||
| 	assert(!vstd::contains(army, slot)); | ||||
| 	army[slot] = CStackBasicDescriptor(cre, count); | ||||
|   | ||||
| @@ -27,7 +27,7 @@ public: | ||||
| 	TQuantity count; | ||||
|  | ||||
| 	CStackBasicDescriptor(); | ||||
| 	CStackBasicDescriptor(CreatureID::CreatureID id, TQuantity Count); | ||||
| 	CStackBasicDescriptor(CreatureID id, TQuantity Count); | ||||
| 	CStackBasicDescriptor(const CCreature *c, TQuantity Count); | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -65,15 +65,15 @@ public: | ||||
| 	std::string getQuantityTXT(bool capitalized = true) const; | ||||
| 	virtual int getExpRank() const; | ||||
| 	si32 magicResistance() const; | ||||
| 	CreatureID::CreatureID getCreatureID() const; //-1 if not available | ||||
| 	CreatureID getCreatureID() const; //-1 if not available | ||||
| 	std::string getName() const; //plural or singular | ||||
| 	virtual void init(); | ||||
| 	CStackInstance(); | ||||
| 	CStackInstance(CreatureID::CreatureID id, TQuantity count); | ||||
| 	CStackInstance(CreatureID id, TQuantity count); | ||||
| 	CStackInstance(const CCreature *cre, TQuantity count); | ||||
| 	~CStackInstance(); | ||||
|  | ||||
| 	void setType(CreatureID::CreatureID creID); | ||||
| 	void setType(CreatureID creID); | ||||
| 	void setType(const CCreature *c); | ||||
| 	void setArmyObj(const CArmedInstance *ArmyObj); | ||||
| 	virtual void giveStackExp(TExpType exp); | ||||
| @@ -97,7 +97,7 @@ public: | ||||
| 	//std::vector <CArtifactInstance *> arts; | ||||
| 	void init() OVERRIDE; | ||||
| 	CCommanderInstance(); | ||||
| 	CCommanderInstance (CreatureID::CreatureID id); | ||||
| 	CCommanderInstance (CreatureID id); | ||||
| 	~CCommanderInstance(); | ||||
| 	void setAlive (bool alive); | ||||
| 	void giveStackExp (TExpType exp); | ||||
| @@ -123,7 +123,7 @@ class IArmyDescriptor | ||||
| { | ||||
| public: | ||||
| 	virtual void clear() = 0; | ||||
| 	virtual bool setCreature(TSlot slot, CreatureID::CreatureID cre, TQuantity count) = 0; | ||||
| 	virtual bool setCreature(TSlot slot, CreatureID cre, TQuantity count) = 0; | ||||
| }; | ||||
|  | ||||
| //simplified version of CCreatureSet | ||||
| @@ -132,7 +132,7 @@ class DLL_LINKAGE CSimpleArmy : public IArmyDescriptor | ||||
| public: | ||||
| 	TSimpleSlots army; | ||||
| 	void clear() OVERRIDE; | ||||
| 	bool setCreature(TSlot slot, CreatureID::CreatureID cre, TQuantity count) OVERRIDE; | ||||
| 	bool setCreature(TSlot slot, CreatureID cre, TQuantity count) OVERRIDE; | ||||
| 	operator bool() const; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -157,7 +157,7 @@ public: | ||||
|  | ||||
| 	const TSlots &Slots() const {return stacks;} | ||||
|  | ||||
| 	void addToSlot(TSlot slot, CreatureID::CreatureID cre, TQuantity count, bool allowMerging = true); //Adds stack to slot. Slot must be empty or with same type creature | ||||
| 	void addToSlot(TSlot slot, CreatureID cre, TQuantity count, bool allowMerging = true); //Adds stack to slot. Slot must be empty or with same type creature | ||||
| 	void addToSlot(TSlot slot, CStackInstance *stack, bool allowMerging = true); //Adds stack to slot. Slot must be empty or with same type creature | ||||
| 	void clear() OVERRIDE; | ||||
| 	void setFormation(bool tight); | ||||
| @@ -175,7 +175,7 @@ public: | ||||
| 	void eraseStack(TSlot slot); //slot must be occupied | ||||
| 	void joinStack(TSlot slot, CStackInstance * stack); //adds new stack to the existing stack of the same type | ||||
| 	void changeStackCount(TSlot slot, TQuantity toAdd); //stack must exist! | ||||
| 	bool setCreature (TSlot slot, CreatureID::CreatureID type, TQuantity quantity) OVERRIDE; //replaces creature in stack; slots 0 to 6, if quantity=0 erases stack | ||||
| 	bool setCreature (TSlot slot, CreatureID type, TQuantity quantity) OVERRIDE; //replaces creature in stack; slots 0 to 6, if quantity=0 erases stack | ||||
| 	void setToArmy(CSimpleArmy &src); //erases all our army and moves stacks from src to us; src MUST NOT be an armed object! WARNING: use it wisely. Or better do not use at all. | ||||
|  | ||||
| 	const CStackInstance& getStack(TSlot slot) const; //stack must exist | ||||
| @@ -184,7 +184,7 @@ public: | ||||
| 	int getStackCount (TSlot slot) const; | ||||
| 	TExpType getStackExperience(TSlot slot) const; | ||||
| 	TSlot findStack(const CStackInstance *stack) const; //-1 if none | ||||
| 	TSlot getSlotFor(CreatureID::CreatureID creature, ui32 slotsAmount = GameConstants::ARMY_SIZE) const; //returns -1 if no slot available | ||||
| 	TSlot getSlotFor(CreatureID creature, ui32 slotsAmount = GameConstants::ARMY_SIZE) const; //returns -1 if no slot available | ||||
| 	TSlot getSlotFor(const CCreature *c, ui32 slotsAmount = GameConstants::ARMY_SIZE) const; //returns -1 if no slot available | ||||
| 	TSlot getFreeSlot(ui32 slotsAmount = GameConstants::ARMY_SIZE) const; | ||||
| 	bool mergableStacks(std::pair<TSlot, TSlot> &out, TSlot preferable = -1) const; //looks for two same stacks, returns slot positions; | ||||
|   | ||||
| @@ -90,7 +90,7 @@ void CDefObjInfoHandler::load() | ||||
|  | ||||
| 		for(int yy=0; yy<2; ++yy) //first - on which types of terrain object can be placed; | ||||
| 			inp>>dump; //second -in which terrains' menus object in the editor will be available (?) | ||||
| 		si32 id; inp >> id; nobj->id = static_cast<Obj::Obj>(id); | ||||
| 		si32 id; inp >> id; nobj->id = Obj(id); | ||||
| 		inp>>nobj->subid; | ||||
| 		inp>>nobj->type; | ||||
|  | ||||
| @@ -102,22 +102,21 @@ void CDefObjInfoHandler::load() | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			using namespace Obj; | ||||
| 			static int visitableFromTop[] = | ||||
| 				{FLOTSAM, | ||||
| 				SEA_CHEST, | ||||
| 				SHIPWRECK_SURVIVOR, | ||||
| 				BUOY, | ||||
| 				OCEAN_BOTTLE, | ||||
| 				BOAT, | ||||
| 				WHIRLPOOL, | ||||
| 				GARRISON, | ||||
| 				SCHOLAR, | ||||
| 				CAMPFIRE, | ||||
| 				BORDERGUARD, | ||||
| 				BORDER_GATE, | ||||
| 				QUEST_GUARD, | ||||
| 				CORPSE}; | ||||
| 			static const Obj visitableFromTop[] = | ||||
| 				{Obj::FLOTSAM, | ||||
| 				Obj::SEA_CHEST, | ||||
| 				Obj::SHIPWRECK_SURVIVOR, | ||||
| 				Obj::BUOY, | ||||
| 				Obj::OCEAN_BOTTLE, | ||||
| 				Obj::BOAT, | ||||
| 				Obj::WHIRLPOOL, | ||||
| 				Obj::GARRISON, | ||||
| 				Obj::SCHOLAR, | ||||
| 				Obj::CAMPFIRE, | ||||
| 				Obj::BORDERGUARD, | ||||
| 				Obj::BORDER_GATE, | ||||
| 				Obj::QUEST_GUARD, | ||||
| 				Obj::CORPSE}; | ||||
|  | ||||
| 			for(int i=0; i < ARRAY_COUNT(visitableFromTop); i++) | ||||
| 			{ | ||||
| @@ -134,7 +133,7 @@ void CDefObjInfoHandler::load() | ||||
| 		nobj->fetchInfoFromMSK(); | ||||
|  | ||||
|  | ||||
| 		gobjs[nobj->id][nobj->subid] = nobj; | ||||
| 		nobj->id.toDefObjInfo()[nobj->subid] = nobj; | ||||
| 	} | ||||
|  | ||||
| 	for (int i = 0; i < 8 ; i++) | ||||
|   | ||||
| @@ -23,7 +23,7 @@ public: | ||||
| 	ui8 blockMap[6]; | ||||
| 	ui8 coverageMap[6], shadowCoverage[6]; //to determine which tiles are covered by picture of this object | ||||
| 	ui8 visitDir; //directions from which object can be entered, format same as for moveDir in CGHeroInstance(but 0 - 7) | ||||
| 	Obj::Obj id; | ||||
| 	Obj id; | ||||
| 	si32 subid; //of object described by this defInfo | ||||
| 	si32 terrainAllowed, //on which terrain it is possible to place object | ||||
| 		 terrainMenu; //in which menus in map editor object will be showed | ||||
|   | ||||
| @@ -332,7 +332,7 @@ DLL_LINKAGE std::string MetaString::buildList () const | ||||
| } | ||||
|  | ||||
|  | ||||
| void  MetaString::addCreReplacement(CreatureID::CreatureID id, TQuantity count) //adds sing or plural name; | ||||
| void  MetaString::addCreReplacement(CreatureID id, TQuantity count) //adds sing or plural name; | ||||
| { | ||||
| 	if (!count) | ||||
| 		addReplacement (CRE_PL_NAMES, id); //no creatures - just empty name (eg. defeat Angels) | ||||
| @@ -348,7 +348,7 @@ void MetaString::addReplacement(const CStackBasicDescriptor &stack) | ||||
| 	addCreReplacement(stack.type->idNumber, stack.count); | ||||
| } | ||||
|  | ||||
| static CGObjectInstance * createObject(Obj::Obj id, int subid, int3 pos, int owner) | ||||
| static CGObjectInstance * createObject(Obj id, int subid, int3 pos, int owner) | ||||
| { | ||||
| 	CGObjectInstance * nobj; | ||||
| 	switch(id) | ||||
| @@ -367,7 +367,7 @@ static CGObjectInstance * createObject(Obj::Obj id, int subid, int3 pos, int own | ||||
| 		break; | ||||
| 	default: //rest of objects | ||||
| 		nobj = new CGObjectInstance; | ||||
| 		nobj->defInfo = VLC->dobjinfo->gobjs[id][subid]; | ||||
| 		nobj->defInfo = id.toDefObjInfo()[subid]; | ||||
| 		break; | ||||
| 	} | ||||
| 	nobj->ID = id; | ||||
| @@ -383,7 +383,7 @@ static CGObjectInstance * createObject(Obj::Obj id, int subid, int3 pos, int own | ||||
| 	//assigning defhandler | ||||
| 	if(nobj->ID==Obj::HERO || nobj->ID==Obj::TOWN) | ||||
| 		return nobj; | ||||
| 	nobj->defInfo = VLC->dobjinfo->gobjs[id][subid]; | ||||
| 	nobj->defInfo = id.toDefObjInfo()[subid]; | ||||
| 	return nobj; | ||||
| } | ||||
|  | ||||
| @@ -516,7 +516,7 @@ int CGameState::pickHero(int owner) | ||||
| } | ||||
|  | ||||
|  | ||||
| std::pair<Obj::Obj,int> CGameState::pickObject (CGObjectInstance *obj) | ||||
| std::pair<Obj,int> CGameState::pickObject (CGObjectInstance *obj) | ||||
| { | ||||
| 	switch(obj->ID) | ||||
| 	{ | ||||
| @@ -630,7 +630,7 @@ std::pair<Obj::Obj,int> CGameState::pickObject (CGObjectInstance *obj) | ||||
| 			delete dwl->info; | ||||
| 			dwl->info = nullptr; | ||||
|  | ||||
| 			std::pair<Obj::Obj,int> result(Obj::NO_OBJ, -1); | ||||
| 			std::pair<Obj,int> result(Obj::NO_OBJ, -1); | ||||
| 			int cid = VLC->townh->towns[faction].creatures[level][0]; | ||||
|  | ||||
| 			//golem factory is not in list of cregens but can be placed as random object | ||||
| @@ -661,8 +661,8 @@ std::pair<Obj::Obj,int> CGameState::pickObject (CGObjectInstance *obj) | ||||
|  | ||||
| void CGameState::randomizeObject(CGObjectInstance *cur) | ||||
| { | ||||
| 	std::pair<Obj::Obj,int> ran = pickObject(cur); | ||||
| 	if(ran.first<0 || ran.second<0) //this is not a random object, or we couldn't find anything | ||||
| 	std::pair<Obj,int> ran = pickObject(cur); | ||||
| 	if(ran.first == Obj::NO_OBJ || ran.second<0) //this is not a random object, or we couldn't find anything | ||||
| 	{ | ||||
| 		if(cur->ID==Obj::TOWN) //town - set def | ||||
| 		{ | ||||
| @@ -710,7 +710,7 @@ void CGameState::randomizeObject(CGObjectInstance *cur) | ||||
| 	cur->ID = ran.first; | ||||
| 	cur->subID = ran.second; | ||||
| 	map->removeBlockVisTiles(cur); //recalculate blockvis tiles - picked object might have different than random placeholder | ||||
| 	map->customDefs.push_back(cur->defInfo = VLC->dobjinfo->gobjs[ran.first][ran.second]); | ||||
| 	map->customDefs.push_back(cur->defInfo = ran.first.toDefObjInfo()[ran.second]); | ||||
| 	if(!cur->defInfo) | ||||
| 	{ | ||||
| 		tlog1<<"*BIG* WARNING: Missing def declaration for "<<cur->ID<<" "<<cur->subID<<std::endl; | ||||
| @@ -798,7 +798,7 @@ void CGameState::init(StartInfo * si) | ||||
| 			switch (curBonus->type) | ||||
| 			{ | ||||
| 			case CScenarioTravel::STravelBonus::SPELL: | ||||
| 				hero->spells.insert(curBonus->info2); | ||||
| 				hero->spells.insert(SpellID(curBonus->info2)); | ||||
| 				break; | ||||
| 			case CScenarioTravel::STravelBonus::MONSTER: | ||||
| 				{ | ||||
| @@ -806,7 +806,7 @@ void CGameState::init(StartInfo * si) | ||||
| 					{ | ||||
| 						if(hero->slotEmpty(i)) | ||||
| 						{ | ||||
| 							hero->addToSlot(i, static_cast<CreatureID::CreatureID>(curBonus->info2), curBonus->info3); | ||||
| 							hero->addToSlot(i, CreatureID(curBonus->info2), curBonus->info3); | ||||
| 							break; | ||||
| 						} | ||||
| 					} | ||||
| @@ -1458,15 +1458,15 @@ void CGameState::init(StartInfo * si) | ||||
| 		if(vti->builtBuildings.find(-50)!=vti->builtBuildings.end()) //give standard set of buildings | ||||
| 		{ | ||||
| 			vti->builtBuildings.erase(-50); | ||||
| 			vti->builtBuildings.insert(EBuilding::VILLAGE_HALL); | ||||
| 			vti->builtBuildings.insert(EBuilding::TAVERN); | ||||
| 			vti->builtBuildings.insert(EBuilding::DWELL_FIRST); | ||||
| 			vti->builtBuildings.insert(BuildingID::VILLAGE_HALL); | ||||
| 			vti->builtBuildings.insert(BuildingID::TAVERN); | ||||
| 			vti->builtBuildings.insert(BuildingID::DWELL_FIRST); | ||||
| 			if(ran()%2) | ||||
| 				vti->builtBuildings.insert(EBuilding::DWELL_FIRST+1); | ||||
| 				vti->builtBuildings.insert(BuildingID::DWELL_FIRST+1); | ||||
| 		} | ||||
|  | ||||
| 		if (vstd::contains(vti->builtBuildings, EBuilding::SHIPYARD) && vti->state()==IBoatGenerator::TILE_BLOCKED) | ||||
| 			vti->builtBuildings.erase(EBuilding::SHIPYARD);//if we have harbor without water - erase it (this is H3 behaviour) | ||||
| 		if (vstd::contains(vti->builtBuildings, BuildingID::SHIPYARD) && vti->state()==IBoatGenerator::TILE_BLOCKED) | ||||
| 			vti->builtBuildings.erase(BuildingID::SHIPYARD);//if we have harbor without water - erase it (this is H3 behaviour) | ||||
|  | ||||
| 		//init hordes | ||||
| 		for (int i = 0; i<GameConstants::CREATURES_PER_TOWN; i++) | ||||
| @@ -1475,15 +1475,15 @@ void CGameState::init(StartInfo * si) | ||||
| 				vti->builtBuildings.erase(-31-i);//remove old ID | ||||
| 				if (vti->town->hordeLvl[0] == i)//if town first horde is this one | ||||
| 				{ | ||||
| 					vti->builtBuildings.insert(EBuilding::HORDE_1);//add it | ||||
| 					if (vstd::contains(vti->builtBuildings,(EBuilding::DWELL_UP_FIRST+i)))//if we have upgraded dwelling as well | ||||
| 						vti->builtBuildings.insert(EBuilding::HORDE_1_UPGR);//add it as well | ||||
| 					vti->builtBuildings.insert(BuildingID::HORDE_1);//add it | ||||
| 					if (vstd::contains(vti->builtBuildings,(BuildingID::DWELL_UP_FIRST+i)))//if we have upgraded dwelling as well | ||||
| 						vti->builtBuildings.insert(BuildingID::HORDE_1_UPGR);//add it as well | ||||
| 				} | ||||
| 				if (vti->town->hordeLvl[1] == i)//if town second horde is this one | ||||
| 				{ | ||||
| 					vti->builtBuildings.insert(EBuilding::HORDE_2); | ||||
| 					if (vstd::contains(vti->builtBuildings,(EBuilding::DWELL_UP_FIRST+i))) | ||||
| 						vti->builtBuildings.insert(EBuilding::HORDE_2_UPGR); | ||||
| 					vti->builtBuildings.insert(BuildingID::HORDE_2); | ||||
| 					if (vstd::contains(vti->builtBuildings,(BuildingID::DWELL_UP_FIRST+i))) | ||||
| 						vti->builtBuildings.insert(BuildingID::HORDE_2_UPGR); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| @@ -1495,9 +1495,9 @@ void CGameState::init(StartInfo * si) | ||||
| 				{ | ||||
| 					ev->buildings.erase(-31-i); | ||||
| 					if (vti->town->hordeLvl[0] == i) | ||||
| 						ev->buildings.insert(EBuilding::HORDE_1); | ||||
| 						ev->buildings.insert(BuildingID::HORDE_1); | ||||
| 					if (vti->town->hordeLvl[1] == i) | ||||
| 						ev->buildings.insert(EBuilding::HORDE_2); | ||||
| 						ev->buildings.insert(BuildingID::HORDE_2); | ||||
| 				} | ||||
| 		} | ||||
| 		//init spells | ||||
| @@ -1707,7 +1707,7 @@ void CGameState::initDuel() | ||||
|  | ||||
| 		for(int j = 0; j < ARRAY_COUNT(dp.sides[i].stacks); j++) | ||||
| 		{ | ||||
| 			CreatureID::CreatureID cre = dp.sides[i].stacks[j].type; | ||||
| 			CreatureID cre = dp.sides[i].stacks[j].type; | ||||
| 			TQuantity count = dp.sides[i].stacks[j].count; | ||||
| 			if(count || obj->hasStackAtSlot(j)) | ||||
| 				obj->setCreature(j, cre, count); | ||||
| @@ -1829,7 +1829,7 @@ UpgradeInfo CGameState::getUpgradeInfo(const CStackInstance &stack) | ||||
| 		TBonusListPtr lista = h->getBonuses(Selector::typeSubtype(Bonus::SPECIAL_UPGRADE, base->idNumber)); | ||||
| 		BOOST_FOREACH(const Bonus *it, *lista) | ||||
| 		{ | ||||
| 			auto nid = static_cast<CreatureID::CreatureID>(it->additionalInfo); | ||||
| 			auto nid = CreatureID(it->additionalInfo); | ||||
| 			if (nid != base->idNumber) //in very specific case the upgrade is available by default (?) | ||||
| 			{ | ||||
| 				ret.newID.push_back(nid); | ||||
| @@ -2252,7 +2252,7 @@ int CGameState::victoryCheck( ui8 player ) const | ||||
| 			BOOST_FOREACH(const CGTownInstance *t, map->towns) | ||||
| 				if((t == map->victoryCondition.obj || !map->victoryCondition.obj) | ||||
| 					&& t->tempOwner == player | ||||
| 					&& t->hasBuilt(EBuilding::GRAIL)) | ||||
| 					&& t->hasBuilt(BuildingID::GRAIL)) | ||||
| 					return 1; | ||||
| 			break; | ||||
|  | ||||
| @@ -2277,8 +2277,9 @@ int CGameState::victoryCheck( ui8 player ) const | ||||
| 				{ | ||||
| 					switch(map->objects[i]->ID) | ||||
| 					{ | ||||
| 					case 17: case 18: case 19: case 20: //dwellings | ||||
| 					case 216: case 217: case 218: | ||||
| 					case Obj::CREATURE_GENERATOR1: case Obj::CREATURE_GENERATOR2: | ||||
| 					case Obj::CREATURE_GENERATOR3: case Obj::CREATURE_GENERATOR4: | ||||
| 					case Obj::RANDOM_DWELLING: case Obj::RANDOM_DWELLING_LVL: case Obj::RANDOM_DWELLING_FACTION: | ||||
| 						return 0; //found not flagged dwelling - player not won | ||||
| 					} | ||||
| 				} | ||||
| @@ -2292,7 +2293,7 @@ int CGameState::victoryCheck( ui8 player ) const | ||||
| 				{ | ||||
| 					switch(map->objects[i]->ID) | ||||
| 					{ | ||||
| 					case 53: case 220: | ||||
| 					case Obj::MINE: case Obj::ABANDONED_MINE: | ||||
| 						return 0; //found not flagged mine - player not won | ||||
| 					} | ||||
| 				} | ||||
| @@ -2870,7 +2871,7 @@ void InfoAboutTown::initFromTown(const CGTownInstance *t, bool detailed) | ||||
| 		//include details about hero | ||||
| 		details = new Details; | ||||
| 		details->goldIncome = t->dailyIncome(); | ||||
| 		details->customRes = t->hasBuilt(EBuilding::RESOURCE_SILO); | ||||
| 		details->customRes = t->hasBuilt(BuildingID::RESOURCE_SILO); | ||||
| 		details->hallLevel = t->hallLevel(); | ||||
| 		details->garrisonedHero = t->garrisonHero; | ||||
| 	} | ||||
| @@ -2915,7 +2916,7 @@ DuelParameters::SideSettings::StackSettings::StackSettings() | ||||
| { | ||||
| } | ||||
|  | ||||
| DuelParameters::SideSettings::StackSettings::StackSettings(CreatureID::CreatureID Type, si32 Count) | ||||
| DuelParameters::SideSettings::StackSettings::StackSettings(CreatureID Type, si32 Count) | ||||
| 	: type(Type), count(Count) | ||||
| { | ||||
| } | ||||
| @@ -2944,7 +2945,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname) | ||||
| 		int i = 0; | ||||
| 		BOOST_FOREACH(const JsonNode &stackNode, n["army"].Vector()) | ||||
| 		{ | ||||
| 			ss.stacks[i].type = static_cast<CreatureID::CreatureID>((si32)stackNode.Vector()[0].Float()); | ||||
| 			ss.stacks[i].type = CreatureID((si32)stackNode.Vector()[0].Float()); | ||||
| 			ss.stacks[i].count = stackNode.Vector()[1].Float(); | ||||
| 			i++; | ||||
| 		} | ||||
| @@ -2973,12 +2974,12 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname) | ||||
| 			if(spells.getType() == JsonNode::DATA_STRING  &&  spells.String() == "all") | ||||
| 			{ | ||||
| 				BOOST_FOREACH(auto spell, VLC->spellh->spells) | ||||
| 					if(spell->id <= Spells::SUMMON_AIR_ELEMENTAL) | ||||
| 					if(spell->id <= SpellID::SUMMON_AIR_ELEMENTAL) | ||||
| 						ss.spells.insert(spell->id); | ||||
| 			} | ||||
| 			else | ||||
| 				BOOST_FOREACH(const JsonNode &spell, n["spells"].Vector()) | ||||
| 					ss.spells.insert(spell.Float()); | ||||
| 					ss.spells.insert(SpellID(spell.Float())); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -215,8 +215,8 @@ public: | ||||
|  | ||||
| struct UpgradeInfo | ||||
| { | ||||
| 	CreatureID::CreatureID oldID; //creature to be upgraded | ||||
| 	std::vector<CreatureID::CreatureID> newID; //possible upgrades | ||||
| 	CreatureID oldID; //creature to be upgraded | ||||
| 	std::vector<CreatureID> newID; //possible upgrades | ||||
| 	std::vector<TResources> cost; // cost[upgrade_serial] -> set of pairs<resource_ID,resource_amount>; cost is for single unit (not entire stack) | ||||
| 	UpgradeInfo(){oldID = CreatureID::NONE;}; | ||||
| }; | ||||
| @@ -273,7 +273,7 @@ struct DLL_EXPORT DuelParameters | ||||
| 	{ | ||||
| 		struct DLL_EXPORT StackSettings | ||||
| 		{ | ||||
| 			CreatureID::CreatureID type; | ||||
| 			CreatureID type; | ||||
| 			si32 count; | ||||
| 			template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 			{ | ||||
| @@ -281,14 +281,14 @@ struct DLL_EXPORT DuelParameters | ||||
| 			} | ||||
|  | ||||
| 			StackSettings(); | ||||
| 			StackSettings(CreatureID::CreatureID Type, si32 Count); | ||||
| 			StackSettings(CreatureID Type, si32 Count); | ||||
| 		} stacks[GameConstants::ARMY_SIZE]; | ||||
|  | ||||
| 		si32 heroId; //-1 if none | ||||
| 		std::vector<si32> heroPrimSkills; //may be empty | ||||
| 		std::map<si32, CArtifactInstance*> artifacts; | ||||
| 		std::vector<std::pair<si32, si8> > heroSecSkills; //may be empty; pairs <id, level>, level [0-3] | ||||
| 		std::set<si32> spells; | ||||
| 		std::set<SpellID> spells; | ||||
|  | ||||
| 		SideSettings(); | ||||
| 		template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -392,7 +392,7 @@ public: | ||||
|  | ||||
| 	void initDuel(); | ||||
| 	void randomizeObject(CGObjectInstance *cur); | ||||
| 	std::pair<Obj::Obj,int> pickObject(CGObjectInstance *obj); //chooses type of object to be randomized, returns <type, subtype> | ||||
| 	std::pair<Obj,int> pickObject(CGObjectInstance *obj); //chooses type of object to be randomized, returns <type, subtype> | ||||
| 	int pickHero(int owner); | ||||
| 	void giveHeroArtifact(CGHeroInstance *h, int aid); | ||||
|  | ||||
|   | ||||
| @@ -255,7 +255,7 @@ CHero * CHeroHandler::loadHero(const JsonNode & node) | ||||
|  | ||||
| 		VLC->modh->identifiers.requestIdentifier(std::string("creature.") + source["creature"].String(), [=](si32 creature) | ||||
| 		{ | ||||
| 			hero->initialArmy[i].creature = static_cast<CreatureID::CreatureID>(creature); | ||||
| 			hero->initialArmy[i].creature = CreatureID(creature); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| @@ -280,7 +280,7 @@ void CHeroHandler::loadHeroJson(CHero * hero, const JsonNode & node) | ||||
|  | ||||
| 	BOOST_FOREACH(const JsonNode & spell, node["spellbook"].Vector()) | ||||
| 	{ | ||||
| 		hero->spells.insert(spell.Float()); | ||||
| 		hero->spells.insert(SpellID(spell.Float())); | ||||
| 	} | ||||
|  | ||||
| 	//deprecated, used only for original spciealties | ||||
| @@ -404,7 +404,7 @@ void CHeroHandler::loadHeroes() | ||||
| 			refName[0] = std::tolower(refName[0]); // to camelCase | ||||
| 			VLC->modh->identifiers.requestIdentifier(std::string("creature.") + refName, [=](si32 creature) | ||||
| 			{ | ||||
| 				hero->initialArmy[x].creature = static_cast<CreatureID::CreatureID>(creature); | ||||
| 				hero->initialArmy[x].creature = CreatureID(creature); | ||||
| 			}); | ||||
| 		} | ||||
| 		parser.endLine(); | ||||
|   | ||||
| @@ -50,7 +50,7 @@ public: | ||||
| 	{ | ||||
| 		ui32 minAmount; | ||||
| 		ui32 maxAmount; | ||||
| 		CreatureID::CreatureID creature; | ||||
| 		CreatureID creature; | ||||
|  | ||||
| 		template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 		{ | ||||
| @@ -67,7 +67,7 @@ public: | ||||
| 	std::vector<std::pair<SecondarySkill::SecondarySkill, ui8> > secSkillsInit; //initial secondary skills; first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert) | ||||
| 	std::vector<SSpecialtyInfo> spec; | ||||
| 	std::vector<SSpecialtyBonus> specialty; | ||||
| 	std::set<si32> spells; | ||||
| 	std::set<SpellID> spells; | ||||
| 	ui8 sex; // default sex: 0=male, 1=female | ||||
| 	ui8 special; // hero is special and won't be placed in game (unless preset on map), e.g. campaign heroes | ||||
|  | ||||
|   | ||||
| @@ -138,12 +138,12 @@ bool CPlayersVisited::wasVisited( TPlayerColor player ) const | ||||
|  | ||||
| // Bank helper. Find the creature ID and their number, and store the | ||||
| // result in storage (either guards or reward creatures). | ||||
| static void readCreatures(const JsonNode &creature, std::vector< std::pair <CreatureID::CreatureID, ui32> > &storage) | ||||
| static void readCreatures(const JsonNode &creature, std::vector< std::pair <CreatureID, ui32> > &storage) | ||||
| { | ||||
| 	std::pair<CreatureID::CreatureID, si32> creInfo = std::make_pair(CreatureID::NONE, 0); | ||||
| 	std::pair<CreatureID, si32> creInfo = std::make_pair(CreatureID::NONE, 0); | ||||
|  | ||||
| 	creInfo.second = creature["number"].Float(); | ||||
| 	creInfo.first = static_cast<CreatureID::CreatureID>((si32)creature["id"].Float()); | ||||
| 	creInfo.first = CreatureID((si32)creature["id"].Float()); | ||||
| 	storage.push_back(creInfo); | ||||
| } | ||||
|  | ||||
| @@ -195,7 +195,7 @@ void CObjectHandler::loadObjects() | ||||
| 	const JsonNode config(ResourceID("config/dwellings.json")); | ||||
| 	BOOST_FOREACH(const JsonNode &dwelling, config["dwellings"].Vector()) | ||||
| 	{ | ||||
| 		cregens[dwelling["dwelling"].Float()] = static_cast<CreatureID::CreatureID>((si32)dwelling["creature"].Float()); | ||||
| 		cregens[dwelling["dwelling"].Float()] = CreatureID((si32)dwelling["creature"].Float()); | ||||
| 	} | ||||
| 	tlog5 << "\t\tDone loading cregens!\n"; | ||||
|  | ||||
| @@ -405,7 +405,7 @@ void CGObjectInstance::setProperty( ui8 what, ui32 val ) | ||||
| 		blockVisit = val; | ||||
| 		break; | ||||
| 	case ObjProperty::ID: | ||||
| 		ID = static_cast<Obj::Obj>(val); | ||||
| 		ID = Obj(val); | ||||
| 		break; | ||||
| 	case ObjProperty::SUBID: | ||||
| 		subID = val; | ||||
| @@ -732,13 +732,13 @@ void CGHeroInstance::initHero() | ||||
| 	if(!type) | ||||
| 		type = VLC->heroh->heroes[subID]; | ||||
|  | ||||
| 	if(!vstd::contains(spells, 0xffffffff)) //hero starts with a spell | ||||
| 	if(!vstd::contains(spells, SpellID::PRESET)) //hero starts with a spell | ||||
| 	{ | ||||
| 		BOOST_FOREACH(auto spellID, type->spells) | ||||
| 			spells.insert(spellID); | ||||
| 	} | ||||
| 	else //remove placeholder | ||||
| 		spells -= 0xffffffff; | ||||
| 		spells -= SpellID::PRESET; | ||||
|  | ||||
| 	if(!getArt(ArtifactPosition::MACH4) && !getArt(ArtifactPosition::SPELLBOOK) && !type->spells.empty()) //no catapult means we haven't read pre-existent set -> use default rules for spellbook | ||||
| 		putArtifact(ArtifactPosition::SPELLBOOK, CArtifactInstance::createNewArtifactInstance(0)); | ||||
| @@ -831,7 +831,7 @@ void CGHeroInstance::initArmy(IArmyDescriptor *dst /*= NULL*/) | ||||
| 				continue; | ||||
|  | ||||
| 			int slot = -1; | ||||
| 			ArtifactID::ArtifactID aid = ArtifactID::NONE; | ||||
| 			ArtifactID aid = ArtifactID::NONE; | ||||
| 			switch (stack.creature) | ||||
| 			{ | ||||
| 			case CreatureID::CATAPULT: | ||||
| @@ -1328,7 +1328,7 @@ ui8 CGHeroInstance::getSpellSchoolLevel(const CSpell * spell, int *outSelectedSc | ||||
|  | ||||
|  | ||||
| 	vstd::amax(skill, valOfBonuses(Bonus::MAGIC_SCHOOL_SKILL, 0)); //any school bonus | ||||
| 	vstd::amax(skill, valOfBonuses(Bonus::SPELL, spell->id)); //given by artifact or other effect | ||||
| 	vstd::amax(skill, valOfBonuses(Bonus::SPELL, spell->id.toEnum())); //given by artifact or other effect | ||||
| 	if (hasBonusOfType(Bonus::MAXED_SPELL, spell->id))//hero specialty (Daremyth, Melodia) | ||||
| 		skill = 3; | ||||
| 	assert(skill >= 0 && skill <= 3); | ||||
| @@ -1588,7 +1588,7 @@ void CGDwelling::initObj() | ||||
| 	{ | ||||
| 	case Obj::CREATURE_GENERATOR1: | ||||
| 		{ | ||||
| 			CreatureID::CreatureID crid = VLC->objh->cregens[subID]; | ||||
| 			CreatureID crid = VLC->objh->cregens[subID]; | ||||
| 			const CCreature *crs = VLC->creh->creatures[crid]; | ||||
|  | ||||
| 			creatures.resize(1); | ||||
| @@ -1672,7 +1672,7 @@ void CGDwelling::setProperty(ui8 what, ui32 val) | ||||
| 		case ObjProperty::AVAILABLE_CREATURE: | ||||
| 			creatures.resize(1); | ||||
| 			creatures[0].second.resize(1); | ||||
| 			creatures[0].second[0] = static_cast<CreatureID::CreatureID>(val); | ||||
| 			creatures[0].second[0] = CreatureID(val); | ||||
| 			break; | ||||
| 	} | ||||
| 	CGObjectInstance::setProperty(what,val); | ||||
| @@ -1777,7 +1777,7 @@ void CGDwelling::heroAcceptsCreatures( const CGHeroInstance *h, ui32 answer ) co | ||||
| 	if(!answer) | ||||
| 		return; | ||||
|  | ||||
| 	CreatureID::CreatureID crid = creatures[0].second[0]; | ||||
| 	CreatureID crid = creatures[0].second[0]; | ||||
| 	CCreature *crs = VLC->creh->creatures[crid]; | ||||
| 	TQuantity count = creatures[0].first; | ||||
|  | ||||
| @@ -1864,9 +1864,9 @@ int CGTownInstance::getSightRadious() const //returns sight distance | ||||
| { | ||||
| 	if (subID == ETownType::TOWER) | ||||
| 	{ | ||||
| 		if (hasBuilt(EBuilding::GRAIL)) //skyship | ||||
| 		if (hasBuilt(BuildingID::GRAIL)) //skyship | ||||
| 			return -1; //entire map | ||||
| 		else if (hasBuilt(EBuilding::LOOKOUT_TOWER)) //lookout tower | ||||
| 		else if (hasBuilt(BuildingID::LOOKOUT_TOWER)) //lookout tower | ||||
| 			return 20; | ||||
| 	} | ||||
| 	return 5; | ||||
| @@ -1896,38 +1896,38 @@ void CGTownInstance::setPropertyDer(ui8 what, ui32 val) | ||||
| } | ||||
| CGTownInstance::EFortLevel CGTownInstance::fortLevel() const //0 - none, 1 - fort, 2 - citadel, 3 - castle | ||||
| { | ||||
| 	if (hasBuilt(EBuilding::CASTLE)) | ||||
| 	if (hasBuilt(BuildingID::CASTLE)) | ||||
| 		return CASTLE; | ||||
| 	if (hasBuilt(EBuilding::CITADEL)) | ||||
| 	if (hasBuilt(BuildingID::CITADEL)) | ||||
| 		return CITADEL; | ||||
| 	if (hasBuilt(EBuilding::FORT)) | ||||
| 	if (hasBuilt(BuildingID::FORT)) | ||||
| 		return FORT; | ||||
| 	return NONE; | ||||
| } | ||||
|  | ||||
| int CGTownInstance::hallLevel() const // -1 - none, 0 - village, 1 - town, 2 - city, 3 - capitol | ||||
| { | ||||
| 	if (hasBuilt(EBuilding::CAPITOL)) | ||||
| 	if (hasBuilt(BuildingID::CAPITOL)) | ||||
| 		return 3; | ||||
| 	if (hasBuilt(EBuilding::CITY_HALL)) | ||||
| 	if (hasBuilt(BuildingID::CITY_HALL)) | ||||
| 		return 2; | ||||
| 	if (hasBuilt(EBuilding::TOWN_HALL)) | ||||
| 	if (hasBuilt(BuildingID::TOWN_HALL)) | ||||
| 		return 1; | ||||
| 	if (hasBuilt(EBuilding::VILLAGE_HALL)) | ||||
| 	if (hasBuilt(BuildingID::VILLAGE_HALL)) | ||||
| 		return 0; | ||||
| 	return -1; | ||||
| } | ||||
| int CGTownInstance::mageGuildLevel() const | ||||
| { | ||||
| 	if (hasBuilt(EBuilding::MAGES_GUILD_5)) | ||||
| 	if (hasBuilt(BuildingID::MAGES_GUILD_5)) | ||||
| 		return 5; | ||||
| 	if (hasBuilt(EBuilding::MAGES_GUILD_4)) | ||||
| 	if (hasBuilt(BuildingID::MAGES_GUILD_4)) | ||||
| 		return 4; | ||||
| 	if (hasBuilt(EBuilding::MAGES_GUILD_3)) | ||||
| 	if (hasBuilt(BuildingID::MAGES_GUILD_3)) | ||||
| 		return 3; | ||||
| 	if (hasBuilt(EBuilding::MAGES_GUILD_2)) | ||||
| 	if (hasBuilt(BuildingID::MAGES_GUILD_2)) | ||||
| 		return 2; | ||||
| 	if (hasBuilt(EBuilding::MAGES_GUILD_1)) | ||||
| 	if (hasBuilt(BuildingID::MAGES_GUILD_1)) | ||||
| 		return 1; | ||||
| 	return 0; | ||||
| } | ||||
| @@ -1938,7 +1938,7 @@ int CGTownInstance::creatureDwellingLevel(int dwelling) const | ||||
| 		return -1; | ||||
| 	for (int i=0; ; i++) | ||||
| 	{ | ||||
| 		if (!hasBuilt(EBuilding::DWELL_FIRST+dwelling+i*GameConstants::CREATURES_PER_TOWN)) | ||||
| 		if (!hasBuilt(BuildingID::DWELL_FIRST+dwelling+i*GameConstants::CREATURES_PER_TOWN)) | ||||
| 			return i-1; | ||||
| 	} | ||||
| } | ||||
| @@ -1957,7 +1957,7 @@ GrowthInfo CGTownInstance::getGrowthInfo(int level) const | ||||
|  | ||||
| 	if (level<0 || level >=GameConstants::CREATURES_PER_TOWN) | ||||
| 		return ret; | ||||
| 	if (!hasBuilt(EBuilding::DWELL_FIRST+level)) | ||||
| 	if (!hasBuilt(BuildingID::DWELL_FIRST+level)) | ||||
| 		return ret; //no dwelling | ||||
|  | ||||
| 	const CCreature *creature = VLC->creh->creatures[creatures[level].second.back()]; | ||||
| @@ -1966,18 +1966,18 @@ GrowthInfo CGTownInstance::getGrowthInfo(int level) const | ||||
|  | ||||
| 	ret.entries.push_back(GrowthInfo::Entry(VLC->generaltexth->allTexts[590], base));// \n\nBasic growth %d" | ||||
|  | ||||
| 	if (hasBuilt(EBuilding::CASTLE)) | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(subID, EBuilding::CASTLE, castleBonus = base)); | ||||
| 	else if (hasBuilt(EBuilding::CITADEL)) | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(subID, EBuilding::CITADEL, castleBonus = base / 2)); | ||||
| 	if (hasBuilt(BuildingID::CASTLE)) | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(subID, BuildingID::CASTLE, castleBonus = base)); | ||||
| 	else if (hasBuilt(BuildingID::CITADEL)) | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(subID, BuildingID::CITADEL, castleBonus = base / 2)); | ||||
|  | ||||
| 	if(town->hordeLvl[0] == level)//horde 1 | ||||
| 		if(hasBuilt(EBuilding::HORDE_1)) | ||||
| 			ret.entries.push_back(GrowthInfo::Entry(subID, EBuilding::HORDE_1, creature->hordeGrowth)); | ||||
| 		if(hasBuilt(BuildingID::HORDE_1)) | ||||
| 			ret.entries.push_back(GrowthInfo::Entry(subID, BuildingID::HORDE_1, creature->hordeGrowth)); | ||||
|  | ||||
| 	if(town->hordeLvl[1] == level)//horde 2 | ||||
| 		if(hasBuilt(EBuilding::HORDE_2)) | ||||
| 			ret.entries.push_back(GrowthInfo::Entry(subID, EBuilding::HORDE_2, creature->hordeGrowth)); | ||||
| 		if(hasBuilt(BuildingID::HORDE_2)) | ||||
| 			ret.entries.push_back(GrowthInfo::Entry(subID, BuildingID::HORDE_2, creature->hordeGrowth)); | ||||
|  | ||||
| 	int dwellingBonus = 0; | ||||
| 	if(const PlayerState *p = cb->getPlayer(tempOwner, false)) | ||||
| @@ -2000,8 +2000,8 @@ GrowthInfo CGTownInstance::getGrowthInfo(int level) const | ||||
| 	BOOST_FOREACH(const Bonus *b, *bonuses2) | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(b->Description() + " %+d", b->val * (base + castleBonus) / 100)); | ||||
|  | ||||
| 	if(hasBuilt(EBuilding::GRAIL)) //grail - +50% to ALL (so far added) growth | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(subID, EBuilding::GRAIL, ret.totalGrowth() / 2)); | ||||
| 	if(hasBuilt(BuildingID::GRAIL)) //grail - +50% to ALL (so far added) growth | ||||
| 		ret.entries.push_back(GrowthInfo::Entry(subID, BuildingID::GRAIL, ret.totalGrowth() / 2)); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
| @@ -2009,26 +2009,26 @@ GrowthInfo CGTownInstance::getGrowthInfo(int level) const | ||||
| int CGTownInstance::dailyIncome() const | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	if (hasBuilt(EBuilding::GRAIL)) | ||||
| 	if (hasBuilt(BuildingID::GRAIL)) | ||||
| 		ret+=5000; | ||||
|  | ||||
| 	if (hasBuilt(EBuilding::CAPITOL)) | ||||
| 	if (hasBuilt(BuildingID::CAPITOL)) | ||||
| 		ret+=4000; | ||||
| 	else if (hasBuilt(EBuilding::CITY_HALL)) | ||||
| 	else if (hasBuilt(BuildingID::CITY_HALL)) | ||||
| 		ret+=2000; | ||||
| 	else if (hasBuilt(EBuilding::TOWN_HALL)) | ||||
| 	else if (hasBuilt(BuildingID::TOWN_HALL)) | ||||
| 		ret+=1000; | ||||
| 	else if (hasBuilt(EBuilding::VILLAGE_HALL)) | ||||
| 	else if (hasBuilt(BuildingID::VILLAGE_HALL)) | ||||
| 		ret+=500; | ||||
| 	return ret; | ||||
| } | ||||
| bool CGTownInstance::hasFort() const | ||||
| { | ||||
| 	return hasBuilt(EBuilding::FORT); | ||||
| 	return hasBuilt(BuildingID::FORT); | ||||
| } | ||||
| bool CGTownInstance::hasCapitol() const | ||||
| { | ||||
| 	return hasBuilt(EBuilding::CAPITOL); | ||||
| 	return hasBuilt(BuildingID::CAPITOL); | ||||
| } | ||||
| CGTownInstance::CGTownInstance() | ||||
| 	:IShipyard(this), IMarket(this), town(nullptr), builded(0), destroyed(0), identifier(0), alignment(0xff) | ||||
| @@ -2048,7 +2048,7 @@ int CGTownInstance::spellsAtLevel(int level, bool checkGuild) const | ||||
| 		return 0; | ||||
| 	int ret = 6 - level; //how many spells are available at this level | ||||
|  | ||||
| 	if (hasBuilt(EBuilding::LIBRARY, ETownType::TOWER)) | ||||
| 	if (hasBuilt(BuildingID::LIBRARY, ETownType::TOWER)) | ||||
| 		ret++; | ||||
|  | ||||
| 	return ret; | ||||
| @@ -2153,7 +2153,7 @@ void CGTownInstance::newTurn() const | ||||
| 	if (cb->getDate(Date::DAY_OF_WEEK) == 1) //reset on new week | ||||
| 	{ | ||||
| 		//give resources for Rampart, Mystic Pond | ||||
| 		if (hasBuilt(EBuilding::MYSTIC_POND, ETownType::RAMPART) | ||||
| 		if (hasBuilt(BuildingID::MYSTIC_POND, ETownType::RAMPART) | ||||
| 			&& cb->getDate(Date::DAY) != 1 && (tempOwner < GameConstants::PLAYER_LIMIT)) | ||||
| 		{ | ||||
| 			int resID = rand()%4+2;//bonus to random rare resource | ||||
| @@ -2167,7 +2167,7 @@ void CGTownInstance::newTurn() const | ||||
| 		if ( subID == ETownType::DUNGEON ) | ||||
| 			for (std::vector<CGTownBuilding*>::const_iterator i = bonusingBuildings.begin(); i!=bonusingBuildings.end(); i++) | ||||
| 		{ | ||||
| 			if ((*i)->ID == EBuilding::MANA_VORTEX) | ||||
| 			if ((*i)->ID == BuildingID::MANA_VORTEX) | ||||
| 				cb->setObjProperty (id, 12, (*i)->id); //reset visitors for Mana Vortex | ||||
| 		} | ||||
|  | ||||
| @@ -2199,7 +2199,7 @@ void CGTownInstance::newTurn() const | ||||
| 				if ((stacksCount() < GameConstants::ARMY_SIZE && rand()%100 < 25) || Slots().empty()) //add new stack | ||||
| 				{ | ||||
| 					int i = rand() % std::min (GameConstants::ARMY_SIZE, cb->getDate(Date::MONTH)<<1); | ||||
| 					CreatureID::CreatureID c = town->creatures[i][0]; | ||||
| 					CreatureID c = town->creatures[i][0]; | ||||
| 					TSlot n = -1; | ||||
|  | ||||
| 					TQuantity count = creatureGrowth(i); | ||||
| @@ -2294,7 +2294,7 @@ int CGTownInstance::getBoatType() const | ||||
|  | ||||
| int CGTownInstance::getMarketEfficiency() const | ||||
| { | ||||
| 	if (!hasBuilt(EBuilding::MARKETPLACE)) | ||||
| 	if (!hasBuilt(BuildingID::MARKETPLACE)) | ||||
| 		return 0; | ||||
|  | ||||
| 	const PlayerState *p = cb->getPlayer(tempOwner); | ||||
| @@ -2302,7 +2302,7 @@ int CGTownInstance::getMarketEfficiency() const | ||||
|  | ||||
| 	int marketCount = 0; | ||||
| 	BOOST_FOREACH(const CGTownInstance *t, p->towns) | ||||
| 		if(t->hasBuilt(EBuilding::MARKETPLACE)) | ||||
| 		if(t->hasBuilt(BuildingID::MARKETPLACE)) | ||||
| 			marketCount++; | ||||
|  | ||||
| 	return marketCount; | ||||
| @@ -2314,22 +2314,22 @@ bool CGTownInstance::allowsTrade(EMarketMode::EMarketMode mode) const | ||||
| 	{ | ||||
| 	case EMarketMode::RESOURCE_RESOURCE: | ||||
| 	case EMarketMode::RESOURCE_PLAYER: | ||||
| 		return hasBuilt(EBuilding::MARKETPLACE); | ||||
| 		return hasBuilt(BuildingID::MARKETPLACE); | ||||
|  | ||||
| 	case EMarketMode::ARTIFACT_RESOURCE: | ||||
| 	case EMarketMode::RESOURCE_ARTIFACT: | ||||
| 		return hasBuilt(EBuilding::ARTIFACT_MERCHANT, ETownType::TOWER) | ||||
| 		    || hasBuilt(EBuilding::ARTIFACT_MERCHANT, ETownType::DUNGEON) | ||||
| 		    || hasBuilt(EBuilding::ARTIFACT_MERCHANT, ETownType::CONFLUX); | ||||
| 		return hasBuilt(BuildingID::ARTIFACT_MERCHANT, ETownType::TOWER) | ||||
| 		    || hasBuilt(BuildingID::ARTIFACT_MERCHANT, ETownType::DUNGEON) | ||||
| 		    || hasBuilt(BuildingID::ARTIFACT_MERCHANT, ETownType::CONFLUX); | ||||
|  | ||||
| 	case EMarketMode::CREATURE_RESOURCE: | ||||
| 		return hasBuilt(EBuilding::FREELANCERS_GUILD, ETownType::STRONGHOLD); | ||||
| 		return hasBuilt(BuildingID::FREELANCERS_GUILD, ETownType::STRONGHOLD); | ||||
|  | ||||
| 	case EMarketMode::CREATURE_UNDEAD: | ||||
| 		return hasBuilt(EBuilding::SKELETON_TRANSFORMER, ETownType::NECROPOLIS); | ||||
| 		return hasBuilt(BuildingID::SKELETON_TRANSFORMER, ETownType::NECROPOLIS); | ||||
|  | ||||
| 	case EMarketMode::RESOURCE_SKILL: | ||||
| 		return hasBuilt(EBuilding::MAGIC_UNIVERSITY, ETownType::CONFLUX); | ||||
| 		return hasBuilt(BuildingID::MAGIC_UNIVERSITY, ETownType::CONFLUX); | ||||
| 	default: | ||||
| 		assert(0); | ||||
| 		return false; | ||||
| @@ -2378,47 +2378,47 @@ void CGTownInstance::recreateBuildingsBonuses() | ||||
| 		removeBonus(b); | ||||
|  | ||||
| 	//tricky! -> checks tavern only if no bratherhood of sword or not a castle | ||||
| 	if(subID != ETownType::CASTLE || !addBonusIfBuilt(EBuilding::BROTHERHOOD, Bonus::MORALE, +2)) | ||||
| 		addBonusIfBuilt(EBuilding::TAVERN, Bonus::MORALE, +1); | ||||
| 	if(subID != ETownType::CASTLE || !addBonusIfBuilt(BuildingID::BROTHERHOOD, Bonus::MORALE, +2)) | ||||
| 		addBonusIfBuilt(BuildingID::TAVERN, Bonus::MORALE, +1); | ||||
|  | ||||
| 	if(subID == ETownType::CASTLE) //castle | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::LIGHTHOUSE, Bonus::SEA_MOVEMENT, +500, make_shared<CPropagatorNodeType>(PLAYER)); | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL,      Bonus::MORALE, +2, make_shared<CPropagatorNodeType>(PLAYER)); //colossus | ||||
| 		addBonusIfBuilt(BuildingID::LIGHTHOUSE, Bonus::SEA_MOVEMENT, +500, make_shared<CPropagatorNodeType>(PLAYER)); | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL,      Bonus::MORALE, +2, make_shared<CPropagatorNodeType>(PLAYER)); //colossus | ||||
| 	} | ||||
| 	else if(subID == ETownType::RAMPART) //rampart | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::FOUNTAIN_OF_FORTUNE, Bonus::LUCK, +2); //fountain of fortune | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::LUCK, +2, make_shared<CPropagatorNodeType>(PLAYER)); //guardian spirit | ||||
| 		addBonusIfBuilt(BuildingID::FOUNTAIN_OF_FORTUNE, Bonus::LUCK, +2); //fountain of fortune | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::LUCK, +2, make_shared<CPropagatorNodeType>(PLAYER)); //guardian spirit | ||||
| 	} | ||||
| 	else if(subID == ETownType::TOWER) //tower | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::PRIMARY_SKILL, +15, PrimarySkill::KNOWLEDGE); //grail | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::PRIMARY_SKILL, +15, PrimarySkill::KNOWLEDGE); //grail | ||||
| 	} | ||||
| 	else if(subID == ETownType::INFERNO) //Inferno | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::STORMCLOUDS, Bonus::PRIMARY_SKILL, +2, PrimarySkill::SPELL_POWER); //Brimstone Clouds | ||||
| 		addBonusIfBuilt(BuildingID::STORMCLOUDS, Bonus::PRIMARY_SKILL, +2, PrimarySkill::SPELL_POWER); //Brimstone Clouds | ||||
| 	} | ||||
| 	else if(subID == ETownType::NECROPOLIS) //necropolis | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::COVER_OF_DARKNESS,    Bonus::DARKNESS, +20); | ||||
| 		addBonusIfBuilt(EBuilding::NECROMANCY_AMPLIFIER, Bonus::SECONDARY_SKILL_PREMY, +10, make_shared<CPropagatorNodeType>(PLAYER), SecondarySkill::NECROMANCY); //necromancy amplifier | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::SECONDARY_SKILL_PREMY, +20, make_shared<CPropagatorNodeType>(PLAYER), SecondarySkill::NECROMANCY); //Soul prison | ||||
| 		addBonusIfBuilt(BuildingID::COVER_OF_DARKNESS,    Bonus::DARKNESS, +20); | ||||
| 		addBonusIfBuilt(BuildingID::NECROMANCY_AMPLIFIER, Bonus::SECONDARY_SKILL_PREMY, +10, make_shared<CPropagatorNodeType>(PLAYER), SecondarySkill::NECROMANCY); //necromancy amplifier | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::SECONDARY_SKILL_PREMY, +20, make_shared<CPropagatorNodeType>(PLAYER), SecondarySkill::NECROMANCY); //Soul prison | ||||
| 	} | ||||
| 	else if(subID == ETownType::DUNGEON) //Dungeon | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::PRIMARY_SKILL, +12, PrimarySkill::SPELL_POWER); //grail | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::PRIMARY_SKILL, +12, PrimarySkill::SPELL_POWER); //grail | ||||
| 	} | ||||
| 	else if(subID == ETownType::STRONGHOLD) //Stronghold | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::PRIMARY_SKILL, +20, PrimarySkill::ATTACK); //grail | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::PRIMARY_SKILL, +20, PrimarySkill::ATTACK); //grail | ||||
| 	} | ||||
| 	else if(subID == ETownType::FORTRESS) //Fortress | ||||
| 	{ | ||||
| 		addBonusIfBuilt(EBuilding::GLYPHS_OF_FEAR, Bonus::PRIMARY_SKILL, +2, PrimarySkill::DEFENSE); //Glyphs of Fear | ||||
| 		addBonusIfBuilt(EBuilding::BLOOD_OBELISK,  Bonus::PRIMARY_SKILL, +2, PrimarySkill::ATTACK); //Blood Obelisk | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::PRIMARY_SKILL, +10, PrimarySkill::ATTACK); //grail | ||||
| 		addBonusIfBuilt(EBuilding::GRAIL, Bonus::PRIMARY_SKILL, +10, PrimarySkill::DEFENSE); //grail | ||||
| 		addBonusIfBuilt(BuildingID::GLYPHS_OF_FEAR, Bonus::PRIMARY_SKILL, +2, PrimarySkill::DEFENSE); //Glyphs of Fear | ||||
| 		addBonusIfBuilt(BuildingID::BLOOD_OBELISK,  Bonus::PRIMARY_SKILL, +2, PrimarySkill::ATTACK); //Blood Obelisk | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::PRIMARY_SKILL, +10, PrimarySkill::ATTACK); //grail | ||||
| 		addBonusIfBuilt(BuildingID::GRAIL, Bonus::PRIMARY_SKILL, +10, PrimarySkill::DEFENSE); //grail | ||||
| 	} | ||||
| 	else if(subID == ETownType::CONFLUX) | ||||
| 	{ | ||||
| @@ -2918,7 +2918,7 @@ void CTownBonus::onHeroVisit (const CGHeroInstance * h) const | ||||
| 		int val=0, mid=0; | ||||
| 		switch (ID) | ||||
| 		{ | ||||
| 			case EBuilding::SPECIAL_4: | ||||
| 			case BuildingID::SPECIAL_4: | ||||
| 				switch(town->subID) | ||||
| 				{ | ||||
| 					case ETownType::TOWER: //wall | ||||
| @@ -2947,7 +2947,7 @@ void CTownBonus::onHeroVisit (const CGHeroInstance * h) const | ||||
| 						break; | ||||
| 				} | ||||
| 				break; | ||||
| 			case EBuilding::SPECIAL_1: | ||||
| 			case BuildingID::SPECIAL_1: | ||||
| 				switch(town->subID) | ||||
| 				{ | ||||
| 					case ETownType::FORTRESS: //cage of warlords | ||||
| @@ -3120,7 +3120,7 @@ void CGCreature::initObj() | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	stacks[0]->setType(static_cast<CreatureID::CreatureID>(subID)); | ||||
| 	stacks[0]->setType(CreatureID(subID)); | ||||
| 	TQuantity &amount = stacks[0]->count; | ||||
| 	CCreature &c = *VLC->creh->creatures[subID]; | ||||
| 	if(!amount) | ||||
| @@ -4736,15 +4736,15 @@ void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward | ||||
| 			break; | ||||
| 		case SPELL: | ||||
| 		{ | ||||
| 			std::set<ui32> spell; | ||||
| 			spell.insert (rID); | ||||
| 			std::set<SpellID> spell; | ||||
| 			spell.insert (SpellID(rID)); | ||||
| 			cb->changeSpells(h, true, spell); | ||||
| 		} | ||||
| 			break; | ||||
| 		case CREATURE: | ||||
| 			{ | ||||
| 				CCreatureSet creatures; | ||||
| 				creatures.setCreature(0, static_cast<CreatureID::CreatureID>(rID), rVal); | ||||
| 				creatures.setCreature(0, CreatureID(rID), rVal); | ||||
| 				cb->giveCreatures(this, h, creatures, false); | ||||
| 			} | ||||
| 			break; | ||||
| @@ -5209,7 +5209,7 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con | ||||
|  | ||||
| 	if(spells.size()) | ||||
| 	{ | ||||
| 		std::set<ui32> spellsToGive; | ||||
| 		std::set<SpellID> spellsToGive; | ||||
| 		iw.components.clear(); | ||||
| 		if (spells.size() > 1) | ||||
| 		{ | ||||
| @@ -5221,7 +5221,7 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con | ||||
| 		} | ||||
| 		iw.text.addReplacement(h->name); | ||||
| 		std::vector<ConstTransitivePtr<CSpell> > * sp = &VLC->spellh->spells; | ||||
| 		for(std::vector<si32>::const_iterator i=spells.begin(); i != spells.end(); i++) | ||||
| 		for(auto i=spells.cbegin(); i != spells.cend(); i++) | ||||
| 		{ | ||||
| 			if ((*sp)[*i]->level <= h->getSecSkillLevel(SecondarySkill::WISDOM) + 2) //enough wisdom | ||||
| 			{ | ||||
| @@ -5475,8 +5475,8 @@ void CGShrine::onHeroVisit( const CGHeroInstance * h ) const | ||||
| 	} | ||||
| 	else //give spell | ||||
| 	{ | ||||
| 		std::set<ui32> spells; | ||||
| 		spells.insert(spell); | ||||
| 		std::set<SpellID> spells; | ||||
| 		spells.insert(SpellID(spell)); | ||||
| 		cb->changeSpells(h, true, spells); | ||||
|  | ||||
| 		iw.components.push_back(Component(Component::SPELL,spell,0,0)); | ||||
| @@ -5490,7 +5490,7 @@ void CGShrine::initObj() | ||||
| 	if(spell == 255) //spell not set | ||||
| 	{ | ||||
| 		int level = ID-87; | ||||
| 		std::vector<ui16> possibilities; | ||||
| 		std::vector<SpellID> possibilities; | ||||
| 		cb->getAllowedSpells (possibilities, level); | ||||
|  | ||||
| 		if(!possibilities.size()) | ||||
| @@ -5582,8 +5582,8 @@ void CGScholar::onHeroVisit( const CGHeroInstance * h ) const | ||||
| 		break; | ||||
| 	case SPELL: | ||||
| 		{ | ||||
| 			std::set<ui32> hlp; | ||||
| 			hlp.insert(bid); | ||||
| 			std::set<SpellID> hlp; | ||||
| 			hlp.insert(SpellID(bid)); | ||||
| 			cb->changeSpells(h,true,hlp); | ||||
| 			iw.components.push_back(Component(Component::SPELL,bid,0,0)); | ||||
| 		} | ||||
| @@ -5612,7 +5612,7 @@ void CGScholar::initObj() | ||||
| 			bonusID = ran() % GameConstants::SKILL_QUANTITY; | ||||
| 			break; | ||||
| 		case SPELL: | ||||
| 			std::vector<ui16> possibilities; | ||||
| 			std::vector<SpellID> possibilities; | ||||
| 			for (int i = 1; i < 6; ++i) | ||||
| 				cb->getAllowedSpells (possibilities, i); | ||||
| 			bonusID = possibilities[ran() % possibilities.size()]; | ||||
| @@ -5927,7 +5927,7 @@ void CBank::setPropertyDer (ui8 what, ui32 val) | ||||
| 					case 1: | ||||
| 						for	(int i = 0; i < 4; ++i) | ||||
| 							setCreature (i, bc->guards[0].first, bc->guards[0].second  / 5 ); | ||||
| 						setCreature (4, static_cast<CreatureID::CreatureID>(bc->guards[0].first + upgraded), bc->guards[0].second  / 5 ); | ||||
| 						setCreature (4, CreatureID(bc->guards[0].first + upgraded), bc->guards[0].second  / 5 ); | ||||
| 						break; | ||||
| 					case 4: | ||||
| 					{ | ||||
| @@ -5942,7 +5942,7 @@ void CBank::setPropertyDer (ui8 what, ui32 val) | ||||
| 						{ | ||||
| 							setCreature (0, bc->guards[0].first, bc->guards[0].second  / 2 ); | ||||
| 							setCreature (1, bc->guards[1].first, bc->guards[1].second / 2); | ||||
| 							setCreature (2, static_cast<CreatureID::CreatureID>(bc->guards[2].first + upgraded), bc->guards[2].second); | ||||
| 							setCreature (2, CreatureID(bc->guards[2].first + upgraded), bc->guards[2].second); | ||||
| 							setCreature (3, bc->guards[1].first, bc->guards[1].second / 2 ); | ||||
| 							setCreature (4, bc->guards[0].first, bc->guards[0].second - (bc->guards[0].second  / 2) ); | ||||
|  | ||||
| @@ -6213,7 +6213,7 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons | ||||
|  | ||||
| void CGPyramid::initObj() | ||||
| { | ||||
| 	std::vector<ui16> available; | ||||
| 	std::vector<SpellID> available; | ||||
| 	cb->getAllowedSpells (available, 5); | ||||
| 	if (available.size()) | ||||
| 	{ | ||||
| @@ -6269,8 +6269,8 @@ void CGPyramid::endBattle (const CGHeroInstance *h, const BattleResult *result) | ||||
| 			iw.text.addTxt (MetaString::ADVOB_TXT, 108); //no expert Wisdom | ||||
| 		else | ||||
| 		{ | ||||
| 			std::set<ui32> spells; | ||||
| 			spells.insert (spell); | ||||
| 			std::set<SpellID> spells; | ||||
| 			spells.insert (SpellID(spell)); | ||||
| 			cb->changeSpells (h, true, spells); | ||||
| 				iw.components.push_back(Component (Component::SPELL, spell, 0, 0)); | ||||
| 		} | ||||
| @@ -7229,7 +7229,7 @@ GrowthInfo::Entry::Entry(const std::string &format, int _count) | ||||
| 	description = boost::str(boost::format(format) % count); | ||||
| } | ||||
|  | ||||
| GrowthInfo::Entry::Entry(int subID, EBuilding::EBuilding building, int _count) | ||||
| GrowthInfo::Entry::Entry(int subID, BuildingID building, int _count) | ||||
| 	: count(_count) | ||||
| { | ||||
| 	description = boost::str(boost::format("%s %+d") % VLC->townh->towns[subID].buildings[building]->Name() % count); | ||||
|   | ||||
| @@ -168,7 +168,7 @@ class DLL_LINKAGE CGObjectInstance : public IObjectInterface | ||||
| public: | ||||
| 	mutable std::string hoverName; | ||||
| 	int3 pos; //h3m pos | ||||
| 	Obj::Obj ID; | ||||
| 	Obj ID; | ||||
| 	si32 subID; //normal subID (this one from OH3 maps ;]) | ||||
| 	si32 id;//number of object in map's vector | ||||
| 	CGDefInfo * defInfo; | ||||
| @@ -308,7 +308,7 @@ public: | ||||
|  | ||||
| 	//std::vector<const CArtifact*> artifacts; //hero's artifacts from bag | ||||
| 	//std::map<ui16, const CArtifact*> artifWorn; //map<position,artifact_id>; positions: 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5 | ||||
| 	std::set<ui32> spells; //known spells (spell IDs) | ||||
| 	std::set<SpellID> spells; //known spells (spell IDs) | ||||
|  | ||||
|  | ||||
| 	struct DLL_LINKAGE Patrol | ||||
| @@ -460,7 +460,7 @@ class DLL_LINKAGE CCreGenLeveledCastleInfo : public CCreGenAsCastleInfo, public | ||||
| class DLL_LINKAGE CGDwelling : public CArmedInstance | ||||
| { | ||||
| public: | ||||
| 	typedef std::vector<std::pair<ui32, std::vector<CreatureID::CreatureID> > > TCreaturesSet; | ||||
| 	typedef std::vector<std::pair<ui32, std::vector<CreatureID> > > TCreaturesSet; | ||||
|  | ||||
| 	CSpecObjInfo * info; //h3m info about dewlling | ||||
| 	TCreaturesSet creatures; //creatures[level] -> <vector of alternative ids (base creature and upgrades, creatures amount> | ||||
| @@ -567,7 +567,7 @@ struct DLL_LINKAGE GrowthInfo | ||||
| 		int count; | ||||
| 		std::string description; | ||||
| 		Entry(const std::string &format, int _count); | ||||
| 		Entry(int subID, EBuilding::EBuilding building, int _count); | ||||
| 		Entry(int subID, BuildingID building, int _count); | ||||
| 	}; | ||||
|  | ||||
| 	std::vector<Entry> entries; | ||||
| @@ -590,7 +590,7 @@ public: | ||||
| 	std::set<si32> forbiddenBuildings, builtBuildings; | ||||
| 	std::vector<CGTownBuilding*> bonusingBuildings; | ||||
| 	std::vector<ui32> possibleSpells, obligatorySpells; | ||||
| 	std::vector<std::vector<ui32> > spells; //spells[level] -> vector of spells, first will be available in guild | ||||
| 	std::vector<std::vector<SpellID> > spells; //spells[level] -> vector of spells, first will be available in guild | ||||
| 	std::list<CCastleEvent*> events; | ||||
| 	std::pair<si32, si32> bonusValue;//var to store town bonuses (rampart = resources from mystic pond); | ||||
|  | ||||
| @@ -684,8 +684,8 @@ public: | ||||
| 	std::vector<si32> primskills;//gained / lost prim skills | ||||
| 	std::vector<SecondarySkill::SecondarySkill> abilities; //gained abilities | ||||
| 	std::vector<si32> abilityLevels; //levels of gained abilities | ||||
| 	std::vector<si32> artifacts; //gained artifacts | ||||
| 	std::vector<si32> spells; //gained spells | ||||
| 	std::vector<ArtifactID> artifacts; //gained artifacts | ||||
| 	std::vector<SpellID> spells; //gained spells | ||||
| 	CCreatureSet creatures; //gained creatures | ||||
|  | ||||
| 	void initObj() override; | ||||
| @@ -732,7 +732,7 @@ public: | ||||
| 	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 | ||||
| 	TResources resources; // resources given to hero that has won with monsters | ||||
| 	ArtifactID::ArtifactID gainedArtifact; //ID of artifact gained to hero, -1 if none | ||||
| 	ArtifactID 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 | ||||
| 	ui64 temppower; //used to handle fractional stack growth for tiny stacks | ||||
| @@ -1373,10 +1373,10 @@ struct BankConfig | ||||
| 	ui8 level; //1 - 4, how hard the battle will be | ||||
| 	ui8 chance; //chance for this level being chosen | ||||
| 	ui8 upgradeChance; //chance for creatures to be in upgraded versions | ||||
| 	std::vector< std::pair <CreatureID::CreatureID, ui32> > guards; //creature ID, amount | ||||
| 	std::vector< std::pair <CreatureID, ui32> > guards; //creature ID, amount | ||||
| 	ui32 combatValue; //how hard are guards of this level | ||||
| 	std::vector<si32> resources; //resources given in case of victory | ||||
| 	std::vector< std::pair <CreatureID::CreatureID, ui32> > creatures; //creatures granted in case of victory (creature ID, amount) | ||||
| 	std::vector< std::pair <CreatureID, ui32> > creatures; //creatures granted in case of victory (creature ID, amount) | ||||
| 	std::vector<ui16> artifacts; //number of artifacts given in case of victory [0] -> treasure, [1] -> minor [2] -> major [3] -> relic | ||||
| 	ui32 value; //overall value of given things | ||||
| 	ui32 rewardDifficulty; //proportion of reward value to difficulty of guards; how profitable is this creature Bank config | ||||
| @@ -1391,7 +1391,7 @@ struct BankConfig | ||||
| class DLL_LINKAGE CObjectHandler | ||||
| { | ||||
| public: | ||||
| 	std::map<si32, CreatureID::CreatureID> cregens; //type 17. dwelling subid -> creature ID | ||||
| 	std::map<si32, CreatureID> cregens; //type 17. dwelling subid -> creature ID | ||||
| 	std::map <ui32, std::vector < ConstTransitivePtr<BankConfig> > > banksInfo; //[index][preset] | ||||
| 	std::map <ui32, std::string> creBanksNames; //[crebank index] -> name of this creature bank | ||||
| 	std::vector<ui32> resVals; //default values of resources in gold | ||||
|   | ||||
| @@ -129,7 +129,7 @@ std::vector<BattleHex> SpellCreatedObstacle::getAffectedTiles() const | ||||
| 	case FIRE_WALL: | ||||
| 		return std::vector<BattleHex>(1, pos); | ||||
| 	case FORCE_FIELD: | ||||
| 		return VLC->spellh->spells[Spells::FORCE_FIELD]->rangeInHexes(pos, spellLevel, casterSide); | ||||
| 		return VLC->spellh->spells[SpellID::FORCE_FIELD]->rangeInHexes(pos, spellLevel, casterSide); | ||||
| 		//TODO Fire Wall | ||||
| 	default: | ||||
| 		assert(0); | ||||
|   | ||||
| @@ -139,7 +139,7 @@ std::vector<BattleHex> CSpell::rangeInHexes(BattleHex centralHex, ui8 schoolLvl, | ||||
| { | ||||
| 	std::vector<BattleHex> ret; | ||||
|  | ||||
| 	if(id == Spells::FIRE_WALL  ||  id == Spells::FORCE_FIELD) | ||||
| 	if(id == SpellID::FIRE_WALL  ||  id == SpellID::FORCE_FIELD) | ||||
| 	{ | ||||
| 		//Special case - shape of obstacle depends on caster's side | ||||
| 		//TODO make it possible through spell_info config | ||||
| @@ -389,7 +389,7 @@ void CSpellHandler::loadSpells() | ||||
| 		do | ||||
| 		{ | ||||
| 			CSpell * spell = loadSpell(parser); | ||||
| 			spell->id = spells.size(); | ||||
| 			spell->id = SpellID(spells.size()); | ||||
| 			spell->combatSpell = combat; | ||||
| 			spell->creatureAbility = alility; | ||||
| 			spells.push_back(spell); | ||||
| @@ -410,10 +410,10 @@ void CSpellHandler::loadSpells() | ||||
| 	skip(3); | ||||
| 	read(true,true);//read creature abilities | ||||
|  | ||||
| 	boost::replace_first (spells[Spells::DISRUPTING_RAY]->attributes, "2", ""); // disrupting ray will now affect single creature | ||||
| 	boost::replace_first (spells[SpellID::DISRUPTING_RAY]->attributes, "2", ""); // disrupting ray will now affect single creature | ||||
|  | ||||
|  | ||||
| 	spells.push_back(spells[Spells::ACID_BREATH_DEFENSE]); //clone Acid Breath attributes for Acid Breath damage effect | ||||
| 	spells.push_back(spells[SpellID::ACID_BREATH_DEFENSE]); //clone Acid Breath attributes for Acid Breath damage effect | ||||
|  | ||||
| 	//loading of additional spell traits | ||||
| 	const JsonNode config(ResourceID("config/spell_info.json")); | ||||
| @@ -432,7 +432,7 @@ void CSpellHandler::loadSpells() | ||||
| 		BOOST_FOREACH(const JsonNode &range, spell.second["ranges"].Vector()) | ||||
| 			s->range[idx++] = range.String(); | ||||
|  | ||||
| 		s->counteredSpells = spell.second["counters"].convertTo<std::vector<TSpell> >(); | ||||
| 		s->counteredSpells = spell.second["counters"].convertTo<std::vector<SpellID> >(); | ||||
|  | ||||
| 		s->identifier = spell.first; | ||||
| 		VLC->modh->identifiers.registerObject("spell." + spell.first, spellID); | ||||
| @@ -524,7 +524,7 @@ void CSpellHandler::loadSpells() | ||||
| 	//spell fixes | ||||
|  | ||||
| 	//forgetfulness needs to get targets automatically on expert level | ||||
| 	boost::replace_first(spells[Spells::FORGETFULNESS]->attributes, "CREATURE_TARGET", "CREATURE_TARGET_2"); //TODO: use flags instead? | ||||
| 	boost::replace_first(spells[SpellID::FORGETFULNESS]->attributes, "CREATURE_TARGET", "CREATURE_TARGET_2"); //TODO: use flags instead? | ||||
| } | ||||
|  | ||||
| std::vector<bool> CSpellHandler::getDefaultAllowedSpells() const | ||||
|   | ||||
| @@ -23,7 +23,7 @@ class DLL_LINKAGE CSpell | ||||
| public: | ||||
| 	enum ETargetType {NO_TARGET, CREATURE, CREATURE_EXPERT_MASSIVE, OBSTACLE}; | ||||
| 	enum ESpellPositiveness {NEGATIVE = -1, NEUTRAL = 0, POSITIVE = 1}; | ||||
| 	TSpell id; | ||||
| 	SpellID id; | ||||
| 	std::string identifier; | ||||
| 	std::string name; | ||||
| 	std::string abbName; //abbreviated name | ||||
| @@ -43,7 +43,7 @@ public: | ||||
| 	bool creatureAbility; //if true, only creatures can use this spell | ||||
| 	si8 positiveness; //1 if spell is positive for influenced stacks, 0 if it is indifferent, -1 if it's negative | ||||
| 	std::vector<std::string> range; //description of spell's range in SRSL by magic school level | ||||
| 	std::vector<TSpell> counteredSpells; //spells that are removed when effect of this spell is placed on creature (for bless-curse, haste-slow, and similar pairs) | ||||
| 	std::vector<SpellID> counteredSpells; //spells that are removed when effect of this spell is placed on creature (for bless-curse, haste-slow, and similar pairs) | ||||
|  | ||||
| 	CSpell(); | ||||
|  | ||||
|   | ||||
| @@ -339,7 +339,7 @@ void CTownHandler::loadSiegeScreen(CTown &town, const JsonNode & source) | ||||
| 	town.clientInfo.siegePrefix = source["imagePrefix"].String(); | ||||
| 	VLC->modh->identifiers.requestIdentifier(std::string("creature.") + source["shooter"].String(), [&town](si32 creature) | ||||
| 	{ | ||||
| 		town.clientInfo.siegeShooter = static_cast<CreatureID::CreatureID>(creature); | ||||
| 		town.clientInfo.siegeShooter = CreatureID(creature); | ||||
| 	}); | ||||
|  | ||||
| 	town.clientInfo.siegeShooterCropHeight = source["shooterHeight"].Float(); | ||||
| @@ -418,7 +418,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source) | ||||
| 	VLC->modh->identifiers.requestIdentifier(std::string("creature." + source["warMachine"].String()), | ||||
| 	[&town](si32 creature) | ||||
| 	{ | ||||
| 		town.warMachine = CArtHandler::creatureToMachineID(static_cast<CreatureID::CreatureID>(creature)); | ||||
| 		town.warMachine = CArtHandler::creatureToMachineID(CreatureID(creature)); | ||||
| 	}); | ||||
|  | ||||
| 	town.moatDamage = source["moatDamage"].Float(); | ||||
| @@ -446,7 +446,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source) | ||||
| 		{ | ||||
| 			VLC->modh->identifiers.requestIdentifier(std::string("creature.") + level[j].String(), [=, &town](si32 creature) | ||||
| 			{ | ||||
| 				town.creatures[i][j] = static_cast<CreatureID::CreatureID>(creature); | ||||
| 				town.creatures[i][j] = CreatureID(creature); | ||||
| 			}); | ||||
| 		} | ||||
| 	} | ||||
| @@ -521,7 +521,7 @@ void CTownHandler::load(const JsonNode &source) | ||||
| 		VLC->modh->identifiers.requestIdentifier ("creature." + node.second["commander"].String(), | ||||
| 			[=](si32 commanderID) | ||||
| 			{ | ||||
| 				factions[id].commander = static_cast<CreatureID::CreatureID>(commanderID); | ||||
| 				factions[id].commander = CreatureID(commanderID); | ||||
| 			}); | ||||
|  | ||||
| 		faction.creatureBg120 = node.second["creatureBackground"]["120px"].String(); | ||||
|   | ||||
| @@ -90,7 +90,7 @@ public: | ||||
|  | ||||
| 	/// level -> list of creatures on this tier | ||||
| 	// TODO: replace with pointers to CCreature | ||||
| 	std::vector<std::vector<CreatureID::CreatureID> > creatures; | ||||
| 	std::vector<std::vector<CreatureID> > creatures; | ||||
|  | ||||
| 	bmap<int, ConstTransitivePtr<CBuilding> > buildings; | ||||
|  | ||||
| @@ -101,7 +101,7 @@ public: | ||||
| 	std::map<int,int> hordeLvl; //[0] - first horde building creature level; [1] - second horde building (-1 if not present) | ||||
| 	ui32 mageLevel; //max available mage guild level | ||||
| 	ui16 primaryRes; | ||||
| 	ArtifactID::ArtifactID warMachine; | ||||
| 	ArtifactID warMachine; | ||||
| 	si32 moatDamage; | ||||
|  | ||||
| 	// Client-only data. Should be moved away from lib | ||||
| @@ -137,7 +137,7 @@ public: | ||||
|  | ||||
| 		std::string siegePrefix; | ||||
| 		std::vector<Point> siegePositions; | ||||
| 		CreatureID::CreatureID siegeShooter; // shooter creature ID | ||||
| 		CreatureID siegeShooter; // shooter creature ID | ||||
| 		si32 siegeShooterCropHeight; //trim height for shooters in turrets | ||||
|  | ||||
| 		template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -178,7 +178,7 @@ public: | ||||
| 	ETerrainType::ETerrainType nativeTerrain; | ||||
| 	EAlignment::EAlignment alignment; | ||||
|  | ||||
| 	CreatureID::CreatureID commander; | ||||
| 	CreatureID commander; | ||||
|  | ||||
| 	std::string creatureBg120; | ||||
| 	std::string creatureBg130; | ||||
|   | ||||
| @@ -378,7 +378,7 @@ public: | ||||
| 	U getIdFromVectorItem(const VectorisedObjectInfo<T, U> &oInfo, const T* obj) const | ||||
| 	{ | ||||
| 		if(!obj) | ||||
| 			return static_cast<U>(-1); | ||||
| 			return U(-1); | ||||
|  | ||||
| 		return obj->*oInfo.idPtr; | ||||
| 	} | ||||
| @@ -427,10 +427,10 @@ struct VectorizedIDType | ||||
| 	typedef typename | ||||
| 		//if | ||||
| 		mpl::eval_if<boost::is_same<CArtifact,U>, | ||||
| 		mpl::identity<ArtifactID::ArtifactID>, | ||||
| 		mpl::identity<ArtifactID>, | ||||
| 		//else if | ||||
| 		mpl::eval_if<boost::is_same<CCreature,U>, | ||||
| 		mpl::identity<CreatureID::CreatureID>, | ||||
| 		mpl::identity<CreatureID>, | ||||
| 		//else | ||||
| 		mpl::identity<si32> | ||||
| 		> | ||||
| @@ -965,7 +965,7 @@ public: | ||||
| 				*this >> id; | ||||
| 				if(id != -1) | ||||
| 				{ | ||||
| 					data = static_cast<T>(getVectorItemFromId<VType, IDType>(*info, static_cast<IDType>(id))); | ||||
| 					data = static_cast<T>(getVectorItemFromId<VType, IDType>(*info, IDType(id))); | ||||
| 					return; | ||||
| 				} | ||||
| 			} | ||||
|   | ||||
							
								
								
									
										68
									
								
								lib/GameConstants.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								lib/GameConstants.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| #include "StdInc.h" | ||||
|  | ||||
| #include "VCMI_Lib.h" | ||||
| #include "CDefObjInfoHandler.h" | ||||
| #include "CArtHandler.h" | ||||
| #include "CCreatureHandler.h" | ||||
| #include "CSpellHandler.h" | ||||
|  | ||||
| #define ID_LIKE_OPERATORS_INTERNAL(A, B, AN, BN)	\ | ||||
| bool operator==(const A & a, const B & b)			\ | ||||
| {													\ | ||||
| 	return AN == BN ;								\ | ||||
| }													\ | ||||
| bool operator!=(const A & a, const B & b)			\ | ||||
| {													\ | ||||
| 	return AN != BN ;								\ | ||||
| }													\ | ||||
| bool operator<(const A & a, const B & b)			\ | ||||
| {													\ | ||||
| 	return AN < BN ;								\ | ||||
| }													\ | ||||
| bool operator<=(const A & a, const B & b)			\ | ||||
| {													\ | ||||
| 	return AN <= BN ;								\ | ||||
| }													\ | ||||
| bool operator>(const A & a, const B & b)			\ | ||||
| {													\ | ||||
| 	return AN > BN ;								\ | ||||
| }													\ | ||||
| bool operator>=(const A & a, const B & b)			\ | ||||
| {													\ | ||||
| 	return AN >= BN ;								\ | ||||
| } | ||||
|  | ||||
| #define ID_LIKE_OPERATORS(CLASS_NAME, ENUM_NAME)	\ | ||||
| 	ID_LIKE_OPERATORS_INTERNAL(CLASS_NAME, CLASS_NAME, a.num, b.num)	\ | ||||
| 	ID_LIKE_OPERATORS_INTERNAL(CLASS_NAME, ENUM_NAME, a.num, b)	\ | ||||
| 	ID_LIKE_OPERATORS_INTERNAL(ENUM_NAME, CLASS_NAME, a, b.num) | ||||
|  | ||||
|  | ||||
| ID_LIKE_OPERATORS(Obj, Obj::EObj) | ||||
|  | ||||
| ID_LIKE_OPERATORS(ArtifactID, ArtifactID::EArtifactID) | ||||
|  | ||||
| ID_LIKE_OPERATORS(CreatureID, CreatureID::ECreatureID) | ||||
|  | ||||
| ID_LIKE_OPERATORS(SpellID, SpellID::ESpellID) | ||||
|  | ||||
|  | ||||
| bmap<int, ConstTransitivePtr<CGDefInfo> > & Obj::toDefObjInfo() const | ||||
| { | ||||
| 	return VLC->dobjinfo->gobjs[*this]; | ||||
| } | ||||
|  | ||||
| CArtifact * ArtifactID::toArtifact() const | ||||
| { | ||||
| 	return VLC->arth->artifacts[*this]; | ||||
| } | ||||
|  | ||||
| CCreature * CreatureID::toCreature() const | ||||
| { | ||||
| 	return VLC->creh->creatures[*this]; | ||||
| } | ||||
|  | ||||
| CSpell * SpellID::toSpell() const | ||||
| { | ||||
| 	return VLC->spellh->spells[*this]; | ||||
| } | ||||
| @@ -10,6 +10,8 @@ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "ConstTransitivePtr.h" | ||||
|  | ||||
| namespace GameConstants | ||||
| { | ||||
| 	const std::string VCMI_VERSION = "VCMI 0.91b"; | ||||
| @@ -91,6 +93,58 @@ namespace GameConstants | ||||
|  | ||||
| } | ||||
|  | ||||
| class CArtifact; | ||||
| class CGDefInfo; | ||||
| class CCreature; | ||||
| class CSpell; | ||||
|  | ||||
| #define ID_LIKE_CLASS_COMMON(CLASS_NAME, ENUM_NAME)	\ | ||||
| CLASS_NAME(const CLASS_NAME & other)				\ | ||||
| {													\ | ||||
| 	num = other.num;								\ | ||||
| }													\ | ||||
| CLASS_NAME & operator=(const CLASS_NAME & other)	\ | ||||
| {													\ | ||||
| 	num = other.num;								\ | ||||
| 	return *this;									\ | ||||
| }													\ | ||||
| explicit CLASS_NAME(si32 id)						\ | ||||
| 	: num(static_cast<ENUM_NAME>(id))				\ | ||||
| {}													\ | ||||
| operator ENUM_NAME() const							\ | ||||
| {													\ | ||||
| 	return num;										\ | ||||
| }													\ | ||||
| ENUM_NAME toEnum() const							\ | ||||
| {													\ | ||||
| 	return num;										\ | ||||
| }													\ | ||||
| template <typename Handler> void serialize(Handler &h, const int version)	\ | ||||
| {													\ | ||||
| 	h & num;										\ | ||||
| }													\ | ||||
| CLASS_NAME & advance(int i)							\ | ||||
| {													\ | ||||
| 	num = (ENUM_NAME)((int)num + i);				\ | ||||
| 	return *this;									\ | ||||
| } | ||||
|  | ||||
|  | ||||
| #define ID_LIKE_OPERATORS_INTERNAL_DECLS(A, B)			\ | ||||
| bool DLL_LINKAGE operator==(const A & a, const B & b);	\ | ||||
| bool DLL_LINKAGE operator!=(const A & a, const B & b);	\ | ||||
| bool DLL_LINKAGE operator<(const A & a, const B & b);	\ | ||||
| bool DLL_LINKAGE operator<=(const A & a, const B & b);	\ | ||||
| bool DLL_LINKAGE operator>(const A & a, const B & b);	\ | ||||
| bool DLL_LINKAGE operator>=(const A & a, const B & b); | ||||
|  | ||||
| #define ID_LIKE_OPERATORS_DECLS(CLASS_NAME, ENUM_NAME)			\ | ||||
| 	ID_LIKE_OPERATORS_INTERNAL_DECLS(CLASS_NAME, CLASS_NAME)	\ | ||||
| 	ID_LIKE_OPERATORS_INTERNAL_DECLS(CLASS_NAME, ENUM_NAME)		\ | ||||
| 	ID_LIKE_OPERATORS_INTERNAL_DECLS(ENUM_NAME, CLASS_NAME) | ||||
|  | ||||
|  | ||||
|  | ||||
| // Enum declarations | ||||
| namespace PrimarySkill | ||||
| { | ||||
| @@ -135,13 +189,15 @@ namespace ETownType | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| namespace EBuilding | ||||
| class BuildingID | ||||
| { | ||||
| public: | ||||
| 	//Quite useful as long as most of building mechanics hardcoded | ||||
| 	// NOTE: all building with completely configurable mechanics will be removed from list | ||||
| 	enum EBuilding | ||||
| 	enum EBuildingID | ||||
| 	{ | ||||
| 		MAGES_GUILD_1,  MAGES_GUILD_2, MAGES_GUILD_3,     MAGES_GUILD_4,   MAGES_GUILD_5, | ||||
| 		NONE = -1, | ||||
| 		MAGES_GUILD_1 = 0,  MAGES_GUILD_2, MAGES_GUILD_3,     MAGES_GUILD_4,   MAGES_GUILD_5, | ||||
| 		TAVERN,         SHIPYARD,      FORT,              CITADEL,         CASTLE, | ||||
| 		VILLAGE_HALL,   TOWN_HALL,     CITY_HALL,         CAPITOL,         MARKETPLACE, | ||||
| 		RESOURCE_SILO,  BLACKSMITH,    SPECIAL_1,         HORDE_1,         HORDE_1_UPGR, | ||||
| @@ -188,7 +244,16 @@ namespace EBuilding | ||||
| 		//ARTIFACT_MERCHANT - same ID as in tower | ||||
| 		MAGIC_UNIVERSITY = SPECIAL_2, // Conflux | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| 	BuildingID(EBuildingID _num = NONE) : num(_num) | ||||
| 	{} | ||||
|  | ||||
| 	ID_LIKE_CLASS_COMMON(BuildingID, EBuildingID) | ||||
|  | ||||
| 	EBuildingID num; | ||||
| }; | ||||
|  | ||||
| ID_LIKE_OPERATORS_DECLS(BuildingID, BuildingID::EBuildingID) | ||||
|  | ||||
| namespace EBuildingState | ||||
| { | ||||
| @@ -261,9 +326,10 @@ namespace EWallState | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| namespace Obj | ||||
| class Obj | ||||
| { | ||||
| 	enum Obj | ||||
| public: | ||||
| 	enum EObj | ||||
| 	{ | ||||
| 		NO_OBJ = -1, | ||||
| 		ALTAR_OF_SACRIFICE = 2, | ||||
| @@ -402,7 +468,17 @@ namespace Obj | ||||
| 		MAGIC_PLAINS2 = 230, | ||||
| 		ROCKLANDS = 231, | ||||
| 	}; | ||||
| } | ||||
| 	Obj(EObj _num = NO_OBJ) : num(_num) | ||||
| 	{} | ||||
|  | ||||
| 	ID_LIKE_CLASS_COMMON(Obj, EObj) | ||||
|  | ||||
| 	bmap<int, ConstTransitivePtr<CGDefInfo> > & toDefObjInfo() const; | ||||
|  | ||||
| 	EObj num; | ||||
| }; | ||||
|  | ||||
| ID_LIKE_OPERATORS_DECLS(Obj, Obj::EObj) | ||||
|  | ||||
| namespace SecSkillLevel | ||||
| { | ||||
| @@ -504,9 +580,10 @@ namespace ArtifactPosition | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| namespace ArtifactID | ||||
| class ArtifactID | ||||
| { | ||||
| 	enum ArtifactID | ||||
| public: | ||||
| 	enum EArtifactID | ||||
| 	{ | ||||
| 		NONE = -1, | ||||
| 		SPELLBOOK = 0, | ||||
| @@ -531,11 +608,23 @@ namespace ArtifactID | ||||
| 		HARDENED_SHIELD = 154, | ||||
| 		SLAVAS_RING_OF_POWER = 155 | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| namespace CreatureID | ||||
| 	ArtifactID(EArtifactID _num = NONE) : num(_num) | ||||
| 	{} | ||||
|  | ||||
| 	DLL_LINKAGE CArtifact * toArtifact() const; | ||||
|  | ||||
| 	ID_LIKE_CLASS_COMMON(ArtifactID, EArtifactID) | ||||
|  | ||||
| 	EArtifactID num; | ||||
| }; | ||||
|  | ||||
| ID_LIKE_OPERATORS_DECLS(ArtifactID, ArtifactID::EArtifactID) | ||||
|  | ||||
| class CreatureID | ||||
| { | ||||
| 	enum CreatureID | ||||
| public: | ||||
| 	enum ECreatureID | ||||
| 	{ | ||||
| 		NONE = -1, | ||||
| 		CAVALIER = 10, | ||||
| @@ -556,12 +645,26 @@ namespace CreatureID | ||||
| 		AMMO_CART = 148, | ||||
| 		ARROW_TOWERS = 149 | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| namespace Spells | ||||
| 	CreatureID(ECreatureID _num = NONE) : num(_num) | ||||
| 	{} | ||||
|  | ||||
| 	DLL_LINKAGE CCreature * toCreature() const; | ||||
|  | ||||
| 	ID_LIKE_CLASS_COMMON(CreatureID, ECreatureID) | ||||
|  | ||||
| 	ECreatureID num; | ||||
| }; | ||||
|  | ||||
| ID_LIKE_OPERATORS_DECLS(CreatureID, CreatureID::ECreatureID) | ||||
|  | ||||
| class SpellID | ||||
| { | ||||
| 	enum Spells | ||||
| public: | ||||
| 	enum ESpellID | ||||
| 	{ | ||||
| 		PRESET = -2, | ||||
| 		NONE = -1, | ||||
| 		SUMMON_BOAT=0, SCUTTLE_BOAT=1, VISIONS=2, VIEW_EARTH=3, DISGUISE=4, VIEW_AIR=5, | ||||
| 		FLY=6, WATER_WALK=7, DIMENSION_DOOR=8, TOWN_PORTAL=9, | ||||
|  | ||||
| @@ -583,12 +686,22 @@ namespace Spells | ||||
| 		STONE_GAZE=70, POISON=71, BIND=72, DISEASE=73, PARALYZE=74, AGE=75, DEATH_CLOUD=76, THUNDERBOLT=77, | ||||
| 		DISPEL_HELPFUL_SPELLS=78, DEATH_STARE=79, ACID_BREATH_DEFENSE=80, ACID_BREATH_DAMAGE=81 | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| 	SpellID(ESpellID _num = NONE) : num(_num) | ||||
| 	{} | ||||
|  | ||||
| 	DLL_LINKAGE CSpell * toSpell() const; | ||||
|  | ||||
| 	ID_LIKE_CLASS_COMMON(SpellID, ESpellID) | ||||
|  | ||||
| 	ESpellID num; | ||||
| }; | ||||
|  | ||||
| ID_LIKE_OPERATORS_DECLS(SpellID, SpellID::ESpellID) | ||||
|  | ||||
| // Typedef declarations | ||||
| typedef si8 TFaction; | ||||
| typedef si64 TExpType; | ||||
| typedef ui32 TSpell; | ||||
| typedef std::pair<ui32, ui32> TDmgRange; | ||||
| typedef ui8 TBonusType; | ||||
| typedef si32 TBonusSubtype; | ||||
| @@ -596,3 +709,8 @@ typedef si32 TSlot; | ||||
| typedef si32 TQuantity; | ||||
| typedef si32 TArtifactInstanceID; | ||||
| typedef ui8 TPlayerColor; | ||||
|  | ||||
|  | ||||
| #undef ID_LIKE_CLASS_COMMON | ||||
| #undef ID_LIKE_OPERATORS_DECLS | ||||
| #undef ID_LIKE_OPERATORS_INTERNAL_DECLS | ||||
|   | ||||
| @@ -1356,7 +1356,7 @@ CCreatureTypeLimiter::CCreatureTypeLimiter() | ||||
| 	includeUpgrades = false; | ||||
| } | ||||
|  | ||||
| void CCreatureTypeLimiter::setCreature (CreatureID::CreatureID id) | ||||
| void CCreatureTypeLimiter::setCreature (CreatureID id) | ||||
| { | ||||
| 	creature = VLC->creh->creatures[id]; | ||||
| } | ||||
|   | ||||
| @@ -766,7 +766,7 @@ public: | ||||
|  | ||||
| 	CCreatureTypeLimiter(); | ||||
| 	CCreatureTypeLimiter(const CCreature &Creature, bool IncludeUpgrades = true); | ||||
| 	void setCreature (CreatureID::CreatureID id); | ||||
| 	void setCreature (CreatureID id); | ||||
|  | ||||
| 	int limit(const BonusLimitationContext &context) const OVERRIDE; | ||||
|  | ||||
|   | ||||
| @@ -203,7 +203,7 @@ void CPrivilagedInfoCallback::erasePickedArt (si32 id) | ||||
| } | ||||
|  | ||||
|  | ||||
| void CPrivilagedInfoCallback::getAllowedSpells(std::vector<ui16> &out, ui16 level) | ||||
| void CPrivilagedInfoCallback::getAllowedSpells(std::vector<SpellID> &out, ui16 level) | ||||
| { | ||||
|  | ||||
| 	CSpell *spell; | ||||
| @@ -231,7 +231,7 @@ const PlayerState * CGameInfoCallback::getPlayer(TPlayerColor color, bool verbos | ||||
| 	return &gs->players[color]; | ||||
| } | ||||
|  | ||||
| const CTown * CGameInfoCallback::getNativeTown(int color) const | ||||
| const CTown * CGameInfoCallback::getNativeTown(TPlayerColor color) const | ||||
| { | ||||
| 	const PlayerSettings *ps = getPlayerSettings(color); | ||||
| 	ERROR_RET_VAL_IF(!ps, "There is no such player!", NULL); | ||||
| @@ -561,21 +561,21 @@ EBuildingState::EBuildingState CGameInfoCallback::canBuildStructure( const CGTow | ||||
| 	if (notAllBuilt) | ||||
| 		return EBuildingState::PREREQUIRES; | ||||
|  | ||||
| 	if(ID == EBuilding::CAPITOL) | ||||
| 	if(ID == BuildingID::CAPITOL) | ||||
| 	{ | ||||
| 		const PlayerState *ps = getPlayer(t->tempOwner); | ||||
| 		if(ps) | ||||
| 		{ | ||||
| 			BOOST_FOREACH(const CGTownInstance *t, ps->towns) | ||||
| 			{ | ||||
| 				if(t->hasBuilt(EBuilding::CAPITOL)) | ||||
| 				if(t->hasBuilt(BuildingID::CAPITOL)) | ||||
| 				{ | ||||
| 					return EBuildingState::HAVE_CAPITAL; //no more than one capitol | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else if(ID == EBuilding::SHIPYARD) | ||||
| 	else if(ID == BuildingID::SHIPYARD) | ||||
| 	{ | ||||
| 		const TerrainTile *tile = getTile(t->bestLocation(), false); | ||||
| 		 | ||||
| @@ -884,9 +884,9 @@ const TeamState * CGameInfoCallback::getTeam( ui8 teamID ) const | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| const TeamState * CGameInfoCallback::getPlayerTeam( ui8 teamID ) const | ||||
| const TeamState * CGameInfoCallback::getPlayerTeam( TPlayerColor color ) const | ||||
| { | ||||
| 	const PlayerState * ps = getPlayer(teamID); | ||||
| 	const PlayerState * ps = getPlayer(color); | ||||
| 	if (ps) | ||||
| 		return getTeam(ps->team); | ||||
| 	return NULL; | ||||
| @@ -933,7 +933,7 @@ void IGameEventRealizer::setObjProperty(int objid, int prop, si64 val) | ||||
| 	commitPackage(&sob); | ||||
| } | ||||
|  | ||||
| const CGObjectInstance * IGameCallback::putNewObject(Obj::Obj ID, int subID, int3 pos) | ||||
| const CGObjectInstance * IGameCallback::putNewObject(Obj ID, int subID, int3 pos) | ||||
| { | ||||
| 	NewObject no; | ||||
| 	no.ID = ID; //creature | ||||
|   | ||||
| @@ -130,11 +130,11 @@ public: | ||||
| 	EBuildingState::EBuildingState canBuildStructure(const CGTownInstance *t, int ID);//// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements | ||||
| 	std::set<int> getBuildingRequiments(const CGTownInstance *t, int ID); | ||||
| 	virtual bool getTownInfo(const CGObjectInstance *town, InfoAboutTown &dest) const; | ||||
| 	const CTown *getNativeTown(int color) const; | ||||
| 	const CTown *getNativeTown(TPlayerColor color) const; | ||||
|  | ||||
| 	//from gs | ||||
| 	const TeamState *getTeam(ui8 teamID) const; | ||||
| 	const TeamState *getPlayerTeam(ui8 color) const; | ||||
| 	const TeamState *getPlayerTeam(TPlayerColor color) const; | ||||
| 	std::set<int> getBuildingRequiments(const CGTownInstance *t, int ID) const; | ||||
| 	EBuildingState::EBuildingState canBuildStructure(const CGTownInstance *t, int ID) const;// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements | ||||
| }; | ||||
| @@ -160,7 +160,7 @@ public: | ||||
| 	int getResourceAmount(Res::ERes type) const; | ||||
| 	TResources getResourceAmount() const; | ||||
| 	const std::vector< std::vector< std::vector<ui8> > > & getVisibilityMap()const; //returns visibility map  | ||||
| 	const PlayerSettings * getPlayerSettings(int color) const; | ||||
| 	const PlayerSettings * getPlayerSettings(TPlayerColor color) const; | ||||
| }; | ||||
|  | ||||
| class DLL_LINKAGE CPrivilagedInfoCallback : public CGameInfoCallback | ||||
| @@ -174,7 +174,7 @@ public: | ||||
| 	ui16 getArtSync (ui32 rand, int flags); //synchronous | ||||
| 	void pickAllowedArtsSet(std::vector<const CArtifact*> &out); //gives 3 treasures, 3 minors, 1 major -> used by Black Market and Artifact Merchant | ||||
| 	void erasePickedArt (si32 id); | ||||
| 	void getAllowedSpells(std::vector<ui16> &out, ui16 level); | ||||
| 	void getAllowedSpells(std::vector<SpellID> &out, ui16 level); | ||||
| }; | ||||
|  | ||||
| class DLL_LINKAGE CNonConstInfoCallback : public CPrivilagedInfoCallback | ||||
| @@ -203,7 +203,7 @@ public: | ||||
| class DLL_LINKAGE IGameEventCallback : public IGameEventRealizer | ||||
| { | ||||
| public: | ||||
| 	virtual void changeSpells(const CGHeroInstance * hero, bool give, const std::set<ui32> &spells)=0; | ||||
| 	virtual void changeSpells(const CGHeroInstance * hero, bool give, const std::set<SpellID> &spells)=0; | ||||
| 	virtual bool removeObject(const CGObjectInstance * obj)=0; | ||||
| 	virtual void setBlockVis(int objid, bool bv)=0; | ||||
| 	virtual void setOwner(const CGObjectInstance * objid, TPlayerColor owner)=0; | ||||
| @@ -240,7 +240,7 @@ public: | ||||
| 	virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, boost::function<void(BattleResult*)> cb = 0, bool creatureBank = false)=0; //if any of armies is hero, hero will be used | ||||
| 	virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, boost::function<void(BattleResult*)> cb = 0, bool creatureBank = false)=0; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle | ||||
| 	virtual void setAmount(int objid, ui32 val)=0; | ||||
| 	virtual bool moveHero(si32 hid, int3 dst, ui8 instant, ui8 asker = 255)=0; | ||||
| 	virtual bool moveHero(si32 hid, int3 dst, ui8 instant, TPlayerColor asker = GameConstants::NEUTRAL_PLAYER)=0; | ||||
| 	virtual void giveHeroBonus(GiveBonus * bonus)=0; | ||||
| 	virtual void setMovePoints(SetMovePoints * smp)=0; | ||||
| 	virtual void setManaPoints(int hid, int val)=0; | ||||
| @@ -258,7 +258,7 @@ public: | ||||
| 	virtual ~IGameCallback(){}; | ||||
|  | ||||
| 	//do sth | ||||
| 	const CGObjectInstance *putNewObject(Obj::Obj ID, int subID, int3 pos); | ||||
| 	const CGObjectInstance *putNewObject(Obj ID, int subID, int3 pos); | ||||
| 	const CGCreature *putNewMonster(int creID, int count, int3 pos); | ||||
|  | ||||
| 	friend struct CPack; | ||||
|   | ||||
| @@ -1055,7 +1055,7 @@ Bonus * JsonUtils::parseBonus (const JsonNode &ability) | ||||
| 							const JsonVector vec = limiter["parameters"].Vector(); | ||||
| 							VLC->modh->identifiers.requestIdentifier(std::string("creature.") + vec[0].String(), [=](si32 creature) | ||||
| 							{ | ||||
| 								l2->setCreature (static_cast<CreatureID::CreatureID>(creature)); | ||||
| 								l2->setCreature (CreatureID(creature)); | ||||
| 							}); | ||||
| 							if (vec.size() > 1) | ||||
| 							{ | ||||
|   | ||||
| @@ -156,16 +156,16 @@ namespace JsonDetail | ||||
| 	struct JsonConvImpl; | ||||
|  | ||||
| 	template <typename T> | ||||
| 	struct JsonConvImpl<T, 0> | ||||
| 	struct JsonConvImpl<T, 1> | ||||
| 	{ | ||||
| 		static T convertImpl(const JsonNode & node) | ||||
| 		{ | ||||
| 			return (T)(int)node.Float(); | ||||
| 			return T((int)node.Float()); | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	template <typename T> | ||||
| 	struct JsonConvImpl<T, 1> | ||||
| 	struct JsonConvImpl<T, 0> | ||||
| 	{ | ||||
| 		static T convertImpl(const JsonNode & node) | ||||
| 		{ | ||||
| @@ -179,8 +179,8 @@ namespace JsonDetail | ||||
| 		static Type convert(const JsonNode & node) | ||||
| 		{ | ||||
| 			///this should be triggered only for numeric types and enums | ||||
| 			static_assert(boost::mpl::or_<std::is_arithmetic<Type>, std::is_enum<Type> >::value, "Unsupported type for JsonNode::convertTo()!"); | ||||
| 			return JsonConvImpl<Type, std::is_arithmetic<Type>::value>::convertImpl(node); | ||||
| 			static_assert(boost::mpl::or_<std::is_arithmetic<Type>, std::is_enum<Type>, boost::is_class<Type> >::value, "Unsupported type for JsonNode::convertTo()!"); | ||||
| 			return JsonConvImpl<Type, boost::mpl::or_<std::is_enum<Type>, boost::is_class<Type> >::value >::convertImpl(node); | ||||
| 				 | ||||
| 		} | ||||
| 	}; | ||||
|   | ||||
| @@ -747,7 +747,7 @@ void CMapLoaderH3M::readDefInfo() | ||||
|  | ||||
| 		defInfo->terrainAllowed = reader.readUInt16(); | ||||
| 		defInfo->terrainMenu = reader.readUInt16(); | ||||
| 		defInfo->id = static_cast<Obj::Obj>(reader.readUInt32()); | ||||
| 		defInfo->id = Obj(reader.readUInt32()); | ||||
| 		defInfo->subid = reader.readUInt32(); | ||||
| 		defInfo->type = reader.readUInt8(); | ||||
| 		defInfo->printPriority = reader.readUInt8(); | ||||
| @@ -854,18 +854,18 @@ void CMapLoaderH3M::readObjects() | ||||
| 				{ | ||||
| 					if(map->version == EMapFormat::ROE) | ||||
| 					{ | ||||
| 						evnt->artifacts.push_back(reader.readUInt8()); | ||||
| 						evnt->artifacts.push_back(ArtifactID(reader.readUInt8())); | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						evnt->artifacts.push_back(reader.readUInt16()); | ||||
| 						evnt->artifacts.push_back(ArtifactID(reader.readUInt16())); | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				int gspel = reader.readUInt8(); // Number of gained spells | ||||
| 				for(int oo = 0; oo < gspel; ++oo) | ||||
| 				{ | ||||
| 					evnt->spells.push_back(reader.readUInt8()); | ||||
| 					evnt->spells.push_back(SpellID(reader.readUInt8())); | ||||
| 				} | ||||
|  | ||||
| 				int gcre = reader.readUInt8(); //number of gained creatures | ||||
| @@ -984,7 +984,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 					{ | ||||
| 						if(artID != 0xff) | ||||
| 						{ | ||||
| 							cre->gainedArtifact = static_cast<ArtifactID::ArtifactID>(artID); | ||||
| 							cre->gainedArtifact = ArtifactID(artID); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| @@ -995,7 +995,7 @@ void CMapLoaderH3M::readObjects() | ||||
| 					{ | ||||
| 						if(artID != 0xffff) | ||||
| 						{ | ||||
| 							cre->gainedArtifact = static_cast<ArtifactID::ArtifactID>(artID); | ||||
| 							cre->gainedArtifact = ArtifactID(artID); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| @@ -1200,17 +1200,17 @@ void CMapLoaderH3M::readObjects() | ||||
| 				{ | ||||
| 					if(map->version > EMapFormat::ROE) | ||||
| 					{ | ||||
| 						box->artifacts.push_back(reader.readUInt16()); | ||||
| 						box->artifacts.push_back(ArtifactID(reader.readUInt16())); | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						box->artifacts.push_back(reader.readUInt8()); | ||||
| 						box->artifacts.push_back(ArtifactID(reader.readUInt8())); | ||||
| 					} | ||||
| 				} | ||||
| 				int gspel = reader.readUInt8(); //number of gained spells | ||||
| 				for(int oo = 0; oo < gspel; ++oo) | ||||
| 				{ | ||||
| 					box->spells.push_back(reader.readUInt8()); | ||||
| 					box->spells.push_back(SpellID(reader.readUInt8())); | ||||
| 				} | ||||
| 				int gcre = reader.readUInt8(); //number of gained creatures | ||||
| 				readCreatureSet(&box->creatures, gcre); | ||||
| @@ -1475,16 +1475,16 @@ void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number) | ||||
|  | ||||
| 	for(int ir = 0; ir < number; ++ir) | ||||
| 	{ | ||||
| 		CreatureID::CreatureID creID; | ||||
| 		CreatureID creID; | ||||
| 		int count; | ||||
|  | ||||
| 		if (version) | ||||
| 		{ | ||||
| 			creID = static_cast<CreatureID::CreatureID>(reader.readUInt16()); | ||||
| 			creID = CreatureID(reader.readUInt16()); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			creID = static_cast<CreatureID::CreatureID>(reader.readUInt8()); | ||||
| 			creID = CreatureID(reader.readUInt8()); | ||||
| 		} | ||||
| 		count = reader.readUInt16(); | ||||
|  | ||||
| @@ -1497,7 +1497,7 @@ void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number) | ||||
| 		if(creID > maxID - 0xf) | ||||
| 		{ | ||||
| 			//this will happen when random object has random army | ||||
| 			creID = static_cast<CreatureID::CreatureID>(maxID + 1 - creID + VLC->creh->creatures.size()); | ||||
| 			creID = CreatureID(maxID + 1 - creID + VLC->creh->creatures.size()); | ||||
| 			hlp->idRand = creID; | ||||
| 		} | ||||
| 		else | ||||
| @@ -1639,7 +1639,7 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven) | ||||
| 		bool hasCustomSpells = reader.readBool(); | ||||
| 		if(hasCustomSpells) | ||||
| 		{ | ||||
| 			nhi->spells.insert(0xffffffff); //placeholder "preset spells" | ||||
| 			nhi->spells.insert(SpellID::PRESET); //placeholder "preset spells" | ||||
|  | ||||
| 			readSpells(nhi->spells); | ||||
| 		} | ||||
| @@ -1650,10 +1650,10 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven) | ||||
| 		ui8 buff = reader.readUInt8(); | ||||
| 		if(buff != 254) | ||||
| 		{ | ||||
| 			nhi->spells.insert(0xffffffff); //placeholder "preset spells" | ||||
| 			nhi->spells.insert(SpellID::PRESET); //placeholder "preset spells" | ||||
| 			if(buff < 254) //255 means no spells | ||||
| 			{ | ||||
| 				nhi->spells.insert(buff); | ||||
| 				nhi->spells.insert(SpellID(buff)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @@ -1904,7 +1904,7 @@ CGTownInstance * CMapLoaderH3M::readTown(int castleID) | ||||
| 		bool hasFort = reader.readBool(); | ||||
| 		if(hasFort) | ||||
| 		{ | ||||
| 			nt->builtBuildings.insert(EBuilding::FORT); | ||||
| 			nt->builtBuildings.insert(BuildingID::FORT); | ||||
| 		} | ||||
|  | ||||
| 		//means that set of standard building should be included | ||||
| @@ -2038,20 +2038,20 @@ std::set<si32> CMapLoaderH3M::convertBuildings(const std::set<si32> h3m, int cas | ||||
| 	if(addAuxiliary) | ||||
| 	{ | ||||
| 		//village hall is always present | ||||
| 		ret.insert(EBuilding::VILLAGE_HALL); | ||||
| 		ret.insert(BuildingID::VILLAGE_HALL); | ||||
| 	} | ||||
|  | ||||
| 	if(ret.find(EBuilding::CITY_HALL) != ret.end()) | ||||
| 	if(ret.find(BuildingID::CITY_HALL) != ret.end()) | ||||
| 	{ | ||||
| 		ret.insert(EBuilding::EXTRA_CITY_HALL); | ||||
| 		ret.insert(BuildingID::EXTRA_CITY_HALL); | ||||
| 	} | ||||
| 	if(ret.find(EBuilding::TOWN_HALL) != ret.end()) | ||||
| 	if(ret.find(BuildingID::TOWN_HALL) != ret.end()) | ||||
| 	{ | ||||
| 		ret.insert(EBuilding::EXTRA_TOWN_HALL); | ||||
| 		ret.insert(BuildingID::EXTRA_TOWN_HALL); | ||||
| 	} | ||||
| 	if(ret.find(EBuilding::CAPITOL) != ret.end()) | ||||
| 	if(ret.find(BuildingID::CAPITOL) != ret.end()) | ||||
| 	{ | ||||
| 		ret.insert(EBuilding::EXTRA_CAPITOL); | ||||
| 		ret.insert(BuildingID::EXTRA_CAPITOL); | ||||
| 	} | ||||
|  | ||||
| 	return ret; | ||||
| @@ -2102,7 +2102,7 @@ void CMapLoaderH3M::readMessageAndGuards(std::string& message, CCreatureSet* gua | ||||
| } | ||||
|  | ||||
|  | ||||
| void CMapLoaderH3M::readSpells(std::set<TSpell>& dest) | ||||
| void CMapLoaderH3M::readSpells(std::set<SpellID>& dest) | ||||
| { | ||||
| 	readBitmask(dest,9,GameConstants::SPELLS_QUANTITY,false); | ||||
| } | ||||
|   | ||||
| @@ -215,7 +215,7 @@ private: | ||||
| 	*/ | ||||
| 	void readMessageAndGuards(std::string& message, CCreatureSet * guards); | ||||
|  | ||||
| 	void readSpells(std::set<TSpell> & dest); | ||||
| 	void readSpells(std::set<SpellID> & dest); | ||||
|  | ||||
| 	void readResourses(TResources& resources); | ||||
|  | ||||
|   | ||||
| @@ -151,7 +151,7 @@ public: | ||||
| 		message.push_back(TREPLACE_PLUSNUMBER); | ||||
| 		numbers.push_back(txt); | ||||
| 	} | ||||
| 	DLL_LINKAGE void addCreReplacement(CreatureID::CreatureID id, TQuantity count); //adds sing or plural name; | ||||
| 	DLL_LINKAGE void addCreReplacement(CreatureID id, TQuantity count); //adds sing or plural name; | ||||
| 	DLL_LINKAGE void addReplacement(const CStackBasicDescriptor &stack); //adds sing or plural name; | ||||
| 	DLL_LINKAGE std::string buildList () const; | ||||
| 	void clear() | ||||
| @@ -355,7 +355,7 @@ struct ChangeSpells : public CPackForClient //109 | ||||
|  | ||||
| 	ui8 learn; //1 - gives spell, 0 - takes | ||||
| 	ui32 hid; | ||||
| 	std::set<ui32> spells; | ||||
| 	std::set<SpellID> spells; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
| @@ -674,7 +674,7 @@ struct SetAvailableCreatures : public CPackForClient //506 | ||||
| 	DLL_LINKAGE void applyGs(CGameState *gs); | ||||
|  | ||||
| 	si32 tid; | ||||
| 	std::vector<std::pair<ui32, std::vector<CreatureID::CreatureID> > > creatures; | ||||
| 	std::vector<std::pair<ui32, std::vector<CreatureID> > > creatures; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
| @@ -773,7 +773,7 @@ struct NewObject  : public CPackForClient //518 | ||||
| 	void applyCl(CClient *cl); | ||||
| 	DLL_LINKAGE void applyGs(CGameState *gs); | ||||
|  | ||||
| 	Obj::Obj ID; | ||||
| 	Obj ID; | ||||
| 	ui32 subID; | ||||
| 	int3 pos; | ||||
|  | ||||
| @@ -1076,7 +1076,7 @@ struct NewTurn : public CPackForClient //101 | ||||
| 	ui32 day; | ||||
| 	bool resetBuilded; | ||||
| 	ui8 specialWeek; //weekType | ||||
| 	CreatureID::CreatureID creatureid; //for creature weeks | ||||
| 	CreatureID creatureid; //for creature weeks | ||||
|  | ||||
| 	NewTurn(){type = 101;}; | ||||
|  | ||||
| @@ -1523,7 +1523,7 @@ struct BattleSpellCast : public CPackForClient//3009 | ||||
| 	BattleHex tile; //destination tile (may not be set in some global/mass spells | ||||
| 	std::vector<ui32> resisted; //ids of creatures that resisted this spell | ||||
| 	std::set<ui32> affectedCres; //ids of creatures affected by this spell, generally used if spell does not set any effect (like dispel or cure) | ||||
| 	CreatureID::CreatureID attackerType;//id of caster to generate console message; -1 if not set (eg. spell casted by artifact) | ||||
| 	CreatureID attackerType;//id of caster to generate console message; -1 if not set (eg. spell casted by artifact) | ||||
| 	bool castedByHero; //if true - spell has been casted by hero, otherwise by a creature | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
| @@ -1629,7 +1629,7 @@ struct BattleStackAdded : public CPackForClient //3017 | ||||
| 	void applyCl(CClient *cl); | ||||
|  | ||||
| 	int attacker; // if true, stack belongs to attacker | ||||
| 	CreatureID::CreatureID creID; | ||||
| 	CreatureID creID; | ||||
| 	int amount; | ||||
| 	int pos; | ||||
| 	int summoned; //if true, remove it afterwards | ||||
| @@ -1857,9 +1857,9 @@ struct RazeStructure : public BuildStructure | ||||
| struct RecruitCreatures : public CPackForServer | ||||
| { | ||||
| 	RecruitCreatures(){}; | ||||
| 	RecruitCreatures(si32 TID, CreatureID::CreatureID CRID, si32 Amount, si32 Level):tid(TID),crid(CRID),amount(Amount),level(Level){}; | ||||
| 	RecruitCreatures(si32 TID, CreatureID CRID, si32 Amount, si32 Level):tid(TID),crid(CRID),amount(Amount),level(Level){}; | ||||
| 	si32 tid; //town id | ||||
| 	CreatureID::CreatureID crid; | ||||
| 	CreatureID crid; | ||||
| 	ui32 amount;//creature amount | ||||
| 	si32 level;//dwelling level to buy from, -1 if any | ||||
| 	bool applyGh(CGameHandler *gh); | ||||
| @@ -1872,10 +1872,10 @@ struct RecruitCreatures : public CPackForServer | ||||
| struct UpgradeCreature : public CPackForServer | ||||
| { | ||||
| 	UpgradeCreature(){}; | ||||
| 	UpgradeCreature(ui8 Pos, si32 ID, CreatureID::CreatureID CRID):pos(Pos),id(ID), cid(CRID){}; | ||||
| 	UpgradeCreature(ui8 Pos, si32 ID, CreatureID CRID):pos(Pos),id(ID), cid(CRID){}; | ||||
| 	ui8 pos; //stack pos | ||||
| 	si32 id; //object id | ||||
| 	CreatureID::CreatureID cid; //id of type to which we want make upgrade | ||||
| 	CreatureID cid; //id of type to which we want make upgrade | ||||
|  | ||||
| 	bool applyGh(CGameHandler *gh); | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -1930,9 +1930,9 @@ struct AssembleArtifacts : public CPackForServer | ||||
| struct BuyArtifact : public CPackForServer | ||||
| { | ||||
| 	BuyArtifact(){}; | ||||
| 	BuyArtifact(si32 HID, ArtifactID::ArtifactID AID):hid(HID),aid(AID){}; | ||||
| 	BuyArtifact(si32 HID, ArtifactID AID):hid(HID),aid(AID){}; | ||||
| 	si32 hid; | ||||
| 	ArtifactID::ArtifactID aid; | ||||
| 	ArtifactID aid; | ||||
|  | ||||
| 	bool applyGh(CGameHandler *gh); | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -2055,7 +2055,7 @@ struct CastAdvSpell : public CPackForServer | ||||
| { | ||||
| 	CastAdvSpell(){} | ||||
| 	si32 hid; //hero id | ||||
| 	ui32 sid; //spell id | ||||
| 	SpellID sid; //spell id | ||||
| 	int3 pos; //selected tile (not always used) | ||||
|  | ||||
| 	bool applyGh(CGameHandler *gh); | ||||
|   | ||||
| @@ -132,10 +132,10 @@ DLL_LINKAGE void ChangeSpells::applyGs( CGameState *gs ) | ||||
| 	CGHeroInstance *hero = gs->getHero(hid); | ||||
|  | ||||
| 	if(learn) | ||||
| 		BOOST_FOREACH(ui32 sid, spells) | ||||
| 		BOOST_FOREACH(auto sid, spells) | ||||
| 			hero->spells.insert(sid); | ||||
| 	else | ||||
| 		BOOST_FOREACH(ui32 sid, spells) | ||||
| 		BOOST_FOREACH(auto sid, spells) | ||||
| 			hero->spells.erase(sid); | ||||
| } | ||||
|  | ||||
| @@ -537,7 +537,7 @@ DLL_LINKAGE void NewObject::applyGs( CGameState *gs ) | ||||
| 			cre->character = 2; | ||||
| 			cre->gainedArtifact = ArtifactID::NONE; | ||||
| 			cre->identifier = -1; | ||||
| 			cre->addToSlot(0, new CStackInstance(static_cast<CreatureID::CreatureID>(subID), -1)); //add placeholder stack | ||||
| 			cre->addToSlot(0, new CStackInstance(CreatureID(subID), -1)); //add placeholder stack | ||||
| 		} | ||||
| 		break; | ||||
| 	default: | ||||
| @@ -1241,8 +1241,8 @@ DLL_LINKAGE void BattleSpellCast::applyGs( CGameState *gs ) | ||||
|  | ||||
| 	//Handle spells removing effects from stacks | ||||
| 	const CSpell *spell = VLC->spellh->spells[id]; | ||||
| 	const bool removeAllSpells = id == Spells::DISPEL; | ||||
| 	const bool removeHelpful = id == Spells::DISPEL_HELPFUL_SPELLS; | ||||
| 	const bool removeAllSpells = id == SpellID::DISPEL; | ||||
| 	const bool removeHelpful = id == SpellID::DISPEL_HELPFUL_SPELLS; | ||||
|  | ||||
| 	BOOST_FOREACH(auto stackID, affectedCres) | ||||
| 	{ | ||||
| @@ -1299,7 +1299,7 @@ DLL_LINKAGE void SetStackEffect::applyGs( CGameState *gs ) | ||||
| 		CStack *s = gs->curB->getStack(id); | ||||
| 		if(s) | ||||
| 		{ | ||||
| 			if(spellid == Spells::DISRUPTING_RAY || spellid == Spells::ACID_BREATH_DEFENSE || !s->hasBonus(Selector::source(Bonus::SPELL_EFFECT, spellid)))//disrupting ray or acid breath or not on the list - just add | ||||
| 			if(spellid == SpellID::DISRUPTING_RAY || spellid == SpellID::ACID_BREATH_DEFENSE || !s->hasBonus(Selector::source(Bonus::SPELL_EFFECT, spellid)))//disrupting ray or acid breath or not on the list - just add | ||||
| 			{ | ||||
| 				BOOST_FOREACH(Bonus &fromEffect, effect) | ||||
| 				{ | ||||
|   | ||||
| @@ -316,7 +316,7 @@ void CMapGenerator::genTowns() | ||||
| 		town->subID = townTypes[side]; | ||||
| 		town->tempOwner = owner; | ||||
| 		town->defInfo = VLC->dobjinfo->gobjs[town->ID][town->subID]; | ||||
| 		town->builtBuildings.insert(EBuilding::FORT); | ||||
| 		town->builtBuildings.insert(BuildingID::FORT); | ||||
| 		town->builtBuildings.insert(-50); | ||||
| 		mapMgr->insertObject(town, townPos[side].x, townPos[side].y + (pos / 2) * 5, false); | ||||
|  | ||||
|   | ||||
| @@ -193,6 +193,7 @@ | ||||
|     <ClCompile Include="Filesystem\CLodArchiveLoader.cpp" /> | ||||
|     <ClCompile Include="Filesystem\CMemoryStream.cpp" /> | ||||
|     <ClCompile Include="Filesystem\CResourceLoader.cpp" /> | ||||
|     <ClCompile Include="GameConstants.cpp" /> | ||||
|     <ClCompile Include="Mapping\CCampaignHandler.cpp" /> | ||||
|     <ClCompile Include="Mapping\CMap.cpp" /> | ||||
|     <ClCompile Include="Mapping\CMapInfo.cpp" /> | ||||
|   | ||||
| @@ -676,10 +676,10 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer | ||||
|  | ||||
| 		iw.text.addReplacement(names.str()); | ||||
|  | ||||
| 		std::set<ui32>::iterator it = cs.spells.begin(); | ||||
| 		auto it = cs.spells.begin(); | ||||
| 		for(int i = 0; i < cs.spells.size(); i++, it++) | ||||
| 		{ | ||||
| 			iw.text.addReplacement(MetaString::SPELL_NAME, *it); | ||||
| 			iw.text.addReplacement(MetaString::SPELL_NAME, it->toEnum()); | ||||
| 			if(i == cs.spells.size() - 2) //we just added pre-last name | ||||
| 				iw.text.addReplacement(MetaString::GENERAL_TXT, 141); // " and " | ||||
| 			iw.components.push_back(Component(Component::SPELL, *it, 0, 0)); | ||||
| @@ -1141,7 +1141,7 @@ void CGameHandler::setPortalDwelling(const CGTownInstance * town, bool forced=fa | ||||
|  | ||||
| 			ui32 dwellpos = rand()%dwellings.size();//take random dwelling | ||||
| 			ui32 creapos = rand()%dwellings[dwellpos]->creatures.size();//for multi-creature dwellings like Golem Factory | ||||
| 			CreatureID::CreatureID creature = dwellings[dwellpos]->creatures[creapos].second[0]; | ||||
| 			CreatureID creature = dwellings[dwellpos]->creatures[creapos].second[0]; | ||||
|  | ||||
| 			if (clear) | ||||
| 				ssi.creatures[GameConstants::CREATURES_PER_TOWN].first = std::max((ui32)1, (VLC->creh->creatures[creature]->growth)/2); | ||||
| @@ -1184,7 +1184,7 @@ void CGameHandler::newTurn() | ||||
| 		bool deityOfFireBuilt = false; | ||||
| 		BOOST_FOREACH(const CGTownInstance *t, gs->map->towns) | ||||
| 		{ | ||||
| 			if(t->hasBuilt(EBuilding::GRAIL, ETownType::INFERNO)) | ||||
| 			if(t->hasBuilt(BuildingID::GRAIL, ETownType::INFERNO)) | ||||
| 			{ | ||||
| 				deityOfFireBuilt = true; | ||||
| 				break; | ||||
| @@ -1206,7 +1206,7 @@ void CGameHandler::newTurn() | ||||
| 					n.specialWeek = NewTurn::DOUBLE_GROWTH; | ||||
| 					if (VLC->modh->settings.ALL_CREATURES_GET_DOUBLE_MONTHS) | ||||
| 					{ | ||||
| 						std::pair<int,CreatureID::CreatureID> newMonster(54, VLC->creh->pickRandomMonster(boost::ref(rand))); | ||||
| 						std::pair<int,CreatureID> newMonster(54, VLC->creh->pickRandomMonster(boost::ref(rand))); | ||||
| 						n.creatureid = newMonster.second; | ||||
| 					} | ||||
| 					else | ||||
| @@ -1224,7 +1224,7 @@ void CGameHandler::newTurn() | ||||
| 				if (monthType < 25) | ||||
| 				{ | ||||
| 					n.specialWeek = NewTurn::BONUS_GROWTH; //+5 | ||||
| 					std::pair<int, CreatureID::CreatureID> newMonster (54, VLC->creh->pickRandomMonster(boost::ref(rand))); | ||||
| 					std::pair<int, CreatureID> newMonster (54, VLC->creh->pickRandomMonster(boost::ref(rand))); | ||||
| 					//TODO do not pick neutrals | ||||
| 					n.creatureid = newMonster.second; | ||||
| 				} | ||||
| @@ -1277,7 +1277,7 @@ void CGameHandler::newTurn() | ||||
| 			hth.id = h->id; | ||||
|             hth.move = h->maxMovePoints(gs->map->getTile(h->getPosition(false)).terType != ETerrainType::WATER); | ||||
|  | ||||
| 			if(h->visitedTown && h->visitedTown->hasBuilt(EBuilding::MAGES_GUILD_1)) //if hero starts turn in town with mage guild | ||||
| 			if(h->visitedTown && h->visitedTown->hasBuilt(BuildingID::MAGES_GUILD_1)) //if hero starts turn in town with mage guild | ||||
| 				hth.mana = std::max(h->mana, h->manaLimit()); //restore all mana | ||||
| 			else | ||||
| 				hth.mana = std::max((si32)(0), std::max(h->mana, std::min((si32)(h->mana + h->manaRegain()), h->manaLimit()))); | ||||
| @@ -1304,11 +1304,11 @@ void CGameHandler::newTurn() | ||||
| 		handleTownEvents(t, n, newCreas); | ||||
| 		if(newWeek) //first day of week | ||||
| 		{ | ||||
| 			if(t->hasBuilt(EBuilding::PORTAL_OF_SUMMON, ETownType::DUNGEON)) | ||||
| 			if(t->hasBuilt(BuildingID::PORTAL_OF_SUMMON, ETownType::DUNGEON)) | ||||
| 				setPortalDwelling(t, true, (n.specialWeek == NewTurn::PLAGUE ? true : false)); //set creatures for Portal of Summoning | ||||
|  | ||||
| 			if(!firstTurn) | ||||
| 				if (t->hasBuilt(EBuilding::TREASURY, ETownType::RAMPART) && player < GameConstants::PLAYER_LIMIT) | ||||
| 				if (t->hasBuilt(BuildingID::TREASURY, ETownType::RAMPART) && player < GameConstants::PLAYER_LIMIT) | ||||
| 						n.res[player][Res::GOLD] += hadGold[player]/10; //give 10% of starting gold | ||||
|  | ||||
| 			SetAvailableCreatures sac; | ||||
| @@ -1353,7 +1353,7 @@ void CGameHandler::newTurn() | ||||
| 		} | ||||
| 		if(!firstTurn  &&  player < GameConstants::PLAYER_LIMIT)//not the first day and town not neutral | ||||
| 		{ | ||||
| 			if(t->hasBuilt(EBuilding::RESOURCE_SILO)) //there is resource silo | ||||
| 			if(t->hasBuilt(BuildingID::RESOURCE_SILO)) //there is resource silo | ||||
| 			{ | ||||
| 				if(t->town->primaryRes == 127) //we'll give wood and ore | ||||
| 				{ | ||||
| @@ -1368,7 +1368,7 @@ void CGameHandler::newTurn() | ||||
|  | ||||
| 			n.res[player][Res::GOLD] += t->dailyIncome(); | ||||
| 		} | ||||
| 		if(t->hasBuilt(EBuilding::GRAIL, ETownType::TOWER)) | ||||
| 		if(t->hasBuilt(BuildingID::GRAIL, ETownType::TOWER)) | ||||
| 		{ | ||||
| 			// Skyship, probably easier to handle same as Veil of darkness | ||||
| 			//do it every new day after veils apply | ||||
| @@ -1628,9 +1628,9 @@ void CGameHandler::giveSpells( const CGTownInstance *t, const CGHeroInstance *h | ||||
| 	cs.learn = true; | ||||
| 	for(int i=0; i<std::min(t->mageGuildLevel(),h->getSecSkillLevel(SecondarySkill::WISDOM)+2);i++) | ||||
| 	{ | ||||
| 		if (t->hasBuilt(EBuilding::GRAIL, ETownType::CONFLUX)) //Aurora Borealis | ||||
| 		if (t->hasBuilt(BuildingID::GRAIL, ETownType::CONFLUX)) //Aurora Borealis | ||||
| 		{ | ||||
| 			std::vector<ui16> spells; | ||||
| 			std::vector<SpellID> spells; | ||||
| 			getAllowedSpells(spells, i); | ||||
| 			for (int j = 0; j < spells.size(); ++j) | ||||
| 				cs.spells.insert(spells[j]); | ||||
| @@ -1846,9 +1846,9 @@ bool CGameHandler::teleportHero(si32 hid, si32 dstid, ui8 source, TPlayerColor a | ||||
| 	const CGTownInstance *from = h->visitedTown; | ||||
| 	if(((h->getOwner() != t->getOwner()) | ||||
| 		&& complain("Cannot teleport hero to another player")) | ||||
| 	|| ((!from || from->hasBuilt(EBuilding::CASTLE_GATE, ETownType::INFERNO)) | ||||
| 	|| ((!from || from->hasBuilt(BuildingID::CASTLE_GATE, ETownType::INFERNO)) | ||||
| 		&& complain("Hero must be in town with Castle gate for teleporting")) | ||||
| 	|| (t->hasBuilt(EBuilding::CASTLE_GATE, ETownType::INFERNO) | ||||
| 	|| (t->hasBuilt(BuildingID::CASTLE_GATE, ETownType::INFERNO) | ||||
| 		&& complain("Cannot teleport hero to town without Castle gate in it"))) | ||||
| 			return false; | ||||
| 	int3 pos = t->visitablePos(); | ||||
| @@ -1867,7 +1867,7 @@ void CGameHandler::setOwner(const CGObjectInstance * obj, TPlayerColor owner) | ||||
| 	if(owner < GameConstants::PLAYER_LIMIT && dynamic_cast<const CGTownInstance *>(obj)) //town captured | ||||
| 	{ | ||||
| 		const CGTownInstance * town = dynamic_cast<const CGTownInstance *>(obj); | ||||
| 		if (town->hasBuilt(EBuilding::PORTAL_OF_SUMMON, ETownType::DUNGEON)) | ||||
| 		if (town->hasBuilt(BuildingID::PORTAL_OF_SUMMON, ETownType::DUNGEON)) | ||||
| 			setPortalDwelling(town, true, false); | ||||
|  | ||||
| 		if (!gs->getPlayer(owner)->towns.size())//player lost last town | ||||
| @@ -1885,7 +1885,7 @@ void CGameHandler::setOwner(const CGObjectInstance * obj, TPlayerColor owner) | ||||
| 	{ | ||||
| 		BOOST_FOREACH(const CGTownInstance *t, gs->getPlayer(owner)->towns) | ||||
| 		{ | ||||
| 			if (t->hasBuilt(EBuilding::PORTAL_OF_SUMMON, ETownType::DUNGEON)) | ||||
| 			if (t->hasBuilt(BuildingID::PORTAL_OF_SUMMON, ETownType::DUNGEON)) | ||||
| 				setPortalDwelling(t);//set initial creatures for all portals of summoning | ||||
| 		} | ||||
| 	} | ||||
| @@ -2052,7 +2052,7 @@ void CGameHandler::startBattleI( const CArmedInstance *army1, const CArmedInstan | ||||
| 	startBattleI(army1, army2, army2->visitablePos(), cb, creatureBank); | ||||
| } | ||||
|  | ||||
| void CGameHandler::changeSpells( const CGHeroInstance * hero, bool give, const std::set<ui32> &spells ) | ||||
| void CGameHandler::changeSpells( const CGHeroInstance * hero, bool give, const std::set<SpellID> &spells ) | ||||
| { | ||||
| 	ChangeSpells cs; | ||||
| 	cs.hid = hero->id; | ||||
| @@ -2125,17 +2125,17 @@ void CGameHandler::useScholarSkill(si32 fromHero, si32 toHero) | ||||
| 	ChangeSpells cs1; | ||||
| 	cs1.learn = true; | ||||
| 	cs1.hid = toHero;//giving spells to first hero | ||||
| 		for(std::set<ui32>::const_iterator it=h1->spells.begin(); it!=h1->spells.end();it++) | ||||
| 			if ( h2Lvl >= VLC->spellh->spells[*it]->level && !vstd::contains(h2->spells, *it))//hero can learn it and don't have it yet | ||||
| 				cs1.spells.insert(*it);//spell to learn | ||||
| 	BOOST_FOREACH(auto it, h1->spells) | ||||
| 		if ( h2Lvl >= it.toSpell()->level && !vstd::contains(h2->spells, it))//hero can learn it and don't have it yet | ||||
| 			cs1.spells.insert(it);//spell to learn | ||||
|  | ||||
| 	ChangeSpells cs2; | ||||
| 	cs2.learn = true; | ||||
| 	cs2.hid = fromHero; | ||||
|  | ||||
| 	for(std::set<ui32>::const_iterator it=h2->spells.begin(); it!=h2->spells.end();it++) | ||||
| 		if ( h1Lvl >= VLC->spellh->spells[*it]->level && !vstd::contains(h1->spells, *it)) | ||||
| 			cs2.spells.insert(*it); | ||||
| 	BOOST_FOREACH(auto it, h2->spells) | ||||
| 		if ( h1Lvl >= it.toSpell()->level && !vstd::contains(h1->spells, it)) | ||||
| 			cs2.spells.insert(it); | ||||
|  | ||||
| 	if (cs1.spells.size() || cs2.spells.size())//create a message | ||||
| 	{ | ||||
| @@ -2150,10 +2150,10 @@ void CGameHandler::useScholarSkill(si32 fromHero, si32 toHero) | ||||
| 		{ | ||||
| 			iw.text.addTxt(MetaString::GENERAL_TXT, 140);//learns | ||||
| 			int size = cs2.spells.size(); | ||||
| 			for(std::set<ui32>::const_iterator it=cs2.spells.begin(); it!=cs2.spells.end();it++) | ||||
| 			BOOST_FOREACH(auto it, cs2.spells) | ||||
| 			{ | ||||
| 				iw.components.push_back(Component(Component::SPELL, (*it), 1, 0)); | ||||
| 				iw.text.addTxt(MetaString::SPELL_NAME, (*it)); | ||||
| 				iw.components.push_back(Component(Component::SPELL, it, 1, 0)); | ||||
| 				iw.text.addTxt(MetaString::SPELL_NAME, it.toEnum()); | ||||
| 				switch (size--) | ||||
| 				{ | ||||
| 					case 2:	iw.text.addTxt(MetaString::GENERAL_TXT, 141); | ||||
| @@ -2175,10 +2175,10 @@ void CGameHandler::useScholarSkill(si32 fromHero, si32 toHero) | ||||
| 		{ | ||||
| 			iw.text.addTxt(MetaString::GENERAL_TXT, 147);//teaches | ||||
| 			int size = cs1.spells.size(); | ||||
| 			for(std::set<ui32>::const_iterator it=cs1.spells.begin(); it!=cs1.spells.end();it++) | ||||
| 			BOOST_FOREACH(auto it, cs1.spells) | ||||
| 			{ | ||||
| 				iw.components.push_back(Component(Component::SPELL, (*it), 1, 0)); | ||||
| 				iw.text.addTxt(MetaString::SPELL_NAME, (*it)); | ||||
| 				iw.components.push_back(Component(Component::SPELL, it, 1, 0)); | ||||
| 				iw.text.addTxt(MetaString::SPELL_NAME, it.toEnum()); | ||||
| 				switch (size--) | ||||
| 				{ | ||||
| 					case 2:	iw.text.addTxt(MetaString::GENERAL_TXT, 141); | ||||
| @@ -2496,10 +2496,10 @@ bool CGameHandler::buildStructure( si32 tid, si32 bid, bool force /*=false*/ ) | ||||
| 	NewStructures ns; | ||||
| 	ns.tid = tid; | ||||
|  | ||||
| 	if(bid >= EBuilding::DWELL_FIRST) //dwelling | ||||
| 	if(bid >= BuildingID::DWELL_FIRST) //dwelling | ||||
| 	{ | ||||
| 		int level = (bid - EBuilding::DWELL_FIRST) % GameConstants::CREATURES_PER_TOWN; | ||||
| 		int upgradeNumber = (bid - EBuilding::DWELL_FIRST) / GameConstants::CREATURES_PER_TOWN; | ||||
| 		int level = (bid - BuildingID::DWELL_FIRST) % GameConstants::CREATURES_PER_TOWN; | ||||
| 		int upgradeNumber = (bid - BuildingID::DWELL_FIRST) / GameConstants::CREATURES_PER_TOWN; | ||||
|  | ||||
| 		if (upgradeNumber >= t->town->creatures[level].size()) | ||||
| 			COMPLAIN_RET("Cannot build dwelling: no creature found!"); | ||||
| @@ -2509,12 +2509,12 @@ bool CGameHandler::buildStructure( si32 tid, si32 bid, bool force /*=false*/ ) | ||||
| 		SetAvailableCreatures ssi; | ||||
| 		ssi.tid = tid; | ||||
| 		ssi.creatures = t->creatures; | ||||
| 		if (bid <= EBuilding::DWELL_LAST) | ||||
| 		if (bid <= BuildingID::DWELL_LAST) | ||||
| 			ssi.creatures[level].first = crea->growth; | ||||
| 		ssi.creatures[level].second.push_back(crea->idNumber); | ||||
| 		sendAndApply(&ssi); | ||||
| 	} | ||||
| 	else if ( t->subID == ETownType::DUNGEON && bid == EBuilding::PORTAL_OF_SUMMON ) | ||||
| 	else if ( t->subID == ETownType::DUNGEON && bid == BuildingID::PORTAL_OF_SUMMON ) | ||||
| 	{ | ||||
| 		setPortalDwelling(t); | ||||
| 	} | ||||
| @@ -2604,7 +2604,7 @@ void CGameHandler::sendMessageToAll( const std::string &message ) | ||||
| 	sendToAllClients(&sm); | ||||
| } | ||||
|  | ||||
| bool CGameHandler::recruitCreatures( si32 objid, CreatureID::CreatureID crid, ui32 cram, si32 fromLvl ) | ||||
| bool CGameHandler::recruitCreatures( si32 objid, CreatureID crid, ui32 cram, si32 fromLvl ) | ||||
| { | ||||
| 	const CGDwelling *dw = static_cast<CGDwelling*>(gs->map->objects[objid].get()); | ||||
| 	const CArmedInstance *dst = NULL; | ||||
| @@ -2923,13 +2923,13 @@ bool CGameHandler::assembleArtifacts (si32 heroID, ArtifactPosition::ArtifactPos | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| bool CGameHandler::buyArtifact( ui32 hid, ArtifactID::ArtifactID aid ) | ||||
| bool CGameHandler::buyArtifact( ui32 hid, ArtifactID aid ) | ||||
| { | ||||
| 	CGHeroInstance *hero = gs->getHero(hid); | ||||
| 	CGTownInstance *town = hero->visitedTown; | ||||
| 	if(aid==ArtifactID::SPELLBOOK) | ||||
| 	{ | ||||
| 		if((!town->hasBuilt(EBuilding::MAGES_GUILD_1) && complain("Cannot buy a spellbook, no mage guild in the town!")) | ||||
| 		if((!town->hasBuilt(BuildingID::MAGES_GUILD_1) && complain("Cannot buy a spellbook, no mage guild in the town!")) | ||||
| 		    || (getResource(hero->getOwner(), Res::GOLD) < GameConstants::SPELLBOOK_GOLD_COST && complain("Cannot buy a spellbook, not enough gold!") ) | ||||
| 		    || (hero->getArt(ArtifactPosition::SPELLBOOK) && complain("Cannot buy a spellbook, hero already has a one!")) | ||||
| 		    ) | ||||
| @@ -2950,8 +2950,8 @@ bool CGameHandler::buyArtifact( ui32 hid, ArtifactID::ArtifactID aid ) | ||||
| 		{ | ||||
| 			return false; | ||||
| 		} | ||||
| 		if  ((town->hasBuilt(EBuilding::BLACKSMITH) && town->town->warMachine == aid ) | ||||
| 		 || ((town->hasBuilt(EBuilding::BALLISTA_YARD, ETownType::STRONGHOLD)) && aid == ArtifactID::BALLISTA)) | ||||
| 		if  ((town->hasBuilt(BuildingID::BLACKSMITH) && town->town->warMachine == aid ) | ||||
| 		 || ((town->hasBuilt(BuildingID::BALLISTA_YARD, ETownType::STRONGHOLD)) && aid == ArtifactID::BALLISTA)) | ||||
| 		{ | ||||
| 			giveResource(hero->getOwner(),Res::GOLD,-price); | ||||
| 			giveHeroNewArtifact(hero, VLC->arth->artifacts[aid], static_cast<ArtifactPosition::ArtifactPosition>(9+aid)); | ||||
| @@ -2963,7 +2963,7 @@ bool CGameHandler::buyArtifact( ui32 hid, ArtifactID::ArtifactID aid ) | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| bool CGameHandler::buyArtifact(const IMarket *m, const CGHeroInstance *h, Res::ERes rid, ArtifactID::ArtifactID aid) | ||||
| bool CGameHandler::buyArtifact(const IMarket *m, const CGHeroInstance *h, Res::ERes rid, ArtifactID aid) | ||||
| { | ||||
| 	if(!vstd::contains(m->availableItemsIds(EMarketMode::RESOURCE_ARTIFACT), aid)) | ||||
| 		COMPLAIN_RET("That artifact is unavailable!"); | ||||
| @@ -3202,7 +3202,7 @@ bool CGameHandler::hireHero(const CGObjectInstance *obj, ui8 hid, TPlayerColor p | ||||
|  | ||||
| 	if(t) //tavern in town | ||||
| 	{ | ||||
| 		if(    (!t->hasBuilt(EBuilding::TAVERN)  && complain("No tavern!")) | ||||
| 		if(    (!t->hasBuilt(BuildingID::TAVERN)  && complain("No tavern!")) | ||||
| 			|| (t->visitingHero  && complain("There is visiting hero - no place!"))) | ||||
| 			return false; | ||||
| 	} | ||||
| @@ -3698,8 +3698,8 @@ bool CGameHandler::makeBattleAction( BattleAction &ba ) | ||||
| 			BattleStackAdded bsa; | ||||
| 			bsa.attacker = summoner->attackerOwned; | ||||
|  | ||||
| 			bsa.creID = static_cast<CreatureID::CreatureID>(summoner->getBonusLocalFirst(Selector::type(Bonus::DAEMON_SUMMONING))->subtype); //in case summoner can summon more than one type of monsters... scream! | ||||
| 			ui64 risedHp = summoner->count * summoner->valOfBonuses(Bonus::DAEMON_SUMMONING, bsa.creID); | ||||
| 			bsa.creID = CreatureID(summoner->getBonusLocalFirst(Selector::type(Bonus::DAEMON_SUMMONING))->subtype); //in case summoner can summon more than one type of monsters... scream! | ||||
| 			ui64 risedHp = summoner->count * summoner->valOfBonuses(Bonus::DAEMON_SUMMONING, bsa.creID.toEnum()); | ||||
| 			bsa.amount = std::min ((ui32)(risedHp / VLC->creh->creatures[bsa.creID]->MaxHealth()), destStack->baseAmount); | ||||
|  | ||||
| 			bsa.pos = gs->curB->getAvaliableHex(bsa.creID, bsa.attacker, destStack->position); | ||||
| @@ -3783,10 +3783,10 @@ void CGameHandler::playerMessage( TPlayerColor player, const std::string &messag | ||||
|  | ||||
| 		//give all spells | ||||
| 		cs.learn = 1; | ||||
| 		for(int i=0;i<VLC->spellh->spells.size();i++) | ||||
| 		BOOST_FOREACH(auto spell, VLC->spellh->spells) | ||||
| 		{ | ||||
| 			if(!VLC->spellh->spells[i]->creatureAbility) | ||||
| 				cs.spells.insert(i); | ||||
| 			if(!spell->creatureAbility) | ||||
| 				cs.spells.insert(spell->id); | ||||
| 		} | ||||
|  | ||||
| 		//give mana | ||||
| @@ -3926,22 +3926,22 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 		auto obstacle = make_shared<SpellCreatedObstacle>(); | ||||
| 		switch(spellID) // :/ | ||||
| 		{ | ||||
| 		case Spells::QUICKSAND: | ||||
| 		case SpellID::QUICKSAND: | ||||
| 			obstacle->obstacleType = CObstacleInstance::QUICKSAND; | ||||
| 			obstacle->turnsRemaining = -1; | ||||
| 			obstacle->visibleForAnotherSide = false; | ||||
| 			break; | ||||
| 		case Spells::LAND_MINE: | ||||
| 		case SpellID::LAND_MINE: | ||||
| 			obstacle->obstacleType = CObstacleInstance::LAND_MINE; | ||||
| 			obstacle->turnsRemaining = -1; | ||||
| 			obstacle->visibleForAnotherSide = false; | ||||
| 			break; | ||||
| 		case Spells::FIRE_WALL: | ||||
| 		case SpellID::FIRE_WALL: | ||||
| 			obstacle->obstacleType = CObstacleInstance::FIRE_WALL; | ||||
| 			obstacle->turnsRemaining = 2; | ||||
| 			obstacle->visibleForAnotherSide = true; | ||||
| 			break; | ||||
| 		case Spells::FORCE_FIELD: | ||||
| 		case SpellID::FORCE_FIELD: | ||||
| 			obstacle->obstacleType = CObstacleInstance::FORCE_FIELD; | ||||
| 			obstacle->turnsRemaining = 2; | ||||
| 			obstacle->visibleForAnotherSide = true; | ||||
| @@ -4028,10 +4028,10 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			continue; | ||||
| 		sc.dmgToDisplay += gs->curB->calculateSpellDmg(spell, caster, *it, spellLvl, usedSpellPower); | ||||
| 	} | ||||
| 	if (spellID == Spells::DEATH_STARE || spellID == Spells::ACID_BREATH_DAMAGE) | ||||
| 	if (spellID == SpellID::DEATH_STARE || spellID == SpellID::ACID_BREATH_DAMAGE) | ||||
| 	{ | ||||
| 		sc.dmgToDisplay = usedSpellPower; | ||||
| 		if (spellID == Spells::DEATH_STARE) | ||||
| 		if (spellID == SpellID::DEATH_STARE) | ||||
| 			vstd::amin(sc.dmgToDisplay, (*attackedCres.begin())->count); //stack is already reduced after attack | ||||
| 	} | ||||
| 	StacksInjured si; | ||||
| @@ -4080,7 +4080,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 				(*it)->prepareAttacked(bsa); | ||||
| 				si.stacks.push_back(bsa); | ||||
|  | ||||
| 				if (spellID == Spells::CHAIN_LIGHTNING) | ||||
| 				if (spellID == SpellID::CHAIN_LIGHTNING) | ||||
| 					++chainLightningModifier; | ||||
| 			}		 | ||||
| 	} | ||||
| @@ -4097,11 +4097,11 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			pseudoBonus.val = spellLvl; | ||||
| 			pseudoBonus.turnsRemain = gs->curB->calculateSpellDuration(spell, caster, stackSpellPower ? stackSpellPower : usedSpellPower); | ||||
| 			CStack::stackEffectToFeature(sse.effect, pseudoBonus); | ||||
| 			if (spellID == Spells::SHIELD || spellID == Spells::AIR_SHIELD) | ||||
| 			if (spellID == SpellID::SHIELD || spellID == SpellID::AIR_SHIELD) | ||||
| 			{ | ||||
| 				sse.effect.back().val = (100 - sse.effect.back().val); //fix to original config: shiled should display damage reduction | ||||
| 			} | ||||
| 			if (spellID == Spells::BIND && stack)//bind | ||||
| 			if (spellID == SpellID::BIND && stack)//bind | ||||
| 			{ | ||||
| 				sse.effect.back().additionalInfo = stack->ID; //we need to know who casted Bind | ||||
| 			} | ||||
| @@ -4166,7 +4166,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 				sendAndApply(&sse); | ||||
| 					 | ||||
| 	} | ||||
| 	else if (spell->isRisingSpell() || spell->id == Spells::CURE) | ||||
| 	else if (spell->isRisingSpell() || spell->id == SpellID::CURE) | ||||
| 	{ | ||||
| 			int hpGained = 0; | ||||
| 			if (stack) | ||||
| @@ -4183,7 +4183,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			for(auto it = attackedCres.begin(); it != attackedCres.end(); ++it) | ||||
| 			{ | ||||
| 				if(vstd::contains(sc.resisted, (*it)->ID) //this creature resisted the spell | ||||
| 					|| (spellID == Spells::ANIMATE_DEAD && !(*it)->hasBonusOfType(Bonus::UNDEAD)) //we try to cast animate dead on living stack, TODO: showuld be not affected earlier | ||||
| 					|| (spellID == SpellID::ANIMATE_DEAD && !(*it)->hasBonusOfType(Bonus::UNDEAD)) //we try to cast animate dead on living stack, TODO: showuld be not affected earlier | ||||
| 					) | ||||
| 					continue; | ||||
| 				StacksHealedOrResurrected::HealInfo hi; | ||||
| @@ -4204,7 +4204,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			} | ||||
| 			if(!shr.healedStacks.empty()) | ||||
| 				sendAndApply(&shr); | ||||
| 			if (spellID == Spells::SACRIFICE) //remove victim | ||||
| 			if (spellID == SpellID::SACRIFICE) //remove victim | ||||
| 			{ | ||||
| 				BattleStacksRemoved bsr; | ||||
| 				bsr.stackIDs.insert (selectedStack); //somehow it works for teleport? | ||||
| @@ -4214,8 +4214,8 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 	else | ||||
| 	switch (spellID) | ||||
| 	{ | ||||
| 	case Spells::QUICKSAND: | ||||
| 	case Spells::LAND_MINE: | ||||
| 	case SpellID::QUICKSAND: | ||||
| 	case SpellID::LAND_MINE: | ||||
| 		{ | ||||
| 			std::vector<BattleHex> availableTiles; | ||||
| 			for(int i = 0; i < GameConstants::BFIELD_SIZE; i += 1) | ||||
| @@ -4235,10 +4235,10 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 		} | ||||
|  | ||||
| 		break; | ||||
| 	case Spells::FORCE_FIELD: | ||||
| 	case SpellID::FORCE_FIELD: | ||||
| 		placeObstacle(destination); | ||||
| 		break; | ||||
| 	case Spells::FIRE_WALL: | ||||
| 	case SpellID::FIRE_WALL: | ||||
| 		{ | ||||
| 			//fire wall is build from multiple obstacles - one fire piece for each affected hex | ||||
| 			auto affectedHexes = spell->rangeInHexes(destination, spellLvl, casterSide); | ||||
| @@ -4246,7 +4246,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 				placeObstacle(hex); | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::TELEPORT: | ||||
| 	case SpellID::TELEPORT: | ||||
| 		{ | ||||
| 			BattleStackMoved bsm; | ||||
| 			bsm.distance = -1; | ||||
| @@ -4258,24 +4258,24 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			sendAndApply(&bsm); | ||||
| 			break; | ||||
| 		} | ||||
| 	case Spells::SUMMON_FIRE_ELEMENTAL: | ||||
| 	case Spells::SUMMON_EARTH_ELEMENTAL: | ||||
| 	case Spells::SUMMON_WATER_ELEMENTAL: | ||||
| 	case Spells::SUMMON_AIR_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_FIRE_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_EARTH_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_WATER_ELEMENTAL: | ||||
| 	case SpellID::SUMMON_AIR_ELEMENTAL: | ||||
| 		{ //elemental summoning | ||||
| 			CreatureID::CreatureID creID; | ||||
| 			CreatureID creID; | ||||
| 			switch(spellID) | ||||
| 			{ | ||||
| 				case Spells::SUMMON_FIRE_ELEMENTAL: | ||||
| 				case SpellID::SUMMON_FIRE_ELEMENTAL: | ||||
| 					creID = CreatureID::FIRE_ELEMENTAL; | ||||
| 					break; | ||||
| 				case Spells::SUMMON_EARTH_ELEMENTAL: | ||||
| 				case SpellID::SUMMON_EARTH_ELEMENTAL: | ||||
| 					creID = CreatureID::EARTH_ELEMENTAL; | ||||
| 					break; | ||||
| 				case Spells::SUMMON_WATER_ELEMENTAL: | ||||
| 				case SpellID::SUMMON_WATER_ELEMENTAL: | ||||
| 					creID = CreatureID::WATER_ELEMENTAL; | ||||
| 					break; | ||||
| 				case Spells::SUMMON_AIR_ELEMENTAL: | ||||
| 				case SpellID::SUMMON_AIR_ELEMENTAL: | ||||
| 					creID = CreatureID::AIR_ELEMENTAL; | ||||
| 					break; | ||||
| 			} | ||||
| @@ -4297,7 +4297,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 				complain("Summoning elementals didn't summon any!"); | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::CLONE: | ||||
| 	case SpellID::CLONE: | ||||
| 		{ | ||||
| 			const CStack * clonedStack = NULL; | ||||
| 			if (attackedCres.size()) | ||||
| @@ -4324,7 +4324,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			sendAndApply(&ssp); | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::REMOVE_OBSTACLE: | ||||
| 	case SpellID::REMOVE_OBSTACLE: | ||||
| 		{ | ||||
| 			ObstaclesRemoved obr; | ||||
| 			BOOST_FOREACH(auto &obstacle, battleGetAllObstacles()) | ||||
| @@ -4340,7 +4340,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			break; | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::DEATH_STARE: //handled in a bit different way | ||||
| 	case SpellID::DEATH_STARE: //handled in a bit different way | ||||
| 		{ | ||||
| 			for(auto it = attackedCres.begin(); it != attackedCres.end(); ++it) | ||||
| 			{ | ||||
| @@ -4361,7 +4361,7 @@ void CGameHandler::handleSpellCasting( int spellID, int spellLvl, BattleHex dest | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	case Spells::ACID_BREATH_DAMAGE: //new effect, separate from acid breath defense reduction | ||||
| 	case SpellID::ACID_BREATH_DAMAGE: //new effect, separate from acid breath defense reduction | ||||
| 		{ | ||||
| 			for(auto it = attackedCres.begin(); it != attackedCres.end(); ++it) //no immunities | ||||
| 			{ | ||||
| @@ -4440,7 +4440,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba ) | ||||
| 			} | ||||
|  | ||||
| 			const CSpell *s = VLC->spellh->spells[ba.additionalInfo]; | ||||
| 			if (s->mainEffectAnim > -1 || (s->id >= 66 || s->id <= 69) || s->id == Spells::CLONE) //allow summon elementals | ||||
| 			if (s->mainEffectAnim > -1 || (s->id >= 66 || s->id <= 69) || s->id == SpellID::CLONE) //allow summon elementals | ||||
| 				//TODO: special effects, like Clone | ||||
| 			{ | ||||
| 				ui8 skill = h->getSpellSchoolLevel(s); //skill level | ||||
| @@ -4536,7 +4536,7 @@ void CGameHandler::stackTurnTrigger(const CStack * st) | ||||
|  | ||||
| 		if(st->hasBonusOfType(Bonus::POISON)) | ||||
| 		{ | ||||
| 			const Bonus * b = st->getBonusLocalFirst(Selector::source(Bonus::SPELL_EFFECT, Spells::POISON) && Selector::type(Bonus::STACK_HEALTH)); | ||||
| 			const Bonus * b = st->getBonusLocalFirst(Selector::source(Bonus::SPELL_EFFECT, SpellID::POISON) && Selector::type(Bonus::STACK_HEALTH)); | ||||
| 			if (b) //TODO: what if not?... | ||||
| 			{ | ||||
| 				bte.val = std::max (b->val - 10, -(st->valOfBonuses(Bonus::POISON))); | ||||
| @@ -4653,14 +4653,14 @@ void CGameHandler::handleDamageFromObstacle(const CObstacleInstance &obstacle, c | ||||
|  | ||||
| 		oneTimeObstacle = true; | ||||
| 		effect = 82; //makes | ||||
| 		damage = gs->curB->calculateSpellDmg(VLC->spellh->spells[Spells::LAND_MINE], hero, curStack, | ||||
| 		damage = gs->curB->calculateSpellDmg(VLC->spellh->spells[SpellID::LAND_MINE], hero, curStack, | ||||
| 											 spellObstacle->spellLevel, spellObstacle->casterSpellPower); | ||||
| 		//TODO even if obstacle wasn't created by hero (Tower "moat") it should deal dmg as if casted by hero, | ||||
| 		//if it is bigger than default dmg. Or is it just irrelevant H3 implementation quirk | ||||
| 	} | ||||
| 	else if(obstacle.obstacleType == CObstacleInstance::FIRE_WALL) | ||||
| 	{ | ||||
| 		damage = gs->curB->calculateSpellDmg(VLC->spellh->spells[Spells::FIRE_WALL], hero, curStack, | ||||
| 		damage = gs->curB->calculateSpellDmg(VLC->spellh->spells[SpellID::FIRE_WALL], hero, curStack, | ||||
| 											 spellObstacle->spellLevel, spellObstacle->casterSpellPower); | ||||
| 	} | ||||
| 	else | ||||
| @@ -4947,7 +4947,7 @@ bool CGameHandler::buildBoat( ui32 objid ) | ||||
| 		return false; | ||||
| 	} | ||||
| 	else if(obj->o->ID == Obj::TOWN | ||||
| 	        && !static_cast<const CGTownInstance*>(obj)->hasBuilt(EBuilding::SHIPYARD)) | ||||
| 	        && !static_cast<const CGTownInstance*>(obj)->hasBuilt(BuildingID::SHIPYARD)) | ||||
| 	{ | ||||
| 		complain("Cannot build boat in the town - no shipyard!"); | ||||
| 		return false; | ||||
| @@ -5354,7 +5354,7 @@ void CGameHandler::handleAfterAttackCasting( const BattleAttack & bat ) | ||||
| 		if (staredCreatures) | ||||
| 		{ | ||||
| 			if (bat.bsa.size() && bat.bsa[0].newAmount > 0) //TODO: death stare was not originally available for multiple-hex attacks, but... | ||||
| 			handleSpellCasting(Spells::DEATH_STARE, 0, gs->curB->battleGetStackByID(bat.bsa[0].stackAttacked)->position, | ||||
| 			handleSpellCasting(SpellID::DEATH_STARE, 0, gs->curB->battleGetStackByID(bat.bsa[0].stackAttacked)->position, | ||||
| 				!attacker->attackerOwned, attacker->owner, NULL, NULL, staredCreatures, ECastingMode::AFTER_ATTACK_CASTING, attacker); | ||||
| 		} | ||||
| 	} | ||||
| @@ -5368,15 +5368,15 @@ void CGameHandler::handleAfterAttackCasting( const BattleAttack & bat ) | ||||
| 	} | ||||
| 	if (acidDamage) | ||||
| 	{ | ||||
| 		handleSpellCasting(Spells::ACID_BREATH_DAMAGE, 0, gs->curB->battleGetStackByID(bat.bsa[0].stackAttacked)->position, | ||||
| 		handleSpellCasting(SpellID::ACID_BREATH_DAMAGE, 0, gs->curB->battleGetStackByID(bat.bsa[0].stackAttacked)->position, | ||||
| 				!attacker->attackerOwned, attacker->owner, NULL, NULL, | ||||
| 				acidDamage * attacker->count, ECastingMode::AFTER_ATTACK_CASTING, attacker); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &pos) | ||||
| bool CGameHandler::castSpell(const CGHeroInstance *h, SpellID spellID, const int3 &pos) | ||||
| { | ||||
| 	const CSpell *s = VLC->spellh->spells[spellID]; | ||||
| 	const CSpell *s = spellID.toSpell(); | ||||
| 	int cost = h->getSpellCost(s); | ||||
| 	int schoolLevel = h->getSpellSchoolLevel(s); | ||||
|  | ||||
| @@ -5392,10 +5392,9 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
| 	asc.spellID = spellID; | ||||
| 	sendAndApply(&asc); | ||||
|  | ||||
| 	using namespace Spells; | ||||
| 	switch(spellID) | ||||
| 	{ | ||||
| 	case SUMMON_BOAT: //Summon Boat | ||||
| 	case SpellID::SUMMON_BOAT: | ||||
| 		{ | ||||
| 			//check if spell works at all | ||||
| 			if(rand() % 100 >= s->powers[schoolLevel]) //power is % chance of success | ||||
| @@ -5457,7 +5456,7 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 	case SCUTTLE_BOAT: //Scuttle Boat | ||||
| 	case SpellID::SCUTTLE_BOAT: | ||||
| 		{ | ||||
| 			//check if spell works at all | ||||
| 			if(rand() % 100 >= s->powers[schoolLevel]) //power is % chance of success | ||||
| @@ -5482,7 +5481,7 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
| 			sendAndApply(&ro); | ||||
| 			break; | ||||
| 		} | ||||
| 	case DIMENSION_DOOR: //Dimension Door | ||||
| 	case SpellID::DIMENSION_DOOR: | ||||
| 		{ | ||||
| 			const TerrainTile *dest = getTile(pos); | ||||
| 			const TerrainTile *curr = getTile(h->getSightCenter()); | ||||
| @@ -5491,7 +5490,7 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
| 				COMPLAIN_RET("Destination tile doesn't exist!"); | ||||
| 			if(!h->movement) | ||||
| 				COMPLAIN_RET("Hero needs movement points to cast Dimension Door!"); | ||||
| 			if(h->getBonusesCount(Bonus::SPELL_EFFECT, DIMENSION_DOOR) >= s->powers[schoolLevel]) //limit casts per turn | ||||
| 			if(h->getBonusesCount(Bonus::SPELL_EFFECT, SpellID::DIMENSION_DOOR) >= s->powers[schoolLevel]) //limit casts per turn | ||||
| 			{ | ||||
| 				InfoWindow iw; | ||||
| 				iw.player = h->tempOwner; | ||||
| @@ -5503,7 +5502,7 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
|  | ||||
| 			GiveBonus gb; | ||||
| 			gb.id = h->id; | ||||
| 			gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::NONE, Bonus::SPELL_EFFECT, 0, DIMENSION_DOOR); | ||||
| 			gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::NONE, Bonus::SPELL_EFFECT, 0, SpellID::DIMENSION_DOOR); | ||||
| 			sendAndApply(&gb); | ||||
|  | ||||
| 			if(!dest->isClear(curr)) //wrong dest tile | ||||
| @@ -5524,28 +5523,28 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	case FLY: //Fly | ||||
| 	case SpellID::FLY: | ||||
| 		{ | ||||
| 			int subtype = schoolLevel >= 2 ? 1 : 2; //adv or expert | ||||
|  | ||||
| 			GiveBonus gb; | ||||
| 			gb.id = h->id; | ||||
| 			gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::FLYING_MOVEMENT, Bonus::SPELL_EFFECT, 0, FLY, subtype); | ||||
| 			gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::FLYING_MOVEMENT, Bonus::SPELL_EFFECT, 0, SpellID::FLY, subtype); | ||||
| 			sendAndApply(&gb); | ||||
| 		} | ||||
| 		break; | ||||
| 	case WATER_WALK: //Water Walk | ||||
| 	case SpellID::WATER_WALK: | ||||
| 		{ | ||||
| 			int subtype = schoolLevel >= 2 ? 1 : 2; //adv or expert | ||||
|  | ||||
| 			GiveBonus gb; | ||||
| 			gb.id = h->id; | ||||
| 			gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::WATER_WALKING, Bonus::SPELL_EFFECT, 0, WATER_WALK, subtype); | ||||
| 			gb.bonus = Bonus(Bonus::ONE_DAY, Bonus::WATER_WALKING, Bonus::SPELL_EFFECT, 0, SpellID::WATER_WALK, subtype); | ||||
| 			sendAndApply(&gb); | ||||
| 		} | ||||
| 		break; | ||||
|  | ||||
| 	case TOWN_PORTAL: //Town Portal | ||||
| 	case SpellID::TOWN_PORTAL: | ||||
| 		{ | ||||
| 			if (!gs->map->isInTheMap(pos)) | ||||
| 				COMPLAIN_RET("Destination tile not present!") | ||||
| @@ -5579,10 +5578,10 @@ bool CGameHandler::castSpell(const CGHeroInstance *h, int spellID, const int3 &p | ||||
| 		} | ||||
| 		break; | ||||
|  | ||||
| 	case VISIONS: //Visions | ||||
| 	case VIEW_EARTH: //View Earth | ||||
| 	case DISGUISE: //Disguise | ||||
| 	case VIEW_AIR: //View Air | ||||
| 	case SpellID::VISIONS: | ||||
| 	case SpellID::VIEW_EARTH: | ||||
| 	case SpellID::DISGUISE: | ||||
| 	case SpellID::VIEW_AIR: | ||||
| 	default: | ||||
| 		COMPLAIN_RET("This spell is not implemented yet!"); | ||||
| 		break; | ||||
| @@ -6143,7 +6142,7 @@ void CGameHandler::commitPackage( CPackForClient *pack ) | ||||
| 	sendAndApply(pack); | ||||
| } | ||||
|  | ||||
| void CGameHandler::spawnWanderingMonsters(CreatureID::CreatureID creatureID) | ||||
| void CGameHandler::spawnWanderingMonsters(CreatureID creatureID) | ||||
| { | ||||
| 	std::vector<int3>::iterator tile; | ||||
| 	std::vector<int3> tiles; | ||||
|   | ||||
| @@ -129,7 +129,7 @@ public: | ||||
| 	////////////////////////////////////////////////////////////////////////// | ||||
| 	//from IGameCallback | ||||
| 	//do sth | ||||
| 	void changeSpells(const CGHeroInstance * hero, bool give, const std::set<ui32> &spells) OVERRIDE; | ||||
| 	void changeSpells(const CGHeroInstance * hero, bool give, const std::set<SpellID> &spells) OVERRIDE; | ||||
| 	bool removeObject(const CGObjectInstance * obj) OVERRIDE; | ||||
| 	void setBlockVis(int objid, bool bv) OVERRIDE; | ||||
| 	void setOwner(const CGObjectInstance * obj, TPlayerColor owner) OVERRIDE; | ||||
| @@ -214,14 +214,14 @@ public: | ||||
| 	bool sellCreatures(ui32 count, const IMarket *market, const CGHeroInstance * hero, ui32 slot, Res::ERes resourceID); | ||||
| 	bool transformInUndead(const IMarket *market, const CGHeroInstance * hero, ui32 slot); | ||||
| 	bool assembleArtifacts (si32 heroID, ArtifactPosition::ArtifactPosition artifactSlot, bool assemble, ui32 assembleTo); | ||||
| 	bool buyArtifact( ui32 hid, ArtifactID::ArtifactID aid ); //for blacksmith and mage guild only -> buying for gold in common buildings | ||||
| 	bool buyArtifact( const IMarket *m, const CGHeroInstance *h, Res::ERes rid, ArtifactID::ArtifactID aid); //for artifact merchant and black market -> buying for any resource in special building / advobject | ||||
| 	bool buyArtifact( ui32 hid, ArtifactID aid ); //for blacksmith and mage guild only -> buying for gold in common buildings | ||||
| 	bool buyArtifact( const IMarket *m, const CGHeroInstance *h, Res::ERes rid, ArtifactID aid); //for artifact merchant and black market -> buying for any resource in special building / advobject | ||||
| 	bool sellArtifact( const IMarket *m, const CGHeroInstance *h, TArtifactInstanceID aid, Res::ERes rid); //for artifact merchant selling | ||||
| 	//void lootArtifacts (TArtHolder source, TArtHolder dest, std::vector<ui32> &arts); //after battle - move al arts to winer | ||||
| 	bool buySecSkill( const IMarket *m, const CGHeroInstance *h, SecondarySkill::SecondarySkill skill); | ||||
| 	bool garrisonSwap(si32 tid); | ||||
| 	bool upgradeCreature( ui32 objid, ui8 pos, ui32 upgID ); | ||||
| 	bool recruitCreatures(si32 objid, CreatureID::CreatureID crid, ui32 cram, si32 level); | ||||
| 	bool recruitCreatures(si32 objid, CreatureID crid, ui32 cram, si32 level); | ||||
| 	bool buildStructure(si32 tid, si32 bid, bool force=false);//force - for events: no cost, no checkings | ||||
| 	bool razeStructure(si32 tid, si32 bid); | ||||
| 	bool disbandCreature( si32 id, ui8 pos ); | ||||
| @@ -234,7 +234,7 @@ public: | ||||
| 	void objectVisited( const CGObjectInstance * obj, const CGHeroInstance * h ); | ||||
| 	void engageIntoBattle( TPlayerColor player ); | ||||
| 	bool dig(const CGHeroInstance *h); | ||||
| 	bool castSpell(const CGHeroInstance *h, int spellID, const int3 &pos); | ||||
| 	bool castSpell(const CGHeroInstance *h, SpellID spellID, const int3 &pos); | ||||
| 	void moveArmy(const CArmedInstance *src, const CArmedInstance *dst, bool allowMerging); | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| @@ -262,7 +262,7 @@ public: | ||||
| 	void handleAfterAttackCasting (const BattleAttack & bat); | ||||
| 	void attackCasting(const BattleAttack & bat, Bonus::BonusType attackMode, const CStack * attacker); | ||||
| 	bool sacrificeArtifact(const IMarket * m, const CGHeroInstance * hero, ArtifactPosition::ArtifactPosition slot); | ||||
| 	void spawnWanderingMonsters(CreatureID::CreatureID creatureID); | ||||
| 	void spawnWanderingMonsters(CreatureID creatureID); | ||||
| 	friend class CVCMIServer; | ||||
| 	friend class CScriptCallback; | ||||
| }; | ||||
|   | ||||
| @@ -184,7 +184,7 @@ bool TradeOnMarketplace::applyGh( CGameHandler *gh ) | ||||
| 	case EMarketMode::RESOURCE_ARTIFACT: | ||||
| 		if(!hero) | ||||
| 			COMPLAIN_AND_RETURN("Only hero can buy artifacts!"); | ||||
| 		return gh->buyArtifact(m, hero, static_cast<Res::ERes>(r1), static_cast<ArtifactID::ArtifactID>(r2)); | ||||
| 		return gh->buyArtifact(m, hero, static_cast<Res::ERes>(r1), ArtifactID(r2)); | ||||
| 	case EMarketMode::ARTIFACT_RESOURCE: | ||||
| 		if(!hero) | ||||
| 			COMPLAIN_AND_RETURN("Only hero can sell artifacts!"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user