Use separate tile hash for each vehicle type
This commit is contained in:
@@ -205,7 +205,7 @@ static uint _num_signals_evaluated; ///< Number of programmable pre-signals eval
|
||||
/** Check whether there is a train on rail, not in a depot */
|
||||
static Vehicle *TrainOnTileEnum(Vehicle *v, void *)
|
||||
{
|
||||
if (v->type != VEH_TRAIN || Train::From(v)->track == TRACK_BIT_DEPOT) return nullptr;
|
||||
if (Train::From(v)->track == TRACK_BIT_DEPOT) return nullptr;
|
||||
|
||||
return v;
|
||||
}
|
||||
@@ -214,8 +214,8 @@ static Vehicle *TrainOnTileEnum(Vehicle *v, void *)
|
||||
static Vehicle *TrainInWormholeTileEnum(Vehicle *v, void *data)
|
||||
{
|
||||
/* Only look for front engine or last wagon. */
|
||||
if (v->type != VEH_TRAIN || (v->Previous() != nullptr && v->Next() != nullptr)) return nullptr;
|
||||
TileIndex tile = *(TileIndex *)data;
|
||||
if ((v->Previous() != nullptr && v->Next() != nullptr)) return nullptr;
|
||||
TileIndex tile = (TileIndex) reinterpret_cast<uintptr_t>(data);
|
||||
if (tile != TileVirtXY(v->x_pos, v->y_pos)) return nullptr;
|
||||
if (!(Train::From(v)->track & TRACK_BIT_WORMHOLE) && !(Train::From(v)->track & GetAcrossTunnelBridgeTrackBits(tile))) return nullptr;
|
||||
return v;
|
||||
@@ -313,13 +313,13 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
|
||||
if (IsRailDepot(tile)) {
|
||||
if (enterdir == INVALID_DIAGDIR) { // from 'inside' - train just entered or left the depot
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, VEH_TRAIN, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
exitdir = GetRailDepotDirection(tile);
|
||||
tile += TileOffsByDiagDir(exitdir);
|
||||
enterdir = ReverseDiagDir(exitdir);
|
||||
break;
|
||||
} else if (enterdir == GetRailDepotDirection(tile)) { // entered a depot
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, VEH_TRAIN, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
continue;
|
||||
} else {
|
||||
continue;
|
||||
@@ -336,7 +336,7 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
if (!(info.flags & SF_TRAIN) && EnsureNoTrainOnTrackBits(tile, tracks).Failed()) info.flags |= SF_TRAIN;
|
||||
} else {
|
||||
if (tracks_masked == TRACK_BIT_NONE) continue; // no incidating track
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, VEH_TRAIN, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
}
|
||||
|
||||
if (HasSignals(tile)) { // there is exactly one track - not zero, because there is exit from this tile
|
||||
@@ -390,7 +390,7 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
if (DiagDirToAxis(enterdir) != GetRailStationAxis(tile)) continue; // different axis
|
||||
if (IsStationTileBlocked(tile)) continue; // 'eye-candy' station tile
|
||||
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, VEH_TRAIN, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
tile += TileOffsByDiagDir(exitdir);
|
||||
break;
|
||||
|
||||
@@ -399,7 +399,7 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
if (!IsOneSignalBlock(owner, GetTileOwner(tile))) continue;
|
||||
if (DiagDirToAxis(enterdir) == GetCrossingRoadAxis(tile)) continue; // different axis
|
||||
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, VEH_TRAIN, nullptr, &TrainOnTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (_settings_game.vehicle.safer_crossings) info.flags |= SF_PBS;
|
||||
tile += TileOffsByDiagDir(exitdir);
|
||||
break;
|
||||
@@ -422,7 +422,7 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
return EnsureNoTrainOnTrackBits(tile, tracks & (~across_tracks)).Failed();
|
||||
}
|
||||
} else {
|
||||
return HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum);
|
||||
return HasVehicleOnPos(tile, VEH_TRAIN, nullptr, &TrainOnTileEnum);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -433,8 +433,8 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
if (enterdir == INVALID_DIAGDIR) {
|
||||
// incoming from the wormhole, onto signal
|
||||
if (!(info.flags & SF_TRAIN) && IsTunnelBridgeSignalSimulationExit(tile)) { // tunnel entrance is ignored
|
||||
if (HasVehicleOnPos(GetOtherTunnelBridgeEnd(tile), &tile, &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, &tile, &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (HasVehicleOnPos(GetOtherTunnelBridgeEnd(tile), VEH_TRAIN, reinterpret_cast<void *>(tile), &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && HasVehicleOnPos(tile, VEH_TRAIN, reinterpret_cast<void *>(tile), &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
}
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile) && !_tbuset.Add(tile, INVALID_TRACKDIR)) {
|
||||
info.flags |= SF_FULL;
|
||||
@@ -456,9 +456,9 @@ static SigInfo ExploreSegment(Owner owner)
|
||||
}
|
||||
}
|
||||
if (!(info.flags & SF_TRAIN)) {
|
||||
if (HasVehicleOnPos(tile, &tile, &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (HasVehicleOnPos(tile, VEH_TRAIN, reinterpret_cast<void *>(tile), &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (!(info.flags & SF_TRAIN) && IsTunnelBridgeSignalSimulationExit(tile)) {
|
||||
if (HasVehicleOnPos(GetOtherTunnelBridgeEnd(tile), &tile, &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
if (HasVehicleOnPos(GetOtherTunnelBridgeEnd(tile), VEH_TRAIN, reinterpret_cast<void *>(tile), &TrainInWormholeTileEnum)) info.flags |= SF_TRAIN;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user