Saveload: Fix recalculation of _state_ticks

For XSLFI_VARIABLE_DAY_LENGTH versions 1 to 3
This commit is contained in:
Jonathan G Rennison
2024-02-21 21:08:31 +00:00
parent f52d56249d
commit 675b31887a
3 changed files with 12 additions and 10 deletions

View File

@@ -110,14 +110,14 @@ EconTime::State EconTime::Detail::NewState(EconTime::Year year)
return state; return state;
} }
StateTicks GetStateTicksFromCurrentDateWithoutOffset() StateTicks GetStateTicksFromDateWithoutOffset(EconTime::Date date, EconTime::DateFract date_fract)
{ {
return ((int64_t)(EconTime::DateToDateTicks(EconTime::CurDate(), EconTime::CurDateFract()).base()) * DayLengthFactor()) + TickSkipCounter(); return ((int64_t)(EconTime::DateToDateTicks(date, date_fract).base()) * DayLengthFactor()) + TickSkipCounter();
} }
void RecalculateStateTicksOffset() void RecalculateStateTicksOffset()
{ {
DateDetail::_state_ticks_offset = _state_ticks - GetStateTicksFromCurrentDateWithoutOffset(); DateDetail::_state_ticks_offset = _state_ticks - GetStateTicksFromDateWithoutOffset(EconTime::CurDate(), EconTime::CurDateFract());
} }
void UpdateEffectiveDayLengthFactor() void UpdateEffectiveDayLengthFactor()

View File

@@ -24,7 +24,7 @@ namespace DateDetail {
extern uint8_t _effective_day_length; extern uint8_t _effective_day_length;
}; };
StateTicks GetStateTicksFromCurrentDateWithoutOffset(); StateTicks GetStateTicksFromDateWithoutOffset(EconTime::Date date, EconTime::DateFract date_fract);
void RecalculateStateTicksOffset(); void RecalculateStateTicksOffset();
inline uint8_t TickSkipCounter() inline uint8_t TickSkipCounter()

View File

@@ -667,7 +667,12 @@ bool AfterLoadGame()
TileIndex map_size = MapSize(); TileIndex map_size = MapSize();
/* Only new games can use wallclock units. */
if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH, 5) && IsSavegameVersionBefore(SLV_ECONOMY_MODE_TIMEKEEPING_UNITS)) {
_settings_game.economy.timekeeping_units = TKU_CALENDAR;
}
UpdateEffectiveDayLengthFactor(); UpdateEffectiveDayLengthFactor();
SetupTickRate(); SetupTickRate();
extern TileIndex _cur_tileloop_tile; // From landscape.cpp. extern TileIndex _cur_tileloop_tile; // From landscape.cpp.
@@ -865,18 +870,15 @@ bool AfterLoadGame()
_scaled_tick_counter = (uint64_t)((_tick_counter * DayLengthFactor()) + TickSkipCounter()); _scaled_tick_counter = (uint64_t)((_tick_counter * DayLengthFactor()) + TickSkipCounter());
} }
if (SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 1, 3)) { if (SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 1, 3)) {
_state_ticks = GetStateTicksFromCurrentDateWithoutOffset() + DateDetail::_state_ticks_offset; /* CalTime is used here because EconTime hasn't been set yet, but this needs to be done before setting EconTime::Detail::SetDate,
* because that calls RecalculateStateTicksOffset which overwrites DateDetail::_state_ticks_offset which is an input here */
_state_ticks = GetStateTicksFromDateWithoutOffset(CalTime::CurDate().base(), CalTime::CurDateFract()) + DateDetail::_state_ticks_offset;
} }
/* Update current year /* Update current year
* must be done before loading sprites as some newgrfs check it */ * must be done before loading sprites as some newgrfs check it */
CalTime::Detail::SetDate(CalTime::CurDate(), CalTime::CurDateFract()); CalTime::Detail::SetDate(CalTime::CurDate(), CalTime::CurDateFract());
/* Only new games can use wallclock units. */
if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH, 5) && IsSavegameVersionBefore(SLV_ECONOMY_MODE_TIMEKEEPING_UNITS)) {
_settings_game.economy.timekeeping_units = TKU_CALENDAR;
}
if (SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 5) || !IsSavegameVersionBefore(SLV_ECONOMY_DATE)) { if (SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 5) || !IsSavegameVersionBefore(SLV_ECONOMY_DATE)) {
EconTime::Detail::SetDate(EconTime::CurDate(), EconTime::CurDateFract()); EconTime::Detail::SetDate(EconTime::CurDate(), EconTime::CurDateFract());
} else { } else {