Modern open-source C# .NET 10 Asheron's Call client. Faithful port of retail client behaviour to Silk.NET with a plugin API.
Before: CurrentVelocity was a pass-through of the current AnimNode's Velocity. So during a stance transition, while the link animation played (with no velocity of its own), CurrentVelocity returned (0,0,0) and remote dead-reckoning briefly stopped advancing the entity. Visible as a hitch at every idle → walk or walk → run transition. Retail's model (ACE Sequence.cs L16-L17, L127-L130): Velocity and Omega are Sequence-wide fields updated by MotionTable.add_motion's Sequence.SetVelocity call (MotionTable.cs L358-L370). Every time a new MotionData is appended, the sequence velocity is REPLACED by that data's velocity × speedMod. In SetCycle's rebuild path the order is: 1. clear_physics → zero 2. add_motion(link) → velocity = link's (typically 0) 3. add_motion(cycle) → velocity = cycle's (the real walk/run velocity) After step 3, Sequence.Velocity is the CYCLE's velocity even though CurrAnim is the link node. So dead-reckoning reads the cycle's velocity from frame zero of the transition — no stutter. This commit: - Converts AnimationSequencer.CurrentVelocity / CurrentOmega from per-node computed properties to sequence-wide private-set properties. - Adds ClearPhysics() helper (mirrors Sequence.clear_physics). - EnqueueMotionData now updates the sequence velocity/omega (matching add_motion's SetVelocity semantics). Only replaces when the MotionData's HasVelocity/HasOmega flags are set — zero-HasVelocity modifiers don't zero the running cycle, matching retail. - SetCycle's rebuild path calls ClearPhysics before the new add_motion chain (matches MotionTable.cs L100-L101, L152-L153). - MultiplyCyclicFramerate scales the sequence-wide velocity/omega instead of per-node fields — algebraically equivalent to retail's subtract_motion(old) + combine_motion(new) pair in change_cycle_speed. New test: CurrentVelocity_PersistsThroughLinkTransition — verifies that after SetCycle enqueues [link][cycle], CurrentVelocity is the cycle's velocity even during the link frames. Catches the old bug directly. All 659 tests pass (was 658). 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.