# world.ludic — the data model: components, entity archetypes, constants. # Imported by examples/games/chronorift.ludic. No `game` wrapper (this is a fragment). property Pos { x: int = 0, y: int = 0 } property Actor { kind: int = 0 } property Stats { hp: int = 1, maxhp: int = 1, mp: int = 0, maxmp: int = 0, atk: int = 1, def: int = 0, lvl: int = 1, xp: int = 0, guard: int = 0 } property Party { slot: int = 0 } # Entity KINDS. Identity is stored as one integer per entity (L_kind), not as # an empty marker component. Query membership with {Player} / {Enemy}. model Player { Pos, Actor, Party, Stats } # the controllable knight model Ally { Party, Stats } # backline mage (no overworld body) model Enemy { Actor, Stats } # battle foe const MW: int = 40 const MH: int = 18 const SPR_GRASS: int = 0 const SPR_TREE: int = 1 const SPR_PATH: int = 2 const SPR_HOUSE: int = 3 const SPR_DOOR: int = 4 const SPR_HERO: int = 5 const SPR_SLIME: int = 6 const SPR_SKEL: int = 7 const SPR_BOSS: int = 8 const SPR_MAGE: int = 9 const SPR_FLOOR: int = 10 const SPR_WALL: int = 11 export state GamesChronoriftState { game_mode: int = 0 # 0 field, 1 battle, 2 gameover, 3 victory turn_phase: int = 0 menu_cursor: int = 0 encounter: int = 0 enemy_type: int = 0 # 0 slime, 1 skeleton, 2 boss player_hit: int = 0 enemy_hit: int = 0 gold: int = 0 world_map: int = 0 # 0 overworld, 1 dungeon boss_down: int = 0 # boss defeated flag ack: int = 0 # debounce for end screens potions: int = 0 # potions in inventory }