Sfoglia il codice sorgente

Random town names are now guaranteed to be unique on the map

Ivan Savenko 1 anno fa
parent
commit
fc252bb9eb

+ 0 - 5
lib/CTownHandler.cpp

@@ -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();

+ 0 - 1
lib/CTownHandler.h

@@ -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;
 

+ 5 - 0
lib/constants/EntityIdentifiers.cpp

@@ -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);

+ 2 - 0
lib/constants/EntityIdentifiers.h

@@ -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();
 

+ 48 - 8
lib/gameState/CGameState.cpp

@@ -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 };

+ 1 - 0
lib/gameState/CGameState.h

@@ -212,6 +212,7 @@ private:
 	void initFogOfWar();
 	void initStartingBonus();
 	void initTowns();
+	void initTownNames();
 	void initMapObjects();
 	void initVisitingAndGarrisonedHeroes();
 	void initCampaign();