mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r26313) -Codechange: use a set for finding unique town names instead of iterating all just created town names (MJP)
This commit is contained in:
parent
c7629735a3
commit
9f6b8aea49
|
@ -1901,6 +1901,7 @@ bool GenerateTowns(TownLayout layout)
|
||||||
uint total = (difficulty == (uint)CUSTOM_TOWN_NUMBER_DIFFICULTY) ? _settings_game.game_creation.custom_town_number : ScaleByMapSize(_num_initial_towns[difficulty] + (Random() & 7));
|
uint total = (difficulty == (uint)CUSTOM_TOWN_NUMBER_DIFFICULTY) ? _settings_game.game_creation.custom_town_number : ScaleByMapSize(_num_initial_towns[difficulty] + (Random() & 7));
|
||||||
total = min(TownPool::MAX_SIZE, total);
|
total = min(TownPool::MAX_SIZE, total);
|
||||||
uint32 townnameparts;
|
uint32 townnameparts;
|
||||||
|
TownNames town_names;
|
||||||
|
|
||||||
SetGeneratingWorldProgress(GWP_TOWN, total);
|
SetGeneratingWorldProgress(GWP_TOWN, total);
|
||||||
|
|
||||||
|
@ -1919,11 +1920,13 @@ bool GenerateTowns(TownLayout layout)
|
||||||
bool city = (_settings_game.economy.larger_towns != 0 && Chance16(1, _settings_game.economy.larger_towns));
|
bool city = (_settings_game.economy.larger_towns != 0 && Chance16(1, _settings_game.economy.larger_towns));
|
||||||
IncreaseGeneratingWorldProgress(GWP_TOWN);
|
IncreaseGeneratingWorldProgress(GWP_TOWN);
|
||||||
/* Get a unique name for the town. */
|
/* Get a unique name for the town. */
|
||||||
if (!GenerateTownName(&townnameparts)) continue;
|
if (!GenerateTownName(&townnameparts, &town_names)) continue;
|
||||||
/* try 20 times to create a random-sized town for the first loop. */
|
/* try 20 times to create a random-sized town for the first loop. */
|
||||||
if (CreateRandomTown(20, townnameparts, TSZ_RANDOM, city, layout) != NULL) current_number++; // If creation was successful, raise a flag.
|
if (CreateRandomTown(20, townnameparts, TSZ_RANDOM, city, layout) != NULL) current_number++; // If creation was successful, raise a flag.
|
||||||
} while (--total);
|
} while (--total);
|
||||||
|
|
||||||
|
town_names.clear();
|
||||||
|
|
||||||
if (current_number != 0) return true;
|
if (current_number != 0) return true;
|
||||||
|
|
||||||
/* If current_number is still zero at this point, it means that not a single town has been created.
|
/* If current_number is still zero at this point, it means that not a single town has been created.
|
||||||
|
|
|
@ -75,9 +75,10 @@ char *GetTownName(char *buff, const Town *t, const char *last)
|
||||||
* Verifies the town name is valid and unique.
|
* Verifies the town name is valid and unique.
|
||||||
* @param r random bits
|
* @param r random bits
|
||||||
* @param par town name parameters
|
* @param par town name parameters
|
||||||
|
* @param town_names if a name is generated, check its uniqueness with the set
|
||||||
* @return true iff name is valid and unique
|
* @return true iff name is valid and unique
|
||||||
*/
|
*/
|
||||||
bool VerifyTownName(uint32 r, const TownNameParams *par)
|
bool VerifyTownName(uint32 r, const TownNameParams *par, TownNames *town_names)
|
||||||
{
|
{
|
||||||
/* reserve space for extra unicode character and terminating '\0' */
|
/* reserve space for extra unicode character and terminating '\0' */
|
||||||
char buf1[(MAX_LENGTH_TOWN_NAME_CHARS + 1) * MAX_CHAR_LENGTH];
|
char buf1[(MAX_LENGTH_TOWN_NAME_CHARS + 1) * MAX_CHAR_LENGTH];
|
||||||
|
@ -88,16 +89,21 @@ bool VerifyTownName(uint32 r, const TownNameParams *par)
|
||||||
/* Check size and width */
|
/* Check size and width */
|
||||||
if (Utf8StringLength(buf1) >= MAX_LENGTH_TOWN_NAME_CHARS) return false;
|
if (Utf8StringLength(buf1) >= MAX_LENGTH_TOWN_NAME_CHARS) return false;
|
||||||
|
|
||||||
const Town *t;
|
if (town_names != NULL) {
|
||||||
FOR_ALL_TOWNS(t) {
|
if (town_names->find(buf1) != town_names->end()) return false;
|
||||||
/* We can't just compare the numbers since
|
town_names->insert(buf1);
|
||||||
* several numbers may map to a single name. */
|
} else {
|
||||||
const char *buf = t->name;
|
const Town *t;
|
||||||
if (buf == NULL) {
|
FOR_ALL_TOWNS(t) {
|
||||||
GetTownName(buf2, t, lastof(buf2));
|
/* We can't just compare the numbers since
|
||||||
buf = buf2;
|
* several numbers may map to a single name. */
|
||||||
|
const char *buf = t->name;
|
||||||
|
if (buf == NULL) {
|
||||||
|
GetTownName(buf2, t, lastof(buf2));
|
||||||
|
buf = buf2;
|
||||||
|
}
|
||||||
|
if (strcmp(buf1, buf) == 0) return false;
|
||||||
}
|
}
|
||||||
if (strcmp(buf1, buf) == 0) return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -107,9 +113,10 @@ bool VerifyTownName(uint32 r, const TownNameParams *par)
|
||||||
/**
|
/**
|
||||||
* Generates valid town name.
|
* Generates valid town name.
|
||||||
* @param townnameparts if a name is generated, it's stored there
|
* @param townnameparts if a name is generated, it's stored there
|
||||||
|
* @param town_names if a name is generated, check its uniqueness with the set
|
||||||
* @return true iff a name was generated
|
* @return true iff a name was generated
|
||||||
*/
|
*/
|
||||||
bool GenerateTownName(uint32 *townnameparts)
|
bool GenerateTownName(uint32 *townnameparts, TownNames *town_names)
|
||||||
{
|
{
|
||||||
/* Do not set too low tries, since when we run out of names, we loop
|
/* Do not set too low tries, since when we run out of names, we loop
|
||||||
* for #tries only one time anyway - then we stop generating more
|
* for #tries only one time anyway - then we stop generating more
|
||||||
|
@ -120,7 +127,7 @@ bool GenerateTownName(uint32 *townnameparts)
|
||||||
|
|
||||||
for (int i = 1000; i != 0; i--) {
|
for (int i = 1000; i != 0; i--) {
|
||||||
uint32 r = _generating_world ? Random() : InteractiveRandom();
|
uint32 r = _generating_world ? Random() : InteractiveRandom();
|
||||||
if (!VerifyTownName(r, &par)) continue;
|
if (!VerifyTownName(r, &par, town_names)) continue;
|
||||||
|
|
||||||
*townnameparts = r;
|
*townnameparts = r;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
char *GenerateTownNameString(char *buf, const char *last, size_t lang, uint32 seed);
|
char *GenerateTownNameString(char *buf, const char *last, size_t lang, uint32 seed);
|
||||||
char *GetTownName(char *buff, const TownNameParams *par, uint32 townnameparts, const char *last);
|
char *GetTownName(char *buff, const TownNameParams *par, uint32 townnameparts, const char *last);
|
||||||
char *GetTownName(char *buff, const Town *t, const char *last);
|
char *GetTownName(char *buff, const Town *t, const char *last);
|
||||||
bool VerifyTownName(uint32 r, const TownNameParams *par);
|
bool VerifyTownName(uint32 r, const TownNameParams *par, TownNames *town_names = NULL);
|
||||||
bool GenerateTownName(uint32 *townnameparts);
|
bool GenerateTownName(uint32 *townnameparts, TownNames *town_names = NULL);
|
||||||
|
|
||||||
#endif /* TOWNNAME_FUNC_H */
|
#endif /* TOWNNAME_FUNC_H */
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
|
|
||||||
#include "newgrf_townname.h"
|
#include "newgrf_townname.h"
|
||||||
#include "town_type.h"
|
#include "town_type.h"
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
typedef std::set<std::string> TownNames;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Struct holding a parameters used to generate town name.
|
* Struct holding a parameters used to generate town name.
|
||||||
|
|
Loading…
Reference in New Issue