1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-15 20:03:15 +02:00

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

This commit is contained in:
Ivan Savenko
2024-02-19 00:36:08 +02:00
parent 10b35ceecb
commit fc252bb9eb
6 changed files with 56 additions and 14 deletions

View File

@@ -243,11 +243,6 @@ CTown::~CTown()
str.dellNull(); str.dellNull();
} }
std::string CTown::getRandomNameTranslated(size_t index) const
{
return VLC->generaltexth->translate(getRandomNameTextID(index));
}
std::string CTown::getRandomNameTextID(size_t index) const std::string CTown::getRandomNameTextID(size_t index) const
{ {
return TextIdentifier("faction", faction->modScope, faction->identifier, "randomName", index).get(); return TextIdentifier("faction", faction->modScope, faction->identifier, "randomName", index).get();

View File

@@ -217,7 +217,6 @@ public:
void setGreeting(BuildingSubID::EBuildingSubID subID, const std::string & message) const; //may affect only mutable field void setGreeting(BuildingSubID::EBuildingSubID subID, const std::string & message) const; //may affect only mutable field
BuildingID getBuildingType(BuildingSubID::EBuildingSubID subID) const; BuildingID getBuildingType(BuildingSubID::EBuildingSubID subID) const;
std::string getRandomNameTranslated(size_t index) const;
std::string getRandomNameTextID(size_t index) const; std::string getRandomNameTextID(size_t index) const;
size_t getRandomNamesCount() const; size_t getRandomNamesCount() const;

View File

@@ -458,6 +458,11 @@ std::string FactionID::entityType()
return "faction"; return "faction";
} }
const CFaction * FactionID::toFaction() const
{
return dynamic_cast<const CFaction*>(toEntity(VLC));
}
const Faction * FactionID::toEntity(const Services * service) const const Faction * FactionID::toEntity(const Services * service) const
{ {
return service->factions()->getByIndex(num); return service->factions()->getByIndex(num);

View File

@@ -24,6 +24,7 @@ class CHero;
class CHeroClass; class CHeroClass;
class HeroClass; class HeroClass;
class HeroTypeService; class HeroTypeService;
class CFaction;
class Faction; class Faction;
class Skill; class Skill;
class RoadType; class RoadType;
@@ -261,6 +262,7 @@ public:
static si32 decode(const std::string& identifier); static si32 decode(const std::string& identifier);
static std::string encode(const si32 index); static std::string encode(const si32 index);
const CFaction * toFaction() const;
const Faction * toEntity(const Services * service) const; const Faction * toEntity(const Services * service) const;
static std::string entityType(); static std::string entityType();

View File

@@ -222,6 +222,7 @@ void CGameState::init(const IMapService * mapService, StartInfo * si, Load::Prog
initHeroes(); initHeroes();
initStartingBonus(); initStartingBonus();
initTowns(); initTowns();
initTownNames();
placeHeroesInTowns(); placeHeroesInTowns();
initMapObjects(); initMapObjects();
buildBonusSystemTree(); 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() void CGameState::initTowns()
{ {
logGlobal->debug("\tTowns"); logGlobal->debug("\tTowns");
@@ -777,15 +823,9 @@ void CGameState::initTowns()
map->townUniversitySkills.push_back(SecondarySkill(SecondarySkill::EARTH_MAGIC)); map->townUniversitySkills.push_back(SecondarySkill(SecondarySkill::EARTH_MAGIC));
for (auto & elem : map->towns) for (auto & elem : map->towns)
{
CGTownInstance * vti =(elem);
assert(vti->town);
if(vti->getNameTextID().empty())
{ {
size_t nameID = getRandomGenerator().nextInt(vti->getTown()->getRandomNamesCount() - 1); CGTownInstance * vti =(elem);
vti->setNameTextId(vti->getTown()->getRandomNameTextID(nameID)); 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 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 }; 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 };

View File

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