diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 8a7cd0d358..5e2974b2f3 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -546,10 +546,14 @@ static Vehicle *FindShipOnTile(Vehicle *v, void *data) */ static bool HandleSpeedOnAqueduct(Ship *v, TileIndex tile, TileIndex ramp) { + TileIndexDiffC ti = TileIndexDiffCByDir(v->direction); + ShipCollideChecker scc; - scc.search_tile = tile + TileOffsByDir(v->direction); scc.v = v; scc.track_bits = TRACK_BIT_NONE; + scc.search_tile = TileAddWrap(tile, ti.x, ti.y); + + if (scc.search_tile == INVALID_TILE) return false; if (IsValidTile(scc.search_tile) && (HasVehicleOnPos(ramp, &scc, FindShipOnTile) || @@ -580,6 +584,7 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks, TrackBits combine = (v->state | track_bits); if (combine != TRACK_BIT_HORZ && combine != TRACK_BIT_VERT && combine != track_bits) return; + TileIndexDiffC ti; ShipCollideChecker scc; scc.v = v; scc.track_bits = track_bits; @@ -592,15 +597,17 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks, if (IsBridgeTile(tile) && HandleSpeedOnAqueduct(v, tile, tile)) return; scc.track_bits = v->state; - scc.search_tile = TileAddByDiagDir(tile, _ship_search_directions[track][diagdir]); - if (!IsValidTile(scc.search_tile)) return; + ti = TileIndexDiffCByDiagDir(_ship_search_directions[track][diagdir]); + scc.search_tile = TileAddWrap(tile, ti.x, ti.y); + if (scc.search_tile == INVALID_TILE) return; found = HasVehicleOnPos(scc.search_tile, &scc, FindShipOnTile); } if (!found) { scc.track_bits = track_bits; - scc.search_tile = TileAddByDiagDir(scc.search_tile, diagdir); - if (!IsValidTile(scc.search_tile)) return; + ti = TileIndexDiffCByDiagDir(diagdir); + scc.search_tile = TileAddWrap(scc.search_tile, ti.x, ti.y); + if (scc.search_tile == INVALID_TILE) return; found = HasVehicleOnPos(scc.search_tile, &scc, FindShipOnTile); } @@ -616,8 +623,9 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks, while (tracks != TRACK_BIT_NONE) { track = RemoveFirstTrack(&tracks); - TileIndex tile_check = TileAddByDiagDir(tile, _ship_search_directions[track][diagdir]); - if (!IsValidTile(tile_check)) continue; + ti = TileIndexDiffCByDiagDir(_ship_search_directions[track][diagdir]); + TileIndex tile_check = TileAddWrap(tile, ti.x, ti.y); + if (tile_check == INVALID_TILE) continue; if (HasVehicleOnPos(tile_check, &scc, FindShipOnTile)) continue;