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 */
|
/* Bridge entrance */
|
||||||
if (IsBridgeTile(tile) && HandleSpeedOnAqueduct(v, tile, tile)) return;
|
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]);
|
ti = TileIndexDiffCByDiagDir(_ship_search_directions[track][diagdir]);
|
||||||
scc.search_tile = TileAddWrap(tile, ti.x, ti.y);
|
scc.search_tile = TileAddWrap(tile, ti.x, ti.y);
|
||||||
if (scc.search_tile == INVALID_TILE) return;
|
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;
|
v->cur_speed /= scc.search_tile == tile ? 8 : 2;
|
||||||
|
|
||||||
/* Clean none wanted trackbits, including pathfinder track, TRACK_BIT_WORMHOLE and no 90 degree turns. */
|
/* 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) */
|
/* 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) {
|
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);
|
TileIndex tile_check = TileAddWrap(tile, ti.x, ti.y);
|
||||||
if (tile_check == INVALID_TILE) continue;
|
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]);
|
TrackBits bits = GetTileShipTrackStatus(tile_check) & DiagdirReachesTracks(_ship_search_directions[track][diagdir]);
|
||||||
if (!IsDiagonalTrack(track)) bits &= TRACK_BIT_CROSS; // No 90 degree turns.
|
if (!IsDiagonalTrack(track)) bits &= TRACK_BIT_CROSS; // No 90 degree turns.
|
||||||
|
Reference in New Issue
Block a user