Fix collision checks for ship collision avoidance

This fixes cases where ships could be redirected in a circle
pull/221/head
Jonathan G Rennison 3 years ago
parent 93f2d5e056
commit 18471da6e1

@ -670,7 +670,7 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks,
/* Bridge entrance */
if (IsBridgeTile(tile) && HandleSpeedOnAqueduct(v, tile, tile)) return;
scc.track_bits = v->state;
scc.track_bits = TrackToTrackBits(IsDiagonalTrack(track) ? track : TrackToOppositeTrack(track));
ti = TileIndexDiffCByDiagDir(_ship_search_directions[track][diagdir]);
scc.search_tile = TileAddWrap(tile, ti.x, ti.y);
if (scc.search_tile == INVALID_TILE) return;
@ -691,7 +691,11 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks,
v->cur_speed /= scc.search_tile == tile ? 8 : 2;
/* Clean none wanted trackbits, including pathfinder track, TRACK_BIT_WORMHOLE and no 90 degree turns. */
tracks = IsDiagonalTrack(track) ? KillFirstBit(tracks) : (tracks & TRACK_BIT_CROSS);
if (IsDiagonalTrack(track)) {
ClrBit(tracks, track);
} else {
tracks &= TRACK_BIT_CROSS;
}
/* Just follow track 1 tile and see if there is a track to follow. (try not to bang in coast or ship) */
while (tracks != TRACK_BIT_NONE) {
@ -701,7 +705,9 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks,
TileIndex tile_check = TileAddWrap(tile, ti.x, ti.y);
if (tile_check == INVALID_TILE) continue;
if (HasVehicleOnPos(tile_check, VEH_SHIP, &scc, FindShipOnTile)) continue;
scc.search_tile = tile_check;
scc.track_bits = TrackToTrackBits(IsDiagonalTrack(track) ? track : TrackToOppositeTrack(track));
if (HasVehicleOnPos(scc.search_tile, VEH_SHIP, &scc, FindShipOnTile)) continue;
TrackBits bits = GetTileShipTrackStatus(tile_check) & DiagdirReachesTracks(_ship_search_directions[track][diagdir]);
if (!IsDiagonalTrack(track)) bits &= TRACK_BIT_CROSS; // No 90 degree turns.

Loading…
Cancel
Save