mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r2142) - Fix: Game no longer crashes when you want to remove a piece of road under a bridge that belongs to the town. TODO: railcrossings store owner somewhere else, put it into _map_owner[]!
This commit is contained in:
parent
f00d0d8ea8
commit
fc411d3675
53
road_cmd.c
53
road_cmd.c
@ -108,7 +108,8 @@ static bool CheckAllowRemoveRoad(uint tile, uint br, bool *edge_road)
|
|||||||
if (_patches.extra_dynamite)
|
if (_patches.extra_dynamite)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
t = GetTown(_map2[tile]);
|
t = ClosestTownFromTile(tile, _patches.dist_local_authority);
|
||||||
|
|
||||||
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;
|
||||||
@ -123,17 +124,18 @@ uint GetRoadBitsByTile(TileIndex tile)
|
|||||||
return (byte)(r | (r >> 8));
|
return (byte)(r | (r >> 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
// cost for removing inner/edge -roads
|
|
||||||
static const uint16 _road_remove_cost[2] = {50, 18};
|
|
||||||
|
|
||||||
/* Delete a piece of road
|
/* Delete a piece of road
|
||||||
* p1 = piece type
|
* p1 = piece type
|
||||||
*/
|
*/
|
||||||
int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||||
{
|
{
|
||||||
|
// cost for removing inner/edge -roads
|
||||||
|
static const uint16 road_remove_cost[2] = {50, 18};
|
||||||
|
|
||||||
TileInfo ti;
|
TileInfo ti;
|
||||||
int32 cost;
|
int32 cost;
|
||||||
uint tile;
|
TileIndex tile;
|
||||||
|
byte owner;
|
||||||
Town *t;
|
Town *t;
|
||||||
/* true if the roadpiece was always removeable,
|
/* true if the roadpiece was always removeable,
|
||||||
false if it was a center piece. Affects town ratings drop
|
false if it was a center piece. Affects town ratings drop
|
||||||
@ -144,9 +146,20 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
|
|
||||||
FindLandscapeHeight(&ti, x, y);
|
FindLandscapeHeight(&ti, x, y);
|
||||||
tile = ti.tile;
|
tile = ti.tile;
|
||||||
if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR)
|
|
||||||
t = GetTown(_map2[tile]); // needed for town rating penalty
|
// owner for railraod crossing is stored somewhere else
|
||||||
else
|
// XXX - Fix this so for a given tiletype the owner of the type is in the same variable
|
||||||
|
if (IsTileType(tile, MP_STREET) && (_map5[tile] & 0xF0) == 0x10) {
|
||||||
|
owner = _map3_lo[tile];
|
||||||
|
} else
|
||||||
|
owner = _map_owner[tile];
|
||||||
|
|
||||||
|
if (owner == OWNER_TOWN && _game_mode != GM_EDITOR) {
|
||||||
|
if (IsTileType(tile, MP_TUNNELBRIDGE)) { // index of town is not saved for bridge (no space)
|
||||||
|
t = ClosestTownFromTile(tile, _patches.dist_local_authority);
|
||||||
|
} else
|
||||||
|
t = GetTown(_map2[tile]);
|
||||||
|
} else
|
||||||
t = NULL;
|
t = NULL;
|
||||||
|
|
||||||
// allow deleting road under bridge
|
// allow deleting road under bridge
|
||||||
@ -176,13 +189,19 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
cost = _price.remove_road * 2;
|
cost = _price.remove_road * 2;
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
|
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
|
||||||
_map5[tile] = ti.map5 & 0xC7;
|
_map5[tile] = ti.map5 & 0xC7;
|
||||||
_map_owner[tile] = OWNER_NONE;
|
_map_owner[tile] = OWNER_NONE;
|
||||||
MarkTileDirtyByTile(tile);
|
MarkTileDirtyByTile(tile);
|
||||||
}
|
}
|
||||||
return cost;
|
return cost;
|
||||||
} else if (ti.type == MP_STREET) {
|
} else if (ti.type == MP_STREET) {
|
||||||
if (!(ti.map5 & 0xF0)) {
|
// check if you're allowed to remove the street owned by a town
|
||||||
|
// removal allowance depends on difficulty setting
|
||||||
|
if (!CheckforTownRating(tile, flags, t, ROAD_REMOVE)) return CMD_ERROR;
|
||||||
|
|
||||||
|
// XXX - change cascading ifs to switch when doing rewrite
|
||||||
|
if ((ti.map5 & 0xF0) == 0) { // normal road
|
||||||
uint c = p1, t2;
|
uint c = p1, t2;
|
||||||
|
|
||||||
if (ti.tileh != 0 && (ti.map5 == 5 || ti.map5 == 10)) {
|
if (ti.tileh != 0 && (ti.map5 == 5 || ti.map5 == 10)) {
|
||||||
@ -200,18 +219,8 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
if (t2&1) cost += _price.remove_road;
|
if (t2&1) cost += _price.remove_road;
|
||||||
} while(t2>>=1);
|
} while(t2>>=1);
|
||||||
|
|
||||||
// check if you're allowed to remove the street owned by a town
|
|
||||||
// removal allowance depends on difficulty setting
|
|
||||||
if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR) {
|
|
||||||
if (!CheckforTownRating(tile, flags, t, ROAD_REMOVE))
|
|
||||||
return CMD_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
// checks if the owner is town than decrease town rating by 50 until you have
|
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
|
||||||
// a "Poor" town rating
|
|
||||||
if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR)
|
|
||||||
ChangeTownRating(t, -_road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
|
|
||||||
|
|
||||||
_map5[tile] ^= c;
|
_map5[tile] ^= c;
|
||||||
if ((_map5[tile]&0xF) == 0)
|
if ((_map5[tile]&0xF) == 0)
|
||||||
@ -221,7 +230,7 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
|
|
||||||
}
|
}
|
||||||
return cost;
|
return cost;
|
||||||
} else if (!(ti.map5 & 0xE0)) {
|
} else if ((ti.map5 & 0xE0) == 0) { // railroad crossing
|
||||||
byte c;
|
byte c;
|
||||||
|
|
||||||
if (!(ti.map5 & 8)) {
|
if (!(ti.map5 & 8)) {
|
||||||
@ -234,6 +243,8 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
|
|
||||||
cost = _price.remove_road * 2;
|
cost = _price.remove_road * 2;
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
|
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
|
||||||
|
|
||||||
ModifyTile(tile,
|
ModifyTile(tile,
|
||||||
MP_SETTYPE(MP_RAILWAY) |
|
MP_SETTYPE(MP_RAILWAY) |
|
||||||
MP_MAP2_CLEAR | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5,
|
MP_MAP2_CLEAR | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5,
|
||||||
|
@ -1807,8 +1807,15 @@ Town *ClosestTownFromTile(uint tile, uint threshold)
|
|||||||
Town *t;
|
Town *t;
|
||||||
uint dist, best = threshold;
|
uint dist, best = threshold;
|
||||||
Town *best_town = NULL;
|
Town *best_town = NULL;
|
||||||
|
byte owner;
|
||||||
|
|
||||||
if ((IsTileType(tile, MP_STREET) && _map_owner[tile] == OWNER_TOWN) || IsTileType(tile, MP_HOUSE))
|
// XXX - Fix this so for a given tiletype the owner of the type is in the same variable
|
||||||
|
if (IsTileType(tile, MP_STREET) && (_map5[tile] & 0xF0) == 0x10) { // rail crossing
|
||||||
|
owner = _map3_lo[tile];
|
||||||
|
} else
|
||||||
|
owner = _map_owner[tile];
|
||||||
|
|
||||||
|
if ((IsTileType(tile, MP_STREET) && owner == OWNER_TOWN) || IsTileType(tile, MP_HOUSE))
|
||||||
return GetTown(_map2[tile]);
|
return GetTown(_map2[tile]);
|
||||||
|
|
||||||
FOR_ALL_TOWNS(t) {
|
FOR_ALL_TOWNS(t) {
|
||||||
|
Loading…
Reference in New Issue
Block a user