(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it

This commit is contained in:
darkvater 2005-01-21 19:52:32 +00:00
parent 5290d5f667
commit 0a944dc950
3 changed files with 24 additions and 16 deletions

View File

@ -214,6 +214,7 @@ bool ScrollWindowTo(int x, int y, Window * w);
bool ScrollMainWindowToTile(TileIndex tile); bool ScrollMainWindowToTile(TileIndex tile);
bool ScrollMainWindowTo(int x, int y); bool ScrollMainWindowTo(int x, int y);
void DrawSprite(uint32 img, int x, int y); void DrawSprite(uint32 img, int x, int y);
uint GetCorrectTileHeight(TileIndex tile);
bool EnsureNoVehicle(TileIndex tile); bool EnsureNoVehicle(TileIndex tile);
bool EnsureNoVehicleZ(TileIndex tile, byte z); bool EnsureNoVehicleZ(TileIndex tile, byte z);
void MarkAllViewportsDirty(int left, int top, int right, int bottom); void MarkAllViewportsDirty(int left, int top, int right, int bottom);

View File

@ -742,7 +742,8 @@ static int32 DoClearBridge(uint tile, uint32 flags)
*/ */
tile += direction ? TILE_XY(0, 1) : TILE_XY( 1,0); tile += direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
endtile -= direction ? TILE_XY(0, 1) : TILE_XY( 1,0); endtile -= direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
if ((v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8)) != NULL) { /* Bridges on slopes might have their Z-value offset..correct this */
if ((v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8 + GetCorrectTileHeight(tile))) != NULL) {
VehicleInTheWayErrMsg(v); VehicleInTheWayErrMsg(v);
return CMD_ERROR; return CMD_ERROR;
} }
@ -804,25 +805,21 @@ clear_it:;
} }
static int32 ClearTile_TunnelBridge(uint tile, byte flags) { static int32 ClearTile_TunnelBridge(uint tile, byte flags) {
int32 ret;
byte m5 = _map5[tile]; byte m5 = _map5[tile];
if ((m5 & 0xF0) == 0) { if ((m5 & 0xF0) == 0) {
if (flags & DC_AUTO) if (flags & DC_AUTO)
return_cmd_error(STR_5006_MUST_DEMOLISH_TUNNEL_FIRST); return_cmd_error(STR_5006_MUST_DEMOLISH_TUNNEL_FIRST);
return DoClearTunnel(tile, flags); return DoClearTunnel(tile, flags);
} else if (m5 & 0x80) { } else if (m5 & 0x80) {
if (flags & DC_AUTO) if (flags & DC_AUTO)
return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST); return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
ret = DoClearBridge(tile, flags); return DoClearBridge(tile, flags);
if (ret == CMD_ERROR) }
return CMD_ERROR;
return CMD_ERROR;
return ret;
} else {
return CMD_ERROR;
}
} }
int32 DoConvertTunnelBridgeRail(uint tile, uint totype, bool exec) int32 DoConvertTunnelBridgeRail(uint tile, uint totype, bool exec)

View File

@ -73,17 +73,27 @@ static void *EnsureNoVehicleProcZ(Vehicle *v, void *data)
return v; return v;
} }
static inline uint Correct_Z(uint tileh)
{
// needs z correction for slope-type graphics that have the NORTHERN tile lowered
// 1, 2, 3, 4, 5, 6 and 7
return (CORRECT_Z(tileh)) ? 8 : 0;
}
uint GetCorrectTileHeight(TileIndex tile)
{
TileInfo ti;
FindLandscapeHeightByTile(&ti, tile);
return Correct_Z(ti.tileh);
}
bool EnsureNoVehicleZ(TileIndex tile, byte z) bool EnsureNoVehicleZ(TileIndex tile, byte z)
{ {
TileInfo ti; TileInfo ti;
FindLandscapeHeightByTile(&ti, tile); FindLandscapeHeightByTile(&ti, tile);
// needs z correction for slope-type graphics that have the NORTHERN tile lowered ti.z = z + Correct_Z(ti.tileh);
// 1, 2, 3, 4, 5, 6 and 7
if (CORRECT_Z(ti.tileh))
z += 8;
ti.z = z;
return VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ) == NULL; return VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ) == NULL;
} }