Add routing restriction action to make exempt from speed adaptation
This commit is contained in:
@@ -429,6 +429,7 @@ CommandCost CopyHeadSpecificThings(Vehicle *old_head, Vehicle *new_head, DoComma
|
||||
|
||||
if (old_head->type == VEH_TRAIN) {
|
||||
Train::From(new_head)->speed_restriction = Train::From(old_head)->speed_restriction;
|
||||
SB(Train::From(new_head)->flags, VRF_SPEED_ADAPTATION_EXEMPT, 1, GB(Train::From(old_head)->flags, VRF_SPEED_ADAPTATION_EXEMPT, 1));
|
||||
}
|
||||
|
||||
/* Transfer any acquired trace restrict slots to the new vehicle */
|
||||
|
@@ -3307,6 +3307,7 @@ STR_TRACE_RESTRICT_SPEED_RESTRICTION :Speed restricti
|
||||
STR_TRACE_RESTRICT_NEWS_CONTROL :News control
|
||||
STR_TRACE_RESTRICT_COUNTER_OP :Counter operation
|
||||
STR_TRACE_RESTRICT_PF_PENALTY_CONTROL :Penalty config
|
||||
STR_TRACE_RESTRICT_SPEED_ADAPTATION_CONTROL :Speed adap. control
|
||||
STR_TRACE_RESTRICT_SLOT_ACQUIRE_WAIT :Acquire or wait
|
||||
STR_TRACE_RESTRICT_SLOT_TRY_ACQUIRE :Try to acquire
|
||||
STR_TRACE_RESTRICT_SLOT_TRY_ACQUIRE_ON_RES :Try to acquire (on reserve)
|
||||
@@ -3357,6 +3358,10 @@ STR_TRACE_RESTRICT_NO_PBS_BACK_PENALTY :Do not apply th
|
||||
STR_TRACE_RESTRICT_NO_PBS_BACK_PENALTY_CANCEL :Cancel do not apply the penalty for passing this PBS signal from the back
|
||||
STR_TRACE_RESTRICT_NO_PBS_BACK_PENALTY_SHORT :No PBS back penalty
|
||||
STR_TRACE_RESTRICT_NO_PBS_BACK_PENALTY_CANCEL_SHORT :Cancel no PBS back penalty
|
||||
STR_TRACE_RESTRICT_MAKE_TRAIN_SPEED_ADAPTATION_EXEMPT :Make train exempt from automatic speed adaptation
|
||||
STR_TRACE_RESTRICT_REMOVE_TRAIN_SPEED_ADAPTATION_EXEMPT :Remove train exemption from automatic speed adaptation
|
||||
STR_TRACE_RESTRICT_MAKE_TRAIN_SPEED_ADAPTATION_EXEMPT_SHORT :Make exempt
|
||||
STR_TRACE_RESTRICT_REMOVE_TRAIN_SPEED_ADAPTATION_EXEMPT_SHORT :Remove exemption
|
||||
STR_TRACE_RESTRICT_TIME_MINUTE :current minute (0 - 59)
|
||||
STR_TRACE_RESTRICT_TIME_HOUR :current hour (0 - 23)
|
||||
STR_TRACE_RESTRICT_TIME_HOUR_MINUTE :current hour and minute (0 - 2359)
|
||||
@@ -5332,6 +5337,7 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacity
|
||||
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer Credits: {LTBLUE}{CURRENCY_LONG}
|
||||
|
||||
STR_VEHICLE_INFO_SPEED_RESTRICTION :{BLACK}Speed restriction: {LTBLUE}{VELOCITY}
|
||||
STR_VEHICLE_INFO_SPEED_ADAPTATION_EXEMPT :{BLACK}Exempt from speed adaptation
|
||||
|
||||
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Servicing interval: {LTBLUE}{COMMA}{NBSP}days{BLACK} Last service: {LTBLUE}{DATE_LONG}
|
||||
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Servicing interval: {LTBLUE}{COMMA}%{BLACK} Last service: {LTBLUE}{DATE_LONG}
|
||||
|
@@ -82,6 +82,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
||||
{ XSLFI_TRACE_RESTRICT_CTGRYCND,XSCF_NULL, 1, 1, "tracerestrict_ctgry_cond", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_TRACE_RESTRICT_PENCTRL, XSCF_NULL, 1, 1, "tracerestrict_pfpenctrl", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_TRACE_RESTRICT_TUNBRIDGE,XSCF_NULL, 1, 1, "tracerestrict_sigtunbridge",nullptr, nullptr, nullptr },
|
||||
{ XSLFI_TRACE_RESTRICT_SPDADAPTCTRL,XSCF_NULL, 1, 1, "tracerestrict_spdadaptctrl",nullptr, nullptr, nullptr },
|
||||
{ XSLFI_PROG_SIGS, XSCF_NULL, 2, 2, "programmable_signals", nullptr, nullptr, "SPRG" },
|
||||
{ XSLFI_ADJACENT_CROSSINGS, XSCF_NULL, 1, 1, "adjacent_crossings", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_SAFER_CROSSINGS, XSCF_NULL, 1, 1, "safer_crossings", nullptr, nullptr, nullptr },
|
||||
|
@@ -35,6 +35,7 @@ enum SlXvFeatureIndex {
|
||||
XSLFI_TRACE_RESTRICT_CTGRYCND, ///< Trace restrict: category conditionals
|
||||
XSLFI_TRACE_RESTRICT_PENCTRL, ///< Trace restrict: PF penalty control
|
||||
XSLFI_TRACE_RESTRICT_TUNBRIDGE, ///< Trace restrict: restricted signalled tunnel/bridge support
|
||||
XSLFI_TRACE_RESTRICT_SPDADAPTCTRL, ///< Trace restrict: speed adaptation control
|
||||
XSLFI_PROG_SIGS, ///< programmable pre-signals patch
|
||||
XSLFI_ADJACENT_CROSSINGS, ///< Adjacent level crossings closure patch
|
||||
XSLFI_SAFER_CROSSINGS, ///< Safer level crossings
|
||||
|
@@ -771,6 +771,24 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp
|
||||
}
|
||||
break;
|
||||
|
||||
case TRIT_SPEED_ADAPTATION_CONTROL:
|
||||
switch (static_cast<TraceRestrictSpeedAdaptationControlField>(GetTraceRestrictValue(item))) {
|
||||
case TRSACF_SPEED_ADAPT_EXEMPT:
|
||||
out.flags |= TRPRF_SPEED_ADAPT_EXEMPT;
|
||||
out.flags &= ~TRPRF_RM_SPEED_ADAPT_EXEMPT;
|
||||
break;
|
||||
|
||||
case TRPPCF_REMOVE_SPEED_ADAPT_EXEMPT:
|
||||
out.flags &= ~TRPRF_SPEED_ADAPT_EXEMPT;
|
||||
out.flags |= TRPRF_RM_SPEED_ADAPT_EXEMPT;
|
||||
break;
|
||||
|
||||
default:
|
||||
NOT_REACHED();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
NOT_REACHED();
|
||||
}
|
||||
@@ -966,6 +984,10 @@ CommandCost TraceRestrictProgram::Validate(const std::vector<TraceRestrictItem>
|
||||
actions_used_flags |= TRPAUF_NO_PBS_BACK_PENALTY;
|
||||
break;
|
||||
|
||||
case TRIT_SPEED_ADAPTATION_CONTROL:
|
||||
actions_used_flags |= TRPAUF_SPEED_ADAPTATION;
|
||||
break;
|
||||
|
||||
default:
|
||||
return_cmd_error(STR_TRACE_RESTRICT_ERROR_VALIDATE_UNKNOWN_INSTRUCTION);
|
||||
}
|
||||
@@ -1032,6 +1054,7 @@ void SetTraceRestrictValueDefault(TraceRestrictItem &item, TraceRestrictValueTyp
|
||||
case TRVT_TIME_DATE_INT:
|
||||
case TRVT_ENGINE_CLASS:
|
||||
case TRVT_PF_PENALTY_CONTROL:
|
||||
case TRVT_SPEED_ADAPTATION_CONTROL:
|
||||
SetTraceRestrictValue(item, 0);
|
||||
if (!IsTraceRestrictTypeAuxSubtype(GetTraceRestrictType(item))) {
|
||||
SetTraceRestrictAuxField(item, 0);
|
||||
|
@@ -160,6 +160,7 @@ enum TraceRestrictItemType {
|
||||
TRIT_NEWS_CONTROL = 50, ///< News control
|
||||
TRIT_COUNTER = 51, ///< Change counter value
|
||||
TRIT_PF_PENALTY_CONTROL = 52, ///< Control base signal penalties
|
||||
TRIT_SPEED_ADAPTATION_CONTROL = 53, ///< Control speed adaptation
|
||||
|
||||
/* space up to 63 */
|
||||
};
|
||||
@@ -291,6 +292,14 @@ enum TraceRestrictPfPenaltyControlField {
|
||||
TRPPCF_CANCEL_NO_PBS_BACK_PENALTY = 1, ///< Cancel do not apply PBS signal back penalty
|
||||
};
|
||||
|
||||
/**
|
||||
* TraceRestrictItem value field, for TRIT_SPEED_ADAPTATION_CONTROL
|
||||
*/
|
||||
enum TraceRestrictSpeedAdaptationControlField {
|
||||
TRSACF_SPEED_ADAPT_EXEMPT = 0, ///< Make train exempt from speed adaptation
|
||||
TRPPCF_REMOVE_SPEED_ADAPT_EXEMPT = 1, ///< Remove train exempt from speed adaptation
|
||||
};
|
||||
|
||||
/**
|
||||
* TraceRestrictItem value field, for TRIT_COND_TRAIN_STATUS
|
||||
*/
|
||||
@@ -387,6 +396,8 @@ enum TraceRestrictProgramResultFlags {
|
||||
TRPRF_SPEED_RESTRICTION_SET = 1 << 6, ///< Speed restriction field set
|
||||
TRPRF_TRAIN_NOT_STUCK = 1 << 7, ///< Train is not stuck
|
||||
TRPRF_NO_PBS_BACK_PENALTY = 1 << 8, ///< Do not apply PBS back penalty
|
||||
TRPRF_SPEED_ADAPT_EXEMPT = 1 << 9, ///< Make speed adaptation exempt
|
||||
TRPRF_RM_SPEED_ADAPT_EXEMPT = 1 << 10, ///< Remove speed adaptation exemption
|
||||
};
|
||||
DECLARE_ENUM_AS_BIT_SET(TraceRestrictProgramResultFlags)
|
||||
|
||||
@@ -409,6 +420,7 @@ enum TraceRestrictProgramActionsUsedFlags {
|
||||
TRPAUF_CHANGE_COUNTER = 1 << 12, ///< Change counter value is present
|
||||
TRPAUF_NO_PBS_BACK_PENALTY = 1 << 13, ///< No PBS back penalty is present
|
||||
TRPAUF_SLOT_ACQUIRE_ON_RES = 1 << 14, ///< Slot acquire (on reserve) action is present
|
||||
TRPAUF_SPEED_ADAPTATION = 1 << 15, ///< Speed adaptation control
|
||||
};
|
||||
DECLARE_ENUM_AS_BIT_SET(TraceRestrictProgramActionsUsedFlags)
|
||||
|
||||
@@ -650,6 +662,7 @@ enum TraceRestrictValueType {
|
||||
TRVT_TIME_DATE_INT = 45,///< takes a TraceRestrictTimeDateValueField, and an integer in the next item slot
|
||||
TRVT_ENGINE_CLASS = 46,///< takes a EngineClass
|
||||
TRVT_PF_PENALTY_CONTROL = 47,///< takes a TraceRestrictPfPenaltyControlField
|
||||
TRVT_SPEED_ADAPTATION_CONTROL = 48,///< takes a TraceRestrictSpeedAdaptationControlField
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -827,6 +840,8 @@ static inline TraceRestrictTypePropertySet GetTraceRestrictTypeProperties(TraceR
|
||||
out.value_type = TRVT_COUNTER_INDEX_INT;
|
||||
} else if (GetTraceRestrictType(item) == TRIT_PF_PENALTY_CONTROL) {
|
||||
out.value_type = TRVT_PF_PENALTY_CONTROL;
|
||||
} else if (GetTraceRestrictType(item) == TRIT_SPEED_ADAPTATION_CONTROL) {
|
||||
out.value_type = TRVT_SPEED_ADAPTATION_CONTROL;
|
||||
} else {
|
||||
out.value_type = TRVT_NONE;
|
||||
}
|
||||
|
@@ -158,6 +158,7 @@ static const StringID _program_insert_str[] = {
|
||||
STR_TRACE_RESTRICT_NEWS_CONTROL,
|
||||
STR_TRACE_RESTRICT_COUNTER_OP,
|
||||
STR_TRACE_RESTRICT_PF_PENALTY_CONTROL,
|
||||
STR_TRACE_RESTRICT_SPEED_ADAPTATION_CONTROL,
|
||||
INVALID_STRING_ID
|
||||
};
|
||||
static const uint32 _program_insert_else_hide_mask = 8; ///< disable bitmask for else
|
||||
@@ -169,6 +170,7 @@ static const uint32 _program_reverse_hide_mask = 0x400; ///< disable bitm
|
||||
static const uint32 _program_speed_res_hide_mask = 0x800; ///< disable bitmask for speed restriction
|
||||
static const uint32 _program_counter_hide_mask = 0x2000; ///< disable bitmask for counter
|
||||
static const uint32 _program_penalty_adj_hide_mask = 0x4000; ///< disable bitmask for penalty adjust
|
||||
static const uint32 _program_speed_adapt_hide_mask = 0x8000; ///< disable bitmask for speed adaptation
|
||||
static const uint _program_insert_val[] = {
|
||||
TRIT_COND_UNDEFINED, // if block
|
||||
TRIT_COND_UNDEFINED | (TRCF_ELSE << 16), // elif block
|
||||
@@ -185,6 +187,7 @@ static const uint _program_insert_val[] = {
|
||||
TRIT_NEWS_CONTROL, // news control
|
||||
TRIT_COUNTER, // counter operation
|
||||
TRIT_PF_PENALTY_CONTROL, // penalty control
|
||||
TRIT_SPEED_ADAPTATION_CONTROL, // speed adaptation control
|
||||
};
|
||||
|
||||
/** insert drop down list strings and values */
|
||||
@@ -403,6 +406,21 @@ static const TraceRestrictDropDownListSet _pf_penalty_control_value = {
|
||||
_pf_penalty_control_value_str, _pf_penalty_control_value_val,
|
||||
};
|
||||
|
||||
static const StringID _speed_adaptation_control_value_str[] = {
|
||||
STR_TRACE_RESTRICT_MAKE_TRAIN_SPEED_ADAPTATION_EXEMPT_SHORT,
|
||||
STR_TRACE_RESTRICT_REMOVE_TRAIN_SPEED_ADAPTATION_EXEMPT_SHORT,
|
||||
INVALID_STRING_ID
|
||||
};
|
||||
static const uint _speed_adaptation_control_value_val[] = {
|
||||
TRSACF_SPEED_ADAPT_EXEMPT,
|
||||
TRPPCF_REMOVE_SPEED_ADAPT_EXEMPT,
|
||||
};
|
||||
|
||||
/** value drop down list for speed adaptation control types strings and values */
|
||||
static const TraceRestrictDropDownListSet _speed_adaptation_control_value = {
|
||||
_speed_adaptation_control_value_str, _speed_adaptation_control_value_val,
|
||||
};
|
||||
|
||||
/**
|
||||
* Get index of @p value in @p list_set
|
||||
* if @p value is not present, assert if @p missing_ok is false, otherwise return -1
|
||||
@@ -464,6 +482,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictG
|
||||
STR_TRACE_RESTRICT_NEWS_CONTROL,
|
||||
STR_TRACE_RESTRICT_COUNTER_OP,
|
||||
STR_TRACE_RESTRICT_PF_PENALTY_CONTROL,
|
||||
STR_TRACE_RESTRICT_SPEED_ADAPTATION_CONTROL,
|
||||
INVALID_STRING_ID,
|
||||
};
|
||||
static const uint val_action[] = {
|
||||
@@ -478,6 +497,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictG
|
||||
TRIT_NEWS_CONTROL,
|
||||
TRIT_COUNTER,
|
||||
TRIT_PF_PENALTY_CONTROL,
|
||||
TRIT_SPEED_ADAPTATION_CONTROL,
|
||||
};
|
||||
static const TraceRestrictDropDownListSet set_action = {
|
||||
str_action, val_action,
|
||||
@@ -549,9 +569,10 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictG
|
||||
if (_settings_client.gui.show_adv_tracerestrict_features) {
|
||||
*hide_mask = 0;
|
||||
} else {
|
||||
*hide_mask = is_conditional ? 0x1FE0000 : 0x6F0;
|
||||
*hide_mask = is_conditional ? 0x1FE0000 : 0xEF0;
|
||||
}
|
||||
if (is_conditional && _settings_game.vehicle.train_braking_model != TBM_REALISTIC) *hide_mask |= 0x1040000;
|
||||
if (!is_conditional && !_settings_game.vehicle.train_speed_adaptation) *hide_mask |= 0x800;
|
||||
}
|
||||
return is_conditional ? &set_cond : &set_action;
|
||||
}
|
||||
@@ -1555,6 +1576,22 @@ static void DrawInstructionString(const TraceRestrictProgram *prog, TraceRestric
|
||||
}
|
||||
break;
|
||||
|
||||
case TRIT_SPEED_ADAPTATION_CONTROL:
|
||||
switch (static_cast<TraceRestrictSpeedAdaptationControlField>(GetTraceRestrictValue(item))) {
|
||||
case TRSACF_SPEED_ADAPT_EXEMPT:
|
||||
instruction_string = STR_TRACE_RESTRICT_MAKE_TRAIN_SPEED_ADAPTATION_EXEMPT;
|
||||
break;
|
||||
|
||||
case TRPPCF_REMOVE_SPEED_ADAPT_EXEMPT:
|
||||
instruction_string = STR_TRACE_RESTRICT_REMOVE_TRAIN_SPEED_ADAPTATION_EXEMPT;
|
||||
break;
|
||||
|
||||
default:
|
||||
NOT_REACHED();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
NOT_REACHED();
|
||||
break;
|
||||
@@ -1682,6 +1719,9 @@ public:
|
||||
hidden |= _program_slot_hide_mask | _program_wait_pbs_hide_mask | _program_reverse_hide_mask |
|
||||
_program_speed_res_hide_mask | _program_counter_hide_mask | _program_penalty_adj_hide_mask;
|
||||
}
|
||||
if (!_settings_client.gui.show_adv_tracerestrict_features || !_settings_game.vehicle.train_speed_adaptation) {
|
||||
hidden |= _program_speed_adapt_hide_mask;
|
||||
}
|
||||
|
||||
this->ShowDropDownListWithValue(&_program_insert, 0, true, TR_WIDGET_INSERT, disabled, hidden, 0);
|
||||
break;
|
||||
@@ -1874,6 +1914,10 @@ public:
|
||||
this->ShowDropDownListWithValue(&_pf_penalty_control_value, GetTraceRestrictValue(item), false, TR_WIDGET_VALUE_DROPDOWN, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case TRVT_SPEED_ADAPTATION_CONTROL:
|
||||
this->ShowDropDownListWithValue(&_speed_adaptation_control_value, GetTraceRestrictValue(item), false, TR_WIDGET_VALUE_DROPDOWN, 0, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -2961,6 +3005,13 @@ private:
|
||||
GetDropDownStringByValue(&_pf_penalty_control_value, GetTraceRestrictValue(item));
|
||||
break;
|
||||
|
||||
case TRVT_SPEED_ADAPTATION_CONTROL:
|
||||
right_sel->SetDisplayedPlane(DPR_VALUE_DROPDOWN);
|
||||
this->EnableWidget(TR_WIDGET_VALUE_DROPDOWN);
|
||||
this->GetWidget<NWidgetCore>(TR_WIDGET_VALUE_DROPDOWN)->widget_data =
|
||||
GetDropDownStringByValue(&_speed_adaptation_control_value, GetTraceRestrictValue(item));
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -46,6 +46,7 @@ enum VehicleRailFlags {
|
||||
VRF_CONSIST_BREAKDOWN = 19,///< one or more vehicles in this consist have a breakdown of some sort (breakdown_ctr != 0)
|
||||
VRF_CONSIST_SPEED_REDUCTION = 20,///< one or more vehicles in this consist may be in a depot or on a bridge (may be false positive but not false negative)
|
||||
VRF_PENDING_SPEED_RESTRICTION = 21,///< This vehicle has one or more pending speed restriction changes
|
||||
VRF_SPEED_ADAPTATION_EXEMPT = 22,///< This vehicle is exempt from train speed adaptation
|
||||
|
||||
VRF_IS_BROKEN = (1 << VRF_BREAKDOWN_POWER) | (1 << VRF_BREAKDOWN_SPEED) | (1 << VRF_BREAKDOWN_STOPPED), ///< Bitmask of all flags that indicate a broken train (braking is not included)
|
||||
};
|
||||
|
@@ -1091,7 +1091,7 @@ Train::MaxSpeedInfo Train::GetCurrentMaxSpeedInfoInternal(bool update_state) con
|
||||
if (this->speed_restriction != 0) {
|
||||
advisory_max_speed = std::min<int>(advisory_max_speed, this->speed_restriction);
|
||||
}
|
||||
if (this->signal_speed_restriction != 0 && _settings_game.vehicle.train_speed_adaptation) {
|
||||
if (this->signal_speed_restriction != 0 && _settings_game.vehicle.train_speed_adaptation && !HasBit(this->flags, VRF_SPEED_ADAPTATION_EXEMPT)) {
|
||||
advisory_max_speed = std::min<int>(advisory_max_speed, this->signal_speed_restriction);
|
||||
}
|
||||
if (this->reverse_distance > 1) {
|
||||
@@ -2271,6 +2271,7 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, uint16 data, uint3
|
||||
/* Copy other important data from the front engine */
|
||||
new_head->CopyVehicleConfigAndStatistics(first);
|
||||
new_head->speed_restriction = first->speed_restriction;
|
||||
SB(Train::From(new_head)->flags, VRF_SPEED_ADAPTATION_EXEMPT, 1, GB(Train::From(first)->flags, VRF_SPEED_ADAPTATION_EXEMPT, 1));
|
||||
GroupStatistics::CountVehicle(new_head, 1); // after copying over the profit
|
||||
} else if (v->IsPrimaryVehicle() && data & (MAKE_ORDER_BACKUP_FLAG >> 20)) {
|
||||
OrderBackup::Backup(v, user);
|
||||
@@ -5268,6 +5269,14 @@ void HandleTraceRestrictSpeedRestrictionAction(const TraceRestrictProgramResult
|
||||
pending_speed_restriction_change_map.insert({ v->index, { (uint16) (v->gcache.cached_total_length + (HasBit(flags, PSRCF_DIAGONAL) ? 8 : 4)), out.speed_restriction, v->speed_restriction, flags } });
|
||||
if ((uint16) (out.speed_restriction + 0xFFFF) < (uint16) (v->speed_restriction + 0xFFFF)) v->speed_restriction = out.speed_restriction;
|
||||
}
|
||||
if (out.flags & TRPRF_SPEED_ADAPT_EXEMPT && !HasBit(v->flags, VRF_SPEED_ADAPTATION_EXEMPT)) {
|
||||
SetBit(v->flags, VRF_SPEED_ADAPTATION_EXEMPT);
|
||||
SetWindowDirty(WC_VEHICLE_DETAILS, v->index);
|
||||
}
|
||||
if (out.flags & TRPRF_RM_SPEED_ADAPT_EXEMPT && HasBit(v->flags, VRF_SPEED_ADAPTATION_EXEMPT)) {
|
||||
ClrBit(v->flags, VRF_SPEED_ADAPTATION_EXEMPT);
|
||||
SetWindowDirty(WC_VEHICLE_DETAILS, v->index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5456,7 +5465,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
|
||||
const Trackdir dir = FindFirstTrackdir(trackdirbits);
|
||||
if (HasSignalOnTrack(gp.new_tile, TrackdirToTrack(dir))) {
|
||||
const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(gp.new_tile, TrackdirToTrack(dir));
|
||||
if (prog && prog->actions_used_flags & (TRPAUF_SLOT_ACQUIRE | TRPAUF_SLOT_RELEASE_FRONT | TRPAUF_REVERSE | TRPAUF_SPEED_RESTRICTION | TRPAUF_CHANGE_COUNTER)) {
|
||||
if (prog && prog->actions_used_flags & (TRPAUF_SLOT_ACQUIRE | TRPAUF_SLOT_RELEASE_FRONT | TRPAUF_REVERSE | TRPAUF_SPEED_RESTRICTION | TRPAUF_SPEED_ADAPTATION | TRPAUF_CHANGE_COUNTER)) {
|
||||
TraceRestrictProgramResult out;
|
||||
TraceRestrictProgramInput input(gp.new_tile, dir, nullptr, nullptr);
|
||||
input.permitted_slot_operations = TRPISP_ACQUIRE | TRPISP_RELEASE_FRONT | TRPISP_CHANGE_COUNTER;
|
||||
@@ -5614,7 +5623,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
|
||||
const Trackdir trackdir = GetTunnelBridgeEntranceTrackdir(old_tile);
|
||||
if (IsTunnelBridgeRestrictedSignal(old_tile)) {
|
||||
const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(old_tile, TrackdirToTrack(trackdir));
|
||||
if (prog && prog->actions_used_flags & (TRPAUF_SLOT_ACQUIRE | TRPAUF_SLOT_RELEASE_FRONT | TRPAUF_SPEED_RESTRICTION | TRPAUF_CHANGE_COUNTER)) {
|
||||
if (prog && prog->actions_used_flags & (TRPAUF_SLOT_ACQUIRE | TRPAUF_SLOT_RELEASE_FRONT | TRPAUF_SPEED_RESTRICTION | TRPAUF_SPEED_ADAPTATION | TRPAUF_CHANGE_COUNTER)) {
|
||||
TraceRestrictProgramResult out;
|
||||
TraceRestrictProgramInput input(old_tile, trackdir, nullptr, nullptr);
|
||||
input.permitted_slot_operations = TRPISP_ACQUIRE | TRPISP_RELEASE_FRONT | TRPISP_CHANGE_COUNTER;
|
||||
@@ -5662,7 +5671,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
|
||||
if (IsTunnelBridgeRestrictedSignal(gp.new_tile) && IsTunnelBridgeSignalSimulationExit(gp.new_tile)) {
|
||||
const Trackdir trackdir = GetTunnelBridgeExitTrackdir(gp.new_tile);
|
||||
const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(gp.new_tile, TrackdirToTrack(trackdir));
|
||||
if (prog && prog->actions_used_flags & (TRPAUF_SLOT_ACQUIRE | TRPAUF_SLOT_RELEASE_FRONT | TRPAUF_SPEED_RESTRICTION | TRPAUF_CHANGE_COUNTER)) {
|
||||
if (prog && prog->actions_used_flags & (TRPAUF_SLOT_ACQUIRE | TRPAUF_SLOT_RELEASE_FRONT | TRPAUF_SPEED_RESTRICTION | TRPAUF_SPEED_ADAPTATION | TRPAUF_CHANGE_COUNTER)) {
|
||||
TraceRestrictProgramResult out;
|
||||
TraceRestrictProgramInput input(gp.new_tile, trackdir, nullptr, nullptr);
|
||||
input.permitted_slot_operations = TRPISP_ACQUIRE | TRPISP_RELEASE_FRONT | TRPISP_CHANGE_COUNTER;
|
||||
|
@@ -4192,6 +4192,7 @@ void DumpVehicleFlagsGeneric(const Vehicle *v, T dump, U dump_header)
|
||||
dump('K', "VRF_CONSIST_BREAKDOWN", HasBit(t->flags, VRF_CONSIST_BREAKDOWN));
|
||||
dump('J', "VRF_CONSIST_SPEED_REDUCTION", HasBit(t->flags, VRF_CONSIST_SPEED_REDUCTION));
|
||||
dump('X', "VRF_PENDING_SPEED_RESTRICTION", HasBit(t->flags, VRF_PENDING_SPEED_RESTRICTION));
|
||||
dump('c', "VRF_SPEED_ADAPTATION_EXEMPT", HasBit(t->flags, VRF_SPEED_ADAPTATION_EXEMPT));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2731,6 +2731,7 @@ struct VehicleDetailsWindow : Window {
|
||||
bool vehicle_weight_ratio_line_shown;
|
||||
bool vehicle_slots_line_shown;
|
||||
bool vehicle_speed_restriction_line_shown;
|
||||
bool vehicle_speed_adaptation_exempt_line_shown;
|
||||
|
||||
/** Initialize a newly created vehicle details window */
|
||||
VehicleDetailsWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc)
|
||||
@@ -2830,6 +2831,12 @@ struct VehicleDetailsWindow : Window {
|
||||
return Train::From(v)->speed_restriction != 0;
|
||||
}
|
||||
|
||||
bool ShouldShowSpeedAdaptationExemptLine(const Vehicle *v) const
|
||||
{
|
||||
if (v->type != VEH_TRAIN) return false;
|
||||
return HasBit(Train::From(v)->flags, VRF_SPEED_ADAPTATION_EXEMPT);
|
||||
}
|
||||
|
||||
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
|
||||
{
|
||||
switch (widget) {
|
||||
@@ -2840,11 +2847,13 @@ struct VehicleDetailsWindow : Window {
|
||||
this->vehicle_weight_ratio_line_shown = ShouldShowWeightRatioLine(v);
|
||||
this->vehicle_slots_line_shown = ShouldShowSlotsLine(v);
|
||||
this->vehicle_speed_restriction_line_shown = ShouldShowSpeedRestrictionLine(v);
|
||||
this->vehicle_speed_adaptation_exempt_line_shown = ShouldShowSpeedAdaptationExemptLine(v);
|
||||
int lines = 4;
|
||||
if (this->vehicle_group_line_shown) lines++;
|
||||
if (this->vehicle_weight_ratio_line_shown) lines++;
|
||||
if (this->vehicle_slots_line_shown) lines++;
|
||||
if (this->vehicle_speed_restriction_line_shown) lines++;
|
||||
if (this->vehicle_speed_adaptation_exempt_line_shown) lines++;
|
||||
size->height = WD_FRAMERECT_TOP + lines * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM;
|
||||
|
||||
for (uint i = 0; i < 5; i++) SetDParamMaxValue(i, INT16_MAX);
|
||||
@@ -3105,10 +3114,17 @@ struct VehicleDetailsWindow : Window {
|
||||
y += FONT_HEIGHT_NORMAL;
|
||||
}
|
||||
|
||||
bool should_show_speed_adaptation_exempt = this->ShouldShowSpeedAdaptationExemptLine(v);
|
||||
if (should_show_speed_adaptation_exempt) {
|
||||
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_VEHICLE_INFO_SPEED_ADAPTATION_EXEMPT);
|
||||
y += FONT_HEIGHT_NORMAL;
|
||||
}
|
||||
|
||||
if (this->vehicle_weight_ratio_line_shown != should_show_weight_ratio ||
|
||||
this->vehicle_weight_ratio_line_shown != should_show_weight_ratio ||
|
||||
this->vehicle_slots_line_shown != should_show_slots ||
|
||||
this->vehicle_speed_restriction_line_shown != should_show_speed_restriction) {
|
||||
this->vehicle_speed_restriction_line_shown != should_show_speed_restriction ||
|
||||
this->vehicle_speed_adaptation_exempt_line_shown != should_show_speed_adaptation_exempt) {
|
||||
const_cast<VehicleDetailsWindow *>(this)->ReInit();
|
||||
}
|
||||
break;
|
||||
|
Reference in New Issue
Block a user