Add signal style flag to require realistic braking

pull/407/head
Jonathan G Rennison 2 years ago
parent bdd97f1aea
commit c19bd4473f

@ -535,6 +535,11 @@ item (FEAT_GLOBALVARS) {
Set whether signals should be drawn on the opposite side of the track for the most recently defined style (defined using the <span class="code">define_style</span> property).
</td>
</tr>
<tr><td>style_realistic_braking_only</td><td>0 or 1</td>
<td>
Set whether signals using this style may only be built when realistic braking is enabled, for the most recently defined style (defined using the <span class="code">define_style</span> property).
</td>
</tr>
<tr><td>no_default_style</td><td>0 or 1</td>
<td>
When enabled, custom signal graphics from this GRF are only used for custom signal styles, not the default style

@ -507,6 +507,13 @@
The Action 0 Id field is not used, the value is ignored.
</p>
<p>This is indicated by the feature name: <font face="monospace">action0_signals_style</font>, version 1</p>
<h4 id="signals_style_realistic_braking_only">Set custom signal style signal requires realistic braking (mappable property: signals_style_realistic_braking_only)</h4>
<p>This applies to the most recent custom signal style defined using the <a href="#signals_define_style">signals_define_style</a> property.<br />
When enabled, signals using this style may only be built when realistic braking is enabled.</p>
<p>The property length is 1 byte. 0 is disabled (default). 1 is enabled.<br />
The Action 0 Id field is not used, the value is ignored.
</p>
<p>This is indicated by the feature name: <font face="monospace">action0_signals_style</font>, version 1</p>
<h4 id="signals_no_default_style">Set whether custom signal sprites should not be used for the default signal style (mappable property: signals_no_default_style)</h4>
<p>This applies to <a href="#a3signals_custom_signal_sprites">Action 2/3 Signals (Feature 0E) custom signal sprites</a> for this GRF.<br />
When enabled, this GRF is not used for the default signal style, it is only used for custom signal styles defined with <a href="#signals_define_style">signals_define_style</a>.</p>

@ -4298,6 +4298,15 @@ static ChangeInfoResult SignalsChangeInfo(uint id, int numinfo, int prop, const
break;
}
case A0RPI_SIGNALS_STYLE_REALISTIC_BRAKING_ONLY: {
if (MappedPropertyLengthMismatch(buf, 1, mapping_entry)) break;
uint8 value = buf->ReadByte();
if (_cur.grffile->current_new_signal_style != nullptr) {
SB(_cur.grffile->current_new_signal_style->style_flags, NSSF_REALISTIC_BRAKING_ONLY, 1, (value != 0 ? 1 : 0));
}
break;
}
default:
ret = HandleAction0PropertyDefault(buf, prop);
break;

@ -102,6 +102,7 @@ extern const GRFPropertyMapDefinition _grf_action0_remappable_properties[] = {
GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_ELECTRIC_ENABLED, "signals_style_electric_enabled"),
GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE, "signals_style_opposite_side"),
GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_COMBINED_NORMAL_SHUNT, "signals_style_combined_normal_shunt"),
GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_REALISTIC_BRAKING_ONLY, "signals_style_realistic_braking_only"),
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_USE_LAND_GROUND, "object_use_land_ground"),
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_EDGE_FOUNDATION_MODE, "object_edge_foundation_mode"),
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_FLOOD_RESISTANT, "object_flood_resistant"),

@ -46,6 +46,7 @@ enum Action0RemapPropertyIds {
A0RPI_SIGNALS_STYLE_ELECTRIC_ENABLED,
A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE,
A0RPI_SIGNALS_STYLE_COMBINED_NORMAL_SHUNT,
A0RPI_SIGNALS_STYLE_REALISTIC_BRAKING_ONLY,
A0RPI_OBJECT_USE_LAND_GROUND,
A0RPI_OBJECT_EDGE_FOUNDATION_MODE,
A0RPI_OBJECT_FLOOD_RESISTANT,

@ -21,6 +21,7 @@ std::vector<const GRFFile *> _new_signals_grfs;
std::array<NewSignalStyle, MAX_NEW_SIGNAL_STYLES> _new_signal_styles;
std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> _new_signal_style_mapping;
uint _num_new_signal_styles = 0;
uint16 _enabled_new_signal_styles_mask = 0;
/* virtual */ uint32 NewSignalsScopeResolver::GetRandomBits() const
{

@ -34,6 +34,7 @@ enum NewSignalStyleFlags {
NSSF_OPPOSITE_SIDE = 3,
NSSF_LOOKAHEAD_SINGLE_SIGNAL = 4,
NSSF_COMBINED_NORMAL_SHUNT = 5,
NSSF_REALISTIC_BRAKING_ONLY = 6,
};
struct NewSignalStyle {
@ -56,6 +57,7 @@ struct NewSignalStyleMapping {
};
extern std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> _new_signal_style_mapping;
extern uint _num_new_signal_styles;
extern uint16 _enabled_new_signal_styles_mask;
/** Resolver for the new signals scope. */
struct NewSignalsScopeResolver : public ScopeResolver {

@ -1481,7 +1481,8 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
uint which_signals = GB(p1, 9, 6);
uint signal_style = std::min<uint>(GB(p1, 19, 4), _num_new_signal_styles);
uint signal_style = GB(p1, 19, 4);
if (signal_style > _num_new_signal_styles || !HasBit(_enabled_new_signal_styles_mask, signal_style)) return CMD_ERROR;
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsSignalTypeUnsuitableForRealisticBraking(sigtype)) return CMD_ERROR;

@ -1876,7 +1876,7 @@ private:
this->realistic_braking_mode = (_settings_game.vehicle.train_braking_model == TBM_REALISTIC);
this->progsig_ui_shown = _settings_client.gui.show_progsig_ui;
this->noentry_ui_shown = _settings_client.gui.show_noentrysig_ui;
this->style_selector_shown = _num_new_signal_styles > 0;
this->style_selector_shown = _enabled_new_signal_styles_mask > 1;
bool show_norm = this->realistic_braking_mode || this->all_signal_mode;
bool show_presig = !this->realistic_braking_mode && this->all_signal_mode;
@ -2106,7 +2106,9 @@ public:
DropDownList list;
list.emplace_back(new DropDownListStringItem(STR_BUILD_SIGNAL_DEFAULT_STYLE, 0, false));
for (uint i = 0; i < _num_new_signal_styles; i++) {
list.emplace_back(new DropDownListStringItem(_new_signal_styles[i].name, i + 1, false));
if (HasBit(_enabled_new_signal_styles_mask, i + 1)) {
list.emplace_back(new DropDownListStringItem(_new_signal_styles[i].name, i + 1, false));
}
}
ShowDropDownList(this, std::move(list), _cur_signal_style, widget);
break;
@ -2148,12 +2150,12 @@ public:
this->SetWidgetDisabledState(WID_BS_DRAG_SIGNALS_DENSITY_DECREASE, _settings_client.gui.drag_signals_density == 1);
this->SetWidgetDisabledState(WID_BS_DRAG_SIGNALS_DENSITY_INCREASE, _settings_client.gui.drag_signals_density == 20);
if (_cur_signal_style > _num_new_signal_styles) _cur_signal_style = 0;
if (_cur_signal_style > _num_new_signal_styles || !HasBit(_enabled_new_signal_styles_mask, _cur_signal_style)) _cur_signal_style = 0;
if (this->all_signal_mode != (_settings_client.gui.signal_gui_mode == SIGNAL_GUI_ALL) || this->progsig_ui_shown != _settings_client.gui.show_progsig_ui ||
this->realistic_braking_mode != (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) ||
this->noentry_ui_shown != _settings_client.gui.show_noentrysig_ui ||
this->style_selector_shown != (_num_new_signal_styles > 0)) {
this->style_selector_shown != (_enabled_new_signal_styles_mask > 1)) {
this->SetSignalUIMode();
this->ReInit();
}

@ -1707,6 +1707,8 @@ static bool DetermineExtraAspectsVariable()
_signal_style_masks = {};
_enabled_new_signal_styles_mask = 1;
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) {
for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
const RailtypeInfo *rti = GetRailTypeInfo(r);
@ -1743,6 +1745,13 @@ static bool DetermineExtraAspectsVariable()
_new_signal_styles[i].electric_mask &= (1 << SIGTYPE_PBS) | (1 << SIGTYPE_PBS_ONEWAY) | (1 << SIGTYPE_NO_ENTRY);
_new_signal_styles[i].semaphore_mask &= (1 << SIGTYPE_PBS) | (1 << SIGTYPE_PBS_ONEWAY) | (1 << SIGTYPE_NO_ENTRY);
}
uint8 mask = 0xFF;
if (HasBit(_new_signal_styles[i].style_flags, NSSF_REALISTIC_BRAKING_ONLY) && _settings_game.vehicle.train_braking_model != TBM_REALISTIC) {
mask = 0;
} else if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) {
mask &= (1 << SIGTYPE_NORMAL) | (1 << SIGTYPE_PBS) | (1 << SIGTYPE_PBS_ONEWAY) | (1 << SIGTYPE_NO_ENTRY);
}
if ((_new_signal_styles[i].electric_mask | _new_signal_styles[i].semaphore_mask) & mask) SetBit(_enabled_new_signal_styles_mask, 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;

Loading…
Cancel
Save