From b329781ab284fb3eb19b60697e54e2bc56bd5d58 Mon Sep 17 00:00:00 2001 From: frosch Date: Fri, 25 Jan 2008 16:51:35 +0000 Subject: (svn r11984) -Fix: Also draw corner shores under rail tracks. --- src/water_cmd.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 10 deletions(-) (limited to 'src/water_cmd.cpp') diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 580e482d5..34c7098d8 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -94,9 +94,18 @@ void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o) for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) { TileIndex neighbour = TileAddByDiagDir(t, dir); - if (IsTileType(neighbour, MP_WATER)) { - has_water |= IsSea(neighbour) || IsCoast(neighbour) || (IsShipDepot(neighbour) && GetShipDepotWaterOwner(neighbour) == OWNER_WATER); - has_canal |= IsCanal(neighbour) || (IsShipDepot(neighbour) && GetShipDepotWaterOwner(neighbour) != OWNER_WATER); + switch (GetTileType(neighbour)) { + case MP_WATER: + has_water |= IsSea(neighbour) || IsCoast(neighbour) || (IsShipDepot(neighbour) && GetShipDepotWaterOwner(neighbour) == OWNER_WATER); + has_canal |= IsCanal(neighbour) || (IsShipDepot(neighbour) && GetShipDepotWaterOwner(neighbour) != OWNER_WATER); + break; + + case MP_RAILWAY: + /* Shore or flooded halftile */ + has_water |= (GetRailGroundType(neighbour) == RAIL_GROUND_WATER); + break; + + default: break; } } if (has_canal || !has_water) { @@ -414,7 +423,13 @@ static bool IsWateredTile(TileIndex tile) if (!IsCoast(tile)) return true; return IsSlopeWithOneCornerRaised(GetTileSlope(tile, NULL)); - case MP_RAILWAY: return GetRailGroundType(tile) == RAIL_GROUND_WATER; + case MP_RAILWAY: + if (GetRailGroundType(tile) == RAIL_GROUND_WATER) { + assert(IsPlainRailTile(tile)); + return IsSlopeWithOneCornerRaised(GetTileSlope(tile, NULL)); + } + return false; + case MP_STATION: return IsOilRig(tile) || IsDock(tile) || IsBuoy(tile); case MP_INDUSTRY: return (GetIndustrySpec(GetIndustryType(tile))->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0; default: return false; @@ -781,7 +796,7 @@ static void FloodVehicle(Vehicle *v) static FloodingBehaviour GetFloodingBehaviour(TileIndex tile) { /* FLOOD_ACTIVE: 'single-corner-raised'-coast, sea, sea-shipdepots, sea-buoys, rail with flooded halftile - * FLOOD_DRYUP: coast with more than one corner raised + * FLOOD_DRYUP: coast with more than one corner raised, coast with rail-track * FLOOD_PASSIVE: oilrig, dock, water-industries * FLOOD_NONE: canals, rivers, everything else */ @@ -795,7 +810,10 @@ static FloodingBehaviour GetFloodingBehaviour(TileIndex tile) } case MP_RAILWAY: - return ((GetRailGroundType(tile) == RAIL_GROUND_WATER) ? FLOOD_ACTIVE : FLOOD_NONE); + if (GetRailGroundType(tile) == RAIL_GROUND_WATER) { + return (IsSlopeWithOneCornerRaised(GetTileSlope(tile, NULL)) ? FLOOD_ACTIVE : FLOOD_DRYUP); + } + return FLOOD_NONE; case MP_STATION: if (IsSeaBuoyTile(tile)) return FLOOD_ACTIVE; @@ -878,12 +896,35 @@ static void DoFloodTile(TileIndex target) */ static void DoDryUp(TileIndex tile) { - assert(IsTileType(tile, MP_WATER) && IsCoast(tile)); _current_player = OWNER_WATER; - if (CmdSucceeded(DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) { - MakeClear(tile, CLEAR_GRASS, 3); - MarkTileDirtyByTile(tile); + switch (GetTileType(tile)) { + case MP_RAILWAY: + assert(IsPlainRailTile(tile)); + assert(GetRailGroundType(tile) == RAIL_GROUND_WATER); + + RailGroundType new_ground; + switch (GetTrackBits(tile)) { + case TRACK_BIT_UPPER: new_ground = RAIL_GROUND_FENCE_HORIZ1; break; + case TRACK_BIT_LOWER: new_ground = RAIL_GROUND_FENCE_HORIZ2; break; + case TRACK_BIT_LEFT: new_ground = RAIL_GROUND_FENCE_VERT1; break; + case TRACK_BIT_RIGHT: new_ground = RAIL_GROUND_FENCE_VERT2; break; + default: NOT_REACHED(); + } + SetRailGroundType(tile, new_ground); + MarkTileDirtyByTile(tile); + break; + + case MP_WATER: + assert(IsCoast(tile)); + + if (CmdSucceeded(DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) { + MakeClear(tile, CLEAR_GRASS, 3); + MarkTileDirtyByTile(tile); + } + break; + + default: NOT_REACHED(); } _current_player = OWNER_NONE; -- cgit v1.2.3-54-g00ecf