Use separate tile hash for each vehicle type

This commit is contained in:
Jonathan G Rennison
2020-02-28 22:21:10 +00:00
parent 4020719227
commit 4108672cf6
14 changed files with 227 additions and 221 deletions

View File

@@ -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.