Modern open-source C# .NET 10 Asheron's Call client. Faithful port of retail client behaviour to Silk.NET with a plugin API.
Complete ground-up rewrite of AnimationSequencer.cs using the retail AC client pseudocode (docs/research/acclient_animation_pseudocode.md) as the direct translation guide. Every key algorithmic difference from the previous patched implementation is addressed: 1. _framePosition is now double (64-bit), matching Sequence+0x30 in the retail client binary. Previously float, which accumulated rounding error over long sessions. 2. FUN_005267E0 (multiply_framerate) is now correctly applied at node load time: negative speedScale swaps startFrame↔endFrame so the advance loop counts DOWN from (EndFrame+1)-epsilon toward EndFrame, exactly matching the retail layout. 3. update_internal (FUN_005261D0) is faithfully ported: one loop handles both forward and reverse; boundary detection uses EndFrame as the lower bound for reverse playback (matching the post-swap field semantics); remainder time propagates correctly across node boundaries for large dt values. 4. GetStartFramePosition (FUN_00526880) and GetEndFramePosition (FUN_005268B0) formulas are now correct: negative speed starts at (EndFrame+1)-epsilon, ends at StartFrame; positive speed starts at StartFrame, ends at (EndFrame+1)-epsilon. 5. advance_to_next_animation (FUN_00525EB0) wraps to _firstCyclic when the linked list is exhausted, matching the retail loop-forever semantics. 6. adjust_motion (ACE MotionInterp.cs:394-428) remapping is unchanged and correct: TurnLeft→TurnRight, SideStepLeft→SideStepRight (negate speed), WalkBackward→WalkForward (negate×0.65 BackwardsFactor). 7. SlerpRetailClient (FUN_005360d0) is unchanged — the pseudocode confirms the existing implementation is correct. AnimationSequencerTests grows from 9 to 17 tests: - Negative-speed playback: TurnLeft remaps and cursor initializes near EndFrame+1 - Reverse frame position decreases (not increases) over time - Reverse wrap at start boundary recovers and loops - advance_to_next_animation: link node drains then enters cycle - Cycle loops repeatedly without crash or position drift All 431 tests green (109 net + 322 core). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| docs | ||
| 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.