Back to list
Foundry376

world-operator

by Foundry376

Monorepo for codako.org - Cocoa / Stagecast Creator reimagined on a modern stack

3🍴 4📅 Jan 24, 2026

SKILL.md


name: world-operator description: Provides comprehensive context about the Codako game engine's world operator, actor/character/rule types, stage helpers, and simulation logic. Use when modifying world-operator.ts, stage-helpers.ts, types.ts, or any game simulation, rule evaluation, or world state management code.

World Operator & Game Engine Context

When to Use This Skill

Activate this skill when working on:

  • The WorldOperator (frontend/src/editor/utils/world-operator.ts)
  • Stage helpers (frontend/src/editor/utils/stage-helpers.ts)
  • Core domain types (frontend/src/types.ts)
  • Rule evaluation, conditions, or actions
  • Actor/character behavior
  • World state mutations or history/undo
  • The recording flow (programming by demonstration)
  • Animation frames or debug data

Key Files

FilePurpose
frontend/src/types.tsAll domain model types
frontend/src/editor/utils/world-operator.tsSimulation engine
frontend/src/editor/utils/stage-helpers.tsPosition, transform, and comparison helpers
frontend/src/editor/utils/frame-accumulator.tsAnimation frame tracking
frontend/src/editor/utils/world-constants.tsFLOW_BEHAVIORS and CONTAINER_TYPES

Core Concepts

Domain Model Hierarchy

Character (template)
  ├── rules: RuleTreeItem[]      # Behavior tree
  ├── spritesheet.appearances    # Sprites
  └── variables                  # Variable definitions

Actor (instance of Character)
  ├── characterId                # Reference to template
  ├── position: {x, y}           # Grid coordinates
  ├── appearance                 # Current sprite ID
  ├── variableValues             # Instance variable overrides
  └── transform                  # Rotation/flip

Stage (2D grid)
  ├── actors: {[id]: Actor}
  ├── width, height
  └── wrapX, wrapY               # Edge wrapping

World (complete state)
  ├── stages: {[id]: Stage}
  ├── globals                    # Global variables
  ├── input: {keys, clicks}      # Current frame input
  ├── evaluatedRuleDetails       # Debug: detailed rule evaluation results
  ├── evaluatedTickFrames        # Debug: animation frames
  └── history: HistoryItem[]     # Undo stack (max 20)

Rule Structure

A Rule defines a before→after pattern transformation:

Rule = {
  mainActorId: string           // "Owner" actor, always at (0,0) in rule space
  actors: {[id]: Actor}         // "Before" pattern - positions relative to mainActor
  conditions: RuleCondition[]   // Additional constraints
  actions: RuleAction[]         // Transformations to apply
  extent: RuleExtent            // Bounding box {xmin, xmax, ymin, ymax, ignored}
}

Rule Tree (Control Flow)

Rules are organized hierarchically:

  • RuleTreeEventItem (group-event): Filters by input

    • event: "key" with code - Specific key press
    • event: "click" - Actor was clicked
    • event: "idle" - Always fires
  • RuleTreeFlowItem (group-flow): Controls iteration

    • behavior: "first" - Stop after first match
    • behavior: "all" - Execute all matches
    • behavior: "random" - Shuffle, then first match
    • behavior: "loop" - Repeat N times

Conditions and Actions

RuleCondition: Comparison between two RuleValues

{ left: RuleValue, comparator: VariableComparator, right: RuleValue, enabled: boolean }

RuleValue variants:

  • { constant: string } - Literal value
  • { actorId, variableId } - Actor's variable/appearance/transform
  • { globalId } - Global variable

RuleAction types:

  • move - Change position (delta or offset)
  • appearance - Change sprite
  • transform - Rotate/flip
  • variable - Modify actor variable (add/set/subtract)
  • delete - Remove actor
  • create - Spawn new actor
  • global - Modify global variable

WorldOperator API

WorldOperator(previousWorld, characters) → {
  tick(),        // Advance simulation one step
  untick(),      // Revert to previous state
  resetForRule() // Set up for rule preview
}

tick() Flow

  1. Snapshot previous state to history
  2. Clone globals and actors for mutation
  3. Update special globals (keypress, click)
  4. Evaluate each actor's rules via ActorOperator
  5. Return new immutable world state

Pattern Matching (checkRuleScenario)

For each grid cell in rule.extent:

  1. Find stage actors at that position (wrapping-aware)
  2. Find rule actors covering that position
  3. Unless "ignored", actor counts must match
  4. Stage actors must match rule actors (same character + conditions)
  5. Verify all referenced actors found
  6. Validate action offsets are valid positions

Returns {ruleActorId → stageActor} mapping, or false.

Debug Data

evaluatedRuleDetails

{ [actorId]: { [ruleId]: EvaluatedRuleDetails } }

Tracks detailed evaluation results for each rule per actor. Includes:

  • Overall pass/fail status
  • Per-square matching results (with failure reasons)
  • Per-condition evaluation results (with resolved values)
  • Actor mappings (which stage actor matched which rule actor)

Used by inspector to show rule state circles and condition status dots. See granular-rule-tracking.md for full details.

evaluatedTickFrames

Frame[] where Frame = { actors: {[id]: FrameActor}, id: number }
FrameActor = Actor & { deleted?, actionIdx?, animationStyle? }

Animation frames within a tick. Stage container animates through these.

Important Patterns

  1. Immutable Updates: Uses updeep (imported as u) for state updates
  2. Relative Positioning: Rule positions are relative to mainActor at (0,0)
  3. Deep Clone: Always clone before mutating (deepClone from utils)
  4. Wrapping: Use wrappedPosition() for stage edge handling
  5. History: Only saved when at least one rule fires

See Also

  • architecture-reference.md - Detailed architecture diagrams, data flow, and code examples
  • granular-rule-tracking.md - Documentation for the granular rule evaluation tracking system (square/condition-level feedback)

Score

Total Score

55/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新

+5
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

Reviews

💬

Reviews coming soon