From ca146c8ddd955cd61c2541bc5a9334abf3ebc79b Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 20 Feb 2024 23:56:46 +0000 Subject: [PATCH] Fix #12145: Incorrect date handling in date cheat in wallclock time-keeping mode --- src/cheat_gui.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index bbc518047f..0a1f7fbeee 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -107,18 +107,21 @@ static int32_t ClickChangeDateCheat(int32_t new_value, int32_t) TimerGameCalendar::YearMonthDay ymd = TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date); TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(new_year, ymd.month, ymd.day); - /* Keep economy and calendar dates synced. */ - TimerGameEconomy::Date new_economy_date = new_calendar_date.base(); - /* Shift cached dates before we change the date. */ - for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date); - LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date); - - /* Now it's safe to actually change the date. */ TimerGameCalendar::SetDate(new_calendar_date, TimerGameCalendar::date_fract); /* If not using wallclock units, we keep economy date in sync with calendar date and must change it also. */ - if (!TimerGameEconomy::UsingWallclockUnits()) TimerGameEconomy::SetDate(new_economy_date, TimerGameEconomy::date_fract); + if (!TimerGameEconomy::UsingWallclockUnits()) { + /* Keep economy and calendar dates synced. */ + TimerGameEconomy::Date new_economy_date = new_calendar_date.base(); + + /* Shift cached dates before we change the date. */ + for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date); + LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date); + + /* Now it's safe to actually change the date. */ + TimerGameEconomy::SetDate(new_economy_date, TimerGameEconomy::date_fract); + } CalendarEnginesMonthlyLoop(); SetWindowDirty(WC_STATUS_BAR, 0);