mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Random town names are now guaranteed to be unique on the map
This commit is contained in:
		| @@ -243,11 +243,6 @@ CTown::~CTown() | ||||
| 		str.dellNull(); | ||||
| } | ||||
|  | ||||
| std::string CTown::getRandomNameTranslated(size_t index) const | ||||
| { | ||||
| 	return VLC->generaltexth->translate(getRandomNameTextID(index)); | ||||
| } | ||||
|  | ||||
| std::string CTown::getRandomNameTextID(size_t index) const | ||||
| { | ||||
| 	return TextIdentifier("faction", faction->modScope, faction->identifier, "randomName", index).get(); | ||||
|   | ||||
| @@ -217,7 +217,6 @@ public: | ||||
| 	void setGreeting(BuildingSubID::EBuildingSubID subID, const std::string & message) const; //may affect only mutable field | ||||
| 	BuildingID getBuildingType(BuildingSubID::EBuildingSubID subID) const; | ||||
|  | ||||
| 	std::string getRandomNameTranslated(size_t index) const; | ||||
| 	std::string getRandomNameTextID(size_t index) const; | ||||
| 	size_t getRandomNamesCount() const; | ||||
|  | ||||
|   | ||||
| @@ -458,6 +458,11 @@ std::string FactionID::entityType() | ||||
| 	return "faction"; | ||||
| } | ||||
|  | ||||
| const CFaction * FactionID::toFaction() const | ||||
| { | ||||
| 	return dynamic_cast<const CFaction*>(toEntity(VLC)); | ||||
| } | ||||
|  | ||||
| const Faction * FactionID::toEntity(const Services * service) const | ||||
| { | ||||
| 	return service->factions()->getByIndex(num); | ||||
|   | ||||
| @@ -24,6 +24,7 @@ class CHero; | ||||
| class CHeroClass; | ||||
| class HeroClass; | ||||
| class HeroTypeService; | ||||
| class CFaction; | ||||
| class Faction; | ||||
| class Skill; | ||||
| class RoadType; | ||||
| @@ -261,6 +262,7 @@ public: | ||||
|  | ||||
| 	static si32 decode(const std::string& identifier); | ||||
| 	static std::string encode(const si32 index); | ||||
| 	const CFaction * toFaction() const; | ||||
| 	const Faction * toEntity(const Services * service) const; | ||||
| 	static std::string entityType(); | ||||
|  | ||||
|   | ||||
| @@ -222,6 +222,7 @@ void CGameState::init(const IMapService * mapService, StartInfo * si, Load::Prog | ||||
| 	initHeroes(); | ||||
| 	initStartingBonus(); | ||||
| 	initTowns(); | ||||
| 	initTownNames(); | ||||
| 	placeHeroesInTowns(); | ||||
| 	initMapObjects(); | ||||
| 	buildBonusSystemTree(); | ||||
| @@ -763,6 +764,51 @@ void CGameState::initStartingBonus() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CGameState::initTownNames() | ||||
| { | ||||
| 	std::map<FactionID, std::vector<int>> availableNames; | ||||
| 	for (auto const & faction : VLC->townh->getDefaultAllowed()) | ||||
| 	{ | ||||
| 		std::vector<int> potentialNames; | ||||
| 		if (faction.toFaction()->town->getRandomNamesCount() > 0) | ||||
| 		{ | ||||
| 			for (int i = 0; i < faction.toFaction()->town->getRandomNamesCount(); ++i) | ||||
| 				potentialNames.push_back(i); | ||||
|  | ||||
| 			availableNames[faction] = potentialNames; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for (auto & elem : map->towns) | ||||
| 	{ | ||||
| 		CGTownInstance * vti =(elem); | ||||
| 		assert(vti->town); | ||||
|  | ||||
| 		if(!vti->getNameTextID().empty()) | ||||
| 			continue; | ||||
|  | ||||
| 		FactionID faction = vti->getFaction(); | ||||
|  | ||||
| 		if (availableNames.empty()) | ||||
| 		{ | ||||
| 			logGlobal->warn("Failed to find available name for a random town!"); | ||||
| 			vti->setNameTextId("core.genrltxt.508"); // Unnamed | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		// If town has no available names (for example - all were picked) - pick names from some other faction that still has names available | ||||
| 		if (!availableNames.count(faction)) | ||||
| 			faction = RandomGeneratorUtil::nextItem(availableNames, getRandomGenerator())->first; | ||||
|  | ||||
| 		auto nameIt = RandomGeneratorUtil::nextItem(availableNames[faction], getRandomGenerator()); | ||||
| 		vti->setNameTextId(faction.toFaction()->town->getRandomNameTextID(*nameIt)); | ||||
|  | ||||
| 		availableNames[faction].erase(nameIt); | ||||
| 		if (availableNames[faction].empty()) | ||||
| 			availableNames.erase(faction); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CGameState::initTowns() | ||||
| { | ||||
| 	logGlobal->debug("\tTowns"); | ||||
| @@ -777,15 +823,9 @@ void CGameState::initTowns() | ||||
| 	map->townUniversitySkills.push_back(SecondarySkill(SecondarySkill::EARTH_MAGIC)); | ||||
|  | ||||
| 	for (auto & elem : map->towns) | ||||
| 	{ | ||||
| 		CGTownInstance * vti =(elem); | ||||
| 		assert(vti->town); | ||||
|  | ||||
| 		if(vti->getNameTextID().empty()) | ||||
| 		{ | ||||
| 			size_t nameID = getRandomGenerator().nextInt(vti->getTown()->getRandomNamesCount() - 1); | ||||
| 			vti->setNameTextId(vti->getTown()->getRandomNameTextID(nameID)); | ||||
| 		} | ||||
| 			CGTownInstance * vti =(elem); | ||||
| 			assert(vti->town); | ||||
|  | ||||
| 		static const BuildingID basicDwellings[] = { BuildingID::DWELL_FIRST, BuildingID::DWELL_LVL_2, BuildingID::DWELL_LVL_3, BuildingID::DWELL_LVL_4, BuildingID::DWELL_LVL_5, BuildingID::DWELL_LVL_6, BuildingID::DWELL_LVL_7 }; | ||||
| 		static const BuildingID upgradedDwellings[] = { BuildingID::DWELL_UP_FIRST, BuildingID::DWELL_LVL_2_UP, BuildingID::DWELL_LVL_3_UP, BuildingID::DWELL_LVL_4_UP, BuildingID::DWELL_LVL_5_UP, BuildingID::DWELL_LVL_6_UP, BuildingID::DWELL_LVL_7_UP }; | ||||
|   | ||||
| @@ -212,6 +212,7 @@ private: | ||||
| 	void initFogOfWar(); | ||||
| 	void initStartingBonus(); | ||||
| 	void initTowns(); | ||||
| 	void initTownNames(); | ||||
| 	void initMapObjects(); | ||||
| 	void initVisitingAndGarrisonedHeroes(); | ||||
| 	void initCampaign(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user