Story Progression
Required story quest Optional side quest
The key words MUST, MUST NOT, and MAY below are used as in RFC 2119. Terminology: the unit of content is a quest. Some code identifiers say "mission" (completed_missions, is_mission_completed, complete_mission) — read those as "quest".
Quest classification
- Search and Rescue is the first story quest and the root of the graph. Every other quest MUST declare a parent (
parent_quest, plus optionalrequired_quests), so the dependency graph is fully rooted at Search and Rescue — no other quest may be parentless. - The required story quests (blue) form the spine from Search and Rescue through Dark Castle, the final story quest. Required vs side is derived from the graph — a quest is required if it lies on the parent chain leading to Dark Castle; there is no separate flag.
- Every quest not on that spine is an optional side quest (yellow). Side quests MAY be skipped and MUST NOT gate the required path.
Quest lifecycle
While a quest is accepted the game is On Quest (see Quest vs Field). Exactly two actions return it to Free Roam — report or cancel:
- In progress — objectives not yet met. The player MAY return to the guild counter and cancel; cancelling records nothing and returns to Free Roam.
- Completed — objectives met (e.g. the boss is down). The quest is still active; the player MUST now be able to report it and MUST NOT be able to cancel it.
- Report — turning the quest in at the guild counter MUST persist it (
complete_mission→completed_missions), grant rewards, and return to Free Roam. Reporting happens at the guild counter only (#354): the Principal in the city office handles story dialog (intro / mission briefing) and MUST NOT complete or report a quest — talking to the Principal with a completed-but-unreported quest directs the player to the counter, nothing more. The autopilot regression matrix proves both: every quest phase talks to the Principal (asserting it does not complete the quest), then reports at the counter. - Completion is not saved until reported: returning to the title while completed-but-unreported MUST NOT mark the quest done — it will not show as cleared at the guild counter.
Return to Title (from the start menu) saves the game and returns to the title screen, dropping the active field session. The end credits are the one exception to "not saved until reported": when the credits begin — after Dark Falz falls in Dark Castle — the game triggers that quest's complete and clear, then saves and returns to title exactly like Return to Title. Dark Castle therefore shows as CLEAR at the guild counter without ever being formally reported.
Unlocking free fields
Clearing an area in a quest MUST unlock that area's location for Free Roam — the location is added to the Free-Roam teleporter (see Quest vs Field). For example, clearing Paru during The Paru Pact unlocks the Paru field.
This rule is intentionally quest-agnostic: quests MAY be added, removed, or re-routed, and any quest that clears a not-yet-unlocked location unlocks it the same way. Unlocked locations are progression and MUST persist — unlike the within-field run-state, they are NOT cleared when a quest is accepted or reset afterward.
An idempotent upsert is the natural fit: clearing an area calls unlock(area), which adds the location if absent and is a no-op if it's already unlocked. No per-quest bookkeeping is needed — the set of unlocked locations simply grows.
Guild counter status tags
| Tag | Meaning |
|---|---|
| (none) | available to accept |
LOCKED | a parent_quest / required_quests entry isn't completed yet |
REPORT | completed this session, awaiting turn-in (the Completed state) |
CLEAR | reported & persisted — is_mission_completed(id) is true |
Ordering & lock display
data/quests/manifest.json is the canonical progression order; the guild counter sorts by manifest position so quests read top-to-bottom in story order. Locked quests MUST still appear (muted, naming the prerequisite: "[LOCKED] Complete \"X\" to unlock") rather than being hidden, so the player can see what's ahead.
Rewards & credits
Reporting the final story quest, Dark Castle (the Dark Falz fight), rolls the end credits on victory.
Implemented by
scripts/autoloads/session_manager.gd(SessionManager) — drives the quest lifecycle (accept / cancel /mark_quest_complete/report_quest) that flips a quest from in-progress to completed to reported.scripts/autoloads/game_state.gd(GameState) — stores the runtime completed-mission set:completed_missions,complete_mission(), andis_mission_completed().scripts/autoloads/character_manager.gd(CharacterManager) — persists that set per character slot, swapping each slot'scompleted_missionsin and out of GameState on slot activation.scripts/2d/guild_counter.gd— the guild counter that derives the REPORT / LOCKED / CLEAR tags (fromhas_completed_quest,parent_quest/required_quests, andis_mission_completed).