summaryrefslogtreecommitdiff
path: root/water_cmd.c
diff options
context:
space:
mode:
authorcelestar <celestar@openttd.org>2006-06-02 13:05:41 +0000
committercelestar <celestar@openttd.org>2006-06-02 13:05:41 +0000
commit25a63ec7af6fadb2d33ef84f79597c14b10e7f39 (patch)
treed5df4e2831609eca45d7ea4558e09a600089ead2 /water_cmd.c
parentd680fcec772d422b88ea4802add2e6195c6327a2 (diff)
downloadopenttd-25a63ec7af6fadb2d33ef84f79597c14b10e7f39.tar.xz
(svn r5070) Merged the bridge branch
-Feature: Bridges can now be placed above: Any railway track combination (excluding depots and waypoints) Any road combination (excluding depots) Clear tiles (duh), including fields Tunnel entrances Bridge heads Thanks to Tron for idea and implementation, KUDr for the yapf synchronization and many others for hours of testing There are still a number of visual problems remaining, especially when electric railways are on or under the bridge. DO NOT REPORT THOSE BUGS FOR THE TIME BEING please.
Diffstat (limited to 'water_cmd.c')
-rw-r--r--water_cmd.c63
1 files changed, 16 insertions, 47 deletions
diff --git a/water_cmd.c b/water_cmd.c
index 086ff36f1..ff48573f3 100644
--- a/water_cmd.c
+++ b/water_cmd.c
@@ -20,7 +20,7 @@
#include "train.h"
#include "water_map.h"
-const SpriteID _water_shore_sprites[15] = {
+static const SpriteID _water_shore_sprites[] = {
0,
SPR_SHORE_TILEH_1,
SPR_SHORE_TILEH_2,
@@ -65,6 +65,8 @@ int32 CmdBuildShipDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsClearWaterTile(tile) || !IsClearWaterTile(tile2))
return_cmd_error(STR_3801_MUST_BE_BUILT_ON_WATER);
+ if (IsBridgeAbove(tile) || IsBridgeAbove(tile2)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
+
ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
if (CmdFailed(ret)) return CMD_ERROR;
ret = DoCommand(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -139,6 +141,8 @@ static int32 DoBuildShiplift(TileIndex tile, DiagDirection dir, uint32 flags)
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
}
+ if (IsBridgeAbove(tile) || IsBridgeAbove(tile - delta) || IsBridgeAbove(tile + delta)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
+
if (flags & DC_EXEC) {
MakeLock(tile, dir);
MarkTileDirtyByTile(tile);
@@ -227,6 +231,8 @@ int32 CmdBuildCanal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
cost = 0;
BEGIN_TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) {
+ int32 ret;
+
if (GetTileSlope(tile, NULL) != SLOPE_FLAT) {
return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
}
@@ -234,26 +240,12 @@ int32 CmdBuildCanal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
// can't make water of water!
if (IsTileType(tile, MP_WATER)) continue;
- /* is middle piece of a bridge? */
- if (IsBridgeTile(tile) && IsBridgeMiddle(tile)) {
- if (IsTransportUnderBridge(tile)) {
- return_cmd_error(STR_5800_OBJECT_IN_THE_WAY);
- }
-
- if (IsWaterUnderBridge(tile)) return_cmd_error(STR_1007_ALREADY_BUILT);
-
- if (flags & DC_EXEC) SetWaterUnderBridge(tile);
- } else {
- /* no bridge, try to clear it. */
- int32 ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
-
- if (CmdFailed(ret)) return ret;
- cost += ret;
-
- if (flags & DC_EXEC) MakeWater(tile);
- }
+ ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+ if (CmdFailed(ret)) return ret;
+ cost += ret;
if (flags & DC_EXEC) {
+ MakeWater(tile);
MarkTileDirtyByTile(tile);
MarkTilesAroundDirty(tile);
}
@@ -336,17 +328,9 @@ static int32 ClearTile_Water(TileIndex tile, byte flags)
static bool IsWateredTile(TileIndex tile)
{
switch (GetTileType(tile)) {
- case MP_WATER:
- return !IsCoast(tile);
-
- case MP_STATION:
- return IsOilRig(tile) || IsDock(tile) || IsBuoy_(tile);
-
- case MP_TUNNELBRIDGE:
- return IsBridge(tile) && IsBridgeMiddle(tile) && IsWaterUnderBridge(tile);
-
- default:
- return false;
+ case MP_WATER: return !IsCoast(tile);
+ case MP_STATION: return IsOilRig(tile) || IsDock(tile) || IsBuoy_(tile);
+ default: return false;
}
}
@@ -422,11 +406,13 @@ static void DrawTile_Water(TileInfo *ti)
case WATER_CLEAR:
DrawGroundSprite(SPR_FLAT_WATER_TILE);
if (ti->z != 0) DrawCanalWater(ti->tile);
+ DrawBridgeMiddle(ti);
break;
case WATER_COAST:
assert(!IsSteepSlope(ti->tileh));
DrawGroundSprite(_water_shore_sprites[ti->tileh]);
+ DrawBridgeMiddle(ti);
break;
case WATER_LOCK: {
@@ -536,27 +522,10 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
}
break;
- case MP_TUNNELBRIDGE:
- if (IsBridge(target) && IsBridgeMiddle(target) && IsClearUnderBridge(target)) {
- SetWaterUnderBridge(target);
- MarkTileDirtyByTile(target);
- }
- break;
-
default:
break;
}
} else {
- if (IsBridgeTile(target) && IsBridgeMiddle(target)) {
- if (IsWaterUnderBridge(target) ||
- (IsTransportUnderBridge(target) && GetTransportTypeUnderBridge(target) == TRANSPORT_WATER)) { // XXX does this happen at all?
- return;
- }
- SetWaterUnderBridge(target);
- MarkTileDirtyByTile(target);
- return;
- }
-
_current_player = OWNER_WATER;
{
Vehicle *v = FindVehicleOnTileZ(target, 0);