Enable economy day length scaling in wallclock timekeeping mode

tmp-jgrpp
Jonathan G Rennison 3 weeks ago
parent 9a07f14f56
commit d90c540f9e

@ -788,10 +788,10 @@ static int DrawCargoCapacityInfo(int left, int right, int y, TestedEngineDetails
static StringID GetRunningCostString()
{
if (EconTime::UsingWallclockUnits()) {
return STR_PURCHASE_INFO_RUNNINGCOST_PERIOD;
} else if (DayLengthFactor() > 1 && !_settings_client.gui.show_running_costs_calendar_year) {
if (DayLengthFactor() > 1 && !_settings_client.gui.show_running_costs_calendar_year) {
return STR_PURCHASE_INFO_RUNNINGCOST_ORIG_YEAR;
} else if (EconTime::UsingWallclockUnits()) {
return STR_PURCHASE_INFO_RUNNINGCOST_PERIOD;
} else {
return STR_PURCHASE_INFO_RUNNINGCOST_YEAR;
}

@ -467,7 +467,7 @@ static void OnNewEconomyDay()
}
}
static void IncreaseCalendarDate()
void IncreaseCalendarDate()
{
/* If calendar day progress is frozen, don't try to advance time. */
if (CalTime::IsCalendarFrozen()) return;

@ -204,10 +204,10 @@ static StringID ProcessEngineCapacityString(StringID str)
static StringID GetRunningCostString()
{
if (EconTime::UsingWallclockUnits()) {
return STR_ENGINE_PREVIEW_RUNCOST_PERIOD;
} else if (DayLengthFactor() > 1 && !_settings_client.gui.show_running_costs_calendar_year) {
if (DayLengthFactor() > 1 && !_settings_client.gui.show_running_costs_calendar_year) {
return STR_ENGINE_PREVIEW_RUNCOST_ORIG_YEAR;
} else if (EconTime::UsingWallclockUnits()) {
return STR_ENGINE_PREVIEW_RUNCOST_PERIOD;
} else {
return STR_ENGINE_PREVIEW_RUNCOST_YEAR;
}

@ -525,7 +525,7 @@ protected:
if (EconTime::UsingWallclockUnits()) {
auto *wid = this->GetWidget<NWidgetCore>(WID_GRAPH_FOOTER);
if (wid != nullptr) {
wid->SetDataTip(STR_GRAPH_LAST_72_MINUTES_TIME_LABEL, STR_NULL);
wid->SetDataTip((DayLengthFactor() > 1) ? STR_GRAPH_LAST_72_PRODUCTION_INTERVALS_TIME_LABEL : STR_GRAPH_LAST_72_MINUTES_TIME_LABEL, STR_NULL);
}
}
@ -929,7 +929,7 @@ struct DeliveredCargoGraphWindow : ExcludingCargoBaseGraphWindow {
if (EconTime::UsingWallclockUnits()) {
auto *wid = this->GetWidget<NWidgetCore>(WID_GRAPH_FOOTER);
if (wid != nullptr) {
wid->SetDataTip(STR_GRAPH_LAST_72_MINUTES_TIME_LABEL, STR_NULL);
wid->SetDataTip((DayLengthFactor() > 1) ? STR_GRAPH_LAST_72_PRODUCTION_INTERVALS_TIME_LABEL : STR_GRAPH_LAST_72_MINUTES_TIME_LABEL, STR_NULL);
}
}
@ -1301,6 +1301,8 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
}
val *= 74;
val /= _settings_time.ticks_per_minute;
} else if (EconTime::UsingWallclockUnits()) {
decimals = 0;
} else {
if ((10 % DayLengthFactor()) == 0) {
decimals = 0;
@ -1897,7 +1899,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
this->num_on_x_axis = MAX_STATION_CARGO_HISTORY_DAYS; // Four weeks
this->num_vert_lines = MAX_STATION_CARGO_HISTORY_DAYS;
this->draw_dates = false;
const uint16_t x_unit = EconTime::UsingWallclockUnits() ? 4 : 2;
const uint16_t x_unit = EconTime::UsingWallclockUnits() ? 4 * DayLengthFactor() : 2;
this->x_values_start = x_unit;
this->x_values_increment = x_unit;
@ -1924,7 +1926,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
}
if (widget == WID_GRAPH_FOOTER_CUSTOM) {
SetDParam(0, EconTime::UsingWallclockUnits() ? STR_GRAPH_STATION_CARGO_X_LABEL_SECONDS : STR_GRAPH_STATION_CARGO_X_LABEL_DAYS);
SetDParam(1, EconTime::UsingWallclockUnits() ? 96 : 48);
SetDParam(1, EconTime::UsingWallclockUnits() ? 96 * DayLengthFactor() : 48);
}
}

@ -960,7 +960,11 @@ public:
if (i->produced_cargo[j] == INVALID_CARGO) continue;
if (first) {
if (has_accept) ir.top += WidgetDimensions::scaled.vsep_wide;
DrawString(ir, EconTime::UsingWallclockUnits() ? STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE : STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE);
if (EconTime::UsingWallclockUnits()) {
DrawString(ir, (DayLengthFactor() > 1) ? STR_INDUSTRY_VIEW_PRODUCTION_LAST_PRODUCTION_INTERVAL_TITLE : STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE);
} else {
DrawString(ir, STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE);
}
ir.top += GetCharacterHeight(FS_NORMAL);
if (this->editable == EA_RATE) this->production_offset_y = ir.top;
first = false;

@ -74,6 +74,12 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_MINUTES_CUSTOM :Every {COMMA}{N
STR_RIVERS_VERY_MANY :{RED}Very many
STR_RIVERS_EXTREMELY_MANY :{RED}Extremely many
##after STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES
STR_CONFIG_SETTING_BRIBE_HELPTEXT_PERIODS :Allow companies to try bribing the local town authority. If the bribe is noticed by an inspector, the company will not be able to act in the town for half a period
##after STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_PERIODS :If a company buys exclusive transport rights for a town, opponents' stations (passenger and cargo) won't receive any cargo for one period
##end-after
STR_COMMA_SEPARATOR :,{SP}
@ -85,6 +91,7 @@ STR_UNIT_NAME_VELOCITY_GAMEUNITS :tiles/day
STR_UNIT_NAME_VELOCITY_GAMEUNITS_WALLCLOCK :tiles/sec
STR_UNITS_SECONDS_SHORT :{COMMA}{NBSP}s
STR_UNITS_PRODUCTION_INTERVALS :{NUM}{NBSP}production interval{P "" s}
STR_BUTTON_RENAME :{BLACK}Rename
@ -128,11 +135,16 @@ STR_GRAPH_DELIVERED_CARGO_BY_CARGO_MODE :{TINY_FONT}{BLA
STR_GRAPH_DELIVERED_CARGO_BY_COMPANY_MODE_TOOLTIP :{BLACK}Display one line for each selected company
STR_GRAPH_DELIVERED_CARGO_BY_CARGO_MODE_TOOLTIP :{BLACK}Display one line for each selected cargo
STR_GRAPH_LAST_72_PRODUCTION_INTERVALS_TIME_LABEL :{TINY_FONT}{BLACK}Last 72 production intervals
STR_SMALLMAP_SCREENSHOT :{BLACK}Screenshot
STR_NEWS_VEHICLE_NO_DEPOT_ORDER :{WHITE}{VEHICLE} does not have a depot order in its schedule
STR_NEWS_TRAIN_OVERSHOT_STATION :{WHITE}{VEHICLE} failed to stop at {STRING1} due to excessive speed
STR_NEWS_ROAD_REBUILDING_PERIODS :{BIG_FONT}{BLACK}Traffic chaos in {TOWN}!{}{}Road rebuilding programme funded by {RAW_STRING} brings half a period of misery to motorists!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_PERIOD :{BIG_FONT}{BLACK}Local authority of {TOWN} signs contract with {RAW_STRING} for 1 period of exclusive transport rights!
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_MINUTES_CUSTOM_LABEL :Custom interval (real-time minutes)
STR_GAME_OPTIONS_AUTOSAVE_MINUTES_QUERY_CAPT :{WHITE}Autosave interval in real-time minutes
@ -571,15 +583,19 @@ STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT_EXTRA :{STRING}{}This
STR_CONFIG_SETTING_TOWN_CARGO_SCALE_MODE :Time interval for town cargo production scaling: {STRING2}
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_MODE :Time interval for industry cargo production scaling: {STRING2}
STR_CONFIG_SETTING_CARGO_SCALE_MODE_HELPTEXT :Monthly: The cargo production per month is scaled.{}{}Game-time: The cargo production per unit of game time is scaled, (the cargo production per month is also scaled by the day length factor). Very high scaling factors may not be achievable.
STR_CONFIG_SETTING_CARGO_SCALE_MODE_HELPTEXT :Monthly/per production interval: The cargo production per month or production interval is scaled.{}{}Game-time: The cargo production per unit of game time is scaled, (the cargo production per month or production interval is also scaled by the day length factor). Very high scaling factors may not be achievable.
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_MODE_HELPTEXT_EXTRA :{STRING}{}Game-time mode is not guaranteed to be fully compatible with all industry NewGRFs.
STR_CONFIG_SETTING_CARGO_SCALE_MODE_MONTHLY :Monthly
STR_CONFIG_SETTING_CARGO_SCALE_MODE_GAME_TIME :Game-time
STR_CONFIG_SETTING_CARGO_SCALE_MODE_PER_PRODUCTION_INTERVAL :Per production interval
STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY :{NUM}% (monthly)
STR_CONFIG_SETTING_CARGO_SCALE_VALUE_REAL_TIME :{NUM}% (game-time)
STR_CONFIG_SETTING_CARGO_SCALE_VALUE_PER_PRODUCTION_INTERVAL :{NUM}% (per production interval)
STR_CONFIG_SETTING_TOWN_ABOVE_HEIGHT :No towns above height level: {STRING2}
STR_CONFIG_SETTING_TOWN_ABOVE_HEIGHT_HELPTEXT :No towns above the specified height level are built during map creation.
@ -821,6 +837,8 @@ STR_LINKGRAPH_STATS_TOOLTIP_USAGE :{}Usage: {CARGO
STR_LINKGRAPH_STATS_TOOLTIP_PLANNED :{}Planned: {CARGO_LONG}
STR_LINKGRAPH_STATS_TOOLTIP_DISTANCE :Manhattan Distance: {COMMA} tile{P 0 "" s}{}Bird Fly Distance: {COMMA} tile{P 1 "" s}
STR_LINKGRAPH_STATS_TOOLTIP_PRODUCTION_INTERVAL :{BLACK}{CARGO_LONG} to be transported per production interval from {STATION} to {STATION} ({COMMA}% of capacity){RAW_STRING}
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_POLYRAIL :{BLACK}Build railway track using the polyline mode. Ctrl toggles build/remove for railway construction. Shift toggles building/showing cost estimate
STR_BUILD_SIGNAL_SEMAPHORE_PROG_TOOLTIP :{BLACK}Programmable Pre-Signal (semaphore){}The programmable pre-signal is a combo-signal which can be programmed to behave in complex ways.
@ -1335,6 +1353,8 @@ STR_NEWGRF_TOO_MANY_STRINGS_DETAIL :{WHITE}Some nam
STR_TOWN_VIEW_NOISE_IN_TOWN_NO_LIMIT :{BLACK}Noise limit in town: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_LAST_PRODUCTION_INTERVAL_MAX :{BLACK}{CARGO_LIST} last interval: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
###length 6
STR_LOCAL_AUTHORITY_SETTING_OVERRIDE_ALLOW_ROADS :Allowed to build roads
STR_LOCAL_AUTHORITY_SETTING_OVERRIDE_ALLOW_LEVEL_CROSSINGS :Allowed to build level crossings
@ -1473,6 +1493,8 @@ STR_INDUSTRY_VIEW_REQUIRED_TOOLTIP_NEXT :, {STRING}{RAW_
STR_INDUSTRY_VIEW_STOCKPILED_TOOLTIP :{CARGO_LONG} waiting{RAW_STRING}
STR_INDUSTRY_VIEW_TRANSPORTED_TOOLTIP_EXTENSION :{CARGO_LONG}{RAW_STRING} ({COMMA}%)
STR_INDUSTRY_VIEW_PRODUCTION_LAST_PRODUCTION_INTERVAL_TITLE :{BLACK}Production last interval:
STR_DEPOT_VIEW_COUNT_TOOLTIP :{BLACK}{COMMA} vehicle{P "" s} inside
STR_DEPOT_VIEW_COUNT_STOPPED_TOOLTIP :{BLACK}{COMMA} stopped vehicle{P "" s} inside
STR_DEPOT_VIEW_COUNT_WAITING_TOOLTIP :{BLACK}{COMMA} waiting vehicle{P "" s} inside
@ -1485,6 +1507,8 @@ STR_DEPOT_VIEW_MIXED_CONTENTS_TOOLTIP :{BLACK}{STRING1
STR_STATION_VIEW_NAME_TOOLTIP :{STATION}{NBSP}{STATION_FEATURES}
STR_STATION_VIEW_CARGO_LINE_TOOLTIP :{STRING} ({COMMA}%): {CARGO_SHORT}
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_PRODUCTION_INTERVAL :{BLACK}Supply per production interval and local rating:
STR_VEHICLE_LIST_AGE :{STRING2}, Age: {COMMA} year{P "" s} ({COMMA})
STR_VEHICLE_LIST_AGE_RED :{STRING2}, Age: {RED}{COMMA} {BLACK}year{P "" s} ({COMMA})
STR_VEHICLE_LIST_CARGO_LIST :{STRING2}, Cargoes: {CARGO_LIST}
@ -1625,6 +1649,14 @@ STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION :Remove speed re
STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION :Set speed restriction
STR_VEHICLE_DETAILS_REMOVE_FROM_SLOT :Remove from slot:
STR_VEHICLE_DETAILS_PRODUCTION_INTERVALS :Production intervals
STR_VEHICLE_DETAILS_LAST_SERVICE_PRODUCTION_INTERVALS_AGO :Last service: {LTBLUE}{NUM} interval{P "" s} ago
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PRODUCTION_INTERVALS :{BLACK}Servicing interval: {LTBLUE}{COMMA}{NBSP}interval{P "" s}{BLACK} {STRING1}
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PRODINT :{BLACK}Increase servicing interval by 5 production intervals. Ctrl+Click to increase servicing interval by 1 production interval
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PRODINT :{BLACK}Decrease servicing interval by 5 production intervals. Ctrl+Click to decrease servicing interval by 1 production interval
STR_ORDER_DROP_CARGO_TYPE_LOAD :Load by cargo type
STR_ORDER_DROP_CARGO_TYPE_UNLOAD :Unload by cargo type

@ -588,6 +588,10 @@ bool LinkGraphOverlay::ShowTooltip(Point pt, TooltipCloseCondition close_cond)
SetDParam(0, STR_TIMETABLE_MINUTES);
SetDParam(1, time / _settings_time.ticks_per_minute);
GetString(builder, STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION_GENERAL);
} else if (EconTime::UsingWallclockUnits() && DayLengthFactor() > 1) {
SetDParam(0, STR_UNITS_SECONDS);
SetDParam(1, time / (DAY_TICKS / 2));
GetString(builder, STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION_GENERAL);
} else {
SetDParam(0, time / (DAY_TICKS * DayLengthFactor()));
GetString(builder, STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION);
@ -656,7 +660,13 @@ bool LinkGraphOverlay::ShowTooltip(Point pt, TooltipCloseCondition close_cond)
SetDParam(3, i->to_id);
SetDParam(4, link.Usage() * 100 / (link.capacity + 1));
SetDParamStr(5, std::move(buf));
GuiShowTooltips(this->window, EconTime::UsingWallclockUnits() ? STR_LINKGRAPH_STATS_TOOLTIP_MINUTE : STR_LINKGRAPH_STATS_TOOLTIP_MONTH, close_cond);
StringID msg;
if (EconTime::UsingWallclockUnits()) {
msg = (DayLengthFactor() > 1) ? STR_LINKGRAPH_STATS_TOOLTIP_PRODUCTION_INTERVAL : STR_LINKGRAPH_STATS_TOOLTIP_MINUTE;
} else {
msg = STR_LINKGRAPH_STATS_TOOLTIP_MONTH;
}
GuiShowTooltips(this->window, msg, close_cond);
return true;
}
}

@ -117,6 +117,7 @@
void CallLandscapeTick();
void IncreaseDate();
void IncreaseCalendarDate();
void DoPaletteAnimations();
void MusicLoop();
void CallWindowGameTickEvent();
@ -2245,6 +2246,9 @@ void StateGameLoop()
RunAuxiliaryTileLoop();
if (DateDetail::_tick_skip_counter < DayLengthFactor()) {
if (_settings_game.economy.timekeeping_units == TKU_WALLCLOCK && !(_game_mode == GM_MENU || _game_mode == GM_BOOTSTRAP)) {
IncreaseCalendarDate();
}
AnimateAnimatedTiles();
RunTileLoop(true);
CallVehicleTicks();

@ -682,6 +682,10 @@ bool AfterLoadGame()
if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH, 5) && IsSavegameVersionBefore(SLV_ECONOMY_MODE_TIMEKEEPING_UNITS)) {
_settings_game.economy.timekeeping_units = TKU_CALENDAR;
}
/* Wallclock unit games which previously ran at an effective day length of 1 should remain that way */
if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH, 7) && _settings_game.economy.timekeeping_units == TKU_WALLCLOCK) {
_settings_game.economy.day_length_factor = 1;
}
UpdateEffectiveDayLengthFactor();
SetupTickRate();

@ -1095,6 +1095,12 @@ static StringID SettingHelpWallclock(const IntSettingDesc &sd)
return EconTime::UsingWallclockUnits(_game_mode == GM_MENU) ? sd.str_help + 1 : sd.str_help;
}
/** Switch setting help depending on wallclock setting */
static StringID SettingHelpWallclockTriple(const IntSettingDesc &sd)
{
return EconTime::UsingWallclockUnits(_game_mode == GM_MENU) ? sd.str_help + ((GetGameSettings().economy.day_length_factor > 1) ? 2 : 1) : sd.str_help;
}
/** Setting values for velocity unit localisation */
static void SettingsValueVelocityUnit(const IntSettingDesc &, uint first_param, int32_t value)
{
@ -2288,7 +2294,13 @@ static bool TownCargoScaleGUI(SettingOnGuiCtrlData &data)
{
switch (data.type) {
case SOGCT_VALUE_DPARAMS:
if (!EconTime::UsingWallclockUnits(_game_mode == GM_MENU)) SetDParam(data.offset, STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY + GetGameSettings().economy.town_cargo_scale_mode);
if (GetGameSettings().economy.day_length_factor > 1) {
if (GetGameSettings().economy.town_cargo_scale_mode) {
SetDParam(data.offset, STR_CONFIG_SETTING_CARGO_SCALE_VALUE_REAL_TIME);
} else {
SetDParam(data.offset, EconTime::UsingWallclockUnits(_game_mode == GM_MENU) ? STR_CONFIG_SETTING_CARGO_SCALE_VALUE_PER_PRODUCTION_INTERVAL : STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY);
}
}
return true;
default:
@ -2305,7 +2317,27 @@ static bool IndustryCargoScaleGUI(SettingOnGuiCtrlData &data)
return true;
case SOGCT_VALUE_DPARAMS:
if (!EconTime::UsingWallclockUnits(_game_mode == GM_MENU)) SetDParam(data.offset, STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY + GetGameSettings().economy.industry_cargo_scale_mode);
if (GetGameSettings().economy.day_length_factor > 1) {
if (GetGameSettings().economy.town_cargo_scale_mode) {
SetDParam(data.offset, STR_CONFIG_SETTING_CARGO_SCALE_VALUE_REAL_TIME);
} else {
SetDParam(data.offset, EconTime::UsingWallclockUnits(_game_mode == GM_MENU) ? STR_CONFIG_SETTING_CARGO_SCALE_VALUE_PER_PRODUCTION_INTERVAL : STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY);
}
}
return true;
default:
return false;
}
}
static bool TownCargoScaleModeGUI(SettingOnGuiCtrlData &data)
{
switch (data.type) {
case SOGCT_VALUE_DPARAMS:
if (data.text == STR_CONFIG_SETTING_CARGO_SCALE_MODE_MONTHLY && EconTime::UsingWallclockUnits(_game_mode == GM_MENU)) {
data.text = STR_CONFIG_SETTING_CARGO_SCALE_MODE_PER_PRODUCTION_INTERVAL;
}
return true;
default:
@ -2322,7 +2354,7 @@ static bool IndustryCargoScaleModeGUI(SettingOnGuiCtrlData &data)
return true;
default:
return WallclockModeDisabledGUI(data);
return TownCargoScaleModeGUI(data);
}
}

@ -2283,7 +2283,7 @@ static SettingsContainer &GetSettingsTree()
vehicle_windows->Add(new SettingEntry("gui.show_order_number_vehicle_view"));
vehicle_windows->Add(new SettingEntry("gui.show_speed_first_vehicle_view"));
vehicle_windows->Add(new SettingEntry("gui.hide_default_stop_location"));
vehicle_windows->Add(new ConditionallyHiddenSettingEntry("gui.show_running_costs_calendar_year", []() -> bool { return GetGameSettings().economy.timekeeping_units != TKU_CALENDAR; }));
vehicle_windows->Add(new SettingEntry("gui.show_running_costs_calendar_year"));
}
SettingsPage *departureboards = interface->Add(new SettingsPage(STR_CONFIG_SETTING_INTERFACE_DEPARTUREBOARDS));

@ -902,7 +902,7 @@ struct GameSettings {
uint8_t EffectiveDayLengthFactor() const
{
return this->economy.timekeeping_units == TKU_CALENDAR ? this->economy.day_length_factor : 1;
return this->economy.day_length_factor;
}
};

@ -103,7 +103,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 2, 2, "vehicle_repair_cost", nullptr, nullptr, nullptr },
{ XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 4, 4, "enh_viewport_plans", nullptr, nullptr, "PLAN" },
{ XSLFI_INFRA_SHARING, XSCF_NULL, 2, 2, "infra_sharing", nullptr, nullptr, "CPDP" },
{ XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 6, 6, "variable_day_length", nullptr, nullptr, nullptr },
{ XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 7, 7, "variable_day_length", nullptr, nullptr, nullptr },
{ XSLFI_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", nullptr, nullptr, nullptr },
{ XSLFI_MORE_COND_ORDERS, XSCF_NULL, 17, 17, "more_cond_orders", nullptr, nullptr, nullptr },
{ XSLFI_EXTRA_LARGE_MAP, XSCF_NULL, 0, 1, "extra_large_map", nullptr, nullptr, nullptr },

@ -2034,7 +2034,11 @@ struct StationViewWindow : public Window {
tr.top += WidgetDimensions::scaled.vsep_wide;
}
DrawString(tr, EconTime::UsingWallclockUnits() ? STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE : STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH);
if (EconTime::UsingWallclockUnits()) {
DrawString(tr, (DayLengthFactor() > 1) ? STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_PRODUCTION_INTERVAL : STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE);
} else {
DrawString(tr, STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH);
}
tr.top += GetCharacterHeight(FS_NORMAL);
this->ratings_list_y = tr.top;

@ -844,6 +844,7 @@ static const Units _units_time_days_or_seconds[] = {
static const Units _units_time_months_or_minutes[] = {
{ { 1 }, STR_UNITS_MONTHS, 0 },
{ { 1 }, STR_UNITS_MINUTES, 0 },
{ { 1 }, STR_UNITS_PRODUCTION_INTERVALS, 0 },
};
/** Unit conversions for time in calendar years or economic periods */
@ -856,6 +857,7 @@ static const Units _units_time_years_or_periods[] = {
static const Units _units_time_years_or_minutes[] = {
{ { 1 }, STR_UNITS_YEARS, 0 },
{ { 12 }, STR_UNITS_MINUTES, 0 },
{ { 1 }, STR_UNITS_PERIODS, 0 },
};
StringID GetVelocityUnitName(VehicleType type)
@ -1751,13 +1753,16 @@ static void FormatString(StringBuilder builder, const char *str_arg, StringParam
case SCC_UNITS_DAYS_OR_SECONDS: { // {UNITS_DAYS_OR_SECONDS}
uint8_t realtime = EconTime::UsingWallclockUnits(_game_mode == GM_MENU);
const auto &x = _units_time_days_or_seconds[realtime];
auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter<int64_t>()), x.decimal_places);
int64_t duration = args.GetNextParameter<int64_t>();
if (realtime) duration *= DayLengthFactor();
auto tmp_params = MakeParameters(x.c.ToDisplay(duration), x.decimal_places);
FormatString(builder, GetStringPtr(x.s), tmp_params);
break;
}
case SCC_UNITS_MONTHS_OR_MINUTES: { // {UNITS_MONTHS_OR_MINUTES}
uint8_t realtime = EconTime::UsingWallclockUnits(_game_mode == GM_MENU);
if (realtime > 0 && DayLengthFactor() > 1) realtime++;
const auto &x = _units_time_months_or_minutes[realtime];
auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter<int64_t>()), x.decimal_places);
FormatString(builder, GetStringPtr(x.s), tmp_params);
@ -1774,6 +1779,7 @@ static void FormatString(StringBuilder builder, const char *str_arg, StringParam
case SCC_UNITS_YEARS_OR_MINUTES: { // {UNITS_YEARS_OR_MINUTES}
uint8_t realtime = EconTime::UsingWallclockUnits(_game_mode == GM_MENU);
if (realtime > 0 && DayLengthFactor() > 1) realtime++;
const auto &x = _units_time_years_or_minutes[realtime];
auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter<int64_t>()), x.decimal_places);
FormatString(builder, GetStringPtr(x.s), tmp_params);

@ -12,6 +12,7 @@ static size_t ConvertLandscape(const char *value);
static StringID SettingTitleWallclock(const IntSettingDesc &sd);
static StringID SettingHelpWallclock(const IntSettingDesc &sd);
static StringID SettingHelpWallclockTriple(const IntSettingDesc &sd);
/* Callback function used in _settings[] as well as _gui_settings[] */
static void UpdateTimeSettings(int32_t new_value);

@ -24,6 +24,7 @@ static void TownZoneCustomValueChanged(int32_t new_value);
static bool OrderTownGrowthRate(SettingOnGuiCtrlData &data);
static bool TownCargoScaleGUI(SettingOnGuiCtrlData &data);
static bool IndustryCargoScaleGUI(SettingOnGuiCtrlData &data);
static bool TownCargoScaleModeGUI(SettingOnGuiCtrlData &data);
static bool IndustryCargoScaleModeGUI(SettingOnGuiCtrlData &data);
static bool CalendarModeDisabledGUI(SettingOnGuiCtrlData &data);
static bool WallclockModeDisabledGUI(SettingOnGuiCtrlData &data);
@ -236,7 +237,6 @@ strval = STR_JUST_COMMA
post_cb = DayLengthChanged
cat = SC_BASIC
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)
guiproc = WallclockModeDisabledGUI
patxname = ""variable_day_length.economy.day_length_factor""
[SDT_BOOL]
@ -257,7 +257,7 @@ var = economy.bribe
def = true
str = STR_CONFIG_SETTING_BRIBE
strhelp = STR_CONFIG_SETTING_BRIBE_HELPTEXT
help_cb = SettingHelpWallclock
help_cb = SettingHelpWallclockTriple
post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
cat = SC_BASIC
@ -267,7 +267,7 @@ from = SLV_79
def = true
str = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE
strhelp = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT
help_cb = SettingHelpWallclock
help_cb = SettingHelpWallclockTriple
post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
cat = SC_BASIC
@ -789,7 +789,7 @@ strhelp = STR_CONFIG_SETTING_CARGO_SCALE_MODE_HELPTEXT
strval = STR_CONFIG_SETTING_CARGO_SCALE_MODE_MONTHLY
cat = SC_BASIC
post_cb = [](auto) { InvalidateWindowClassesData(WC_GAME_OPTIONS); UpdateCargoScalers(); }
guiproc = WallclockModeDisabledGUI
guiproc = TownCargoScaleModeGUI
[SDT_VAR]
var = economy.industry_cargo_scale_mode

@ -3663,8 +3663,13 @@ static CommandCost TownActionRoadRebuild(Town *t, DoCommandFlag flags)
SetDParam(0, t->index);
SetDParamStr(1, company_name->string);
AddNewsItem(EconTime::UsingWallclockUnits() ? STR_NEWS_ROAD_REBUILDING_MINUTES : STR_NEWS_ROAD_REBUILDING_MONTHS,
NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, company_name);
StringID msg;
if (EconTime::UsingWallclockUnits()) {
msg = (DayLengthFactor() > 1) ? STR_NEWS_ROAD_REBUILDING_PERIODS : STR_NEWS_ROAD_REBUILDING_MINUTES;
} else {
msg = STR_NEWS_ROAD_REBUILDING_MONTHS;
}
AddNewsItem(msg, NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, company_name);
AI::BroadcastNewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
Game::NewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
}
@ -3816,7 +3821,11 @@ static CommandCost TownActionBuyRights(Town *t, DoCommandFlag flags)
/* Spawn news message */
CompanyNewsInformation *cni = new CompanyNewsInformation(Company::Get(_current_company));
SetDParam(0, STR_NEWS_EXCLUSIVE_RIGHTS_TITLE);
SetDParam(1, EconTime::UsingWallclockUnits() ? STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES : STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS);
if (EconTime::UsingWallclockUnits()) {
SetDParam(1, (DayLengthFactor() > 1) ? STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_PERIOD : STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES);
} else {
SetDParam(1, STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS);
}
SetDParam(2, t->index);
SetDParamStr(3, cni->company_name);
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_GENERAL, NF_COMPANY, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cni);

@ -592,7 +592,12 @@ public:
DrawString(tr, STR_TOWN_VIEW_POPULATION_HOUSES);
tr.top += GetCharacterHeight(FS_NORMAL);
StringID str_last_period = EconTime::UsingWallclockUnits() ? STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX : STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX;
StringID str_last_period;
if (EconTime::UsingWallclockUnits()) {
str_last_period = (DayLengthFactor() > 1) ? STR_TOWN_VIEW_CARGO_LAST_PRODUCTION_INTERVAL_MAX : STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX;
} else {
str_last_period = STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX;
}
for (auto tpe : {TPE_PASSENGERS, TPE_MAIL}) {
for (CargoID cid : CargoSpec::town_production_cargoes[tpe]) {

@ -2835,6 +2835,22 @@ static StringID _service_interval_dropdown_wallclock[] = {
INVALID_STRING_ID,
};
static StringID _service_interval_dropdown_wallclock_daylength[] = {
STR_VEHICLE_DETAILS_DEFAULT,
STR_VEHICLE_DETAILS_PRODUCTION_INTERVALS,
STR_VEHICLE_DETAILS_PERCENT,
INVALID_STRING_ID,
};
const StringID *GetServiceIntervalDropDownTexts()
{
if (EconTime::UsingWallclockUnits()) {
return DayLengthFactor() > 1 ? _service_interval_dropdown_wallclock_daylength : _service_interval_dropdown_wallclock;
} else {
return _service_interval_dropdown_calendar;
}
}
/** Class for managing the vehicle details window. */
struct VehicleDetailsWindow : Window {
TrainDetailsWindowTabs tab; ///< For train vehicles: which tab is displayed.
@ -3052,7 +3068,8 @@ struct VehicleDetailsWindow : Window {
case WID_VD_SERVICE_INTERVAL_DROPDOWN: {
Dimension d{0, 0};
for (const StringID *strs : {_service_interval_dropdown_calendar, _service_interval_dropdown_wallclock}) {
{
const StringID *strs = GetServiceIntervalDropDownTexts();
while (*strs != INVALID_STRING_ID) {
d = maxdim(d, GetStringBoundingBox(*strs++));
}
@ -3313,10 +3330,15 @@ struct VehicleDetailsWindow : Window {
/* We're using wallclock units. Show minutes since last serviced. */
if (EconTime::UsingWallclockUnits()) {
int minutes_since_serviced = (EconTime::CurDate() - v->date_of_last_service).base() / EconTime::DAYS_IN_ECONOMY_WALLCLOCK_MONTH;
SetDParam(1, STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO);
SetDParam(1, DayLengthFactor() > 1 ? STR_VEHICLE_DETAILS_LAST_SERVICE_PRODUCTION_INTERVALS_AGO : STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO);
SetDParam(2, minutes_since_serviced);
DrawString(tr.left, tr.right, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)),
v->ServiceIntervalIsPercent() ? STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT : STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES);
StringID str;
if (v->ServiceIntervalIsPercent()) {
str = STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT;
} else {
str = DayLengthFactor() > 1 ? STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PRODUCTION_INTERVALS : STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES;
}
DrawString(tr.left, tr.right, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)), str);
break;
}
@ -3347,10 +3369,8 @@ struct VehicleDetailsWindow : Window {
this->SetWidgetDisabledState(WID_VD_EXTRA_ACTIONS, v->type != VEH_TRAIN && !HasBit(v->vehicle_flags, VF_HAVE_SLOT));
StringID str =
!v->ServiceIntervalIsCustom() ? STR_VEHICLE_DETAILS_DEFAULT :
v->ServiceIntervalIsPercent() ? STR_VEHICLE_DETAILS_PERCENT :
EconTime::UsingWallclockUnits() ? STR_VEHICLE_DETAILS_MINUTES : STR_VEHICLE_DETAILS_DAYS;
const StringID *texts = GetServiceIntervalDropDownTexts();
StringID str = !v->ServiceIntervalIsCustom() ? texts[0] : (v->ServiceIntervalIsPercent() ? texts[2] : texts[1]);
this->GetWidget<NWidgetCore>(WID_VD_SERVICE_INTERVAL_DROPDOWN)->widget_data = str;
this->DrawWidgets();
@ -3380,7 +3400,7 @@ struct VehicleDetailsWindow : Window {
case WID_VD_SERVICE_INTERVAL_DROPDOWN: {
const Vehicle *v = Vehicle::Get(this->window_number);
ShowDropDownMenu(this,
EconTime::UsingWallclockUnits() ? _service_interval_dropdown_wallclock : _service_interval_dropdown_calendar,
GetServiceIntervalDropDownTexts(),
v->ServiceIntervalIsCustom() ? (v->ServiceIntervalIsPercent() ? 2 : 1) : 0, widget, 0, 0, 0, DDSF_SHARED);
break;
}
@ -3431,7 +3451,11 @@ struct VehicleDetailsWindow : Window {
if (v->ServiceIntervalIsPercent()) {
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT;
} else if (EconTime::UsingWallclockUnits()) {
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES;
if (DayLengthFactor() > 1) {
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PRODINT : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PRODINT;
} else {
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES;
}
} else {
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS;
}

Loading…
Cancel
Save