| Old revision #pwaldxdg9 | New revision #pntsd7s9a | ||
|---|---|---|---|
| 1 | Index: src/station_cmd.cpp | ||
| 2 | =================================================================== | ||
| 3 | --- src/station_cmd.cpp (revision 27632) | ||
| 4 | +++ src/station_cmd.cpp (working copy) | ||
| 5 | @@ -2504,6 +2504,21 @@ | ||
| 6 | return_cmd_error(STR_ERROR_SITE_UNSUITABLE); | ||
| 7 | } | ||
| 8 | |||
| 9 | + TileIndex tc = tile_cur; | ||
| 10 | + DiagDirection dir_rotate = ReverseDiagDir(direction); | ||
| 11 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); | ||
| 12 | + if (ret.Failed()) return ret; | ||
| 13 | + | ||
| 14 | + tc = dir_rotate == DIAGDIR_NE ? tc + TileDiffXY(-1, -1) : dir_rotate == DIAGDIR_NW ? tc + TileDiffXY(1, -1) : dir_rotate == DIAGDIR_SW ? tc + TileDiffXY(1, 1) : tc + TileDiffXY(-1, 1); | ||
| 15 | + dir_rotate = ChangeDiagDir(dir_rotate, DIAGDIRDIFF_90RIGHT); | ||
| 16 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); | ||
| 17 | + if (ret.Failed()) return ret; | ||
| 18 | + | ||
| 19 | + tc = dir_rotate == DIAGDIR_NE ? tc + TileDiffXY(-2, 0) : dir_rotate == DIAGDIR_NW ? tc + TileDiffXY(0, -2) : dir_rotate == DIAGDIR_SW ? tc + TileDiffXY(2, 0) : tc + TileDiffXY(0, 2); | ||
| 20 | + dir_rotate = ReverseDiagDir(dir_rotate); | ||
| 21 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); | ||
| 22 | + if (ret.Failed()) return ret; | ||
| 23 | + | ||
| 24 | TileArea dock_area = TileArea(tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]), | ||
| 25 | _dock_w_chk[direction], _dock_h_chk[direction]); | ||
| 26 | |||
| 27 | Index: src/vehicle.cpp | ||
| 28 | =================================================================== | ||
| 29 | --- src/vehicle.cpp (revision 27632) | ||
| 30 | +++ src/vehicle.cpp (working copy) | ||
| 31 | @@ -484,6 +484,24 @@ | ||
| 32 | return CommandCost(); | ||
| 33 | } | ||
| 34 | |||
| 35 | +/** | ||
| 36 | +* Ensure there is no ship on the water at the given diagonal direction. | ||
| 37 | +* @param tile Position to examine. | ||
| 38 | +* @param diag_dir Diagonal direction | ||
| 39 | +* @return Succeeded command (water is free) or failed command (a ship is found). | ||
| 40 | +*/ | ||
| 41 | +CommandCost EnsureNoShipOnDiagDir(TileIndex tile, DiagDirection diag_dir) | ||
| 42 | +{ | ||
| 43 | + if (HasTileWaterClass(tile)) { | ||
| 44 | + TrackBits tb = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)); | ||
| 45 | + if (((diag_dir == DIAGDIR_NE && (tb & TRACK_BIT_3WAY_NE) != 0) || (diag_dir == DIAGDIR_SE && (tb & TRACK_BIT_3WAY_SE) != 0) || (diag_dir == DIAGDIR_NW && (tb & TRACK_BIT_3WAY_NW) != 0) || (diag_dir == DIAGDIR_SW && (tb & TRACK_BIT_3WAY_SW) != 0) && !IsShipDepotTile(tile) && IsTileType(tile, MP_WATER) && !IsLock(tile))) { | ||
| 46 | + CommandCost ret = EnsureNoVehicleOnGround(tile); | ||
| 47 | + if (ret.Failed()) return ret; | ||
| 48 | + } | ||
| 49 | + } | ||
| 50 | + return CommandCost(); | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | /** Procedure called for every vehicle found in tunnel/bridge in the hash map */ | ||
| 54 | static Vehicle *GetVehicleTunnelBridgeProc(Vehicle *v, void *data) | ||
| 55 | { | ||
| 56 | Index: src/vehicle_func.h | ||
| 57 | =================================================================== | ||
| 58 | --- src/vehicle_func.h (revision 27632) | ||
| 59 | +++ src/vehicle_func.h (working copy) | ||
| 60 | @@ -165,6 +165,7 @@ | ||
| 61 | |||
| 62 | CommandCost EnsureNoVehicleOnGround(TileIndex tile); | ||
| 63 | CommandCost EnsureNoTrainOnTrackBits(TileIndex tile, TrackBits track_bits); | ||
| 64 | +CommandCost EnsureNoShipOnDiagDir(TileIndex tile, DiagDirection diag_dir); | ||
| 65 | |||
| 66 | extern VehicleID _new_vehicle_id; | ||
| 67 | extern uint16 _returned_refit_capacity; | ||
| 1 | Index: src/water_cmd.cpp | 68 | Index: src/water_cmd.cpp |
| 2 | =================================================================== | 69 | =================================================================== |
| 3 | --- src/water_cmd.cpp (revision 27632) | 70 | --- src/water_cmd.cpp (revision 27632) |
| 4 | +++ src/water_cmd.cpp (working copy) | 71 | +++ src/water_cmd.cpp (working copy) |
| 5 | @@ -135,6 +135, | 5 | @@ -135,6 +135,24 @@ |
| 6 | cost.AddCost(ret); | 73 | cost.AddCost(ret); |
| 7 | } | 74 | } |
| 8 | 75 | ||
| 9 | + | 9 | + DiagDirection dir_rotate = axis == AXIS_X ? DIAGDIR_SE : DIAGDIR_NE; |
| 10 | + TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0)); | 77 | + TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0)); |
| 11 | + if (HasTileWaterClass(tc)) { | 11 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 12 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 12 | + if (ret.Failed()) return ret; |
| 13 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 13 | + |
| 14 | + ret = EnsureNoVehicleOnGround(tc); | ||
| 15 | + if (ret.Failed()) return ret; | ||
| 16 | + } | ||
| 17 | + } | ||
| 18 | + tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0)); | 81 | + tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, -1) : TileDiffXY(1, 0)); |
| 19 | + if (HasTileWaterClass(tc)) { | 19 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 20 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 20 | + if (ret.Failed()) return ret; |
| 21 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 21 | + |
| 22 | + ret = EnsureNoVehicleOnGround(tc); | 22 | + dir_rotate = ReverseDiagDir(dir_rotate); |
| 23 | + if (ret.Failed()) return ret; | ||
| 24 | + } | ||
| 25 | + } | ||
| 26 | + tc = tile + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0)); | 86 | + tc = tile + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0)); |
| 27 | + if (HasTileWaterClass(tc)) { | 27 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 28 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 28 | + if (ret.Failed()) return ret; |
| 29 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 29 | + |
| 30 | + ret = EnsureNoVehicleOnGround(tc); | ||
| 31 | + if (ret.Failed()) return ret; | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | + tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0)); | 90 | + tc = tile2 + (axis == AXIS_X ? TileDiffXY(0, 1) : TileDiffXY(-1, 0)); |
| 35 | + if (HasTileWaterClass(tc)) { | 35 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 36 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 36 | + if (ret.Failed()) return ret; |
| 37 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 37 | + |
| 38 | + ret = EnsureNoVehicleOnGround(tc); | ||
| 39 | + if (ret.Failed()) return ret; | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | if (flags & DC_EXEC) { | 94 | if (flags & DC_EXEC) { |
| 43 | Depot *depot = new Depot(tile); | 95 | Depot *depot = new Depot(tile); |
| 44 | depot->build_date = _date; | 96 | depot->build_date = _date; |
| 45 | @@ -372,6 + | 45 | @@ -372,6 +390,25 @@ |
| 46 | DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile)); | 98 | DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile)); |
| 47 | if (dir == INVALID_DIAGDIR) return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); | 99 | if (dir == INVALID_DIAGDIR) return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); |
| 48 | 100 | ||
| 49 | + Axis axis = DiagDirToAxis(dir); | 101 | + Axis axis = DiagDirToAxis(dir); |
| 50 | + TrackBits tb; | 50 | + DiagDirection dir_rotate = (dir == DIAGDIR_NE || dir == DIAGDIR_NW) ? ChangeDiagDir(dir, DIAGDIRDIFF_90RIGHT) : ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT); |
| 51 | + CommandCost ret; | ||
| 52 | + TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(-1, -1) : TileDiffXY(1, -1)); | 103 | + TileIndex tc = tile + (axis == AXIS_X ? TileDiffXY(-1, -1) : TileDiffXY(1, -1)); |
| 53 | + if (HasTileWaterClass(tc)) { | 53 | + CommandCost ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 54 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 54 | + if (ret.Failed()) return ret; |
| 55 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 55 | + |
| 56 | + ret = EnsureNoVehicleOnGround(tc); | ||
| 57 | + if (ret.Failed()) return ret; | ||
| 58 | + } | ||
| 59 | + } | ||
| 60 | + tc = tile + (axis == AXIS_X ? TileDiffXY(1, -1) : TileDiffXY(1, 1)); | 107 | + tc = tile + (axis == AXIS_X ? TileDiffXY(1, -1) : TileDiffXY(1, 1)); |
| 61 | + if (HasTileWaterClass(tc)) { | 61 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 62 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 62 | + if (ret.Failed()) return ret; |
| 63 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_NE) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_SE) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 63 | + |
| 64 | + ret = EnsureNoVehicleOnGround(tc); | 64 | + dir_rotate = ReverseDiagDir(dir_rotate); |
| 65 | + if (ret.Failed()) return ret; | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + tc = tile + (axis == AXIS_X ? TileDiffXY(-1, 1) : TileDiffXY(-1, -1)); | 112 | + tc = tile + (axis == AXIS_X ? TileDiffXY(-1, 1) : TileDiffXY(-1, -1)); |
| 69 | + if (HasTileWaterClass(tc)) { | 69 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 70 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 70 | + if (ret.Failed()) return ret; |
| 71 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 71 | + |
| 72 | + ret = EnsureNoVehicleOnGround(tc); | ||
| 73 | + if (ret.Failed()) return ret; | ||
| 74 | + } | ||
| 75 | + } | ||
| 76 | + tc = tile + (axis == AXIS_X ? TileDiffXY(1, 1) : TileDiffXY(-1, 1)); | 116 | + tc = tile + (axis == AXIS_X ? TileDiffXY(1, 1) : TileDiffXY(-1, 1)); |
| 77 | + if (HasTileWaterClass(tc)) { | 77 | + ret = EnsureNoShipOnDiagDir(tc, dir_rotate); |
| 78 | + tb = TrackStatusToTrackBits(GetTileTrackStatus(tc, TRANSPORT_WATER, 0)); | 78 | + if (ret.Failed()) return ret; |
| 79 | + if (((axis == AXIS_Y && (tb & TRACK_BIT_3WAY_SW) != 0) || (axis == AXIS_X && (tb & TRACK_BIT_3WAY_NW) != 0) && !IsShipDepotTile(tc) && IsTileType(tc, MP_WATER) && !IsLock(tc))) { | 79 | + |
| 80 | + ret = EnsureNoVehicleOnGround(tc); | ||
| 81 | + if (ret.Failed()) return ret; | ||
| 82 | + } | ||
| 83 | + } | ||
| 84 | return DoBuildLock(tile, dir, flags); | 120 | return DoBuildLock(tile, dir, flags); |
| 85 | } | 121 | } |