Store signal style GRF to local map in savegame
Update existing signal style IDs as necessary
This commit is contained in:
137
src/signal.cpp
137
src/signal.cpp
@@ -1503,6 +1503,79 @@ void UpdateAllSignalAspects()
|
||||
}
|
||||
}
|
||||
|
||||
void ClearNewSignalStyleMapping()
|
||||
{
|
||||
_new_signal_style_mapping.fill({});
|
||||
}
|
||||
|
||||
static bool RemapNewSignalStyles(const std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> &new_mapping)
|
||||
{
|
||||
const std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> old_mapping = _new_signal_style_mapping;
|
||||
_new_signal_style_mapping = new_mapping;
|
||||
|
||||
uint8 remap_table[MAX_NEW_SIGNAL_STYLES + 1] = {};
|
||||
remap_table[0] = 0;
|
||||
|
||||
uint8 next_free = _num_new_signal_styles;
|
||||
|
||||
bool do_remap = false;
|
||||
for (uint i = 0; i < MAX_NEW_SIGNAL_STYLES; i++) {
|
||||
if (old_mapping[i].grfid == 0) {
|
||||
remap_table[i + 1] = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
auto find_target = [&]() {
|
||||
for (uint j = 0; j < MAX_NEW_SIGNAL_STYLES; j++) {
|
||||
if (old_mapping[i].grfid == _new_signal_style_mapping[j].grfid && old_mapping[i].grf_local_id == _new_signal_style_mapping[j].grf_local_id) {
|
||||
remap_table[i + 1] = j + 1;
|
||||
if (i != j) do_remap = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (next_free < MAX_NEW_SIGNAL_STYLES) {
|
||||
remap_table[i + 1] = next_free + 1;
|
||||
_new_signal_style_mapping[next_free].grfid = old_mapping[i].grfid;
|
||||
_new_signal_style_mapping[next_free].grf_local_id = old_mapping[i].grf_local_id;
|
||||
next_free++;
|
||||
do_remap = true;
|
||||
} else {
|
||||
remap_table[i + 1] = 0;
|
||||
do_remap = true;
|
||||
}
|
||||
};
|
||||
find_target();
|
||||
}
|
||||
|
||||
if (do_remap) {
|
||||
const TileIndex map_size = MapSize();
|
||||
for (TileIndex t = 0; t < map_size; t++) {
|
||||
if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) {
|
||||
SetSignalStyle(t, TRACK_LOWER, remap_table[GetSignalStyle(t, TRACK_LOWER)]);
|
||||
SetSignalStyle(t, TRACK_UPPER, remap_table[GetSignalStyle(t, TRACK_UPPER)]);
|
||||
}
|
||||
if (IsRailTunnelBridgeTile(t) && GetTunnelBridgeDirection(t) < DIAGDIR_SW) {
|
||||
/* Only process west end of tunnel/bridge */
|
||||
uint8 old_style = GetTunnelBridgeSignalStyle(t);
|
||||
uint8 new_style = remap_table[old_style];
|
||||
if (new_style != old_style) {
|
||||
SetTunnelBridgeSignalStyle(t, GetOtherTunnelBridgeEnd(t), new_style);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return do_remap;
|
||||
}
|
||||
|
||||
static void DetermineSignalStyleMapping(std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> &mapping)
|
||||
{
|
||||
for (uint i = 0; i < _num_new_signal_styles; i++) {
|
||||
mapping[i].grfid = _new_signal_styles[i].grffile->grfid;
|
||||
mapping[i].grf_local_id = _new_signal_styles[i].grf_local_id;
|
||||
}
|
||||
}
|
||||
|
||||
static bool DetermineExtraAspectsVariable()
|
||||
{
|
||||
bool changed = false;
|
||||
@@ -1518,30 +1591,31 @@ static bool DetermineExtraAspectsVariable()
|
||||
for (const GRFFile *grf : _new_signals_grfs) {
|
||||
new_extra_aspects = std::max<uint8>(new_extra_aspects, grf->new_signal_extra_aspects);
|
||||
}
|
||||
for (uint i = 0; i < _num_new_signal_styles; i++) {
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_NO_ASPECT_INC)) {
|
||||
SetBit(_signal_style_masks.non_aspect_inc, i + 1);
|
||||
SetBit(_signal_style_masks.no_tunnel_bridge, i + 1);
|
||||
}
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_ALWAYS_RESERVE_THROUGH)) {
|
||||
SetBit(_signal_style_masks.always_reserve_through, i + 1);
|
||||
SetBit(_signal_style_masks.no_tunnel_bridge, i + 1);
|
||||
}
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_LOOKAHEAD_SINGLE_SIGNAL)) {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = 0;
|
||||
SetBit(_signal_style_masks.next_only, i + 1);
|
||||
} else if (HasBit(_new_signal_styles[i].style_flags, NSSF_LOOKAHEAD_ASPECTS_SET)) {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = std::min<uint8>(_new_signal_styles[i].lookahead_extra_aspects, _new_signal_styles[i].grffile->new_signal_extra_aspects);
|
||||
} else {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = _new_signal_styles[i].grffile->new_signal_extra_aspects;
|
||||
}
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_OPPOSITE_SIDE)) {
|
||||
SetBit(_signal_style_masks.signal_opposite_side, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
for (uint i = 0; i < _num_new_signal_styles; i++) {
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_NO_ASPECT_INC)) {
|
||||
SetBit(_signal_style_masks.non_aspect_inc, i + 1);
|
||||
SetBit(_signal_style_masks.no_tunnel_bridge, i + 1);
|
||||
}
|
||||
for (uint i = _num_new_signal_styles; i < MAX_NEW_SIGNAL_STYLES; i++) {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = new_extra_aspects;
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_ALWAYS_RESERVE_THROUGH)) {
|
||||
SetBit(_signal_style_masks.always_reserve_through, i + 1);
|
||||
SetBit(_signal_style_masks.no_tunnel_bridge, i + 1);
|
||||
}
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_LOOKAHEAD_SINGLE_SIGNAL)) {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = 0;
|
||||
SetBit(_signal_style_masks.next_only, i + 1);
|
||||
} else if (HasBit(_new_signal_styles[i].style_flags, NSSF_LOOKAHEAD_ASPECTS_SET)) {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = std::min<uint8>(_new_signal_styles[i].lookahead_extra_aspects, _new_signal_styles[i].grffile->new_signal_extra_aspects);
|
||||
} else {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = _new_signal_styles[i].grffile->new_signal_extra_aspects;
|
||||
}
|
||||
if (HasBit(_new_signal_styles[i].style_flags, NSSF_OPPOSITE_SIDE)) {
|
||||
SetBit(_signal_style_masks.signal_opposite_side, i + 1);
|
||||
}
|
||||
}
|
||||
for (uint i = _num_new_signal_styles; i < MAX_NEW_SIGNAL_STYLES; i++) {
|
||||
_new_signal_styles[i].lookahead_extra_aspects = new_extra_aspects;
|
||||
}
|
||||
|
||||
_extra_aspects = new_extra_aspects;
|
||||
@@ -1561,9 +1635,23 @@ static bool DetermineExtraAspectsVariable()
|
||||
|
||||
void UpdateExtraAspectsVariable()
|
||||
{
|
||||
bool changed = DetermineExtraAspectsVariable();
|
||||
std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> new_mapping;
|
||||
DetermineSignalStyleMapping(new_mapping);
|
||||
|
||||
bool style_remap = false;
|
||||
if (new_mapping != _new_signal_style_mapping) {
|
||||
style_remap = RemapNewSignalStyles(new_mapping);
|
||||
}
|
||||
|
||||
bool style_change = DetermineExtraAspectsVariable();
|
||||
|
||||
if (style_remap || style_change) {
|
||||
if (_networking && !_network_server) {
|
||||
const char *msg = "Network client recalculating signal states and/or signal style mappings, this is likely to cause desyncs";
|
||||
DEBUG(desync, 0, "%s", msg);
|
||||
LogDesyncMsg(msg);
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
UpdateAllSignalReserveThroughBits();
|
||||
if (_extra_aspects > 0) UpdateAllSignalAspects();
|
||||
UpdateAllBlockSignals();
|
||||
@@ -1573,6 +1661,7 @@ void UpdateExtraAspectsVariable()
|
||||
|
||||
void InitialiseExtraAspectsVariable()
|
||||
{
|
||||
DetermineSignalStyleMapping(_new_signal_style_mapping);
|
||||
DetermineExtraAspectsVariable();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user