# ============================================================================ # qdecl.ludic — a handler whose query lives in a @Queries annotation. # # @Queries(these: [Battle{hp <= 0 and side == 1}, Pos], on: Foe) # handler CleanBattle phase LateUpdate { … } # # is the same thing as writing `for (Battle, Pos) in query [Battle, Pos, {Foe}] # where Battle.hp <= 0 and Battle.side == 1 { … }` around the whole body — the # loop header moves into the annotation. Each property binds by name, the body # runs once per matching entity, and self() is that entity. # ============================================================================ program QueryDecl { property Battle { hp: int = 0, side: int = 0 } property Pos { x: int = 0, y: int = 0 } model Foe { Battle, Pos } handler Seed phase Start { spawn Foe { Battle { hp: 3, side: 1 } } spawn Foe { Battle { hp: 0, side: 1 } } spawn Foe { Battle { hp: -2, side: 0 } } } # a per-property constraint `Battle{...}` qualifies its bare fields to that # property; `on: Foe` adds the {Foe} kind filter. @Queries(these: [Battle { hp <= 0 and side == 1 }, Pos], on: Foe) handler CleanBattle phase LateUpdate { print(Pos.x) despawn self() } @Queries(these: [Battle]) handler Census phase Render { print(Battle.hp) } handler Bye phase Render { quit() } }