Add signal style flag to require realistic braking
This commit is contained in:
@@ -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).
|
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>
|
</td>
|
||||||
</tr>
|
</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>
|
<tr><td>no_default_style</td><td>0 or 1</td>
|
||||||
<td>
|
<td>
|
||||||
When enabled, custom signal graphics from this GRF are only used for custom signal styles, not the default style
|
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.
|
The Action 0 Id field is not used, the value is ignored.
|
||||||
</p>
|
</p>
|
||||||
<p>This is indicated by the feature name: <font face="monospace">action0_signals_style</font>, version 1</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>
|
<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 />
|
<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>
|
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;
|
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:
|
default:
|
||||||
ret = HandleAction0PropertyDefault(buf, prop);
|
ret = HandleAction0PropertyDefault(buf, prop);
|
||||||
break;
|
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_ELECTRIC_ENABLED, "signals_style_electric_enabled"),
|
||||||
GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE, "signals_style_opposite_side"),
|
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_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_USE_LAND_GROUND, "object_use_land_ground"),
|
||||||
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_EDGE_FOUNDATION_MODE, "object_edge_foundation_mode"),
|
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_EDGE_FOUNDATION_MODE, "object_edge_foundation_mode"),
|
||||||
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_FLOOD_RESISTANT, "object_flood_resistant"),
|
GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_FLOOD_RESISTANT, "object_flood_resistant"),
|
||||||
|
@@ -46,6 +46,7 @@ enum Action0RemapPropertyIds {
|
|||||||
A0RPI_SIGNALS_STYLE_ELECTRIC_ENABLED,
|
A0RPI_SIGNALS_STYLE_ELECTRIC_ENABLED,
|
||||||
A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE,
|
A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE,
|
||||||
A0RPI_SIGNALS_STYLE_COMBINED_NORMAL_SHUNT,
|
A0RPI_SIGNALS_STYLE_COMBINED_NORMAL_SHUNT,
|
||||||
|
A0RPI_SIGNALS_STYLE_REALISTIC_BRAKING_ONLY,
|
||||||
A0RPI_OBJECT_USE_LAND_GROUND,
|
A0RPI_OBJECT_USE_LAND_GROUND,
|
||||||
A0RPI_OBJECT_EDGE_FOUNDATION_MODE,
|
A0RPI_OBJECT_EDGE_FOUNDATION_MODE,
|
||||||
A0RPI_OBJECT_FLOOD_RESISTANT,
|
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<NewSignalStyle, MAX_NEW_SIGNAL_STYLES> _new_signal_styles;
|
||||||
std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> _new_signal_style_mapping;
|
std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> _new_signal_style_mapping;
|
||||||
uint _num_new_signal_styles = 0;
|
uint _num_new_signal_styles = 0;
|
||||||
|
uint16 _enabled_new_signal_styles_mask = 0;
|
||||||
|
|
||||||
/* virtual */ uint32 NewSignalsScopeResolver::GetRandomBits() const
|
/* virtual */ uint32 NewSignalsScopeResolver::GetRandomBits() const
|
||||||
{
|
{
|
||||||
|
@@ -34,6 +34,7 @@ enum NewSignalStyleFlags {
|
|||||||
NSSF_OPPOSITE_SIDE = 3,
|
NSSF_OPPOSITE_SIDE = 3,
|
||||||
NSSF_LOOKAHEAD_SINGLE_SIGNAL = 4,
|
NSSF_LOOKAHEAD_SINGLE_SIGNAL = 4,
|
||||||
NSSF_COMBINED_NORMAL_SHUNT = 5,
|
NSSF_COMBINED_NORMAL_SHUNT = 5,
|
||||||
|
NSSF_REALISTIC_BRAKING_ONLY = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NewSignalStyle {
|
struct NewSignalStyle {
|
||||||
@@ -56,6 +57,7 @@ struct NewSignalStyleMapping {
|
|||||||
};
|
};
|
||||||
extern std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> _new_signal_style_mapping;
|
extern std::array<NewSignalStyleMapping, MAX_NEW_SIGNAL_STYLES> _new_signal_style_mapping;
|
||||||
extern uint _num_new_signal_styles;
|
extern uint _num_new_signal_styles;
|
||||||
|
extern uint16 _enabled_new_signal_styles_mask;
|
||||||
|
|
||||||
/** Resolver for the new signals scope. */
|
/** Resolver for the new signals scope. */
|
||||||
struct NewSignalsScopeResolver : public ScopeResolver {
|
struct NewSignalsScopeResolver : public ScopeResolver {
|
||||||
|
@@ -1481,7 +1481,8 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
|||||||
|
|
||||||
uint which_signals = GB(p1, 9, 6);
|
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;
|
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->realistic_braking_mode = (_settings_game.vehicle.train_braking_model == TBM_REALISTIC);
|
||||||
this->progsig_ui_shown = _settings_client.gui.show_progsig_ui;
|
this->progsig_ui_shown = _settings_client.gui.show_progsig_ui;
|
||||||
this->noentry_ui_shown = _settings_client.gui.show_noentrysig_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_norm = this->realistic_braking_mode || this->all_signal_mode;
|
||||||
bool show_presig = !this->realistic_braking_mode && this->all_signal_mode;
|
bool show_presig = !this->realistic_braking_mode && this->all_signal_mode;
|
||||||
@@ -2106,8 +2106,10 @@ public:
|
|||||||
DropDownList list;
|
DropDownList list;
|
||||||
list.emplace_back(new DropDownListStringItem(STR_BUILD_SIGNAL_DEFAULT_STYLE, 0, false));
|
list.emplace_back(new DropDownListStringItem(STR_BUILD_SIGNAL_DEFAULT_STYLE, 0, false));
|
||||||
for (uint i = 0; i < _num_new_signal_styles; i++) {
|
for (uint i = 0; i < _num_new_signal_styles; i++) {
|
||||||
|
if (HasBit(_enabled_new_signal_styles_mask, i + 1)) {
|
||||||
list.emplace_back(new DropDownListStringItem(_new_signal_styles[i].name, i + 1, false));
|
list.emplace_back(new DropDownListStringItem(_new_signal_styles[i].name, i + 1, false));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ShowDropDownList(this, std::move(list), _cur_signal_style, widget);
|
ShowDropDownList(this, std::move(list), _cur_signal_style, widget);
|
||||||
break;
|
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_DECREASE, _settings_client.gui.drag_signals_density == 1);
|
||||||
this->SetWidgetDisabledState(WID_BS_DRAG_SIGNALS_DENSITY_INCREASE, _settings_client.gui.drag_signals_density == 20);
|
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 ||
|
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->realistic_braking_mode != (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) ||
|
||||||
this->noentry_ui_shown != _settings_client.gui.show_noentrysig_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)) {
|
||||||
this->SetSignalUIMode();
|
this->SetSignalUIMode();
|
||||||
this->ReInit();
|
this->ReInit();
|
||||||
}
|
}
|
||||||
|
@@ -1707,6 +1707,8 @@ static bool DetermineExtraAspectsVariable()
|
|||||||
|
|
||||||
_signal_style_masks = {};
|
_signal_style_masks = {};
|
||||||
|
|
||||||
|
_enabled_new_signal_styles_mask = 1;
|
||||||
|
|
||||||
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) {
|
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) {
|
||||||
for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
|
for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
|
||||||
const RailtypeInfo *rti = GetRailTypeInfo(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].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);
|
_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++) {
|
for (uint i = _num_new_signal_styles; i < MAX_NEW_SIGNAL_STYLES; i++) {
|
||||||
_new_signal_styles[i].lookahead_extra_aspects = new_extra_aspects;
|
_new_signal_styles[i].lookahead_extra_aspects = new_extra_aspects;
|
||||||
|
Reference in New Issue
Block a user