Use separate tile hash for each vehicle type
This commit is contained in:
@@ -343,7 +343,7 @@ void Ship::UpdateDeltaXY()
|
||||
*/
|
||||
static Vehicle *EnsureNoVisibleShipProc(Vehicle *v, void *data)
|
||||
{
|
||||
return v->type == VEH_SHIP && (v->vehstatus & VS_HIDDEN) == 0 ? v : nullptr;
|
||||
return (v->vehstatus & VS_HIDDEN) == 0 ? v : nullptr;
|
||||
}
|
||||
|
||||
static bool CheckShipLeaveDepot(Ship *v)
|
||||
@@ -369,7 +369,7 @@ static bool CheckShipLeaveDepot(Ship *v)
|
||||
|
||||
/* Don't leave depot if another vehicle is already entering/leaving */
|
||||
/* This helps avoid CPU load if many ships are set to start at the same time */
|
||||
if (HasVehicleOnPos(v->tile, nullptr, &EnsureNoVisibleShipProc)) return true;
|
||||
if (HasVehicleOnPos(v->tile, VEH_SHIP, nullptr, &EnsureNoVisibleShipProc)) return true;
|
||||
|
||||
TileIndex tile = v->tile;
|
||||
Axis axis = GetShipDepotAxis(tile);
|
||||
@@ -588,8 +588,6 @@ struct ShipCollideChecker {
|
||||
/** Helper function for collision avoidance. */
|
||||
static Vehicle *FindShipOnTile(Vehicle *v, void *data)
|
||||
{
|
||||
if (v->type != VEH_SHIP) return nullptr;
|
||||
|
||||
ShipCollideChecker *scc = (ShipCollideChecker*)data;
|
||||
|
||||
/* Don't detect vehicles on different parallel tracks. */
|
||||
@@ -624,8 +622,8 @@ static bool HandleSpeedOnAqueduct(Ship *v, TileIndex tile, TileIndex ramp)
|
||||
if (scc.search_tile == INVALID_TILE) return false;
|
||||
|
||||
if (IsValidTile(scc.search_tile) &&
|
||||
(HasVehicleOnPos(ramp, &scc, FindShipOnTile) ||
|
||||
HasVehicleOnPos(GetOtherTunnelBridgeEnd(ramp), &scc, FindShipOnTile))) {
|
||||
(HasVehicleOnPos(ramp, VEH_SHIP, &scc, FindShipOnTile) ||
|
||||
HasVehicleOnPos(GetOtherTunnelBridgeEnd(ramp), VEH_SHIP, &scc, FindShipOnTile))) {
|
||||
v->cur_speed /= 4;
|
||||
}
|
||||
return false;
|
||||
@@ -664,7 +662,7 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks,
|
||||
scc.track_bits = track_bits;
|
||||
scc.search_tile = tile;
|
||||
|
||||
bool found = HasVehicleOnPos(tile, &scc, FindShipOnTile);
|
||||
bool found = HasVehicleOnPos(tile, VEH_SHIP, &scc, FindShipOnTile);
|
||||
|
||||
if (!found) {
|
||||
/* Bridge entrance */
|
||||
@@ -675,7 +673,7 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks,
|
||||
scc.search_tile = TileAddWrap(tile, ti.x, ti.y);
|
||||
if (scc.search_tile == INVALID_TILE) return;
|
||||
|
||||
found = HasVehicleOnPos(scc.search_tile, &scc, FindShipOnTile);
|
||||
found = HasVehicleOnPos(scc.search_tile, VEH_SHIP, &scc, FindShipOnTile);
|
||||
}
|
||||
if (!found) {
|
||||
scc.track_bits = track_bits;
|
||||
@@ -683,7 +681,7 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks,
|
||||
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);
|
||||
found = HasVehicleOnPos(scc.search_tile, VEH_SHIP, &scc, FindShipOnTile);
|
||||
}
|
||||
if (found) {
|
||||
|
||||
@@ -701,7 +699,7 @@ 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, &scc, FindShipOnTile)) continue;
|
||||
if (HasVehicleOnPos(tile_check, 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