diff --git a/src/settings.cpp b/src/settings.cpp index aef37cc363..01e3f0b384 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1709,11 +1709,26 @@ static void ImprovedBreakdownsSettingChanged(int32 new_value) } } +static uint8 _pre_change_day_length_factor; + +static bool DayLengthPreChange(int32 &new_value) +{ + _pre_change_day_length_factor = _settings_game.economy.day_length_factor; + + return true; +} + static void DayLengthChanged(int32 new_value) { + DateTicksScaled old_scaled_date_ticks = _scaled_date_ticks; + DateTicksScaled old_scaled_date_ticks_offset = _scaled_date_ticks_offset; + extern void RebaseScaledDateTicksBase(); RebaseScaledDateTicksBase(); + extern void VehicleDayLengthChanged(DateTicksScaled old_scaled_date_ticks, DateTicksScaled old_scaled_date_ticks_offset, uint8 old_day_length_factor); + VehicleDayLengthChanged(old_scaled_date_ticks, old_scaled_date_ticks_offset, _pre_change_day_length_factor); + MarkWholeScreenDirty(); } diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index 741d55faec..f3c3e31e48 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -52,6 +52,7 @@ static void SpriteZoomMinChanged(int32 new_value); static void MaxVehiclesChanged(int32 new_value); static void InvalidateShipPathCache(int32 new_value); static void ImprovedBreakdownsSettingChanged(int32 new_value); +static bool DayLengthPreChange(int32 &new_value); static void DayLengthChanged(int32 new_value); static void EnableSingleVehSharedOrderGuiChanged(int32 new_value); static void CheckYapfRailSignalPenalties(int32 new_value); @@ -2224,6 +2225,7 @@ max = 125 str = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR strhelp = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR_HELPTEXT strval = STR_JUST_COMMA +pre_cb = DayLengthPreChange post_cb = DayLengthChanged cat = SC_BASIC extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index a625c5622a..c97a1dcd3c 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -4576,6 +4576,33 @@ void ShiftVehicleDates(int interval) } } +extern void VehicleDayLengthChanged(DateTicksScaled old_scaled_date_ticks, DateTicksScaled old_scaled_date_ticks_offset, uint8 old_day_length_factor) +{ + if (_settings_game.economy.day_length_factor == old_day_length_factor || !_settings_game.game_time.time_in_minutes) return; + + for (Vehicle *v : Vehicle::Iterate()) { + if (v->timetable_start != 0) { + DateTicksScaled tt_start = ((int64)v->timetable_start * old_day_length_factor) + v->timetable_start_subticks + old_scaled_date_ticks_offset; + tt_start += (_scaled_date_ticks - old_scaled_date_ticks); + std::tie(v->timetable_start, v->timetable_start_subticks) = ScaledDateTicksToDateTicksAndSubTicks(tt_start); + } + } + + for (OrderList *orderlist : OrderList::Iterate()) { + for (DispatchSchedule &ds : orderlist->GetScheduledDispatchScheduleSet()) { + if (ds.GetScheduledDispatchStartDatePart() >= 0) { + DateTicksScaled start = ((int64)ds.GetScheduledDispatchStartDatePart() * DAY_TICKS * old_day_length_factor) + + ds.GetScheduledDispatchStartDateFractPart() + old_scaled_date_ticks_offset; + start += (_scaled_date_ticks - old_scaled_date_ticks); + Date date; + uint16 full_date_fract; + std::tie(date, full_date_fract) = ScaledDateTicksToDateAndFullSubTicks(start); + ds.SetScheduledDispatchStartDate(date, full_date_fract); + } + } + } +} + /** * Calculates the maximum weight of the ground vehicle when loaded. * @return Weight in tonnes