sky(phase-3f): anchor calendar to dat's GameTime.ZeroTimeOfYear
Final piece of the retail-sync puzzle. Live Dereth dat has GameTime.ZeroTimeOfYear = 3600 (verified 2026-04-23 diagnostic dump). Our DerethDateTime hardcoded +7/16 × DayTicks = 3333.75, copied from ACE's DerethDateTime.cs comment "tick 0 = Morntide-and-Half". The dat is authoritative; ACE's comment is wrong by 266.25 ticks (~33 Dereth minutes). User-observed regression (2026-04-23): acdream: middle-of-night (Darktide), clear, DayGroup "Sunny" retail: near-pre-dawn (Foredawn), thunderstorm, stormy DayGroup (both connected to the same ACE at PortalYearTicks=291134079) Same server tick → different calendar extraction → the offset skewed dayFraction AND pushed DayOfYear across a boundary at certain ticks, feeding a different LCG seed into the DayGroup picker (FUN_00501990). A single 266.25-tick offset error explains both the time mismatch and the weather mismatch. Code changes: - DerethDateTime.OriginOffsetTicks — runtime-settable static, default = DayFractionOriginOffsetTicks (3333.75, the legacy fallback). Applied in DayFraction, Year, DayOfYear, ToCalendar. - DerethDateTime.SetOriginOffsetFromDat(double) — called at Region load. - SkyDescLoader.DumpRegionSkyDesc dumps GameTime fields (and all 16 TimesOfDay entries) when ACDREAM_DUMP_SKY=1. - GameWindow.LoadRegion adopts the dat's ZeroTimeOfYear after LoadFromRegion, logs the before/after values. Also dumps every Dereth TimeOfDay hour-boundary (0..15) so any future calendar weirdness has authoritative ground truth in the log. Build + 733 tests green (no test depended on the hardcoded offset). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5f9df4d620
commit
cd8a37a9c8
3 changed files with 110 additions and 31 deletions
|
|
@ -893,6 +893,26 @@ public sealed class GameWindow : IDisposable
|
|||
// 2026-04-23).
|
||||
WorldTime.TickSize = 1.0;
|
||||
|
||||
// Phase 3f: adopt the dat's GameTime.ZeroTimeOfYear as the
|
||||
// calendar-extraction offset. Dereth's dat value is 3600
|
||||
// (verified 2026-04-23 live dump); ACE's DerethDateTime.cs
|
||||
// comment that "tick 0 = Morntide-and-Half" (3333.75
|
||||
// offset = +7/16) is WRONG by 266.25 ticks against the
|
||||
// authoritative dat. The mismatch cascaded into both the
|
||||
// wrong hour label AND the wrong DayOfYear at boundary
|
||||
// times (different LCG seed → different DayGroup roll),
|
||||
// which explained the user's observation of "acdream
|
||||
// clear night, retail stormy pre-dawn" at the same
|
||||
// server PortalYearTicks.
|
||||
if (region.GameTime is not null)
|
||||
{
|
||||
AcDream.Core.World.DerethDateTime.SetOriginOffsetFromDat(
|
||||
region.GameTime.ZeroTimeOfYear);
|
||||
Console.WriteLine(
|
||||
$"sky: GameTime ZeroTimeOfYear={region.GameTime.ZeroTimeOfYear} " +
|
||||
$"(was default {AcDream.Core.World.DerethDateTime.DayFractionOriginOffsetTicks})");
|
||||
}
|
||||
|
||||
Console.WriteLine(
|
||||
$"sky: loaded Region 0x13000000 — {_loadedSkyDesc.DayGroups.Count} day groups, " +
|
||||
$"SkyDesc.TickSize={_loadedSkyDesc.TickSize} (throttle, not rate), " +
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue