Modern open-source C# .NET 10 Asheron's Call client. Faithful port of retail client behaviour to Silk.NET with a plugin API.
Client-side deterministic sky + weather + day/night system per R12. Retail's model is 95% client-side: the server just delivers its current PortalYearTicks (double, seconds since boot-seed) at login and in TimeSync packets; the client computes everything else locally from the constants in r12 §1.2 + ACE DerethDateTime.cs. Core layer (AcDream.Core/World): - DerethDateTime: retail-exact calendar (16 hours/day, 30 days/month, 12 months/year, 7620 ticks/day, 2,743,200 ticks/year). HourName enum covers all 16 named half-hour slots (Darktide → GloamingAndHalf); MonthName covers the 12 Derethian months (Snowreap → Frostfell). DayFraction, CurrentHour, IsDaytime, ToCalendar. - SkyKeyframe + SkyStateProvider: 4-keyframe default day/dawn/noon/dusk with linear color + angular-wrap heading interpolation + slerp-like shortest-arc lerp so heading wraps 350° → 10° don't tween backwards through 180°. Default keyframe colors tuned to retail screenshots (sunrise warm, noon white, sunset red, midnight deep blue). - WorldTimeService: owns the live clock. SyncFromServer(ticks) sets baseline; NowTicks advances by real-time elapsed. Exposes DayFraction, CurrentSky, CurrentSunDirection, IsDaytime for the render thread. This is the foundation Phase G.2 (dynamic lighting) consumes: lighting uniforms are fed from CurrentSky's SunColor / AmbientColor / sun direction, varying smoothly across the day. Tests (16 new): - DerethDateTime: midnight, half-day, wrap, Dawnsong, Midsong, day/night flag at dawn vs Darktide-Half, year rollover, month advance. - SkyState: 4-default keyframes, noon-exact matches frame data, midpoint lerps between neighbours, wrap across midnight doesn't produce NaN, sun direction returns unit vector, WorldTimeService sync + DayFraction at noon. Build green, 587 tests pass (up from 570). Ref: r12 §1 (Portal Year math), §2 (sky objects), §4 (color lerp). Ref: ACE DerethDateTime.cs + NetworkSession TimeSync handler. 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.