game/module -> program, main -> entry, component -> property, archetype -> model, system -> handler. Done via a transitional self-hosting bootstrap: parser accepts both -> reseed -> compiler source moved to new keywords + parser tightened to new-only -> reseed (fixpoint holds). Old keywords now rejected. Token-safe corpus migration (tools/ludic-tools/rename_kw.c) leaves the LLVM @main/entry: labels in emit strings untouched; goldens byte-identical. Editor vocab (header/JetBrains/TextMate/emacs), check-docs wrapper, and doc fences updated; error string 'unknown component' -> 'unknown property'. test.sh 14/14, test-tools 28/0, check-vocabulary green. (Doc prose pass to follow.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
742 B
Text
34 lines
742 B
Text
# hello.ludic — smallest program that exercises the ECS pipeline
|
|
program Hello {
|
|
|
|
property Pos { x: int = 0, y: int = 0 }
|
|
property Vel { dx: int = 0, dy: int = 0 }
|
|
|
|
handler Boot phase Start {
|
|
spawn Mob {
|
|
Pos { x: 3, y: 4 }
|
|
Vel { dx: 1, dy: 0 }
|
|
}
|
|
spawn Mob {
|
|
Pos { x: 10, y: 2 }
|
|
Vel { dx: 0, dy: 1 }
|
|
}
|
|
}
|
|
|
|
# a system can declare the entities it operates on: the body then runs once
|
|
# per match, with the components bound and self() giving that entity.
|
|
handler Move phase FixedUpdate
|
|
query (p, v) [Pos, Vel]
|
|
{
|
|
p.x = p.x + v.dx
|
|
p.y = p.y + v.dy
|
|
}
|
|
|
|
handler Report phase Update {
|
|
for (p) in query [Pos] {
|
|
print_int(p.x)
|
|
print_int(p.y)
|
|
}
|
|
quit()
|
|
}
|
|
}
|