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:
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -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 };
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user