Story arc system: 4 narrative beats with class-agnostic story screen
== New: StoryScreen.cs (full-screen narrative beat overlay) ==
== New: StoryScreen.cs (full-screen narrative beat overlay) ==
Generic story-beat presenter modeled on BossHypeScreen — full-screen
art, lower-third dark stripe, line-by-line type-on text reveal at
~35 chars/sec, 1.6s spacing between lines. Click to fast-forward;
players who’ve already seen a beat can click-skip the entire reveal
(PlayerPrefs gates “story_seen_
Four canonical beats baked in:
-
CampaignOpening — plays at every run start “Three operators. Three weapons. Find the source. End it before it ends us.” Sets up the world, the AI threat, the player role.
-
Act1Aftermath — after defeating Sentinel Prime “Its server farm goes dark. Then, through the static, you hear the AI laughing.” The first export was a prototype; the real fight is spreading.
-
Act2Aftermath — after defeating The Nexus “Where the Nexus stood, the air now ripples. The AI has stopped trying to control the world. It is trying to remake it.”
-
Act3Endgame — after defeating The Singularity The multiverse twist. Every reality, every operator, every version of the same fight. “You are not the last. You are one of infinitely many. End it in your reality. The others must do the same.”
Makes the meta-progression CANONICAL — every run = a different reality, every player worldwide is an operator in the multiverse-fight. Provides the in-game justification for repeated runs being narratively meaningful rather than just gameplay loops.
== Wiring ==
-
GameFlowManager.StartNewGame → CampaignOpening before NodeMap loads. Works for both first-class-pick and the post-defeat TryAgainSameClass path since both route through StartNewGame.
-
PostCombatHandler.ReturnToMap (boss-defeat branch):
- Captures actBeaten BEFORE incrementing currentAct
- Act 1 -> Act1Aftermath -> NodeMap (Act 2)
- Act 2 -> Act2Aftermath -> NodeMap (Act 3)
- Act 3 -> RecordRunEnded(fullRun=true) -> Act3Endgame -> MainMenu Replaces the previous “TODO: show run complete screen” + bare main menu return.
== Art ==
4 cinematic 16:9 images generated via tools/generate_story_art.py (Gemini 3 Pro Image, 770-790 KB each, 83s total runtime, 0 retries):
- campaign_opening.png — three operators silhouetted on a rooftop walking into a cyberpunk city at dusk, all three signature weapons visible
- act1_aftermath.png — fallen Sentinel Prime in server-farm rubble, larger horror awakening in the distance
- act2_aftermath.png — reality bending in violet/crimson over a ruined city, fractal patterns forming
- act3_endgame.png — multiverse vision: central operator + infinite reflections wielding different weapons across fractured realities
All saved to Resources/StoryArt/{slug}.png and loaded by StoryScreen.LoadStoryArt at runtime. Falls back to dark vignette if the art is missing (cold-install resilience).
Co-Authored-By: Claude Opus 4.7 (1M context) [email protected]
Commit 88e350c by astafford8488.