Fix bridges not being redrawn after all signals reset when cleared

pull/212/head
Jonathan G Rennison 3 years ago
parent 65d5d13a08
commit d32a282112

@ -107,17 +107,22 @@ void SetBridgeEntranceSimulatedSignalStateExtended(TileIndex t, uint16 signal, S
_m[t].m2 |= BRIDGE_M2_SIGNAL_STATE_EXT_FLAG;
}
void SetAllBridgeEntranceSimulatedSignalsGreenExtended(TileIndex t)
bool SetAllBridgeEntranceSimulatedSignalsGreenExtended(TileIndex t)
{
bool changed = GB(_m[t].m2, BRIDGE_M2_SIGNAL_STATE_OFFSET, BRIDGE_M2_SIGNAL_STATE_COUNT) != 0;
SB(_m[t].m2, BRIDGE_M2_SIGNAL_STATE_OFFSET, BRIDGE_M2_SIGNAL_STATE_FIELD_SIZE, 0);
auto it = _long_bridge_signal_sim_map.find(t);
if (it != _long_bridge_signal_sim_map.end()) {
LongBridgeSignalStorage &lbss = it->second;
for (auto &it : lbss.signal_red_bits) {
it = 0;
if (it != 0) {
changed = true;
it = 0;
}
}
_m[t].m2 |= BRIDGE_M2_SIGNAL_STATE_EXT_FLAG;
}
return changed;
}
void ClearBridgeEntranceSimulatedSignalsExtended(TileIndex t)

@ -53,14 +53,16 @@ static inline void SetBridgeEntranceSimulatedSignalState(TileIndex t, uint16 sig
}
}
void SetAllBridgeEntranceSimulatedSignalsGreenExtended(TileIndex t);
bool SetAllBridgeEntranceSimulatedSignalsGreenExtended(TileIndex t);
static inline void SetAllBridgeEntranceSimulatedSignalsGreen(TileIndex t)
static inline bool SetAllBridgeEntranceSimulatedSignalsGreen(TileIndex t)
{
if (_m[t].m2 & BRIDGE_M2_SIGNAL_STATE_EXT_FLAG) {
SetAllBridgeEntranceSimulatedSignalsGreenExtended(t);
return SetAllBridgeEntranceSimulatedSignalsGreenExtended(t);
} else {
bool changed = GB(_m[t].m2, BRIDGE_M2_SIGNAL_STATE_OFFSET, BRIDGE_M2_SIGNAL_STATE_FIELD_SIZE) != 0;
SB(_m[t].m2, BRIDGE_M2_SIGNAL_STATE_OFFSET, BRIDGE_M2_SIGNAL_STATE_FIELD_SIZE, 0);
return changed;
}
}

@ -2763,8 +2763,14 @@ static void HandleLastTunnelBridgeSignals(TileIndex tile, TileIndex end, DiagDir
if (free) {
/* Open up the wormhole and clear m2. */
if (IsBridge(end)) {
if (IsTunnelBridgeSignalSimulationEntrance(tile)) SetAllBridgeEntranceSimulatedSignalsGreen(tile);
if (IsTunnelBridgeSignalSimulationEntrance(end)) SetAllBridgeEntranceSimulatedSignalsGreen(end);
bool redraw = false;
if (IsTunnelBridgeSignalSimulationEntrance(tile)) {
redraw |= SetAllBridgeEntranceSimulatedSignalsGreen(tile);
}
if (IsTunnelBridgeSignalSimulationEntrance(end)) {
redraw |= SetAllBridgeEntranceSimulatedSignalsGreen(end);
}
if (redraw) MarkBridgeDirty(tile, end, GetTunnelBridgeDirection(tile), GetBridgeHeight(tile), VMDF_NOT_MAP_MODE);
}
if (IsTunnelBridgeSignalSimulationEntrance(end) && GetTunnelBridgeEntranceSignalState(end) == SIGNAL_STATE_RED) {

Loading…
Cancel
Save