Skip to content

Releases: stainlu/euca-engine

v1.6.0 — Genre De-leakage

16 Apr 15:00

Choose a tag to compare

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-gameplay now has 29 genre-neutral modules only — zero MOBA vocabulary
  • Two reverse dependencies severed:
    • TowerAggroOverride → generic TargetOverride in combat.rs
    • StatGrowth moved from hero.rs → leveling.rs
  • Code structure matches --scope metadata 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

14 Apr 18:04

Choose a tag to compare

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 + towers

Topics: 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 tools

Scopes: `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

13 Apr 06:02

Choose a tag to compare

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 JSON
  • POST /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_wins

Why 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)

  • RuleCondition variants 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 }
  • SpawnRequest gained Debug + Default derives (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

12 Apr 12:58

Choose a tag to compare

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-type clone_fn infrastructure. Component trait now requires Clone; resources require Clone at 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 fork CLI 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 up

Other 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

  • Component trait now requires Clone (blanket impl updated)
  • World::insert_resource<T> now requires T: Clone
  • World::send_event<T> now requires T: Clone
  • AudioEngine and ScriptEngine must be wrapped in Arc<Mutex<>> at insertion site (use shared_engine() helpers)
  • Box<dyn ChunkLoader> is now Arc<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

06 Apr 12:28

Choose a tag to compare

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

25 Mar 03:31

Choose a tag to compare

Full Changelog: v1.0.0...v1.1.0

v1.0.0

25 Mar 02:06

Choose a tag to compare

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

21 Mar 05:49
eb1548c

Choose a tag to compare

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

20 Mar 05:58

Choose a tag to compare

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.sh

Quickstart

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.sh

Full Changelog: v0.1.0...v0.2.0

v0.1.0

18 Mar 18:33

Choose a tag to compare