Port the introduction's naming and clock screens
Checks / web (push) Canceled after 0s

A new game now runs NewGame's InitGender and OakSpeech natively before
the bedroom: Boy or Girl, InitClock's hour and minute steppers with
their YES/NO confirmations, Oak's speech with Wooper, and NamePlayer's
preset names or naming field (a blank name takes CHRIS or KRIS). Texts,
menus and time strings come from a new INTRO profile table verified by
check:reference; Oak's and the player's pictures decode from
TrainerPicPointers, ChrisPic/KrisPic and TrainerPalettes.

The chosen time is kept as a minute offset from the device clock, which
time of day, the weekday, NPC hours and the daily reset now read. The
intro runs only when nothing is saved; a save made during it starts it
again. Saves gain intro and clock.minuteOffset, migrated by absence. The
shell's name and character fields are gone. Intentional change: the
steppers start at the device time rather than 10:00.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Sébastien QUEROLandClaude Opus 5.5 committed 2026-09-30 09:53:52 +02:00
1 parent 5a0fe1e313
commit b13fd20be4
28 files changed
+975 -101

No files matched your search

+3
View File
@@ -4,6 +4,9 @@ import type { Button } from "../input/types";
export interface GameRuntime {
readonly id: string;
load(rom: Uint8Array, canvas: HTMLCanvasElement): Promise<void>;
/** Start a new game in the loaded session, when nothing was saved; the
* emulator reference starts its cartridge instead. */
newGame?(): void;
play(): void;
pause(): void;
setButton(button: Button, pressed: boolean): void;
+1
View File
@@ -30,6 +30,7 @@ export class GameSession {
}
await this.runtime.load(rom.bytes, canvas);
if (saved) this.runtime.restoreState(saved.state);
else this.runtime.newGame?.();
// Never retain ROM bytes in storage or the session after loading.
this.rom = { ...rom, bytes: new Uint8Array() };
this.state = "paused";