Design notes
Data each screen needs that doesn't exist yet
| Need | For | Where it should live | Depends on |
|---|---|---|---|
Player name rules: 1 to 12 characters, letters, spaces, ' and -; a list of random names | New game: name | Velan.Save validation, a names list in Data/ | Open question 1 |
| Per-device settings: music, effects and ambience volumes, haptics, text speed, text size, handedness, thumb swap, high-contrast glyphs, reduced motion | Settings, and every screen that honours them | PlayerPrefs keys velan.settings.*, like today's velan.settings.volume; not in the save | Audio mixer groups (VEL-84) |
| The main quest's current stage, for the save card | Continue card | Derived from QuestLog and the saved flags; quests need a category (main or side) | Quest JSON field |
| Location art and a short subtitle (region, side) | Continue card, loading, map cards | art and subtitle fields in Data/Locations/<id>.json | VEL-65, VEL-80 |
| Tracked quest | Objective tracker, journal, map | TrackedQuestId in the save | Velan.Save change |
| Where each quest stage happens (location id and marker) | Tracker direction arrow, map pins, "On map" | target: { location, marker } on each stage in Data/Quests/*.json | Quest JSON field |
| Quest giver and finish order | Journal | giver in quest JSON; finished quests in the order they finished (a list or timestamps in the save) | Velan.Story, Velan.Save |
| Events for "spell learned" and "item received" | Toasts | QuestLog.Changed exists; a learned-spell event on GameData; an inventory event | Inventory (VEL-61) |
| Speaker to character, and a portrait set with expressions | Dialogue | Data/Characters/<id>.json (name, portrait set); Yarn line tags such as #mood:worried | VEL-70 (character data), VEL-64 (portraits) |
| Rewards: item drops per encounter (battles never pay copper); a level curve (XP per level) | Battle results | drops in Data/Encounters/*.json; a level table in Data/ | VEL-61; level curve is new |
| A tip for each defeat | Defeat | tips per enemy in Data/Enemies/*.json | Bestiary (VEL-59) |
| World map: art, each place's position on it, routes, discovered and visited flags | World map | Data/Map/world.json; flags map.discovered.<id> and map.visited.<id> | VEL-65 / VEL-66 art; VEL-76 |
| Local map: a top-down image per location, the world-to-image mapping, markers (exits, quest targets, shops, people) | Local map | A render tool in the Editor that writes the image and bounds; markers from the location JSON's interactables and exits plus a mapMarkers list | VEL-76 |
| Spell effect summary and lore line; which spells show as unknown before they are found | Spell book, detail | lore (and the effect, derived from the spell's effects) in Data/Spells/*.json; the unknown list from the spell roadmap | VEL-60 |
| Practice mode: a cast without a battle | Practice | Reuses FieldCast (learn and prompt modes) with a free mode that only scores | Code, no data |
| Items, stacks, categories, copper | Inventory, item detail, shop, rewards, toasts | Codex/items-and-economy.md and its save-model spec | VEL-61 |
| Shops: what each sells, prices, stock | Shop | Data/Shops/<id>.json | VEL-61 |
| Letters and documents: title, sender, addressee, seal, pages; read and opened flags | Letter viewer | Data/Documents/<id>.json; key items point to a document id | VEL-61; addressee names are still open (Story Bible) |
| Loading tips | Loading | Data/Tips/tips.json | Writing |
From Game Screens › Data each screen needs that doesn't exist yet