Modern open-source C# .NET 10 Asheron's Call client. Faithful port of retail client behaviour to Silk.NET with a plugin API.
User reported the in-game sky time in acdream consistently trails retail's, even after Phases 3a-3c.1 aligned the DayGroup selection. Diagnosed it as a rate mismatch between our client-side extrapolation and the ACE server's tick advancement. ACE advances PortalYearTicks at 1.0 ticks per real-second: Timers.cs: PortalYearTicks += worldTickTimer.Elapsed.TotalSeconds Our WorldTime was using SkyDesc.TickSize (0.8 in the live Dereth dat) as the extrapolation rate: NowTicks = lastSync + elapsed * TickSize // with TickSize=0.8 Between the server's ~20s TimeSync gap, we fell 4 ticks behind. Every sync yanked us back, but in the window between syncs the sky interp was rendering at a stale (earlier) dayFraction — visible as "acdream is behind retail" when the user had retail running alongside. Root cause: we misread r12 §1.2's definition of SkyDesc.TickSize. Agent C's decompile (`docs/research/2026-04-23-sky-decompile-hunt-C.md` §5 and the 2026-04-23 sky-retail-verbatim synthesis §5) showed SkyDesc.TickSize is consulted at `FUN_005062e0:6241` as: _DAT_00842798 = SkyDesc.TickSize + _DAT_008379a8 // next deadline i.e. the per-frame sky-subsystem update PERIOD. It's a throttle, not a clock-rate multiplier. SkyDesc.LightTickSize=15 plays the same role for lighting interpolation (re-run every 15 real-seconds). Fix: remove the SkyDesc.TickSize → WorldTime.TickSize assignment. Keep WorldTime.TickSize at its default 1.0, matching the server's rate. SkyDesc.TickSize stays on the LoadedSkyDesc for a future Phase 4 port of the actual retail throttle logic. Build + 717 tests green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| docs | ||
| memory | ||
| src | ||
| tests | ||
| tools | ||
| .gitignore | ||
| AcDream.slnx | ||
| CLAUDE.md | ||
| README.md | ||
acdream
Experimental modern open-source Asheron's Call client in C# / .NET 10.
Status: pre-alpha, not playable. Phase 0 only — dat file asset inventory.
Stack: .NET 10, Chorizite.DatReaderWriter for dat parsing. Silk.NET + Avalonia planned for rendering/UI (not yet wired up).
Requires: A retail Asheron's Call install (Turbine/Microsoft property — supply your own). Set ACDREAM_DAT_DIR environment variable to the directory containing client_portal.dat, client_cell_1.dat, client_highres.dat, and client_local_English.dat, or pass it as the first CLI argument.
Layout
src/AcDream.Cli/— console app that dumps asset counts from a dat directoryreferences/— local read-only reference material (ACE, ACViewer, WorldBuilder, DatReaderWriter, holtburger, retail AC install). Gitignored.
Run
dotnet run --project src/AcDream.Cli -- "C:\path\to\Asheron's Call"
Or set ACDREAM_DAT_DIR and run without args.