Modern open-source C# .NET 10 Asheron's Call client. Faithful port of retail client behaviour to Silk.NET with a plugin API.
Adds SceneryGenerator.Generate which walks Region.TerrainInfo.TerrainTypes + Region.SceneInfo.SceneTypes for each landblock vertex, selects a scene using the AC client's pseudo-random LCG hash of global cell coordinates, then rolls each ObjectDesc's frequency, computes a displaced cell-local position, random scale, and random rotation — the exact algorithm ACViewer ports from the retail AC client's get_land_scenes(). Phase 2 rendered 239 explicit Stab+Building entities on the 3x3 Holtburg grid but was missing every procedurally-placed tree, bush, rock, fence, and small decoration because these are not stored as LandBlockInfo entries. This adds 419 scenery entities across the same 9 landblocks, bringing the total to 658. Integration in GameWindow.OnLoad: after the existing Stab/Building hydration loop, iterate each landblock's scenery spawns, resolve each to a GfxObj or Setup via the same mesh pipeline, bake the random scale into each MeshRef's PartTransform so the static mesh renderer doesn't need a scale field on WorldEntity, and sample the landblock heightmap bilinearly for the ground Z (simpler than ACViewer's find_terrain_poly slope-aware placement). Deliberate deferrals for first pass: - No slope-based rejection (obj.MinSlope/MaxSlope). Trees may end up on cliffs they shouldn't be on. - No road-overlap rejection. Scenery may spawn in roads. - No building-overlap rejection. Scenery may clip buildings. - No WeenieObj handling (those are dynamic spawns, not static scenery). All three filters will be added in a follow-up phase when we have the walkable-polygon infrastructure they need. Build clean, 48 tests still pass, smoke verified: "scenery: spawned 419 entities across 9 landblocks", process runs without exceptions. Addresses the user visual feedback after Phase 2b: "some extra details are missing, like a tree and the statue on top of the foundry". The tree issue is now fixed (419 trees/bushes/rocks/etc placed). The foundry statue may still be missing if it's a hierarchical Setup part (Phase 2a's SetupMesh.Flatten intentionally doesn't walk ParentIndex) — that's a separate fix if smoke verification shows it's still missing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| docs/plans | ||
| src | ||
| tests | ||
| .gitignore | ||
| AcDream.slnx | ||
| 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.