Releases: stainlu/euca-engine
v1.6.0 — Genre De-leakage
Genre De-leakage: euca-moba crate split
Extracted 11 MOBA-specific modules from euca-gameplay into a new euca-moba crate. Agents building non-MOBA games no longer inherit MOBA vocabulary at compile time.
What changed
- New crate:
euca-moba— roshan, creep_wave, tower_aggro, neutral_camp, hero, shop, item_active, building, building_systems, attributes, fog_of_war euca-gameplaynow has 29 genre-neutral modules only — zero MOBA vocabulary- Two reverse dependencies severed:
TowerAggroOverride→ genericTargetOverridein combat.rsStatGrowthmoved from hero.rs → leveling.rs
- Code structure matches
--scopemetadata from v1.5.0
Migration
// MOBA types moved — add euca-moba dependency and update imports:
use euca_moba::{HeroRegistry, spawn_roshan, buy_item};
// Genre-neutral types unchanged:
use euca_gameplay::{Health, Team, AutoCombat, GameState};1,729 tests passing across the full workspace.
Full Changelog: v1.5.0...v1.6.0
v1.5.0 — Progressive discovery: euca explain + discover --scope
Progressive disclosure for agents
Reduces the token tax on every agent session by 533 lines. SKILL.md shrinks from 638 → 105 lines; the rest of the engine's surface area is now discoverable on demand.
New: euca explain <topic>
Focused worked examples compiled into the CLI binary. Agents pull specifics only when they need them:
euca explain # Lists all topics
euca explain fork # Full counterfactual workflow
euca explain scenario # Declarative game setup format
euca explain combat # Auto-targeting fighters + towersTopics: quickstart, entity, combat, rule, assert, fork, scenario. Each is ~60–100 lines of focused documentation with executable examples.
New: euca discover --scope
Agents building a puzzle game shouldn't see Roshan. The new --scope flag filters the CLI surface by genre:
euca discover --scope core # Generic primitives only
euca discover --scope gameplay # Genre-neutral gameplay
euca discover --scope media # Audio, animation, visuals
euca discover --scope moba # MOBA-specific vocabulary
euca discover --scope tools # Infrastructure, offline toolsScopes: `core`, `gameplay`, `media`, `moba`, `tools`, `all`. Each group in the JSON manifest carries a `scope` field so programmatic callers can filter without re-parsing.
SKILL.md: 638 → 105 lines
The old SKILL.md was a full agent reference. Most of its content is now discoverable on demand, so the new SKILL.md is:
- One-line description
- Bootstrap sequence (5 commands)
- Core primitives table with explain pointers
- The counterfactual loop (5-command agent workflow)
- Pointers to `discover` / `explain` / `GUIDE.md`
The old content is preserved as `SKILL_FULL.md` for humans who want the full reference.
Why this matters
Per the "Seeing Like an Agent" design analysis, every line an agent preloads is a token tax paid on every session. 1,284 lines of SKILL + GUIDE was euca's preload tax. Blog's insight: agents discover better than we credit them for when given the right tools. `euca discover` + `euca explain` provide those tools, so SKILL.md can get out of the way.
What's next
The remaining items from the first-principles plan:
- Empirical validation — actually run an agent against the fork + scenario stack
- Priority 2: Genre de-leakage — split `euca-gameplay` into core/gameplay-kit/moba-kit crates (complements today's `--scope` filter)
- Secondary A: SpawnRequest refactor — reflection-driven entity construction
Full Changelog: v1.4.0...v1.5.0
v1.4.0
Scenario primitive (new)
A single declarative JSON document that describes an entire game state — templates, entities, rules, assertions, camera, game mode — replacing the imperative 28-command MOBA setup pipeline.
Composes with fork (v1.3.0): save a baseline scenario, fork the world, apply a modified scenario to the fork, run a counterfactual. Main world untouched.
Format (v2)
{
"version": 2,
"name": "single-lane-moba",
"templates": {
"hero": { "mesh": "cube", "health": 500, "team": 1, "combat": true },
"minion": { "mesh": "cube", "health": 80, "team": 2 }
},
"entities": [
{ "template": "hero", "position": [0, 1, 0] },
{ "template": "minion", "position": [5, 1, 0], "overrides": { "health": 200 } }
],
"rules": [
{
"when": { "kind": "death" },
"filter": "team:2",
"actions": [{ "action": "score", "target": "source", "points": 1 }]
}
],
"assertions": [
{
"name": "team1_alive",
"condition": { "type": "entity_count", "filter": { "type": "team", "team": 1 }, "min": 1 },
"severity": "error"
}
],
"game": { "mode": "deathmatch", "score_limit": 10 }
}API
POST /scenario— apply scenario to main world (wipes + loads atomically)GET /scenario— export current main world as scenario JSONPOST /fork/{id}/scenario— apply scenario to a named fork
CLI
euca scenario load tests/fixtures/moba.json
euca scenario save --out /tmp/snapshot.json
# Counterfactual workflow:
euca fork create buff-test
euca scenario apply-to-fork buff-test tests/fixtures/moba_buffed.json
euca fork step buff-test --ticks 300
euca fork probe buff-test --assertions team1_winsWhy this matters
Before scenarios, agents setting up a MOBA had to issue 28 ordered euca commands. Any one could fail mid-setup, leaving the world half-built; agents had to figure out where the failure happened and resume from a partial state. Scenarios make setup atomic and declarative: the engine receives the entire description and applies it as one operation.
The scenario format uses already-typed enums everywhere (GameAction, RuleCondition, AssertCondition) — no string DSL parsing, no positional fields. Schema validation happens at the JSON deserialization layer, not at runtime.
Breaking changes (small)
RuleConditionvariants refactored from tuple to struct form for clean serde output:Timer(f32)→Timer { interval: f32 }HealthBelow(f32)→HealthBelow { threshold: f32 }Score(i32)→Score { threshold: i32 }Phase(String)→Phase { phase: String }
SpawnRequestgainedDebug+Defaultderives (additive)
Tests
19/19 integration tests pass (15 existing + 4 new scenario tests):
- scenario_apply_to_main
- scenario_round_trip_serializes_and_loads
- scenario_apply_to_fork_does_not_affect_main
- scenario_template_overrides_merge
v1.3.0 — Fork primitive for counterfactual simulation
Fork primitive (new)
Agents can now deep-clone the main world into independent forks to answer "what if?" questions without touching the main simulation.
World::clone()— deep-clones every entity, component, resource, and event via per-typeclone_fninfrastructure. Component trait now requiresClone; resources requireCloneat insert time.SharedWorld::fork(id)— create named forks from the main world. Forks share the single Schedule but own independent World state.- 6 HTTP endpoints:
POST /fork,GET /fork/list,DELETE /fork/{id},POST /fork/{id}/step,POST /fork/{id}/probe,GET /fork/{id}/observe euca forkCLI subcommands mirror the HTTP API- 13 new tests (7 integration + 6 ECS-level fork tests)
Agent workflow
euca fork create scenario-a # clone main world
euca fork step scenario-a --ticks 300 # advance physics/combat/AI
euca fork probe scenario-a --ticks 0 --assertions hero-alive # evaluate
euca fork observe scenario-a # read state
euca fork delete scenario-a # clean upOther changes since v1.2.0
- GPU timestamp queries for per-pass profiling
- Diagonal inertia tensor and angular collision impulses
- Reflection-driven scene serialization (v3 format)
- Joint limits and motors in physics
- GPU terrain generation wired into renderer
- ExternalForce component and force/torque pipeline
- CI benchmark regression detection for PRs
- MetalFX temporal upscaling integration
- Water shader, GPU particles, Metal mesh shader path
- Post-process passes, audio, animation, AI behavior trees
- SSGI, UI, Lua scripting, meshlets, deferred, HLOD
- Fix double-tick bug in probe endpoint
- Fix Metal backend compile errors
Breaking changes
Componenttrait now requiresClone(blanket impl updated)World::insert_resource<T>now requiresT: CloneWorld::send_event<T>now requiresT: CloneAudioEngineandScriptEnginemust be wrapped inArc<Mutex<>>at insertion site (useshared_engine()helpers)Box<dyn ChunkLoader>is nowArc<dyn ChunkLoader>in streaming
What's Changed
- Add CI benchmark regression detection for PRs by @stainlu in #147
- Add force/torque accumulation pipeline by @stainlu in #148
- Wire GPU terrain generation into renderer by @stainlu in #149
- Add joint limits and motors to physics system by @stainlu in #150
- Add reflection-driven scene serialization (v3 format) by @stainlu in #151
- Add inertia tensor and angular collision impulses by @stainlu in #152
- Add GPU timestamp queries for per-pass profiling by @stainlu in #153
Full Changelog: v1.2.0...v1.3.0
v1.2.0
What's Changed
- refactor: make TextureStore generic over RenderDevice by @stainlu in #106
- refactor: make DecalRenderer generic over RenderDevice by @stainlu in #107
- refactor: make UiOverlayRenderer generic over RenderDevice by @stainlu in #108
- refactor: make IblResources generic over RenderDevice by @stainlu in #109
- refactor: make BindlessMaterialSystem generic over RenderDevice by @stainlu in #110
- refactor: make MotionBlurPass and DofPass generic over RenderDevice by @stainlu in #111
- refactor: make SsgiPass and SsrPass generic over RenderDevice by @stainlu in #112
- refactor: make TaaPass generic over RenderDevice by @stainlu in #113
- refactor: make GpuParticleSystem generic over RenderDevice by @stainlu in #114
- refactor: make PrepassPipeline generic over RenderDevice by @stainlu in #115
- refactor: make GpuDrivenPipeline generic over RenderDevice by @stainlu in #116
- refactor: make VelocityTextures generic over RenderDevice by @stainlu in #117
- refactor: make VolumetricFogPass generic over RenderDevice by @stainlu in #118
- refactor: make GBuffer and DeferredPipeline generic over RenderDevice by @stainlu in #119
- refactor: make ComputePipeline and GpuBuffer generic over RenderDevice by @stainlu in #120
- refactor: make PostProcessStack generic over RenderDevice by @stainlu in #121
- docs: update tech report, roadmap, changelog with RHI and Metal backend by @stainlu in #122
- feat: add native MSL shaders for Metal backend (PBR, shadow, sky) by @stainlu in #123
- feat: add GET /engine/gpu endpoint for GPU capability reporting by @stainlu in #124
- feat: Metal indexed drawing, capability detection, memoryless render targets by @stainlu in #125
- refactor: convert TextureStore methods to generic RenderDevice by @stainlu in #126
- refactor: convert TaaPass methods to generic RenderDevice by @stainlu in #129
- refactor: convert VolumetricFog, IBL, GpuParticles to generic RenderDevice by @stainlu in #131
- refactor: convert SSGI, SSR, DOF, MotionBlur to generic RenderDevice by @stainlu in #133
- refactor: convert GBuffer and DeferredPipeline to generic RenderDevice by @stainlu in #127
- perf: retain BFS queue across frames in transform propagation by @stainlu in #134
- fix: recover from poisoned locks in asset loader by @stainlu in #135
- fix: recover from poisoned locks instead of crashing in ECS by @stainlu in #136
- perf: allocation-free animation blend workspace by @stainlu in #137
- perf: retain frame vectors across physics ticks by @stainlu in #138
- perf: auto-compact RenderExtractor on 25% fragmentation by @stainlu in #139
- Add CONTRIBUTING.md with build, test, and workflow docs by @stainlu in #140
- Expand GUIDE.md into a proper getting-started tutorial by @stainlu in #141
- Enable SSR, DoF, and volumetric fog in MOBA demo by @stainlu in #142
- Wire MetalFX temporal upscaling into Renderer by @stainlu in #143
- Wire terrain_panel into editor and fix clippy warnings by @stainlu in #144
- Add procedural grass foliage to Tiled level viewer by @stainlu in #145
Full Changelog: v1.1.0...v1.2.0
v1.1.0
Full Changelog: v1.0.0...v1.1.0
v1.0.0
What's Changed
- v6: Deep engine audit — fix dead code, unwrap, quality issues by @stainlu in #58
- v7-1B: Remove RefCell from Renderer by @stainlu in #59
- v7-2A: Use SpatialIndex for O(n) combat targeting by @stainlu in #60
- v7-2BC: Eliminate unnecessary clones in combat/rules by @stainlu in #61
- v7-1A: Remove inline postprocess, always use PostProcessStack by @stainlu in #62
- Merge v7-1C editor refactor by @stainlu in #64
- v7-1C: Extract editor resource init into helpers by @stainlu in #63
- v7-2E: Optimize MOBA minion wave spawning by @stainlu in #65
- v7-2D: Add minion corpse cleanup by @stainlu in #66
- MOBA: Skip AutoCombat for PlayerHero entities by @stainlu in #67
- MOBA: Wire input system into editor by @stainlu in #68
- MOBA: Add PlayerHero + command system by @stainlu in #69
- MOBA: Player-controlled hero — full integration by @stainlu in #72
- MOBA: Add camera follow + edge panning system by @stainlu in #70
- MOBA: Add click-to-move + attack-target input by @stainlu in #71
- Add moba.json level file by @stainlu in #73
- Play mode: level file loading, hide editor UI, camera auto-follow by @stainlu in #77
- v0.8.0: Doc comments for remaining public APIs + version bump by @stainlu in #79
- Split euca-audio/lib.rs into focused modules by @stainlu in #80
- Add doc comments to euca-render public API by @stainlu in #82
- Add doc comments to euca-gameplay and euca-physics public APIs by @stainlu in #84
- refactor(euca-agent): replace wildcard re-exports with explicit named exports by @stainlu in #87
- Add missing Cargo.toml metadata to all crates by @stainlu in #78
- docs(euca-ecs): add comprehensive doc comments to public API by @stainlu in #81
- Replace println!/eprintln! with log:: macros by @stainlu in #83
- Review clippy suppressions: fix 5, document 11 by @stainlu in #86
- refactor: split euca-cli main.rs into command modules by @stainlu in #85
- Add audio clip unload, input stack pop guard, and editor entity lookup docs by @stainlu in #88
- Fix hardcoded projectile radius and terrain physics panic by @stainlu in #89
- Bind per-decal uniforms before each draw call by @stainlu in #90
- Fix fragile color parsing and document hardcoded game init by @stainlu in #91
- Remove dead code in App framework and simplify reflect JSON dispatch by @stainlu in #92
- Add turn & phase management system (Unit 10) by @stainlu in #95
- Add spatial grid for O(k) interest queries by @stainlu in #96
- Wire 8 missing v0.9.3 systems into headless server schedule by @stainlu in #98
- Implement stat resolution with equipment and status effect modifiers by @stainlu in #99
- Add v0.9.3/v0.9.4 pipeline integration tests by @stainlu in #100
- Add shop system — buy/sell items with gold, recipe combining by @stainlu in #104
Full Changelog: v0.3.0...v1.0.0
EucaEngine v0.3.0
Changelog
v0.3.0 (2026-03-21)
Rendering
- Deferred rendering path (G-buffer + lighting pass)
- Screen-space reflections (SSR)
- Volumetric fog with god rays
- SSAO (GTAO) + bilateral blur
- FXAA anti-aliasing
- Post-process stack (bloom, color grading, ACES tonemapping)
- GPU-driven rendering (draw indirect)
- HZB occlusion culling
- LOD system (screen-space mesh selection)
- Depth+normal pre-pass
- Clustered light culling (256+ lights)
- Render quality presets (Low/Medium/High/Ultra)
- Material system: transparency, emissive, metallic/roughness/AO textures
- Shader extraction to .wgsl files
- Foliage system (Poisson disk instancing)
- HLOD (hierarchical LOD)
- Decal system
- Particle render data pipeline
- Compute shader infrastructure
Physics
- Collision layers and masks
- Mass and inertia properties
- Scene queries (overlap_sphere, sweep_sphere, raycast_world)
- Collision events
- Character controller (capsule, ground detection, slopes, jumping)
- Vehicle physics (suspension, tires, engine, transmission)
Animation
- Animation blending and state machines
- Blend spaces (1D parametric)
- Root motion extraction
- Animation events
- Montage player
- Inverse kinematics (two-bone IK, FABRIK, look-at)
AI
- Behavior trees with blackboard
- Decorators, composites, action/condition nodes
Gameplay
- Role-aware targeting (heroes/minions/towers have different priorities)
- Persistent target tracking (CurrentTarget component)
- March direction (units advance toward enemy base)
Scale
- World streaming / chunk loading
- Spatial index (uniform grid queries)
- Prefab system (PrefabRegistry, spawn by name)
Networking
- Property replication with delta compression
- RPCs (ServerRpc, ClientRpc)
- Replication priority
Performance
- SIMD math (SSE2/NEON) for Vec3/Vec4/Mat4/Quat
- ECS query caching with generation invalidation
- Parallel system execution (ParallelSchedule)
- Frame profiler (per-system timing via CLI)
- Criterion benchmarks (ECS, physics, math)
Apple Silicon
- Metal TBDR render hints
- Unified memory SmartBuffer
- Optimized 32-thread compute dispatch
Scripting
- Lua scripting via mlua (hot reload, sandboxing, ECS bridge)
UI
- Runtime UI framework (anchored layout, flex, widgets)
Terrain
- Heightmap terrain (chunk LOD, splatting, physics, brush editing)
Audio
- Bus mixing hierarchy (Master/Music/SFX/Voice/UI)
- Reverb zones
- Sound priority and occlusion
Reflection
- Runtime field access (field_ref, field_mut, set_field)
- TypeRegistry for dynamic type creation
- JSON serialization
CLI / Agent API
- 70+ HTTP endpoints
- CLI commands: terrain, prefab, material, postprocess, fog, foliage, profile
- Render quality presets via CLI
Infrastructure
- 715+ tests
- Criterion benchmark suites
- CI: build-essential for mlua
What's Changed
- WU-15: Add behavior trees and blackboard (euca-ai crate) by @stainlu in #7
- WU-02: Add collision layers, mass, and scene queries by @stainlu in #14
- WU-05: Add SIMD math intrinsics (SSE2/NEON) by @stainlu in #8
- WU-11: Audio mixing buses, reverb zones, priority, occlusion, and fading by @stainlu in #9
- WU-08: SSAO and post-processing pipeline by @stainlu in #10
- WU-09: Add LOD system — screen-space mesh selection by @stainlu in #4
- WU-14: Add compute shader infrastructure by @stainlu in #3
- WU-16: Add terrain system — heightmap, chunked LOD, splatting, physics by @stainlu in #5
- Update docs for v3: 24 crates, expanded feature table, CI for mlua by @stainlu in #15
- Integrate all v3 features into main by @stainlu in #16
- WU-19: Add vehicle physics by @stainlu in #17
- WU-13: Add prefabs and spatial index by @stainlu in #18
- WU-03: Add character controller by @stainlu in #19
- WU-12: Add particle rendering data pipeline by @stainlu in #20
- WU-18: Add inverse kinematics by @stainlu in #21
- WU-17: Add decal system by @stainlu in #22
- WU-10: Add network property replication and RPCs by @stainlu in #23
- WU-12: Add particle render data pipeline by @stainlu in #24
- E1: Add built-in frame profiler by @stainlu in #25
- B1: Integrate post-process stack into renderer by @stainlu in #26
- A1: Wire all new systems into editor tick loop by @stainlu in #27
- D1: Metal-optimized render path for Apple Silicon by @stainlu in #28
- C3: Add foliage system with instanced vegetation by @stainlu in #31
- B6: Extract shaders to .wgsl files by @stainlu in #32
- E2: Add ECS query caching by @stainlu in #33
- A2: Add CLI/HTTP endpoints for new systems by @stainlu in #34
- Merge remaining batch 1: unified memory + occlusion culling by @stainlu in #35
- D3: Unified memory optimization for Apple Silicon by @stainlu in #29
- C1: Add occlusion culling with hierarchical Z-buffer by @stainlu in #30
- A3: Update SKILL.md with all new commands by @stainlu in #36
- C4: Add hierarchical LOD system by @stainlu in #37
- B4: Add volumetric fog and god rays by @stainlu in #38
- B3: Add screen-space reflections by @stainlu in #39
- E3: Add parallel system execution by @stainlu in #40
- C2: Add world streaming / chunk loading by @stainlu in #41
- B5: Add GPU-driven rendering with draw indirect by @stainlu in #42
- D2: Apple GPU compute optimization by @stainlu in #43
- B2: Add deferred rendering path by @stainlu in #44
- v5-1A: Enable SSAO/FXAA by default, add render quality presets by @stainlu in #45
- v5-1G: Add clustered light culling for Forward+ by @stainlu in #48
- v5: Wire all rendering systems into pipeline by @stainlu in #52
- v5-1F: Add depth+normal pre-pass by @stainlu in #46
- v5-1E: Wire foliage instancing into render pipeline by @stainlu in #47
- v5-1D: Wire HZB occlusion culling into renderer by @stainlu in #49
- v5-1H: Add render quality presets by @stainlu in #50
- v5-1C: Wire volumetric fog into render pipeline by @stainlu in #51
- v6-1C: Add math SIMD benchmark suite by @stainlu in #53
- v6-1B: Add physics benchmark suite by @stainlu in #54
- v6-1D: Integrate profiler into editor + CLI by @stainlu in #55
- v6-1A: Add ECS benchmark suite by @stainlu in #56
- Add CHANGELOG.md for v0.3.0 release by @stainlu in #57
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0 — MOBA Release
EucaEngine v0.2.0
Major release: full gameplay systems + working MOBA demo.
What's New Since v0.1.0
New Engine Systems
- MSAA 4x anti-aliasing
- Audio (spatial, kira)
- Animation (glTF skeletal)
- Particles (CPU emitters)
- Navigation (grid navmesh, A* pathfinding)
- Economy (gold, bounty, gold-on-kill)
- Leveling (XP, auto stat boost, max level 18)
- Abilities (Q/W/E/R, cooldowns, mana, effects)
- Entity Roles + targeting priority
- AttackStyle (Melee/Stationary)
- Patrol-combat hybrid AI
- SpawnPoints + Respawn
- Diagnostics (euca diagnose, euca events)
Architecture Improvements
- Routes split from 1738-line monolith into 10 modules
- Physics decoupled from Collider (entities move without colliders)
- Kinematic body type for gameplay entities
- Persistent entities survive world reset
- RuleSpawnEvent bridges gameplay→render for visible spawned entities
MOBA Demo
Complete 1-lane MOBA: heroes, towers, minions, economy, leveling.
./scripts/moba.shQuickstart
git clone https://github.com/stainlu/euca-engine.git && cd euca-engine
cargo build -p euca-editor --example editor -p euca-cli
cargo run -p euca-editor --example editor &
./scripts/moba.shFull Changelog: v0.1.0...v0.2.0
v0.1.0
Full Changelog: https://github.com/stainlu/euca-engine/commits/v0.1.0