From f180262aee5d6c59c4d60c5573155731d3e2fcbf Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 2 Mar 2024 20:45:30 +0000 Subject: [PATCH] Fix #12154: Incorrect calendar day lengths with minutes per year setting (#12158) --- src/timer/timer_game_calendar.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/timer/timer_game_calendar.cpp b/src/timer/timer_game_calendar.cpp index 3b7bc870a8..30f938464c 100644 --- a/src/timer/timer_game_calendar.cpp +++ b/src/timer/timer_game_calendar.cpp @@ -105,10 +105,13 @@ bool TimerManager::Elapsed([[maybe_unused]] TimerGameCalendar /* If we are using a non-default calendar progression speed, we need to check the sub_date_fract before updating date_fract. */ if (_settings_game.economy.minutes_per_calendar_year != CalendarTime::DEF_MINUTES_PER_YEAR) { - TimerGameCalendar::sub_date_fract++; + TimerGameCalendar::sub_date_fract += Ticks::DAY_TICKS; /* Check if we are ready to increment date_fract */ - if (TimerGameCalendar::sub_date_fract < (Ticks::DAY_TICKS * _settings_game.economy.minutes_per_calendar_year) / CalendarTime::DEF_MINUTES_PER_YEAR) return false; + const uint16_t threshold = (_settings_game.economy.minutes_per_calendar_year * Ticks::DAY_TICKS) / CalendarTime::DEF_MINUTES_PER_YEAR; + if (TimerGameCalendar::sub_date_fract < threshold) return false; + + TimerGameCalendar::sub_date_fract = std::min(TimerGameCalendar::sub_date_fract - threshold, Ticks::DAY_TICKS - 1); } TimerGameCalendar::date_fract++;