summaryrefslogtreecommitdiff
path: root/src/tunnelbridge_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tunnelbridge_cmd.cpp')
-rw-r--r--src/tunnelbridge_cmd.cpp99
1 files changed, 69 insertions, 30 deletions
diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp
index 416db8c9e..16cedfdac 100644
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -227,9 +227,11 @@ CommandCost CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p
if (!ValParamRailtype(railtype)) return CMD_ERROR;
break;
+ case TRANSPORT_WATER:
+ break;
+
default:
- /* For now, only TRANSPORT_RAIL and TRANSPORT_ROAD are allowed.
- * But let not this stops us for preparing the future */
+ /* Airports don't have tunnels. */
return CMD_ERROR;
}
@@ -250,9 +252,11 @@ CommandCost CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p
return_cmd_error(STR_500A_START_AND_END_MUST_BE_IN);
}
- /* set and test bridge length, availability */
bridge_len = sx + sy - x - y - 1;
- if (!CheckBridge_Stuff(bridge_type, bridge_len)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+ if (transport_type != TRANSPORT_WATER) {
+ /* set and test bridge length, availability */
+ if (!CheckBridge_Stuff(bridge_type, bridge_len)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+ }
/* retrieve landscape height and ensure it's on land */
tile_start = TileXY(x, y);
@@ -368,6 +372,11 @@ CommandCost CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p
MakeRoadBridgeRamp(tile_end, owner, bridge_type, ReverseDiagDir(dir), roadtypes);
break;
+ case TRANSPORT_WATER:
+ MakeAqueductBridgeRamp(tile_start, owner, dir);
+ MakeAqueductBridgeRamp(tile_end, owner, ReverseDiagDir(dir));
+ break;
+
default:
NOT_REACHED();
break;
@@ -926,7 +935,11 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
if (ti->tileh == SLOPE_FLAT) base_offset += 4; // sloped bridge head
/* Table number 6 always refers to the bridge heads for any bridge type */
- psid = &GetBridgeSpriteTable(GetBridgeType(ti->tile), 6)[base_offset];
+ if (transport_type != TRANSPORT_WATER) {
+ psid = &GetBridgeSpriteTable(GetBridgeType(ti->tile), 6)[base_offset];
+ } else {
+ psid = _aqueduct_sprites + base_offset;
+ }
if (!ice) {
DrawClearLandTile(ti, 3);
@@ -1023,7 +1036,7 @@ void DrawBridgeMiddle(const TileInfo* ti)
/* Z position of the bridge sprites relative to bridge height (downwards) */
static const int BRIDGE_Z_START = 3;
- const PalSpriteID* psid;
+ const PalSpriteID *psid;
uint base_offset;
TileIndex rampnorth;
TileIndex rampsouth;
@@ -1048,13 +1061,17 @@ void DrawBridgeMiddle(const TileInfo* ti)
);
type = GetBridgeType(rampsouth);
- if (transport_type == TRANSPORT_RAIL) {
- base_offset = GetRailTypeInfo(GetRailType(rampsouth))->bridge_offset;
+ if (transport_type != TRANSPORT_WATER) {
+ if (transport_type == TRANSPORT_RAIL) {
+ base_offset = GetRailTypeInfo(GetRailType(rampsouth))->bridge_offset;
+ } else {
+ base_offset = 8;
+ }
+
+ psid = base_offset + GetBridgeSpriteTable(type, piece);
} else {
- base_offset = 8;
+ psid = _aqueduct_sprites;
}
-
- psid = base_offset + GetBridgeSpriteTable(type, piece);
if (axis != AXIS_X) psid += 4;
x = ti->x;
@@ -1342,7 +1359,7 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
}
} else { // IsBridge(tile)
- if (v->IsPrimaryVehicle()) {
+ if (v->IsPrimaryVehicle() && v->type != VEH_SHIP) {
/* modify speed of vehicle */
uint16 spd = GetBridgeSpec(GetBridgeType(tile))->speed;
@@ -1358,29 +1375,51 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
case DIAGDIR_SW: if ((x & 0xF) != TILE_SIZE - 1) return VETSB_CONTINUE; break;
case DIAGDIR_NW: if ((y & 0xF) != 0) return VETSB_CONTINUE; break;
}
- if (v->type == VEH_TRAIN) {
- v->u.rail.track = TRACK_BIT_WORMHOLE;
- ClrBit(v->u.rail.flags, VRF_GOINGUP);
- ClrBit(v->u.rail.flags, VRF_GOINGDOWN);
- } else {
- v->u.road.state = RVSB_WORMHOLE;
+ switch (v->type) {
+ case VEH_TRAIN:
+ v->u.rail.track = TRACK_BIT_WORMHOLE;
+ ClrBit(v->u.rail.flags, VRF_GOINGUP);
+ ClrBit(v->u.rail.flags, VRF_GOINGDOWN);
+ break;
+
+ case VEH_ROAD:
+ v->u.road.state = RVSB_WORMHOLE;
+ break;
+
+ case VEH_SHIP:
+ v->u.ship.state = TRACK_BIT_WORMHOLE;
+ break;
+
+ default: NOT_REACHED();
}
return VETSB_ENTERED_WORMHOLE;
} else if (DirToDiagDir(v->direction) == ReverseDiagDir(dir)) {
v->tile = tile;
- if (v->type == VEH_TRAIN) {
- if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
- v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
- return VETSB_ENTERED_WORMHOLE;
- }
- } else {
- if (v->u.road.state == RVSB_WORMHOLE) {
- v->u.road.state = _road_exit_tunnel_state[dir];
- v->u.road.frame = 0;
- return VETSB_ENTERED_WORMHOLE;
- }
+ switch (v->type) {
+ case VEH_TRAIN:
+ if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
+ v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
+ return VETSB_ENTERED_WORMHOLE;
+ }
+ break;
+
+ case VEH_ROAD:
+ if (v->u.road.state == RVSB_WORMHOLE) {
+ v->u.road.state = _road_exit_tunnel_state[dir];
+ v->u.road.frame = 0;
+ return VETSB_ENTERED_WORMHOLE;
+ }
+ break;
+
+ case VEH_SHIP:
+ if (v->u.ship.state == TRACK_BIT_WORMHOLE) {
+ v->u.ship.state = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
+ return VETSB_ENTERED_WORMHOLE;
+ }
+ break;
+
+ default: NOT_REACHED();
}
- return VETSB_CONTINUE;
}
}
return VETSB_CONTINUE;