Skip to content

feat: the cast on the site, and a first-run onboarding flow in the game - #70

Merged
ralyodio merged 1 commit into
mainfrom
worktree-characters-onboarding
Sep 23, 2026
Merged

ralyodio merged 1 commit into
mainfrom
worktree-characters-onboarding

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

You asked for more character development on nightcell7.com, and a gameplay onboarding flow.

The cast

The story bible (PRD §7.5–§7.7) defines a supporting cast, four factions and MIRAGE, but the site showed none of them: two dossiers and nothing else.

  • packages/game-core/src/cast.ts holds them as data, and both the site and the game read it, so no surface can describe a person differently:
    • the supporting cast: Jonas Vale, Director Mara Vey, Colonel Arman Daryan, Silas Kade
    • the factions: the Nightcell Program, the Security Directorate, Orison Strategic, the International Verification Mission
    • MIRAGE
  • New /characters page with:
    • the two protagonists as a matched pair
    • the supporting cast, each with faction, role, and which campaign you meet them in
    • the four factions, MIRAGE, and the fiction notice
  • Each dossier gains "Who they answer to" (Vey for Rook, Daryan for Leila) and "Who they cross paths with" (Vale and Kade). Both sides get the same shape.
  • Linked from the home page's Two perspectives section and from the footer.

Spoiler and content rules. The page follows the home-page timeline's rule: say who these people are, never what the campaigns reveal. Vale's death is already public on that timeline. Who authorised the cleanup, and what "Nightcell 7" designates, are not. cast.test.ts fails the build if:

  • the copy reveals either secret,
  • any Arabic-script text appears, since Farsi is still awaiting native review (docs/content-and-culture.md),
  • Daryan is written as a villain, or
  • the two protagonists' circles differ in size (§14.3).

Onboarding

A first-time player used to get every option at once, then was dropped into Team Deathmatch against four bots with no guidance.

A briefing on the deploy gate. It says:

  • which institution your chosen side belongs to, and whose story that is (from the same cast data)
  • what the yard is
  • that the two sides can never share a colour

It re-renders when you change side.

A coach in the yard. It teaches one control at a time, in the order PRD §10.1 introduces them: move, look, sprint, crouch, jump, fire, reload, switch, frag. It moves on only when you actually do the thing, never on a timer.

  • Each step is measured from the moment it starts, so "switch" means changing weapon slot and "frag" means spending a grenade.
  • It pauses while you're dead. A respawn resets your slot and grenades and would otherwise complete steps by itself.
  • Turning counts correctly across the ±π wrap-around.

Skipping. The cursor is locked during play, so a skip button in the yard couldn't be clicked. Press Esc to bring up the gate, and Skip training is there. Each step is announced to screen readers. Finishing or skipping is remembered in nc7.onboarded. If browser storage is blocked, the game treats you as onboarded rather than showing the coach every time.

The logic is a pure module, apps/game/src/onboarding.ts, with 12 tests.

Also fixed: the side descriptions on the gate still said "Cyan band" and "Orange band". Since #62 you choose your side's colour, so those were wrong.

Verified

  • Real build, via the gameplay capture tool:
    • the briefing shows on the gate
    • the coach starts on step 1 (W A S D · Move)
    • it moves to Mouse · Look around once the scripted player walks
  • /characters and both dossiers render with no horizontal scrolling at 1280 px and 390 px.
  • pnpm check green, 369 tests.

🤖 Generated with Claude Code

Asked for: more character development on nightcell7.com, and a gameplay
onboarding flow.

THE CAST

The story bible (PRD §7.5 to §7.7) has a supporting cast, four factions and
MIRAGE, and the site showed none of them: two dossiers and nothing else.

- packages/game-core/src/cast.ts holds them as data: Jonas Vale, Director
  Mara Vey, Colonel Arman Daryan, Silas Kade; the Nightcell Program, the
  Security Directorate, Orison Strategic and the International Verification
  Mission; MIRAGE. The site and the game both read it, so no surface can
  describe a person differently.
- /characters: the protagonists as a matched pair, the supporting cast with
  faction, role and which campaign you meet them in, the factions, MIRAGE,
  and the fiction notice.
- Each dossier gains "Who they answer to" (Vey / Daryan) and "Who they cross
  paths with" (Vale, Kade), the same shape for both sides.
- Linked from the home page's Two perspectives section and the footer.

Public copy, under the home-page timeline's rule: who these people are and
what the player sees early, never what the campaigns reveal. Vale's death is
already public on that timeline; who authorised the cleanup and what
Nightcell 7 designates are not. cast.test.ts refuses those reveals, any
Arabic-script text while Farsi awaits native review
(docs/content-and-culture.md), and a Daryan written as a villain, and holds
both protagonists' circles to the same size (§14.3).

ONBOARDING

A first-time player got every option at once and was then dropped into Team
Deathmatch against four bots with no guidance.

- A briefing on the deploy gate: which institution the chosen side belongs
  to and whose story it is, from the same cast data; what the yard is; that
  the two sides can never share a colour. Re-renders on a side change.
- A coach in the yard that teaches one control at a time, in the order PRD
  §10.1 introduces systems (move, look, sprint, crouch, jump, fire, reload,
  switch, frag), and advances only when the player actually does the thing,
  never on a timer. It measures each step against a baseline, so "switch"
  means changing slot and "frag" means spending one; it waits while the
  player is dead, because a respawn resets both and would complete steps by
  itself; it counts turns across the +-pi wrap correctly.
- Skippable from the gate. The cursor is locked in play, so a skip button in
  the yard could not be clicked; Esc brings the gate up and the button is
  there. A live region announces each step. Remembered in nc7.onboarded; a
  blocked storage counts as onboarded rather than nagging forever.
- Logic is pure in apps/game/src/onboarding.ts, 12 tests.

Also fixed: the side blurbs on the gate still said "Cyan band" and "Orange
band", which #62 made wrong; the player now chooses the colour.

Verified: a real build under the gameplay capture tool shows the briefing on
the gate, the coach on step 1 ("W A S D · Move"), and the coach advancing to
"Mouse · Look around" once the scripted player walks. /characters and both
dossiers render with no horizontal overflow at 1280 or 390 px. pnpm check
green, 369 tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

9 finding(s)

HIGH/CRITICAL: 4 | MEDIUM: 5

Severity Rule Location
HIGH manifest-typosquat apps/game/package.json:17
HIGH sh-remote-script-execution apps/site/public/install.sh:210
HIGH sh-remote-script-execution apps/site/public/install.sh:213
HIGH sh-remote-script-execution apps/site/public/install.sh:216
MEDIUM sh-remote-script-execution apps/site/public/install.sh:219
MEDIUM sh-remote-script-execution apps/site/public/install.sh:432
MEDIUM sh-remote-script-execution apps/site/public/install.sh:433
MEDIUM js-path-traversal tools/art/tactical-sample/validate.mjs:6
MEDIUM js-path-traversal tools/art/tactical-sample/validate.mjs:10

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit 45ae0f9 into main Sep 23, 2026
7 checks passed
@ralyodio ralyodio mentioned this pull request Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant