mirror of https://github.com/OpenTTD/OpenTTD
(svn r12859) -Fix: make the town rating tests use less memory and much quicker; from 13% to unnoticable in the profile in games with lots of towns and lots of very active AIs.
parent
739cb53fff
commit
9c675afb91
|
@ -124,7 +124,6 @@ struct Town : PoolItem<Town, TownID, &_Town_pool> {
|
||||||
PlayerByte exclusivity; ///< which player has exslusivity
|
PlayerByte exclusivity; ///< which player has exslusivity
|
||||||
uint8 exclusive_counter; ///< months till the exclusivity expires
|
uint8 exclusive_counter; ///< months till the exclusivity expires
|
||||||
int16 ratings[MAX_PLAYERS];
|
int16 ratings[MAX_PLAYERS];
|
||||||
int16 test_rating;
|
|
||||||
|
|
||||||
/* Maximum amount of passengers and mail that can be transported. */
|
/* Maximum amount of passengers and mail that can be transported. */
|
||||||
uint32 max_pass;
|
uint32 max_pass;
|
||||||
|
|
|
@ -2446,14 +2446,14 @@ Town *ClosestTownFromTile(TileIndex tile, uint threshold)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _town_rating_test = false;
|
static bool _town_rating_test = false;
|
||||||
|
std::map<const Town *, int> _town_test_ratings;
|
||||||
|
|
||||||
void SetTownRatingTestMode(bool mode)
|
void SetTownRatingTestMode(bool mode)
|
||||||
{
|
{
|
||||||
static int ref_count = 0;
|
static int ref_count = 0;
|
||||||
if (mode) {
|
if (mode) {
|
||||||
if (ref_count == 0) {
|
if (ref_count == 0) {
|
||||||
Town *t;
|
_town_test_ratings.empty();
|
||||||
FOR_ALL_TOWNS(t) t->test_rating = t->ratings[_current_player];
|
|
||||||
}
|
}
|
||||||
ref_count++;
|
ref_count++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2463,6 +2463,17 @@ void SetTownRatingTestMode(bool mode)
|
||||||
_town_rating_test = !(ref_count == 0);
|
_town_rating_test = !(ref_count == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int GetRating(const Town *t)
|
||||||
|
{
|
||||||
|
if (_town_rating_test) {
|
||||||
|
std::map<const Town *, int>::iterator it = _town_test_ratings.find(t);
|
||||||
|
if (it != _town_test_ratings.end()) {
|
||||||
|
return (*it).second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return t->ratings[_current_player];
|
||||||
|
}
|
||||||
|
|
||||||
void ChangeTownRating(Town *t, int add, int max)
|
void ChangeTownRating(Town *t, int add, int max)
|
||||||
{
|
{
|
||||||
/* if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff */
|
/* if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff */
|
||||||
|
@ -2474,8 +2485,7 @@ void ChangeTownRating(Town *t, int add, int max)
|
||||||
|
|
||||||
SetBit(t->have_ratings, _current_player);
|
SetBit(t->have_ratings, _current_player);
|
||||||
|
|
||||||
int rating = _town_rating_test ? t->test_rating : t->ratings[_current_player];
|
int rating = GetRating(t);
|
||||||
|
|
||||||
if (add < 0) {
|
if (add < 0) {
|
||||||
if (rating > max) {
|
if (rating > max) {
|
||||||
rating += add;
|
rating += add;
|
||||||
|
@ -2488,7 +2498,7 @@ void ChangeTownRating(Town *t, int add, int max)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_town_rating_test) {
|
if (_town_rating_test) {
|
||||||
t->test_rating = rating;
|
_town_test_ratings[t] = rating;
|
||||||
} else {
|
} else {
|
||||||
t->ratings[_current_player] = rating;
|
t->ratings[_current_player] = rating;
|
||||||
}
|
}
|
||||||
|
@ -2514,7 +2524,7 @@ bool CheckforTownRating(uint32 flags, Town *t, byte type)
|
||||||
*/
|
*/
|
||||||
int modemod = _default_rating_settings[_opt.diff.town_council_tolerance][type];
|
int modemod = _default_rating_settings[_opt.diff.town_council_tolerance][type];
|
||||||
|
|
||||||
if ((_town_rating_test ? t->test_rating : t->ratings[_current_player]) < 16 + modemod && !(flags & DC_NO_TOWN_RATING)) {
|
if (GetRating(t) < 16 + modemod && !(flags & DC_NO_TOWN_RATING)) {
|
||||||
SetDParam(0, t->index);
|
SetDParam(0, t->index);
|
||||||
_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
|
_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue