(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.
authorrubidium
Wed, 23 Apr 2008 22:55:11 +0000
changeset 9040 05467c606a0e
parent 9039 480ed3fad6ce
child 9041 2e64f7dc7a48
(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.
src/town.h
src/town_cmd.cpp
--- a/src/town.h	Wed Apr 23 22:17:33 2008 +0000
+++ b/src/town.h	Wed Apr 23 22:55:11 2008 +0000
@@ -124,7 +124,6 @@
 	PlayerByte exclusivity;      ///< which player has exslusivity
 	uint8 exclusive_counter;     ///< months till the exclusivity expires
 	int16 ratings[MAX_PLAYERS];
-	int16 test_rating;
 
 	/* Maximum amount of passengers and mail that can be transported. */
 	uint32 max_pass;
--- a/src/town_cmd.cpp	Wed Apr 23 22:17:33 2008 +0000
+++ b/src/town_cmd.cpp	Wed Apr 23 22:55:11 2008 +0000
@@ -2446,14 +2446,14 @@
 }
 
 static bool _town_rating_test = false;
+std::map<const Town *, int> _town_test_ratings;
 
 void SetTownRatingTestMode(bool mode)
 {
 	static int ref_count = 0;
 	if (mode) {
 		if (ref_count == 0) {
-			Town *t;
-			FOR_ALL_TOWNS(t) t->test_rating = t->ratings[_current_player];
+			_town_test_ratings.empty();
 		}
 		ref_count++;
 	} else {
@@ -2463,6 +2463,17 @@
 	_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)
 {
 	/* if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff */
@@ -2474,8 +2485,7 @@
 
 	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 (rating > max) {
 			rating += add;
@@ -2488,7 +2498,7 @@
 		}
 	}
 	if (_town_rating_test) {
-		t->test_rating = rating;
+		_town_test_ratings[t] = rating;
 	} else {
 		t->ratings[_current_player] = rating;
 	}
@@ -2514,7 +2524,7 @@
 	 */
 	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);
 		_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
 		return false;