Open Route 42 to Mahogany, the Lake of Rage, the Rocket Hideout and Pryce (#32)

Route 42, Mt. Mortar, Mahogany Town, Route 43 and its gates, the Lake of
Rage and its houses, the Rocket Hideout and Route 44 are open. The story
plays through the toll, the red Gyarados, Lance, the hideout and Pryce's
GLACIERBADGE, which starts the Radio Tower takeover.

The fishing guru measures Magikarp (CheckMagikarpLength,
MagikarpHouseSign, FindPartyMonThatSpecies); the record is saved.
takemoney now leaves a short account at zero as TakeMoney does, and
setmapscene/setscene on a map without scenes consume the byte instead of
refusing. The playthrough's path search slides on ice and the run gains
five stages to Pryce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
kawaandClaude Opus 5.5 committed 2026-10-13 13:35:58 +02:00
1 parent 62fe4bf664
commit 061ca4d59d
11 files changed
+578 -43

No files matched your search

+14
View File
@@ -58,6 +58,7 @@ import {
type ScriptState,
type DayTimerName,
} from "../scripts/interpreter";
import { initialMagikarpRecord, type MagikarpRecord } from "../scripts/lake-of-rage";
import { IntroRun } from "../scripts/intro";
import { FLY_MAP_BUTTONS, type FlyMapView } from "../scripts/fly-map";
import { SCREEN_BUTTONS, type TileScreen } from "../scripts/screen";
@@ -198,6 +199,8 @@ export interface NativeSave {
/** RTC day countdowns by name, and the Lucky Number show's number. */
timers: Partial<Record<DayTimerName, DayTimer>>;
luckyNumber: { id: number; day: number };
/** The Magikarp length record and its holder. */
magikarpRecord: MagikarpRecord;
/** wRoamMon1/2/3 (Raikou, Entei, Suicune). */
roamMons: RoamMon[];
/** wRoamMons_CurMapGroup/Number, kept from the last UpdateRoamMons or
@@ -4547,6 +4550,7 @@ export class GameWorld {
firstUnownSeen: state.firstUnownSeen,
timers: structuredClone(state.timers),
luckyNumber: { ...state.luckyNumber },
magikarpRecord: { ...state.magikarpRecord },
roamMons: structuredClone(state.roamMons),
roamMonsMap: state.roamMonsMap,
options: { ...state.options },
@@ -4703,6 +4707,11 @@ export class GameWorld {
!save.luckyNumber ||
!integer(save.luckyNumber.id, 0, 0xffff) ||
!integer(save.luckyNumber.day, 0, RTC_DAYS) ||
!save.magikarpRecord ||
!integer(save.magikarpRecord.feet, 0, 0xff) ||
!integer(save.magikarpRecord.inches, 0, 0xff) ||
typeof save.magikarpRecord.holder !== "string" ||
save.magikarpRecord.holder.length > 10 ||
!Array.isArray(save.roamMons) ||
save.roamMons.length !== 3 ||
!save.roamMons.every(validRoamMon) ||
@@ -4802,6 +4811,7 @@ export class GameWorld {
firstUnownSeen: save.firstUnownSeen,
timers: structuredClone(save.timers),
luckyNumber: { ...save.luckyNumber },
magikarpRecord: { ...save.magikarpRecord },
roamMons: structuredClone(save.roamMons),
roamMonsMap: save.roamMonsMap,
options: { ...save.options },
@@ -4958,6 +4968,9 @@ export function migrateSave(
timers: {},
luckyNumber: { id: 0, day: 0 },
}),
...(!Object.hasOwn(save, "magikarpRecord") && {
magikarpRecord: initialMagikarpRecord(),
}),
...(!Object.hasOwn(save, "roamMons") && {
roamMons: emptyRoamMons(),
roamMonsMap: null,
@@ -5021,6 +5034,7 @@ export function migrateSave(
firstUnownSeen: 0,
timers: {},
luckyNumber: { id: 0, day: 0 },
magikarpRecord: initialMagikarpRecord(),
roamMons: emptyRoamMons(),
roamMonsMap: null,
intro: false,