From d90c540f9eaf1bec7f73eea319dbc3574f175042 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 30 Apr 2024 01:11:38 +0100 Subject: [PATCH] Enable economy day length scaling in wallclock timekeeping mode --- src/build_vehicle_gui.cpp | 6 ++-- src/date.cpp | 2 +- src/engine_gui.cpp | 6 ++-- src/graph_gui.cpp | 10 +++--- src/industry_gui.cpp | 6 +++- src/lang/extra/english.txt | 34 ++++++++++++++++++- src/linkgraph/linkgraph_gui.cpp | 12 ++++++- src/openttd.cpp | 4 +++ src/saveload/afterload.cpp | 4 +++ src/settings.cpp | 38 +++++++++++++++++++-- src/settings_gui.cpp | 2 +- src/settings_type.h | 2 +- src/sl/extended_ver_sl.cpp | 2 +- src/station_gui.cpp | 6 +++- src/strings.cpp | 8 ++++- src/table/settings.h.preamble | 1 + src/table/settings/economy_settings.ini | 8 ++--- src/town_cmd.cpp | 15 +++++++-- src/town_gui.cpp | 7 +++- src/vehicle_gui.cpp | 44 +++++++++++++++++++------ 20 files changed, 177 insertions(+), 40 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 8b5b212238..7448e6ba55 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -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; } diff --git a/src/date.cpp b/src/date.cpp index 0e5692d3ba..300570d166 100644 --- a/src/date.cpp +++ b/src/date.cpp @@ -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; diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 094a8cc038..e462a58565 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -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; } diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index c881da9681..adee3faaa1 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -525,7 +525,7 @@ protected: if (EconTime::UsingWallclockUnits()) { auto *wid = this->GetWidget(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(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); } } diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index ee258ab6c9..92a1b6496c 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -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; diff --git a/src/lang/extra/english.txt b/src/lang/extra/english.txt index 14c7849d4d..23d613b25e 100644 --- a/src/lang/extra/english.txt +++ b/src/lang/extra/english.txt @@ -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 diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index d452439fee..57da7e45ae 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -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; } } diff --git a/src/openttd.cpp b/src/openttd.cpp index 27a65c1245..0e2514bc15 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -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(); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index ae097bed72..6d68f6ddf8 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -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(); diff --git a/src/settings.cpp b/src/settings.cpp index fb31e70803..fc5b286317 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -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); } } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 02cd9c5da1..1b8385e22b 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -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)); diff --git a/src/settings_type.h b/src/settings_type.h index d9f6918038..a42fe859c0 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -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; } }; diff --git a/src/sl/extended_ver_sl.cpp b/src/sl/extended_ver_sl.cpp index 5b02e4ad55..708a0b7165 100644 --- a/src/sl/extended_ver_sl.cpp +++ b/src/sl/extended_ver_sl.cpp @@ -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 }, diff --git a/src/station_gui.cpp b/src/station_gui.cpp index b9af66cb48..11dabdd67f 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -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; diff --git a/src/strings.cpp b/src/strings.cpp index 02df664121..1a48248060 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -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()), x.decimal_places); + int64_t duration = args.GetNextParameter(); + 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()), 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()), x.decimal_places); FormatString(builder, GetStringPtr(x.s), tmp_params); diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index 892df19f22..8bc6766b18 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -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); diff --git a/src/table/settings/economy_settings.ini b/src/table/settings/economy_settings.ini index 61db37857f..7febd37e75 100644 --- a/src/table/settings/economy_settings.ini +++ b/src/table/settings/economy_settings.ini @@ -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 diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 0338deb736..32ce9d06c4 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -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); diff --git a/src/town_gui.cpp b/src/town_gui.cpp index b220be0df4..e935a10a3c 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -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]) { diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 8048ea4966..772c1080ee 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -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(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; }