Fix collision checks for ship collision avoidance
This fixes cases where ships could be redirected in a circle
This commit is contained in:
@@ -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.
|
||||
|
Reference in New Issue
Block a user