changeset 8186:6d098ac32840 draft

(svn r11749) -Fix (r11352): when a bankrupted company is bought, reset vehicle color mapping so the vehicles use the new owner color
author glx <glx@openttd.org>
date Thu, 03 Jan 2008 23:50:58 +0000
parents acdfec5ae831
children 628ae1d0d227
files src/command.cpp src/economy.cpp src/road_cmd.cpp src/town.h src/town_cmd.cpp src/tree_cmd.cpp src/tunnelbridge_cmd.cpp
diffstat 7 files changed, 56 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -17,6 +17,7 @@
 #include "strings_func.h"
 #include "gfx_func.h"
 #include "functions.h"
+#include "town.h"
 
 const char *_cmd_text = NULL;
 
@@ -388,7 +389,7 @@
 	return _command_proc_table[cmd & 0xFF].flags;
 }
 
-static int _docommand_recursive;
+static int _docommand_recursive = 0;
 
 /*!
  * This function executes a given command with the parameters from the #CommandProc parameter list.
@@ -420,7 +421,9 @@
 
 	/* only execute the test call if it's toplevel, or we're not execing. */
 	if (_docommand_recursive == 1 || !(flags & DC_EXEC) || (flags & DC_FORCETEST) ) {
+		SetTownRatingTestMode(true);
 		res = proc(tile, flags & ~DC_EXEC, p1, p2);
+		SetTownRatingTestMode(false);
 		if (CmdFailed(res)) {
 			res.SetGlobalErrorMessage();
 			goto error;
@@ -554,7 +557,7 @@
 		(cmd & 0xFF) == CMD_REMOVE_ROAD ||
 		(cmd & 0xFF) == CMD_REMOVE_LONG_ROAD ||
 		(cmd & 0xFF) == CMD_CLONE_VEHICLE;
-
+	notest = false;
 	_docommand_recursive = 1;
 
 	/* cost estimation only? */
@@ -581,7 +584,9 @@
 
 	if (!((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
 		/* first test if the command can be executed. */
+		SetTownRatingTestMode(true);
 		res = proc(tile, flags, p1, p2);
+		SetTownRatingTestMode(false);
 		if (CmdFailed(res)) {
 			res.SetGlobalErrorMessage();
 			goto show_error;
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -402,6 +402,7 @@
 					}
 				} else {
 					v->owner = new_player;
+					v->colormap = PAL_NONE;
 					v->group_id = DEFAULT_GROUP;
 					if (IsEngineCountable(v)) GetPlayer(new_player)->num_engines[v->engine_type]++;
 					switch (v->type) {
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -201,9 +201,8 @@
 			c &= present;
 			if (c == ROAD_NONE) return CMD_ERROR;
 
+			ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
 			if (flags & DC_EXEC) {
-				ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
-
 				present ^= c;
 				if (present == ROAD_NONE) {
 					RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
@@ -236,11 +235,11 @@
 			 * we can't draw the crossing without trambits ;) */
 			if (rt == ROADTYPE_ROAD && HasBit(GetRoadTypes(tile), ROADTYPE_TRAM) && ((flags & DC_EXEC) || !HasBit(p1, 6))) return CMD_ERROR;
 
+			if (rt == ROADTYPE_ROAD) {
+				ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
+			}
+
 			if (flags & DC_EXEC) {
-				if (rt == ROADTYPE_ROAD) {
-					ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
-				}
-
 				RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
 				if (rts == ROADTYPES_NONE) {
 					MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailType(tile));
--- a/src/town.h
+++ b/src/town.h
@@ -109,6 +109,7 @@
 	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;
@@ -358,5 +359,6 @@
 Town *ClosestTownFromTile(TileIndex tile, uint threshold);
 void ChangeTownRating(Town *t, int add, int max);
 uint GetTownRadiusGroup(const Town* t, TileIndex tile);
+void SetTownRatingTestMode(bool mode);
 
 #endif /* TOWN_H */
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -522,8 +522,8 @@
 		}
 	}
 
+	ChangeTownRating(t, -rating, RATING_HOUSE_MINIMUM);
 	if (flags & DC_EXEC) {
-		ChangeTownRating(t, -rating, RATING_HOUSE_MINIMUM);
 		ClearTownHouse(t, tile);
 	}
 
@@ -2261,6 +2261,23 @@
 	}
 }
 
+static bool _town_rating_test = false;
+
+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];
+		}
+		ref_count++;
+	} else {
+		assert(ref_count > 0);
+		ref_count--;
+	}
+	_town_rating_test = !(ref_count == 0);
+}
 
 void ChangeTownRating(Town *t, int add, int max)
 {
@@ -2275,7 +2292,7 @@
 
 	SetBit(t->have_ratings, _current_player);
 
-	rating = t->ratings[_current_player];
+	rating = _town_rating_test ? t->test_rating : t->ratings[_current_player];
 
 	if (add < 0) {
 		if (rating > max) {
@@ -2288,7 +2305,11 @@
 			if (rating > max) rating = max;
 		}
 	}
-	t->ratings[_current_player] = rating;
+	if (_town_rating_test) {
+		t->test_rating = rating;
+	} else {
+		t->ratings[_current_player] = rating;
+	}
 }
 
 /* penalty for removing town-owned stuff */
@@ -2313,7 +2334,7 @@
 	 */
 	modemod = _default_rating_settings[_opt.diff.town_council_tolerance][type];
 
-	if (t->ratings[_current_player] < 16 + modemod && !(flags & DC_NO_TOWN_RATING)) {
+	if ((_town_rating_test ? t->test_rating : t->ratings[_current_player]) < 16 + modemod && !(flags & DC_NO_TOWN_RATING)) {
 		SetDParam(0, t->index);
 		_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
 		return false;
--- a/src/tree_cmd.cpp
+++ b/src/tree_cmd.cpp
@@ -330,16 +330,16 @@
 						default: break;
 					}
 
+					if (_game_mode != GM_EDITOR && IsValidPlayer(_current_player)) {
+						Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
+						if (t != NULL)
+							ChangeTownRating(t, RATING_TREE_UP_STEP, RATING_TREE_MAXIMUM);
+					}
+
 					if (flags & DC_EXEC) {
 						TreeType treetype;
 						uint growth;
 
-						if (_game_mode != GM_EDITOR && IsValidPlayer(_current_player)) {
-							Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
-							if (t != NULL)
-								ChangeTownRating(t, RATING_TREE_UP_STEP, RATING_TREE_MAXIMUM);
-						}
-
 						treetype = (TreeType)p1;
 						if (treetype == TREE_INVALID) {
 							treetype = GetRandomTreeType(tile, GB(Random(), 24, 8));
@@ -488,7 +488,7 @@
 {
 	uint num;
 
-	if ((flags & DC_EXEC) && IsValidPlayer(_current_player)) {
+	if (IsValidPlayer(_current_player)) {
 		Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
 		if (t != NULL)
 			ChangeTownRating(t, RATING_TREE_DOWN_STEP, RATING_TREE_MINIMUM);
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -599,16 +599,16 @@
 		}
 	}
 
+	/* Adjust the town's player rating. Do this before removing the tile owner info. */
+	if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
+		ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
+
 	if (flags & DC_EXEC) {
 		/* We first need to request the direction before calling DoClearSquare
 		 *  else the direction is always 0.. dah!! ;) */
 		DiagDirection dir = GetTunnelBridgeDirection(tile);
 		Track track;
 
-		/* Adjust the town's player rating. Do this before removing the tile owner info. */
-		if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
-			ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
-
 		DoClearSquare(tile);
 		DoClearSquare(endtile);
 		UpdateSignalsOnSegment(tile, ReverseDiagDir(dir));
@@ -650,15 +650,15 @@
 		}
 	}
 
+	/* checks if the owner is town then decrease town rating by RATING_TUNNEL_BRIDGE_DOWN_STEP until
+	 * you have a "Poor" (0) town rating */
+	if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
+		ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
+
 	if (flags & DC_EXEC) {
 		TileIndex c;
 		Track track;
 
-		/* checks if the owner is town then decrease town rating by RATING_TUNNEL_BRIDGE_DOWN_STEP until
-		 * you have a "Poor" (0) town rating */
-		if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
-			ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
-
 		DoClearSquare(tile);
 		DoClearSquare(endtile);
 		for (c = tile + delta; c != endtile; c += delta) {