mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-09 07:29:44 +00:00
(svn r11749) -Fix (r11352): when a bankrupted company is bought, reset vehicle color mapping so the vehicles use the new owner color
This commit is contained in:
parent
aebcd80088
commit
42bddcf723
@ -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 @@ byte GetCommandFlags(uint cmd)
|
||||
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 @@ CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint32
|
||||
|
||||
/* 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 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
|
||||
(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 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
|
||||
|
||||
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;
|
||||
|
@ -402,6 +402,7 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
|
||||
}
|
||||
} 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) {
|
||||
|
@ -201,9 +201,8 @@ CommandCost CmdRemoveRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
||||
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 @@ CommandCost CmdRemoveRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
||||
* 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 (flags & DC_EXEC) {
|
||||
if (rt == ROADTYPE_ROAD) {
|
||||
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
|
||||
}
|
||||
if (rt == ROADTYPE_ROAD) {
|
||||
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
|
||||
if (rts == ROADTYPES_NONE) {
|
||||
MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailType(tile));
|
||||
|
@ -109,6 +109,7 @@ struct Town : PoolItem<Town, TownID, &_Town_pool> {
|
||||
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 @@ bool CheckIfAuthorityAllows(TileIndex tile);
|
||||
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 */
|
||||
|
@ -522,8 +522,8 @@ static CommandCost ClearTile_Town(TileIndex tile, byte flags)
|
||||
}
|
||||
}
|
||||
|
||||
ChangeTownRating(t, -rating, RATING_HOUSE_MINIMUM);
|
||||
if (flags & DC_EXEC) {
|
||||
ChangeTownRating(t, -rating, RATING_HOUSE_MINIMUM);
|
||||
ClearTownHouse(t, tile);
|
||||
}
|
||||
|
||||
@ -2261,6 +2261,23 @@ Town *ClosestTownFromTile(TileIndex tile, uint threshold)
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ void ChangeTownRating(Town *t, int add, int max)
|
||||
|
||||
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 @@ void ChangeTownRating(Town *t, int add, int max)
|
||||
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 @@ bool CheckforTownRating(uint32 flags, Town *t, byte type)
|
||||
*/
|
||||
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;
|
||||
|
@ -330,16 +330,16 @@ CommandCost CmdPlantTree(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
||||
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 @@ static CommandCost ClearTile_Trees(TileIndex tile, byte flags)
|
||||
{
|
||||
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);
|
||||
|
@ -599,16 +599,16 @@ static CommandCost DoClearTunnel(TileIndex tile, uint32 flags)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 @@ static CommandCost DoClearBridge(TileIndex tile, uint32 flags)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
|
Loading…
Reference in New Issue
Block a user