81 behaviors · std/behaviors
std-arcade-flowHeadless win/lose authority for the arcade play-for-tickets loop: owns only result. Listens SCORE_CHANGED (tickets + tokens) and sets result to won once tickets reach the target, lost when tokens run out first, else none. Renders nothing.
uses ArcadeFlow from "std/behaviors/std-arcade-flow"Entity: ArcadeFlowData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ArcadeFlow | SCORE_CHANGED, RESTART | GAME_END |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ArcadeFlow | running | boolean | Running |
ArcadeFlow | ticketsToWin | number | Tickets To Win |
std-arcade-playHeadless arcade play-economy mechanic: the SOLE writer of tokens + tickets + machines. Applies a PLAY_MACHINE intent (spends a token, rolls a pseudo-random ticket payout within a configured range, emits BURST + SCORE_CHANGED). Renders nothing.
uses ArcadePlay from "std/behaviors/std-arcade-play"Entity: ArcadePlayData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ArcadePlay | PLAY_MACHINE, RESTART | BURST, SCORE_CHANGED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ArcadePlay | machines | [Machine] | Machines |
ArcadePlay | maxPayout | number | Max Payout |
ArcadePlay | minPayout | number | Min Payout |
ArcadePlay | running | boolean | Running |
ArcadePlay | startTokens | number | Start Tokens |
std-area-fillthe physical per-tick maximum — so teleports and respawns paint nothing) — height is linear interpolation of the config curve samples above the fill's baseline (the platformer body's leftSamp/rightSamp idiom). rateMode picks the rate: "area" (height × |dx|, default — fills fastest where the curve is tallest), "speed" (|dx| only, flat rate), or "ride" (|dx| only while the move reports skating — walking the same distance paints nothing). When a fill's filled reaches its target it flips reported and emits AREA_FILLED once (the shared entity carries the rest); each fill also stamps a frontier (x0 + span × min(1, filled/target)) so boards can shade the painted region left-to-right as the gauge grows. RESTART resets every live fill (re-arming the live entity set, so SET_FILLS-injected fills survive respawns). SET_FILLS replaces the fill set at runtime for boards that import their fills. Renders nothing; boards shade the painted region and read filled/frontier from the shared entity (the render authority).
uses AreaFill from "std/behaviors/std-area-fill"Entity: AreaFillData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
AreaFill | BODY_MOVED, SET_FILLS, RESTART | AREA_FILLED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
AreaFill | fills | [AreaFill] | Fills |
AreaFill | running | boolean | Running |
std-audio-cueswap them per game by rebinding this atom's config, never by hand-authoring a second audio layer.
uses AudioCue from "std/behaviors/std-audio-cue"Entity: AudioState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
AudioCue | CUE, MUSIC, STOP_MUSIC, MUTE, UNMUTE, TOGGLE_MUTE, SET_VOLUME, RESTART | AUDIO_MUTED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
AudioCue | baseUrl | string | Base Url |
AudioCue | initialMusic | string | Initial Music |
AudioCue | initialMuted | boolean | Initial Muted |
AudioCue | initialVolume | number | Initial Volume |
AudioCue | manifest | Map<string,SoundEntry> | Manifest |
std-camera-riga dead-zone camera: inside deadzoneX/deadzoneY the axis holds, outside it lerps by stiffness — clamps the result to bounds, eases camZoom toward camTargetZoom the same way, and decays camShake toward 0 by shakeDecay. Intents: FOLLOW retargets from a moving body's x/y/vx (vx feeds camLead, the horizontal look-ahead), CUT snaps position+target instantly (no ease, for teleports/cutscenes), SET_ZOOM retargets zoom (clamped to minZoom/maxZoom), SHAKE sets camShake for a consumer to jitter with at bind time — this atom never writes shake into camX/camY itself, RESTART reseeds from config. Emits CAMERA_MOVED every tick. Renders nothing — a board binds its own canvas camera prop straight to camX/camY/camZoom.
uses CameraRig from "std/behaviors/std-camera-rig"Entity: CameraState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
CameraRig | FOLLOW, CUT, SET_ZOOM, SHAKE, RESTART | CAMERA_MOVED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
CameraRig | bounds | CameraBounds | Bounds |
CameraRig | deadzoneX | number | Dead Zone X |
CameraRig | deadzoneY | number | Dead Zone Y |
CameraRig | lead | number | Lead |
CameraRig | maxZoom | number | Max Zoom |
CameraRig | minZoom | number | Min Zoom |
CameraRig | running | boolean | Running |
CameraRig | shakeDecay | number | Shake Decay |
CameraRig | start | CameraPos | Start Position |
CameraRig | stiffness | number | Stiffness |
CameraRig | zoom | number | Zoom |
std-chase-aiHeadless chase-AI mechanic: enemies damage adjacent targets, else step toward the nearest target respecting tile passability and occupancy.
uses ChaseAi from "std/behaviors/std-chase-ai"Entity: ChaseState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ChaseAi | none | BURST, UNITS_CHANGED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ChaseAi | gridHeight | number | Grid Height |
ChaseAi | gridWidth | number | Grid Width |
ChaseAi | running | boolean | Running |
ChaseAi | tiles | [Tile] | Initial Tiles |
ChaseAi | units | [Unit] | Initial Units |
std-choice-gatethe pad-lock touch pattern): the correct option stamps the gate solved + chosen on the shared entity and emits CHOICE_CORRECT once (a solved gate never judges again, so the path stays open); a wrong option emits CHOICE_WRONG carrying the gate id, the chosen optionId, and the option's world position, so the board can bounce the player back and float the gate's hint (the board owns the bounce — the atom only reports). RESTART unsolves every live gate (re-arming the live entity set, so SET_GATES-injected gates survive respawns). SET_GATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the option platforms and labels from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, agency.
uses ChoiceGate from "std/behaviors/std-choice-gate"Entity: ChoiceGateData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ChoiceGate | BODY_MOVED, SET_GATES, RESTART | CHOICE_CORRECT, CHOICE_WRONG |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ChoiceGate | gates | [ChoiceGate] | Choice Gates |
ChoiceGate | reachX | number | Reach X |
ChoiceGate | reachY | number | Reach Y |
ChoiceGate | running | boolean | Running |
std-coef-padthe pad-lock touch pattern), stamps the pad applied on the shared entity and emits COEF_PAD_APPLIED carrying the pad position AND its mod (x0, x1, a, h, k), so the board can append the mod to the body authority's curveMods (std-platformer-body with curveModsEnabled) and hop the player onto the reshaped surface. When every pad is applied it emits COEF_PAD_SET_COMPLETED once. RESTART un-applies every live pad (re-arming the live entity set, so SET_PADS-injected pads survive respawns; the board clears curveMods alongside — the pad reports, the board owns the road). SET_PADS replaces the pad set at runtime for boards that import their pads. Renders nothing; boards draw the pads and read applied from the shared entity (the render authority).
uses CoefPad from "std/behaviors/std-coef-pad"Entity: CoefPadData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
CoefPadLock | BODY_MOVED, SET_PADS, RESTART | COEF_PAD_APPLIED, COEF_PAD_SET_COMPLETED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
CoefPadLock | coefPads | [CoefPad] | Coefficient Pads |
CoefPadLock | reachX | number | Reach X |
CoefPadLock | reachY | number | Reach Y |
CoefPadLock | running | boolean | Running |
std-curve-fogthe atom listens BODY_MOVED and stamps fogX (the reveal horizon = player x + the region's lookAhead) onto the shared entity, and the board's render layer clips or ghosts every road sample past it, so the player must commit to jumps before the landing is visible and internalize where the function GOES (blowup, flattening, slow growth, divergence). Outside every region fogX sits at a large sentinel, i.e. fully revealed. Physics is untouched: the collider keeps the whole curve — the fog is purely visual. Renders nothing; boards clip their own curve/region samples against @entity.fogX (the render authority).
uses CurveFog from "std/behaviors/std-curve-fog"Entity: CurveFogData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
CurveFog | BODY_MOVED, RESTART | none |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
CurveFog | regions | [CurveFogRegion] | Fog Regions |
CurveFog | running | boolean | Running |
std-dungeon-combatHeadless dungeon combat authority: owns the enemy roster, hero HP, and kill score. Bump-attacks damage enemies; monster ticks chase the hero and deal contact damage.
uses DungeonCombat from "std/behaviors/std-dungeon-combat"Entity: DungeonCombatData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
DungeonCombat | ATTACK, MONSTER_TICK, RESTART | BURST, DEFEATED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
DungeonCombat | attackDamage | number | Attack Damage |
DungeonCombat | enemies | [Unit] | Initial Enemies |
DungeonCombat | gridHeight | number | Grid Height |
DungeonCombat | gridWidth | number | Grid Width |
DungeonCombat | pointsPerKill | number | Points Per Kill |
DungeonCombat | running | boolean | Running |
DungeonCombat | startHp | number | Start HP |
DungeonCombat | tiles | [Tile] | Tiles |
std-fx-narrativeHeadless pedagogy→fx translator for game boards and learning shells: turns high-level narrative events into big transient screen-space or world-space text effects consumed by std-fx-particles / fx-overlay. Levels emit NARRATE { text, style } and get a correctly styled, centered (or positioned) floating text burst without hand-rolling particle structs. Tutorials emit TUTORIAL_SHOW and the atom forwards SHOW to a composed std-tutorial-overlay trait. Renders nothing; centralizes the FX vocabulary so every level's teaching text looks and behaves the same. Corresponds to the design-sheet field(s): feedback.
uses FxNarrative from "std/behaviors/std-fx-narrative"Entity: FxNarrativeData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
FxNarrative | NARRATE, TUTORIAL_SHOW | BURST, SHOW |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
FxNarrative | running | boolean | Running |
FxNarrative | styles | Map<string,StyleDef> | Styles |
std-fx-particlesstamping maxTtl (fade envelope) and bornAt (epoch ms, smooth render interpolation) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space "world", fx-overlay for space "screen"). Corresponds to the design-sheet field(s): feedback, rewards.
uses FxParticles from "std/behaviors/std-fx-particles"Entity: FxState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
FxParticles | BURST, RESTART | none |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
FxParticles | decayRate | number | Decay Rate |
FxParticles | fx | [Fx] | Initial Fx |
FxParticles | running | boolean | Running |
std-fx-trailappends a dot only when the body's speed exceeds minSpeed (standing still leaves no trail) and prunes dots older than ttl on the same pass, so no decay tick is needed and a stopped body's trail simply stops growing (the render side fades each dot by bornAt/ttl). RESTART clears. Renders nothing.
uses FxTrail from "std/behaviors/std-fx-trail"Entity: FxTrailData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
FxTrail | BODY_MOVED, RESTART | none |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
FxTrail | minSpeed | number | Min Speed |
FxTrail | running | boolean | Running |
FxTrail | ttl | number | Trail Ttl (ms) |
std-gate-lockstars, coins, keys) and flips every door whose cost is met, stamping open on the shared door rows and emitting GATE_OPENED for the first newly opened door (the shared entity is the render authority for the rest). While a closed door's rect contains the player it emits GATE_BLOCKED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a locked fx. RESTART re-locks every live door and zeroes the total (re-arming the live entity set, so SET_DOORS-injected doors survive respawns). SET_DOORS replaces the door set at runtime for boards that import their doors. Renders nothing; boards draw closed doors as bars/walls and open ones as gaps. Corresponds to the design-sheet field(s): challenge, rewards.
uses GateLock from "std/behaviors/std-gate-lock"Entity: GateLockData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
GateLock | COLLECT, BODY_MOVED, SET_DOORS, RESTART | GATE_OPENED, GATE_BLOCKED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
GateLock | doors | [Door] | Doors |
GateLock | reachMargin | number | Reach Margin |
GateLock | running | boolean | Running |
std-gatherHeadless resource-gathering mechanic: owns features + wood + stone. Listens HERO_STEPPED and, when the hero lands on a wood/stone-type feature, increments the matching resource, removes the node, emits a BURST pickup particle, and emits RESOURCES so survival-flow can decide loss. Never writes units.
uses Gather from "std/behaviors/std-gather"Entity: GatherData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
Gather | HERO_STEPPED, RESTART | BURST, RESOURCES |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
Gather | features | [Feature] | Features |
Gather | running | boolean | Running |
Gather | startStone | number | Start Stone |
Gather | startWood | number | Start Wood |
Gather | stoneType | string | Stone Type |
Gather | woodType | string | Wood Type |
Gather | yieldPerNode | number | Yield Per Node |
std-goldHeadless gold-economy mechanic: the SOLE writer of gold. Listens a mine-hit signal and adds a fixed yield; emits GOLD_CHANGED. Renders nothing.
uses Gold from "std/behaviors/std-gold"Entity: GoldData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
GoldMine | MINE_HIT, RESTART | GOLD_CHANGED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
GoldMine | running | boolean | Running |
GoldMine | startGold | number | Start Gold |
GoldMine | yieldAmount | number | Yield Amount |
std-grid-tacticsHeadless grid-tactics unit-authority: the SOLE writer of units. Applies MOVE/ATTACK/SPAWN/HEAL intents from any source (player, AI, production, or progression) and runs the enemy AI_TURN pipeline, emitting BURST hit-particles and UNITS_CHANGED survivor counts. Renders nothing.
uses GridTactics from "std/behaviors/std-grid-tactics"Entity: TacticsState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
GridTactics | MOVE, ATTACK, SPAWN, HEAL, AI_TURN | BURST, UNITS_CHANGED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
GridTactics | attackDamage | number | Attack Damage |
GridTactics | gridHeight | number | Grid Height |
GridTactics | gridWidth | number | Grid Width |
GridTactics | running | boolean | Running |
GridTactics | tiles | [Tile] | Tiles |
GridTactics | units | [Unit] | Initial Units |
std-hero-navHeadless single-hero navigation authority: the SOLE writer of units + movesLeft on objective boards. Applies a budget-limited MOVE intent (steps the hero one tile, spends a move, emits HERO_STEPPED) and an optional WANDER intent (random step for neutral NPCs). Renders nothing.
uses HeroNav from "std/behaviors/std-hero-nav"Entity: HeroNavData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
HeroNav | MOVE, WANDER, RESTART | HERO_STEPPED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
HeroNav | gridHeight | number | Grid Height |
HeroNav | gridWidth | number | Grid Width |
HeroNav | moveBudget | number | Move Budget |
HeroNav | running | boolean | Running |
HeroNav | tiles | [Tile] | Tiles |
HeroNav | units | [Unit] | Initial Units |
std-livesBODY_HAZARD, BODY_FELL, PATROL_HIT — onto it) costs one life, respecting an invulnerability window so overlapping hazards can't chain-drain; losing a life emits LIFE_LOST plus RESPAWN with the current checkpoint (boards route RESPAWN to the body authority's PLACE), and losing the last emits GAME_OVER instead. Checkpoints advance automatically: BODY_MOVED crossing a configured checkpoint's atX moves the respawn point forward and emits CHECKPOINT_REACHED once per checkpoint (tracked by furthest atX reached, so checkpoints are ordered along the run). RESTART reseeds lives and respawn to the spawn. Renders nothing — HUDs read lives off the shared entity. Corresponds to the design-sheet field(s): challenge, feedback.
uses Lives from "std/behaviors/std-lives"Entity: LivesData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
Lives | DAMAGE, BODY_MOVED, RESTART | LIFE_LOST, RESPAWN, GAME_OVER, CHECKPOINT_REACHED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
Lives | checkpoints | [Checkpoint] | Checkpoints |
Lives | invulnMs | number | Invulnerability Window (ms) |
Lives | maxLives | number | Max Lives |
Lives | running | boolean | Running |
Lives | spawnX | number | Spawn X |
Lives | spawnY | number | Spawn Y |
std-loop-lockeither direction counts); when |swept| reaches turns × 2π the lock flips unlocked and emits LOOP_UNLOCKED once. Entering the band reseeds the angle so leaving and returning never jumps the sweep; progress is kept across exits, so a revolution can be completed in stages. RESTART re-locks every live lock (re-arming the live entity set, so SET_LOCKS-injected locks survive respawns). SET_LOCKS replaces the lock set at runtime for boards that import their locks. Renders nothing; boards draw the ring/chest and read swept from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, rewards.
uses LoopLock from "std/behaviors/std-loop-lock"Entity: LoopLockData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
LoopLock | BODY_MOVED, SET_LOCKS, RESTART | LOOP_UNLOCKED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
LoopLock | locks | [LoopLock] | Locks |
LoopLock | running | boolean | Running |
std-market-flowHeadless win/lose authority for market-service boards: owns only result. Listens SERVICE_CHANGED (served + lost) and sets result to won when enough customers are served, lost when too many patience timers expire, else none. Renders nothing.
uses MarketFlow from "std/behaviors/std-market-flow"Entity: MarketFlowData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
MarketFlow | SERVICE_CHANGED, RESTART | GAME_END |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
MarketFlow | maxLost | number | Max Lost |
MarketFlow | running | boolean | Running |
MarketFlow | targetServed | number | Target Served |
std-mesh-asset-artSOLE writer of @entity.meshAssetArt: collects volumetric asset catalogs published on the bus (MESH_ASSET_PUBLISH { kind, states }) into one kind → (state → draw-group items of draw-mesh descriptors) map that 3D board frames select per-row per anim state. INIT seeds from config and emits MESH_ASSET_SYNC so already-mounted catalogs republish regardless of mount order; the SYNC self-hop re-applies the seed after sibling canvas stashes exist (Almadar_Runtime_Gaps.md R-INIT-SEED-REPAINT-RACE). The 3D twin of SvgAssetArtCollector. Renders nothing — render authority stays with the frame.
uses MeshAssetArt from "std/behaviors/std-mesh-asset-art"Entity: StdMeshAssetArt (runtime)
Traits
| Trait | events | emits |
|---|---|---|
MeshAssetArtCollector | MESH_ASSET_PUBLISH | MESH_ASSET_SYNC |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
MeshAssetArtCollector | seedArt | Map<string,Map<string,[node]>> | Seed Art |
std-motion-bodythrust acceleration plus the board-wide bias field (biasAx/biasAy — the hill-force / wind / conveyor-belt channel, written only through the SET_BIAS intent) plus gravity feed velocity, damping bleeds it, maxSpeed caps it, velocity steps position, and the world walls clamp it (a clamped axis kills that axis's velocity). Intents: THRUST sets a body's acceleration (hold-to-push input: keydown pushes, keyup zeroes), IMPULSE kicks velocity instantly (jumps, d-pad nudges), PLACE teleports (spawns, curve-riding pins), SET_GRAVITY retunes the pull live, SET_BIAS steers the bias field, RESTART reseeds. Emits BODY_MOVED for the lead body (bodies[0]) every tick so boards that subscribe can react — boards that don't subscribe pay nothing. Renders nothing.
uses MotionBody from "std/behaviors/std-motion-body"Entity: MotionBodyData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
MotionBody | THRUST, IMPULSE, PLACE, SET_GRAVITY, SET_BIAS, RESTART | BODY_MOVED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
MotionBody | bodies | [Body] | Initial Bodies |
MotionBody | damping | number | Damping |
MotionBody | gravity | number | Gravity |
MotionBody | maxSpeed | number | Max Speed |
MotionBody | running | boolean | Running |
MotionBody | xMax | number | Right Wall |
MotionBody | xMin | number | Left Wall |
MotionBody | yMax | number | Ceiling |
MotionBody | yMin | number | Floor |
std-objective-flowHeadless win/lose authority for objective boards: owns only result. Listens PROGRESS (objectivesLeft + movesLeft) and sets result to won when every objective is reached, lost when the move budget runs out first, else none. Renders nothing. Corresponds to the design-sheet field(s): goals, feedback.
uses ObjectiveFlow from "std/behaviors/std-objective-flow"Entity: FlowState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ObjectiveFlow | PROGRESS, RESTART | GAME_END |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ObjectiveFlow | running | boolean | Running |
std-objective-reachHeadless reach-the-objective mechanic: owns features + score + objectivesLeft. Listens HERO_STEPPED and, when the hero lands on a target-type feature, scores it (optionally removing the model), emits a BURST pickup particle, and emits PROGRESS so round-flow can decide win/lose. Never writes units.
uses ObjectiveReach from "std/behaviors/std-objective-reach"Entity: ObjectiveState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ObjectiveReach | HERO_STEPPED, RESTART | BURST, PROGRESS |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ObjectiveReach | features | [Feature] | Features |
ObjectiveReach | pointsPerTarget | number | Points Per Target |
ObjectiveReach | reachRadius | number | Reach Radius |
ObjectiveReach | removeOnReach | boolean | Remove On Reach |
ObjectiveReach | running | boolean | Running |
ObjectiveReach | startScore | number | Start Score |
ObjectiveReach | targetType | string | Target Type |
std-pad-lockpads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. The lowest uncompleted group is stamped on the shared entity as currentGrp so boards can pulse exactly the live pads (0 = no group open / ungrouped pads). RESTART unlights every live pad and resets the set (re-arming the live entity set, so SET_PADS-injected pads survive respawns). SET_PADS replaces the pad set at runtime for boards that import their pads. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics.
uses PadLock from "std/behaviors/std-pad-lock"Entity: PadLockData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
PadLock | BODY_MOVED, SET_PADS, RESTART | PAD_GROUP_COMPLETED, PAD_SET_COMPLETED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
PadLock | pads | [PadLock] | Pads |
PadLock | reachX | number | Reach X |
PadLock | reachY | number | Reach Y |
PadLock | running | boolean | Running |
std-patienceHeadless customer-service mechanic: owns a stationary customer roster with per-customer patience. Decrements patience every tick, serves nearby customers on HERO_STEPPED (resets their patience + scores), and emits CUSTOMER_LOST when a timer expires. Never writes units.
uses Patience from "std/behaviors/std-patience"Entity: PatienceData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
Patience | HERO_STEPPED, RESTART | BURST, SERVICE_CHANGED, CUSTOMER_LOST |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
Patience | customers | [Customer] | Customers |
Patience | running | boolean | Running |
Patience | serveRadius | number | Serve Radius |
std-patrol-hazardcy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. SET_PATROLS replaces the live patrol set at runtime for boards that import their patrols; RESTART re-arms the live set, so injected patrols survive respawns. Renders nothing. Corresponds to the design-sheet field(s): challenge, dynamics.
uses PatrolHazard from "std/behaviors/std-patrol-hazard"Entity: PatrolState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
PatrolHazard | BODY_MOVED, SET_PATROLS, RESTART | PATROL_HIT |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
PatrolHazard | hitRadius | number | Hit Radius |
PatrolHazard | patrols | [Patrol] | Patrols |
PatrolHazard | playerSpawnX | number | Player Spawn X |
PatrolHazard | playerSpawnY | number | Player Spawn Y |
PatrolHazard | running | boolean | Running |
std-pickupthe platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). A feature carrying active: false is visible but NOT collectible (gated pickups — e.g. a star that only counts once the curve passes through it); FEATURES_ACTIVE{updates:[{id,active}]} flips gates in place without re-arming collected. When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count (re-arming the live entity set, so SET_FEATURES-injected features survive). SET_FEATURES replaces the collectible set at runtime for boards that import their features; ADD_FEATURES appends without disturbing the live set (mid-game gem drops). kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity. Corresponds to the design-sheet field(s): rewards.
uses Pickup from "std/behaviors/std-pickup"Entity: PickupData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
Pickup | BODY_MOVED, SET_FEATURES, ADD_FEATURES, FEATURES_ACTIVE, RESTART | PICKED, COLLECT, PICKUP_SET_COMPLETED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
Pickup | features | [PickupFeature] | Features |
Pickup | reachX | number | Reach X |
Pickup | reachY | number | Reach Y |
Pickup | running | boolean | Running |
std-platformer-bodya body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Geometry lives on the shared entity: config platforms/skateCurve/driftRegions seed entity.platforms/skateCurve/driftRegions on INIT, and SET_PLATFORMS / SET_SKATE_CURVE / SET_DRIFT_REGIONS replace them at runtime (RESTART keeps the live set, so boards that import geometry never lose it on a respawn). Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Drift regions: the driftRegions set lists axis-aligned rects each carrying a constant acceleration (ax, ay) applied with the same 0.033s dt whenever the body's center is inside (empty list = zero behavior change). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, and the vertical velocity is the tangential projection (s = vx·cos θ, vy = s·sin θ — no discontinuous jumps at sample boundaries), so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing. Corresponds to the design-sheet field(s): mechanics, dynamics.
uses PlatformerBody from "std/behaviors/std-platformer-body"Entity: PlatformerBodyData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
PlatformerBody | STEER, JUMP, PLACE, CURVE_MOD_ADD, CURVE_MOD_CLEAR_RANGE, SET_TUNING, SET_PLATFORMS, SET_SKATE_CURVE, SET_DRIFT_REGIONS, RESTART | BODY_MOVED, BODY_SKATE_START, BODY_SKATE_END, BODY_JUMPED, BODY_LANDED, BODY_HAZARD, BODY_GOAL, BODY_FELL, CURVE_MOD_CLEAR |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
PlatformerBody | curveModsEnabled | boolean | Curve Mods Enabled |
PlatformerBody | driftRegions | [BodyDriftRegion] | Drift Regions |
PlatformerBody | gravity | number | Gravity |
PlatformerBody | jumpStrength | number | Jump Strength |
PlatformerBody | killY | number | Kill Y |
PlatformerBody | maxFallSpeed | number | Max Fall Speed |
PlatformerBody | moveSpeed | number | Move Speed |
PlatformerBody | platforms | [PlatformerPlatform] | Platforms |
PlatformerBody | running | boolean | Running |
PlatformerBody | skate | boolean | Curve Skating |
PlatformerBody | skateCurve | [PlatformerCurveSample] | Skate Curve |
PlatformerBody | skateMaxGap | number | Skate Max Gap |
PlatformerBody | skateSnap | number | Skate Snap |
PlatformerBody | spawn | PlatformerBody | Spawn Body |
PlatformerBody | xMax | number | Right Wall |
PlatformerBody | xMin | number | Left Wall |
std-productionHeadless unit-production mechanic: accrues productionPoints each turn (AI_TURN) and, on an affordable PRODUCE, emits a SPAWN intent for the grid-tactics authority to place a new unit. Owns only productionPoints (+ its spawn counter); never writes units directly.
uses Production from "std/behaviors/std-production"Entity: ProductionState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
Producer | AI_TURN, PRODUCE | SPAWN |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
Producer | pointsPerTurn | number | Points Per Turn |
Producer | running | boolean | Running |
Producer | spawnCost | number | Spawn Cost |
Producer | spawnHealth | number | Spawn Health |
Producer | spawnTeam | string | Spawn Team |
Producer | spawnUnitType | string | Spawn Unit Type |
Producer | spawnX | number | Spawn X |
Producer | spawnY | number | Spawn Y |
Producer | startPoints | number | Start Points |
std-round-flowHeadless win/lose round-resolution mechanic: derives result (victory/defeat/none) from team survivor counts on each UNITS_CHANGED signal and emits GAME_END. Owns only result; boards own their own phase/turn. Renders nothing.
uses RoundFlow from "std/behaviors/std-round-flow"Entity: RoundState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
RoundFlow | UNITS_CHANGED | GAME_END |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
RoundFlow | running | boolean | Running |
std-scoreHeadless scoring mechanic: awards points when the enemy survivor count drops on a UNITS_CHANGED signal. Owns only score (+ its kill baseline); renders nothing.
uses Score from "std/behaviors/std-score"Entity: ScoreState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ScoreKeeper | UNITS_CHANGED | none |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ScoreKeeper | initialEnemies | number | Initial Enemies |
ScoreKeeper | pointsPerKill | number | Points Per Kill |
ScoreKeeper | running | boolean | Running |
ScoreKeeper | startScore | number | Start Score |
std-survival-flowHeadless win/lose authority for the nature-survival board: owns only result. Listens RESOURCES (movesLeft) and sets result to lost when the move budget runs out before the camp is built; listens BUILD_CAMP (the render-gated win intent) and sets result to won. Renders nothing.
uses SurvivalFlow from "std/behaviors/std-survival-flow"Entity: SurvivalFlowData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
SurvivalFlow | RESOURCES, BUILD_CAMP, RESTART | GAME_END |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
SurvivalFlow | running | boolean | Running |
std-svg-asset-artSOLE writer of @entity.svgAssetArt: collects vector asset catalogs published on the bus (SVG_ASSET_PUBLISH { kind, states }) into one kind → (state → draw-group items) map that board frames select per-row per anim state. INIT seeds from config and emits SVG_ASSET_SYNC so already-mounted catalogs republish regardless of mount order; the SYNC self-hop re-applies the seed after sibling canvas stashes exist (Almadar_Runtime_Gaps.md R-INIT-SEED-REPAINT-RACE). Renders nothing — render authority stays with the frame.
uses SvgAssetArt from "std/behaviors/std-svg-asset-art"Entity: StdSvgAssetArt (runtime)
Traits
| Trait | events | emits |
|---|---|---|
SvgAssetArtCollector | SVG_ASSET_PUBLISH | SVG_ASSET_SYNC |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
SvgAssetArtCollector | seedArt | Map<string,Map<string,[node]>> | Seed Art |
std-tutorial-autodemothe organism maps DEMO_* to its own steering, so a demo cannot self-cancel through the board's input path.
uses TutorialAutodemo from "std/behaviors/std-tutorial-autodemo"Entity: AutoDemoData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
AutoDemo | TUTORIAL_DEMO_START, TUTORIAL_DEMO_STOP, DEMO_CANCEL | DEMO_LEFT, DEMO_RIGHT, DEMO_JUMP, DEMO_STOP |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
AutoDemo | scripts | [DemoScript] | Scripts |
std-tutorial-overlaytitle, a live previewTrait frame playing the mechanic via std-tutorial-autodemo (a bare game canvas, no shell chrome), one line of body copy, a step counter, and Back / Next / Skip — composed entirely from registered render types (stack + text + button + trait frame) into the overlay slot, so no new UI component is needed. autoShow opens it on INIT for first-time players; a board's help button re-opens it any time via SHOW (which rewinds to step one). DISMISS (or finishing the last step) marks the run done, clears the overlay, and emits TUTORIAL_DONE so the board can unpause or log. Steps are pure config — a board teaches a new mechanic by adding one { id, title, body, demoId } row plus a previewTrait binding. Corresponds to the design-sheet field(s): feedback, agency.
uses TutorialOverlay from "std/behaviors/std-tutorial-overlay"Entity: TutorialState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
TutorialEmptyPreview | none | none |
TutorialOverlay | CLOSE | TUT_AUTO, TUT_NEXT, TUT_BACK, TUT_DISMISS, SHOW, TUTORIAL_DONE, TUTORIAL_DEMO_START, TUTORIAL_DEMO_STOP |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
TutorialOverlay | autoShow | boolean | Auto Show |
TutorialOverlay | previewTrait | trait | Preview trait |
TutorialOverlay | steps | [TutorialStep] | Steps |
std-velocity-gatea failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every live gate (re-arming the live entity set, so SET_VGATES-injected gates survive respawns). SET_VGATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics.
uses VelocityGate from "std/behaviors/std-velocity-gate"Entity: VelocityGateData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
VelocityGate | BODY_MOVED, SET_VGATES, RESTART | VELOCITY_GATE_OPENED, VELOCITY_GATE_DENIED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
VelocityGate | gates | [VelocityGate] | Gates |
VelocityGate | reachMargin | number | Reach Margin |
VelocityGate | running | boolean | Running |
std-xpraising the threshold and emitting a HEAL reward the grid-tactics authority applies. Owns only xp/xpToNext/level (+ kill baseline); never writes units.
uses Xp from "std/behaviors/std-xp"Entity: XpState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
XpProgression | UNITS_CHANGED | HEAL |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
XpProgression | baseXpToNext | number | Base XP To Next |
XpProgression | healTeam | string | Heal Team |
XpProgression | initialEnemies | number | Initial Enemies |
XpProgression | levelUpHeal | number | Level-Up Heal |
XpProgression | running | boolean | Running |
XpProgression | startXp | number | Start XP |
XpProgression | xpPerKill | number | XP Per Kill |
XpProgression | xpToNextIncrement | number | XP To Next Increment |
std-zone-cardname, concept, objective — for a while after every crossing. Listens BODY_MOVED and, when the player's x crosses into a different config zone, stamps the shared entity (zoneId, card, enteredAt) and emits ZONE_CHANGED carrying the card fields; the card self-clears ttlTicks BODY_MOVED ticks later (a per-move tick counter on the entity, so pauses at speed zero still age it out) and boards clear it early via CARD_DISMISS (renamed to a board-scoped progress event) on any mechanic completion. RESTART clears the card and the clock. Renders nothing; boards draw the card from the shared entity (the render authority).
uses ZoneCard from "std/behaviors/std-zone-card"Entity: ZoneCardData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
ZoneCard | BODY_MOVED, CARD_DISMISS, RESTART | ZONE_CHANGED |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
ZoneCard | running | boolean | Running |
ZoneCard | ttlTicks | number | TTL Ticks |
ZoneCard | zones | [ZoneCardZone] | Zones |
std-arcade-board-3d3D arcade-hall FRAME: composes hero-nav (free roam) + arcade-play (token/ticket economy) + fx-particles + arcade-flow (win/lose) onto one shared GameState with a single render authority. Games consume this molecule and supply only theme/assets/units/tiles/machines via config.
uses ArcadeBoard3d from "std/behaviors/std-arcade-board-3d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
HeroAuthority | none | none |
PlayEconomy | none | none |
FxDecay | none | none |
RoundGate | none | none |
ArcadeIntent | PLAY_AGAIN | MOVE, WANDER, PLAY_MACHINE, RESTART, TILE_CLICK, UNIT_CLICK, FEATURE_CLICK, CANCEL |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
HeroAuthority | gridHeight | number | Grid Height |
HeroAuthority | gridWidth | number | Grid Width |
HeroAuthority | moveBudget | number | Move Budget |
HeroAuthority | running | boolean | Running |
HeroAuthority | tiles | [Tile] | Tiles |
HeroAuthority | units | [Unit] | Initial Units |
PlayEconomy | machines | [Machine] | Machines |
PlayEconomy | maxPayout | number | Max Payout |
PlayEconomy | minPayout | number | Min Payout |
PlayEconomy | running | boolean | Running |
PlayEconomy | startTokens | number | Start Tokens |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundGate | running | boolean | Running |
RoundGate | ticketsToWin | number | Tickets To Win |
ArcadeIntent | assetManifest | AssetManifest | Asset Manifest |
ArcadeIntent | bgColor | string | Bg Color |
ArcadeIntent | cameraMode | string | Camera Mode |
ArcadeIntent | features | [Feature] | Features |
ArcadeIntent | fxPresets | [FxPreset] | Fx Presets |
ArcadeIntent | goalText | string | Goal Text |
ArcadeIntent | gridHeight | number | Grid Height |
ArcadeIntent | gridWidth | number | Grid Width |
ArcadeIntent | howText | string | How Text |
ArcadeIntent | movementRange | number | Movement Range |
ArcadeIntent | scale | number | Scale |
ArcadeIntent | ticketsLabel | string | Tickets Label |
ArcadeIntent | tokensLabel | string | Tokens Label |
ArcadeIntent | unitScale | number | Unit Scale |
std-crew-board-2d2D multi-unit crew-management board FRAME: composes hero-nav (unit-by-id move authority, no combat) + fx-particles onto one shared GameState with a canvas-2d render and select/deselect/move intent. Games consume this molecule and supply only theme/assets/units/tiles via config.
uses CrewBoard2d from "std/behaviors/std-crew-board-2d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
CrewAuthority | none | none |
FxDecay | none | none |
AnimClock | none | none |
CrewIntent | none | MOVE, TILE_CLICK, UNIT_CLICK, CANCEL |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
CrewAuthority | gridHeight | number | Grid Height |
CrewAuthority | gridWidth | number | Grid Width |
CrewAuthority | moveBudget | number | Move Budget |
CrewAuthority | running | boolean | Running |
CrewAuthority | tiles | [Tile] | Tiles |
CrewAuthority | units | [Unit] | Initial Units |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
AnimClock | frames | [string] | Frame names |
CrewIntent | assetManifest | AssetManifest | Asset Manifest |
CrewIntent | backgroundAsset | Asset | Background Asset |
CrewIntent | cancelIcon | Asset | Cancel Icon |
CrewIntent | crewCount | number | Crew Count |
CrewIntent | crewIcon | Asset | Crew Icon |
CrewIntent | features | [Feature] | Features |
CrewIntent | fxPresets | [FxPreset] | Fx Presets |
CrewIntent | gridHeight | number | Grid Height |
CrewIntent | gridWidth | number | Grid Width |
CrewIntent | hudBackgroundAsset | Asset | HUD Background Asset |
CrewIntent | movementRange | number | Movement Range |
CrewIntent | oxygen | number | Oxygen |
CrewIntent | oxygenIcon | Asset | Oxygen Icon |
CrewIntent | projection | string | Projection |
CrewIntent | showMinimap | boolean | Show Minimap |
std-dungeon-board-2d2D key-move dungeon-crawl board FRAME: composes hero-nav (key-move intent) + dungeon-combat (bump-attack, monster chase, hero HP) + objective-reach (exit/chest) + fx-particles + objective-flow (win) onto one shared GameState with a canvas-2d render. Games consume this molecule and supply only theme/assets/tiles/units/enemies/features via config.
uses DungeonBoard2d from "std/behaviors/std-dungeon-board-2d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
HeroAuthority | none | none |
Enemies | none | none |
Collector | none | none |
FxDecay | none | none |
RoundGate | none | none |
DungeonIntent | none | MOVE, ATTACK, MONSTER_TICK, MOVE_UP, MOVE_DOWN, MOVE_LEFT, MOVE_RIGHT, PLAY_AGAIN, RESTART |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
HeroAuthority | gridHeight | number | Grid Height |
HeroAuthority | gridWidth | number | Grid Width |
HeroAuthority | moveBudget | number | Move Budget |
HeroAuthority | running | boolean | Running |
HeroAuthority | tiles | [Tile] | Tiles |
HeroAuthority | units | [Unit] | Initial Units |
Enemies | attackDamage | number | Attack Damage |
Enemies | enemies | [Unit] | Initial Enemies |
Enemies | gridHeight | number | Grid Height |
Enemies | gridWidth | number | Grid Width |
Enemies | pointsPerKill | number | Points Per Kill |
Enemies | running | boolean | Running |
Enemies | startHp | number | Start HP |
Enemies | tiles | [Tile] | Tiles |
Collector | features | [Feature] | Features |
Collector | pointsPerTarget | number | Points Per Target |
Collector | reachRadius | number | Reach Radius |
Collector | removeOnReach | boolean | Remove On Reach |
Collector | running | boolean | Running |
Collector | startScore | number | Start Score |
Collector | targetType | string | Target Type |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundGate | running | boolean | Running |
DungeonIntent | assetManifest | AssetManifest | Asset Manifest |
DungeonIntent | backgroundAsset | Asset | Background Asset |
DungeonIntent | directionAssets | DirectionAssets | Direction Assets |
DungeonIntent | fontFamily | string | Font Family |
DungeonIntent | fxPresets | [FxPreset] | Fx Presets |
DungeonIntent | gridHeight | number | Grid Height |
DungeonIntent | gridWidth | number | Grid Width |
DungeonIntent | hudBackgroundAsset | Asset | HUD Background Asset |
DungeonIntent | scale | number | Scale |
std-market-board-3d3D single-hero market-service board FRAME: composes hero-nav (hero movement) + patience (stationary customers + starve timers) + fx-particles + market-flow (win/lose) onto one shared GameState with a single render authority. Games consume this molecule and supply only theme/assets/units/customers via config.
uses MarketBoard3d from "std/behaviors/std-market-board-3d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
HeroAuthority | none | none |
Patience | none | none |
FxDecay | none | none |
RoundGate | none | none |
MarketIntent | PLAY_AGAIN | MOVE, RESTART, TILE_CLICK, UNIT_CLICK, CANCEL |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
HeroAuthority | gridHeight | number | Grid Height |
HeroAuthority | gridWidth | number | Grid Width |
HeroAuthority | moveBudget | number | Move Budget |
HeroAuthority | running | boolean | Running |
HeroAuthority | tiles | [Tile] | Tiles |
HeroAuthority | units | [Unit] | Initial Units |
Patience | customers | [Customer] | Customers |
Patience | running | boolean | Running |
Patience | serveRadius | number | Serve Radius |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundGate | maxLost | number | Max Lost |
RoundGate | running | boolean | Running |
RoundGate | targetServed | number | Target Served |
MarketIntent | assetManifest | AssetManifest | Asset Manifest |
MarketIntent | bgColor | string | Bg Color |
MarketIntent | cameraMode | string | Camera Mode |
MarketIntent | features | [Feature] | Features |
MarketIntent | fxPresets | [FxPreset] | Fx Presets |
MarketIntent | goalText | string | Goal Text |
MarketIntent | gridHeight | number | Grid Height |
MarketIntent | gridWidth | number | Grid Width |
MarketIntent | howText | string | How Text |
MarketIntent | livesLabel | string | Lives Label |
MarketIntent | maxLost | number | Max Lost |
MarketIntent | movementRange | number | Movement Range |
MarketIntent | scale | number | Scale |
MarketIntent | scoreLabel | string | Score Label |
MarketIntent | unitScale | number | Unit Scale |
std-objective-board-3d3D single-hero objective board FRAME: composes hero-nav (units + move budget) + objective-reach (targets) + fx-particles + objective-flow (win/lose) onto one shared GameState with a single render authority. Games consume this molecule and supply only theme/assets/units/targets via config.
uses ObjectiveBoard3d from "std/behaviors/std-objective-board-3d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
HeroAuthority | none | none |
Collector | none | none |
FxDecay | none | none |
RoundGate | none | none |
HeroIntent | PLAY_AGAIN | MOVE, WANDER, RESTART, TILE_CLICK, UNIT_CLICK, CANCEL |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
HeroAuthority | gridHeight | number | Grid Height |
HeroAuthority | gridWidth | number | Grid Width |
HeroAuthority | moveBudget | number | Move Budget |
HeroAuthority | running | boolean | Running |
HeroAuthority | tiles | [Tile] | Tiles |
HeroAuthority | units | [Unit] | Initial Units |
Collector | features | [Feature] | Features |
Collector | pointsPerTarget | number | Points Per Target |
Collector | reachRadius | number | Reach Radius |
Collector | removeOnReach | boolean | Remove On Reach |
Collector | running | boolean | Running |
Collector | startScore | number | Start Score |
Collector | targetType | string | Target Type |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundGate | running | boolean | Running |
HeroIntent | assetManifest | AssetManifest | Asset Manifest |
HeroIntent | bgColor | string | Bg Color |
HeroIntent | cameraMode | string | Camera Mode |
HeroIntent | extraStats | [HudStat] | Extra Stats |
HeroIntent | fxPresets | [FxPreset] | Fx Presets |
HeroIntent | gridHeight | number | Grid Height |
HeroIntent | gridWidth | number | Grid Width |
HeroIntent | movementRange | number | Movement Range |
HeroIntent | objectiveLabel | string | Objective Label |
HeroIntent | scale | number | Scale |
HeroIntent | scoreLabel | string | Score Label |
HeroIntent | unitScale | number | Unit Scale |
std-platformer-board-2dinput forwarding (LEFT/RIGHT/STOP/JUMP → STEER/JUMP intents), goal scoring, hazard/pit lives with respawn, PLAY_AGAIN reset — physics, particles, and the win gate belong to the atoms. Games consume this organism and supply level geometry (platforms, in both BodyAuthority.platforms for collision and the render-side platforms knob), theme/assets, and physics feel via config/traitOverrides.
uses PlatformerBoard2d from "std/behaviors/std-platformer-board-2d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
BodyAuthority | none | none |
FxDecay | none | none |
RoundGate | none | none |
PlatformerIntent | none | LEFT, RIGHT, STOP, JUMP, PLAT_STEER, PLAT_JUMP, PLAT_PLACE, PLAT_GOAL, PLAT_HAZARD, PLAT_FELL, BURST, PROGRESS, GAME_END, RESTART, PLAY_AGAIN |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
BodyAuthority | curveModsEnabled | boolean | Curve Mods Enabled |
BodyAuthority | driftRegions | [BodyDriftRegion] | Drift Regions |
BodyAuthority | gravity | number | Gravity |
BodyAuthority | jumpStrength | number | Jump Strength |
BodyAuthority | killY | number | Kill Y |
BodyAuthority | maxFallSpeed | number | Max Fall Speed |
BodyAuthority | moveSpeed | number | Move Speed |
BodyAuthority | platforms | [PlatformerPlatform] | Platforms |
BodyAuthority | running | boolean | Running |
BodyAuthority | skate | boolean | Curve Skating |
BodyAuthority | skateCurve | [PlatformerCurveSample] | Skate Curve |
BodyAuthority | skateMaxGap | number | Skate Max Gap |
BodyAuthority | skateSnap | number | Skate Snap |
BodyAuthority | spawn | PlatformerBody | Spawn Body |
BodyAuthority | xMax | number | Right Wall |
BodyAuthority | xMin | number | Left Wall |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundGate | running | boolean | Running |
PlatformerIntent | backgroundAsset | Asset | Background Asset |
PlatformerIntent | backgroundImage | Asset | Background Image |
PlatformerIntent | bgColor | string | Bg Color |
PlatformerIntent | clearTitle | string | Clear Title |
PlatformerIntent | directionAssets | DirectionAssets | Direction Assets |
PlatformerIntent | fxPresets | [FxPreset] | Fx Presets |
PlatformerIntent | goalScore | number | Goal Score |
PlatformerIntent | hudBackgroundAsset | Asset | HUD Background Asset |
PlatformerIntent | lostTitle | string | Lost Title |
PlatformerIntent | platforms | [PlatformerPlatform] | Platforms |
PlatformerIntent | playerSprite | Asset | Player Sprite |
PlatformerIntent | respawnX | number | Respawn X |
PlatformerIntent | respawnY | number | Respawn Y |
PlatformerIntent | startLives | number | Start Lives |
PlatformerIntent | tileSprites | Map<string,Asset> | Tile Sprites |
PlatformerIntent | worldHeight | number | World Height |
PlatformerIntent | worldWidth | number | World Width |
std-platformer-puzzleplatformer-body, pickup, objective-flow, choice-gate, fx-particles, fx-narrative, tutorial-overlay — as the pillars a level rebinds: agency (body), challenge (choice), goal (objective), reward (pickup), feedback (fx, narrative, tutorial). Levels rebind these authorities locally and add their own geometry, render, and math rules. Math targets and grade levels stay downstream in the domain package; this substrate is domain-agnostic.
uses PlatformerPuzzle from "std/behaviors/std-platformer-puzzle"Entity: PlatformerPuzzleData (runtime)
Traits
| Trait | events | emits |
|---|---|---|
PlatformerPuzzleBody | none | none |
PlatformerPuzzlePickup | none | none |
PlatformerPuzzleObjective | none | none |
PlatformerPuzzleChoice | none | none |
PlatformerPuzzleFx | none | none |
PlatformerPuzzleNarrative | none | none |
PlatformerPuzzleTutorial | none | none |
PlatformerPuzzleNoopPreview | none | none |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
PlatformerPuzzleBody | curveModsEnabled | boolean | Curve Mods Enabled |
PlatformerPuzzleBody | driftRegions | [BodyDriftRegion] | Drift Regions |
PlatformerPuzzleBody | gravity | number | Gravity |
PlatformerPuzzleBody | jumpStrength | number | Jump Strength |
PlatformerPuzzleBody | killY | number | Kill Y |
PlatformerPuzzleBody | maxFallSpeed | number | Max Fall Speed |
PlatformerPuzzleBody | moveSpeed | number | Move Speed |
PlatformerPuzzleBody | platforms | [PlatformerPlatform] | Platforms |
PlatformerPuzzleBody | running | boolean | Running |
PlatformerPuzzleBody | skate | boolean | Curve Skating |
PlatformerPuzzleBody | skateCurve | [PlatformerCurveSample] | Skate Curve |
PlatformerPuzzleBody | skateMaxGap | number | Skate Max Gap |
PlatformerPuzzleBody | skateSnap | number | Skate Snap |
PlatformerPuzzleBody | spawn | PlatformerBody | Spawn Body |
PlatformerPuzzleBody | xMax | number | Right Wall |
PlatformerPuzzleBody | xMin | number | Left Wall |
PlatformerPuzzlePickup | features | [PickupFeature] | Features |
PlatformerPuzzlePickup | reachX | number | Reach X |
PlatformerPuzzlePickup | reachY | number | Reach Y |
PlatformerPuzzlePickup | running | boolean | Running |
PlatformerPuzzleObjective | running | boolean | Running |
PlatformerPuzzleChoice | gates | [ChoiceGate] | Choice Gates |
PlatformerPuzzleChoice | reachX | number | Reach X |
PlatformerPuzzleChoice | reachY | number | Reach Y |
PlatformerPuzzleChoice | running | boolean | Running |
PlatformerPuzzleFx | decayRate | number | Decay Rate |
PlatformerPuzzleFx | fx | [Fx] | Initial Fx |
PlatformerPuzzleFx | running | boolean | Running |
PlatformerPuzzleNarrative | running | boolean | Running |
PlatformerPuzzleNarrative | styles | Map<string,StyleDef> | Styles |
PlatformerPuzzleTutorial | autoShow | boolean | Auto Show |
PlatformerPuzzleTutorial | previewTrait | trait | Preview trait |
PlatformerPuzzleTutorial | steps | [TutorialStep] | Steps |
std-survival-board-3d3D single-hero survival board FRAME: composes hero-nav (units + move budget as energy) + gather (wood/stone resource nodes) + fx-particles + survival-flow (build-camp win / energy-out loss) onto one shared GameState with a single render authority. Games consume this molecule and supply only theme/assets/units/tiles/features/camp thresholds via config.
uses SurvivalBoard3d from "std/behaviors/std-survival-board-3d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
HeroAuthority | none | none |
Gather | none | none |
FxDecay | none | none |
Flow | none | none |
SurvivalIntent | PLAY_AGAIN | MOVE, WANDER, RESTART, TILE_CLICK, UNIT_CLICK, CANCEL, BUILD_CAMP_PRESS, BUILD_CAMP |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
HeroAuthority | gridHeight | number | Grid Height |
HeroAuthority | gridWidth | number | Grid Width |
HeroAuthority | moveBudget | number | Move Budget |
HeroAuthority | running | boolean | Running |
HeroAuthority | tiles | [Tile] | Tiles |
HeroAuthority | units | [Unit] | Initial Units |
Gather | features | [Feature] | Features |
Gather | running | boolean | Running |
Gather | startStone | number | Start Stone |
Gather | startWood | number | Start Wood |
Gather | stoneType | string | Stone Type |
Gather | woodType | string | Wood Type |
Gather | yieldPerNode | number | Yield Per Node |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
Flow | running | boolean | Running |
SurvivalIntent | assetManifest | AssetManifest | Asset Manifest |
SurvivalIntent | bgColor | string | Bg Color |
SurvivalIntent | cameraMode | string | Camera Mode |
SurvivalIntent | campStone | number | Camp Stone |
SurvivalIntent | campWood | number | Camp Wood |
SurvivalIntent | extraStats | [HudStat] | Extra Stats |
SurvivalIntent | fxPresets | [FxPreset] | Fx Presets |
SurvivalIntent | gridHeight | number | Grid Height |
SurvivalIntent | gridWidth | number | Grid Width |
SurvivalIntent | movementRange | number | Movement Range |
SurvivalIntent | scale | number | Scale |
SurvivalIntent | unitScale | number | Unit Scale |
std-tactics-board-2d2D player-controlled grid-tactics board FRAME: composes grid-tactics (units authority) + fx-particles + round-flow + a player-intent/render trait onto one shared GameState with a canvas-2d render. Games consume this molecule and supply only theme/assets/units via config.
uses TacticsBoard2d from "std/behaviors/std-tactics-board-2d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
TacticsAuthority | none | none |
FxDecay | none | none |
RoundLogic | none | none |
ScoreKeeper | none | none |
AnimClock | none | none |
VectorArt | none | none |
PlayerIntent | END_TURN | MOVE, ATTACK, AI_TURN, TILE_CLICK, UNIT_CLICK, CANCEL, `` |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
TacticsAuthority | attackDamage | number | Attack Damage |
TacticsAuthority | gridHeight | number | Grid Height |
TacticsAuthority | gridWidth | number | Grid Width |
TacticsAuthority | running | boolean | Running |
TacticsAuthority | tiles | [Tile] | Tiles |
TacticsAuthority | units | [Unit] | Initial Units |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundLogic | running | boolean | Running |
ScoreKeeper | initialEnemies | number | Initial Enemies |
ScoreKeeper | pointsPerKill | number | Points Per Kill |
ScoreKeeper | running | boolean | Running |
ScoreKeeper | startScore | number | Start Score |
AnimClock | frames | [string] | Frame names |
VectorArt | seedArt | Map<string,Map<string,[node]>> | Seed Art |
PlayerIntent | assetManifest | AssetManifest | Asset Manifest |
PlayerIntent | attackRange | number | Attack Range |
PlayerIntent | backgroundAsset | Asset | Background Asset |
PlayerIntent | extraAddonEvent | event | Extra Addon Event |
PlayerIntent | extraAddons | [HudButton] | Extra Addon Buttons |
PlayerIntent | extraStats | [HudStat] | Extra HUD Stats |
PlayerIntent | features | [Feature] | Features |
PlayerIntent | fxPresets | [FxPreset] | Fx Presets |
PlayerIntent | gridHeight | number | Grid Height |
PlayerIntent | gridWidth | number | Grid Width |
PlayerIntent | hudBackgroundAsset | Asset | HUD Background Asset |
PlayerIntent | movementRange | number | Movement Range |
PlayerIntent | projection | string | Projection |
PlayerIntent | showMinimap | boolean | Show Minimap |
PlayerIntent | vectorUnitScale | number | Vector Unit Scale |
std-tactics-board-3d3D player-controlled grid-tactics board FRAME: composes grid-tactics (units authority) + fx-particles + round-flow + a player-intent/render trait onto one shared GameState. Games consume this molecule and supply only theme/assets/units via config.
uses TacticsBoard3d from "std/behaviors/std-tactics-board-3d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
TacticsAuthority | none | none |
FxDecay | none | none |
RoundLogic | none | none |
VolumetricArt | none | none |
PlayerIntent | END_TURN | MOVE, ATTACK, AI_TURN, TILE_CLICK, UNIT_CLICK, CANCEL |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
TacticsAuthority | attackDamage | number | Attack Damage |
TacticsAuthority | gridHeight | number | Grid Height |
TacticsAuthority | gridWidth | number | Grid Width |
TacticsAuthority | running | boolean | Running |
TacticsAuthority | tiles | [Tile] | Tiles |
TacticsAuthority | units | [Unit] | Initial Units |
FxDecay | decayRate | number | Decay Rate |
FxDecay | fx | [Fx] | Initial Fx |
FxDecay | running | boolean | Running |
RoundLogic | running | boolean | Running |
VolumetricArt | seedArt | Map<string,Map<string,[node]>> | Seed Art |
PlayerIntent | assetManifest | AssetManifest | Asset Manifest |
PlayerIntent | bgColor | string | Bg Color |
PlayerIntent | cameraMode | string | Camera Mode |
PlayerIntent | features | [Feature] | Features |
PlayerIntent | fxPresets | [FxPreset] | Fx Presets |
PlayerIntent | gridHeight | number | Grid Height |
PlayerIntent | gridWidth | number | Grid Width |
PlayerIntent | lighting | Lighting3D | Lighting |
PlayerIntent | meshUnitScale | number | Mesh Unit Scale |
PlayerIntent | movementRange | number | Movement Range |
PlayerIntent | post | Post3D | Post Effects |
PlayerIntent | scale | number | Scale |
PlayerIntent | unitScale | number | Unit Scale |
std-worldmap-board-2d2D isometric overworld-travel board FRAME: composes grid-tactics (units authority) + round-flow (win/lose) + gold + a player-intent/render trait onto one shared GameState with an isometric canvas-2d render. Games consume this molecule and supply theme/assets/units/tiles/features via config.
uses WorldmapBoard2d from "std/behaviors/std-worldmap-board-2d"Entity: GameState (runtime)
Traits
| Trait | events | emits |
|---|---|---|
TacticsAuthority | none | none |
RoundLogic | none | none |
GoldAuthority | none | none |
WorldMapIntent | none | HERO_SELECT, HERO_MOVE, ADVANCE_TURN, MOVE, ATTACK, MINE_HIT |
Config knobs
| Trait | Knob | Type | Label |
|---|---|---|---|
TacticsAuthority | attackDamage | number | Attack Damage |
TacticsAuthority | gridHeight | number | Grid Height |
TacticsAuthority | gridWidth | number | Grid Width |
TacticsAuthority | running | boolean | Running |
TacticsAuthority | tiles | [Tile] | Tiles |
TacticsAuthority | units | [Unit] | Initial Units |
RoundLogic | running | boolean | Running |
GoldAuthority | running | boolean | Running |
GoldAuthority | startGold | number | Start Gold |
GoldAuthority | yieldAmount | number | Yield Amount |
WorldMapIntent | assetManifest | AssetManifest | Asset Manifest |
WorldMapIntent | backgroundAsset | Asset | Background Asset |
WorldMapIntent | extraAddons | [HudButton] | Extra Addon Buttons |
WorldMapIntent | extraStats | [HudStat] | Extra HUD Stats |
WorldMapIntent | features | [Feature] | Features |
WorldMapIntent | fontFamily | string | Font Family |
WorldMapIntent | goldIconAsset | Asset | Gold Icon Asset |
WorldMapIntent | gridHeight | number | Grid Height |
WorldMapIntent | gridWidth | number | Grid Width |
WorldMapIntent | hudBackgroundAsset | Asset | HUD Background Asset |
WorldMapIntent | movementRange | number | Movement Range |
WorldMapIntent | region | string | Region |
WorldMapIntent | regionIconAsset | Asset | Region Icon Asset |
WorldMapIntent | travelIconAsset | Asset | Travel Icon Asset |
WorldMapIntent | turnIconAsset | Asset | Turn Icon Asset |
One ui-* behavior per UI pattern, generated 1:1 from the pattern registry: its config knobs are the pattern's props.
| Name | Description |
|---|---|
ui-action-palette | ActionPalette |
ui-action-tile | ActionTile |
ui-canvas-2d | Canvas2d |
ui-canvas | Canvas |
ui-choice-button | ChoiceButton |
ui-control-button | ControlButton |
ui-control-grid | ControlGrid |
ui-dialogue-bubble | DialogueBubble |
ui-draw-fx-layer | DrawFxLayer |
ui-draw-group | DrawGroup |
ui-draw-mesh | DrawMesh |
ui-draw-shape-layer | DrawShapeLayer |
ui-draw-shape | DrawShape |
ui-draw-skinned-mesh | DrawSkinnedMesh |
ui-draw-sprite-layer | DrawSpriteLayer |
ui-draw-sprite | DrawSprite |
ui-draw-text-layer | DrawTextLayer |
ui-draw-text | DrawText |
ui-game-audio-cue | GameAudioCue |
ui-game-audio-toggle | GameAudioToggle |
ui-game-hud | GameHud |
ui-game-menu | GameMenu |
ui-health-bar | HealthBar |
ui-score-display | ScoreDisplay |
ui-sequence-bar | SequenceBar |
ui-stat-badge | StatBadge |
ui-state-graph | StateGraph |
ui-state-json-view | StateJsonView |
ui-timer-display | TimerDisplay |
ui-trait-slot | TraitSlot |
The language where the rule is the program.