Codechange: Allow passing waypoints to Trigger(Station|RoadStop)Randomisation.

This commit is contained in:
frosch 2025-04-22 18:27:49 +02:00 committed by frosch
parent c0cd7cafe4
commit bc0eaf9ac4
6 changed files with 26 additions and 17 deletions

View File

@ -379,8 +379,7 @@ void AnimateRoadStopTile(TileIndex tile)
void TriggerRoadStopAnimation(BaseStation *st, TileIndex trigger_tile, StationAnimationTrigger trigger, CargoType cargo_type) void TriggerRoadStopAnimation(BaseStation *st, TileIndex trigger_tile, StationAnimationTrigger trigger, CargoType cargo_type)
{ {
/* Get Station if it wasn't supplied */ assert(st != nullptr);
if (st == nullptr) st = BaseStation::GetByTile(trigger_tile);
/* Check the cached animation trigger bitmask to see if we need /* Check the cached animation trigger bitmask to see if we need
* to bother with any further processing. */ * to bother with any further processing. */
@ -417,12 +416,13 @@ void TriggerRoadStopAnimation(BaseStation *st, TileIndex trigger_tile, StationAn
* @param trigger trigger type * @param trigger trigger type
* @param cargo_type cargo type causing the trigger * @param cargo_type cargo type causing the trigger
*/ */
void TriggerRoadStopRandomisation(Station *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type) void TriggerRoadStopRandomisation(BaseStation *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type)
{ {
if (st == nullptr) st = Station::GetByTile(tile); assert(st != nullptr);
/* Check the cached cargo trigger bitmask to see if we need /* Check the cached cargo trigger bitmask to see if we need
* to bother with any further processing. */ * to bother with any further processing.
* Note: cached_roadstop_cargo_triggers must be non-zero even for cargo-independent triggers. */
if (st->cached_roadstop_cargo_triggers == 0) return; if (st->cached_roadstop_cargo_triggers == 0) return;
if (IsValidCargoType(cargo_type) && !HasBit(st->cached_roadstop_cargo_triggers, cargo_type)) return; if (IsValidCargoType(cargo_type) && !HasBit(st->cached_roadstop_cargo_triggers, cargo_type)) return;
@ -431,7 +431,10 @@ void TriggerRoadStopRandomisation(Station *st, TileIndex tile, StationRandomTrig
uint32_t whole_reseed = 0; uint32_t whole_reseed = 0;
/* Bitmask of completely empty cargo types to be matched. */ /* Bitmask of completely empty cargo types to be matched. */
CargoTypes empty_mask = (trigger == StationRandomTrigger::CargoTaken) ? GetEmptyMask(st) : 0; CargoTypes empty_mask{};
if (trigger == StationRandomTrigger::CargoTaken) {
empty_mask = GetEmptyMask(Station::From(st));
}
StationRandomTriggers used_random_triggers; StationRandomTriggers used_random_triggers;
auto process_tile = [&](TileIndex cur_tile) { auto process_tile = [&](TileIndex cur_tile) {

View File

@ -176,7 +176,7 @@ uint16_t GetRoadStopCallback(CallbackID callback, uint32_t param1, uint32_t para
void AnimateRoadStopTile(TileIndex tile); void AnimateRoadStopTile(TileIndex tile);
uint8_t GetRoadStopTileAnimationSpeed(TileIndex tile); uint8_t GetRoadStopTileAnimationSpeed(TileIndex tile);
void TriggerRoadStopAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoType cargo_type = INVALID_CARGO); void TriggerRoadStopAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoType cargo_type = INVALID_CARGO);
void TriggerRoadStopRandomisation(Station *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type = INVALID_CARGO); void TriggerRoadStopRandomisation(BaseStation *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type = INVALID_CARGO);
bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype); bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype);
bool GetIfClassHasNewStopsByType(const RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype); bool GetIfClassHasNewStopsByType(const RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype);

View File

@ -909,8 +909,7 @@ void TriggerStationAnimation(BaseStation *st, TileIndex trigger_tile, StationAni
TA_TILE, TA_WHOLE, TA_WHOLE, TA_PLATFORM, TA_PLATFORM, TA_PLATFORM, TA_WHOLE TA_TILE, TA_WHOLE, TA_WHOLE, TA_PLATFORM, TA_PLATFORM, TA_PLATFORM, TA_WHOLE
}; };
/* Get Station if it wasn't supplied */ assert(st != nullptr);
if (st == nullptr) st = BaseStation::GetByTile(trigger_tile);
/* Check the cached animation trigger bitmask to see if we need /* Check the cached animation trigger bitmask to see if we need
* to bother with any further processing. */ * to bother with any further processing. */
@ -943,18 +942,18 @@ void TriggerStationAnimation(BaseStation *st, TileIndex trigger_tile, StationAni
* @param trigger trigger type * @param trigger trigger type
* @param cargo_type cargo type causing trigger * @param cargo_type cargo type causing trigger
*/ */
void TriggerStationRandomisation(Station *st, TileIndex trigger_tile, StationRandomTrigger trigger, CargoType cargo_type) void TriggerStationRandomisation(BaseStation *st, TileIndex trigger_tile, StationRandomTrigger trigger, CargoType cargo_type)
{ {
/* List of coverage areas for each animation trigger */ /* List of coverage areas for each animation trigger */
static const TriggerArea tas[] = { static const TriggerArea tas[] = {
TA_WHOLE, TA_WHOLE, TA_PLATFORM, TA_PLATFORM, TA_PLATFORM, TA_PLATFORM TA_WHOLE, TA_WHOLE, TA_PLATFORM, TA_PLATFORM, TA_PLATFORM, TA_PLATFORM
}; };
/* Get Station if it wasn't supplied */ assert(st != nullptr);
if (st == nullptr) st = Station::GetByTile(trigger_tile);
/* Check the cached cargo trigger bitmask to see if we need /* Check the cached cargo trigger bitmask to see if we need
* to bother with any further processing. */ * to bother with any further processing.
* Note: cached_cargo_triggers must be non-zero even for cargo-independent triggers. */
if (st->cached_cargo_triggers == 0) return; if (st->cached_cargo_triggers == 0) return;
if (IsValidCargoType(cargo_type) && !HasBit(st->cached_cargo_triggers, cargo_type)) return; if (IsValidCargoType(cargo_type) && !HasBit(st->cached_cargo_triggers, cargo_type)) return;
@ -962,7 +961,10 @@ void TriggerStationRandomisation(Station *st, TileIndex trigger_tile, StationRan
ETileArea area = ETileArea(st, trigger_tile, tas[static_cast<size_t>(trigger)]); ETileArea area = ETileArea(st, trigger_tile, tas[static_cast<size_t>(trigger)]);
/* Bitmask of completely empty cargo types to be matched. */ /* Bitmask of completely empty cargo types to be matched. */
CargoTypes empty_mask = (trigger == StationRandomTrigger::CargoTaken) ? GetEmptyMask(st) : 0; CargoTypes empty_mask{};
if (trigger == StationRandomTrigger::CargoTaken) {
empty_mask = GetEmptyMask(Station::From(st));
}
/* Store triggers now for var 5F */ /* Store triggers now for var 5F */
st->waiting_random_triggers.Set(trigger); st->waiting_random_triggers.Set(trigger);

View File

@ -213,7 +213,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
void AnimateStationTile(TileIndex tile); void AnimateStationTile(TileIndex tile);
void TriggerStationAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoType cargo_type = INVALID_CARGO); void TriggerStationAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoType cargo_type = INVALID_CARGO);
void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type = INVALID_CARGO); void TriggerStationRandomisation(BaseStation *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type = INVALID_CARGO);
void StationUpdateCachedTriggers(BaseStation *st); void StationUpdateCachedTriggers(BaseStation *st);
#endif /* NEWGRF_STATION_H */ #endif /* NEWGRF_STATION_H */

View File

@ -80,7 +80,8 @@ private:
tile = TileAdd(tile, diff); tile = TileAdd(tile, diff);
} while (IsCompatibleTrainStationTile(tile, start) && tile != this->origin_tile); } while (IsCompatibleTrainStationTile(tile, start) && tile != this->origin_tile);
TriggerStationRandomisation(nullptr, start, StationRandomTrigger::PathReservation); auto *st = Station::GetByTile(start);
TriggerStationRandomisation(st, start, StationRandomTrigger::PathReservation);
return true; return true;
} }

View File

@ -113,7 +113,10 @@ bool TryReserveRailTrack(TileIndex tile, Track t, bool trigger_stations)
case MP_STATION: case MP_STATION:
if (HasStationRail(tile) && !HasStationReservation(tile)) { if (HasStationRail(tile) && !HasStationReservation(tile)) {
SetRailStationReservation(tile, true); SetRailStationReservation(tile, true);
if (trigger_stations && IsRailStation(tile)) TriggerStationRandomisation(nullptr, tile, StationRandomTrigger::PathReservation); if (trigger_stations && IsRailStation(tile)) {
auto *st = Station::GetByTile(tile);
TriggerStationRandomisation(st, tile, StationRandomTrigger::PathReservation);
}
MarkTileDirtyByTile(tile); // some GRFs need redraw after reserving track MarkTileDirtyByTile(tile); // some GRFs need redraw after reserving track
return true; return true;
} }