diff --git a/src/date.cpp b/src/date.cpp index 9c25af40ee..fe0fb78410 100644 --- a/src/date.cpp +++ b/src/date.cpp @@ -28,6 +28,7 @@ Month _cur_month; ///< Current month (0..11) Date _date; ///< Current date in days (day counter) DateFract _date_fract; ///< Fractional part of the day. uint16 _tick_counter; ///< Ever incrementing (and sometimes wrapping) tick counter for setting off various events +uint8 _tick_skip_counter; ///< Counter for ticks, when only vehicles are moving and nothing else happens /** * Set the date. diff --git a/src/date_func.h b/src/date_func.h index 9ac87af61b..bf12ba2ec6 100644 --- a/src/date_func.h +++ b/src/date_func.h @@ -18,7 +18,8 @@ extern Year _cur_year; extern Month _cur_month; extern Date _date; extern DateFract _date_fract; -extern uint16 _tick_counter; +extern uint16 _tick_counter; +extern uint8 _tick_skip_counter; void SetDate(Date date, DateFract fract); void ConvertDateToYMD(Date date, YearMonthDay *ymd); diff --git a/src/lang/english.txt b/src/lang/english.txt index 492e205a84..813e85d5b8 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1590,6 +1590,8 @@ STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentage of l STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percentage of income given to the intermediate legs in feeder systems, giving more control over the income STR_CONFIG_SETTING_SIMULATE_SIGNALS :Simulate signals in tunnels, bridges every: {STRING2} STR_CONFIG_SETTING_SIMULATE_SIGNALS_VALUE :{COMMA} tile{P 0 "" s} +STR_CONFIG_SETTING_DAY_LENGTH_FACTOR :Day length factor: {STRING2} +STR_CONFIG_SETTING_DAY_LENGTH_FACTOR_HELPTEXT :Game pace is slowed by this factor STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :When dragging, place signals every: {STRING2} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Set the distance at which signals will be built on a track up to the next obstacle (signal, junction), if signals are dragged STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tile{P 0 "" s} diff --git a/src/misc.cpp b/src/misc.cpp index 939338af15..4fa0289af7 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -63,6 +63,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin _pause_mode = PM_UNPAUSED; _fast_forward = 0; _tick_counter = 0; + _tick_skip_counter = 0; _cur_tileloop_tile = 1; _thd.redsq = INVALID_TILE; if (reset_settings) MakeNewgameSettingsLive(); diff --git a/src/openttd.cpp b/src/openttd.cpp index 057700f09b..92796e6549 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1394,11 +1394,17 @@ void StateGameLoop() Backup cur_company(_current_company, OWNER_NONE, FILE_LINE); BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP); - AnimateAnimatedTiles(); - IncreaseDate(); - RunTileLoop(); - CallVehicleTicks(); - CallLandscapeTick(); + _tick_skip_counter++; + if (_tick_skip_counter < _settings_game.economy.day_length_factor) { + CallVehicleTicks(); + } else { + _tick_skip_counter = 0; + AnimateAnimatedTiles(); + IncreaseDate(); + RunTileLoop(); + CallVehicleTicks(); + CallLandscapeTick(); + } BasePersistentStorageArray::SwitchMode(PSM_LEAVE_GAMELOOP); #ifndef DEBUG_DUMP_COMMANDS diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 55e274dda3..4d0fdafaa1 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -59,6 +59,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 1, 1, "vehicle_repair_cost", NULL, NULL, NULL }, { XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 1, 1, "enh_viewport_plans", NULL, NULL, "PLAN,PLLN" }, { XSLFI_INFRA_SHARING, XSCF_NULL, 1, 1, "infra_sharing", NULL, NULL, NULL }, + { XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 1, 1, "variable_day_length", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 051bc8161b..b8ce1ea0fe 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -34,6 +34,7 @@ enum SlXvFeatureIndex { XSLFI_VEHICLE_REPAIR_COST, ///< Vehicle repair costs patch XSLFI_ENH_VIEWPORT_PLANS, ///< Enhanced viewport patch: plans XSLFI_INFRA_SHARING, ///< Infrastructure sharing patch + XSLFI_VARIABLE_DAY_LENGTH, ///< Variable day length patch XSLFI_SIZE, ///< Total count of features, including null feature }; diff --git a/src/saveload/misc_sl.cpp b/src/saveload/misc_sl.cpp index c7bd31e81e..e25a8f78ba 100644 --- a/src/saveload/misc_sl.cpp +++ b/src/saveload/misc_sl.cpp @@ -75,6 +75,7 @@ static const SaveLoadGlobVarList _date_desc[] = { SLEG_CONDVAR(_date, SLE_INT32, 31, SL_MAX_VERSION), SLEG_VAR(_date_fract, SLE_UINT16), SLEG_VAR(_tick_counter, SLE_UINT16), + SLEG_CONDVAR_X(_tick_skip_counter, SLE_UINT8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)), SLE_CONDNULL(2, 0, 156), // _vehicle_id_ctr_day SLEG_CONDVAR(_age_cargo_skip_counter, SLE_UINT8, 0, 161), SLE_CONDNULL(1, 0, 45), @@ -100,6 +101,7 @@ static const SaveLoadGlobVarList _date_check_desc[] = { SLEG_CONDVAR(_load_check_data.current_date, SLE_INT32, 31, SL_MAX_VERSION), SLE_NULL(2), // _date_fract SLE_NULL(2), // _tick_counter + SLEG_CONDVAR_X(_tick_skip_counter, SLE_UINT8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)), SLE_CONDNULL(2, 0, 156), // _vehicle_id_ctr_day SLE_CONDNULL(1, 0, 161), // _age_cargo_skip_counter SLE_CONDNULL(1, 0, 45), diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 925aaa4cd0..9f712e8a8c 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1637,6 +1637,7 @@ static SettingsContainer &GetSettingsTree() SettingsPage *accounting = main->Add(new SettingsPage(STR_CONFIG_SETTING_ACCOUNTING)); { accounting->Add(new SettingEntry("economy.inflation")); + accounting->Add(new SettingEntry("economy.day_length_factor")); accounting->Add(new SettingEntry("difficulty.initial_interest")); accounting->Add(new SettingEntry("difficulty.max_loan")); accounting->Add(new SettingEntry("difficulty.subsidy_multiplier")); diff --git a/src/settings_type.h b/src/settings_type.h index 3d555ad3c1..902727db39 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -532,6 +532,7 @@ struct EconomySettings { bool allow_town_level_crossings; ///< towns are allowed to build level crossings int8 town_cargo_factor; ///< power-of-two multiplier for town (passenger, mail) generation. May be negative. bool infrastructure_maintenance; ///< enable monthly maintenance fee for owner infrastructure + uint8 day_length_factor; ///< factor which the length of day is multiplied }; struct LinkGraphSettings { diff --git a/src/table/settings.ini b/src/table/settings.ini index 1a6707704f..479b57dc26 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -1324,6 +1324,20 @@ str = STR_CONFIG_SETTING_INFLATION strhelp = STR_CONFIG_SETTING_INFLATION_HELPTEXT cat = SC_BASIC +[SDT_VAR] +base = GameSettings +var = economy.day_length_factor +type = SLE_UINT8 +def = 1 +min = 1 +max = 125 +str = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR +strhelp = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR_HELPTEXT +strval = STR_JUST_COMMA +cat = SC_BASIC +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH) +patxname = ""variable_day_length.economy.day_length_factor"" + [SDT_VAR] base = GameSettings var = construction.raw_industry_construction diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 3d2f258d94..cc6578799b 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -590,9 +590,9 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) if (v->timetable_start != 0) { #if WALLCLOCK_NETWORK_COMPATIBLE - v->lateness_counter = (_date - v->timetable_start) * DAY_TICKS + _date_fract; + v->lateness_counter = ((_date - v->timetable_start) * DAY_TICKS + _date_fract) * _settings_game.economy.day_length_factor + _tick_skip_counter; #else - v->lateness_counter = (_date * DAY_TICKS) + _date_fract - v->timetable_start; + v->lateness_counter = ((_date * DAY_TICKS) + _date_fract - v->timetable_start) * _settings_game.economy.day_length_factor + _tick_skip_counter; #endif v->timetable_start = 0; } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index cffc35afbf..0a96490085 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -947,7 +947,7 @@ void CallVehicleTicks() { _vehicles_to_autoreplace.Clear(); - RunVehicleDayProc(); + if (_tick_skip_counter == 0) RunVehicleDayProc(); Station *st; FOR_ALL_STATIONS(st) LoadUnloadStation(st);