A Shining Force 1-inspired tactical RPG. Browser game built with Phaser 3 + TypeScript + Vite.
Game balance data lives in YAML under data/ — easy to hand-edit during development.
Early scaffold. Battle prototype is stubbed (renders a grid + data summary). No combat, AI, or town yet.
npm install
npm run dev # dev server on http://127.0.0.1:5173
npm run typecheck # TS type-check only
npm run build # production build to dist/data/ YAML game data (hand-edited)
characters.yaml playable + enemy unit templates
classes.yaml class definitions, promotion paths, learned spells
equipment.yaml weapons / armor
items.yaml consumables / key items
spells.yaml spell catalog (multi-level: Heal 1/2/3/4)
terrain.yaml tile types: move cost, defense, evade
src/
main.ts Phaser game bootstrap
scenes/ Phaser scenes (Boot, Battle)
data/ schema (Zod) + YAML loader
battle/ grid, pathfinding (A*), turn order, combat, AI stubs
- YAML files are imported as raw strings via Vite's
?rawand validated with Zod at startup. Schema errors print to the browser console with a readable diff. data/is intentionally outsidesrc/so non-coders can edit it without touching code.- Permanent design goal: keep gameplay rules data-driven. New units, classes, spells, and items should never require code changes.
- Battle prototype: 1 map, 3 vs 3, grid move + attack, simple AI, win/lose.
- Damage formula tuning, crits, terrain effects.
- Spells (single target, then AoE), MP, status effects.
- Town hub: shops, church (revive), HQ (party select), inn.
- Save/load via localStorage.
- Multi-battle campaign with story scenes.
- Promotion system, character recruitment.
- Real art (sprite sheets, animations) — placeholder until then.