FLY opens _FlyMap in the party menu: the region's Town Map with "Where?", the visited flypoints in turn and the Fly user's icon, then FlyScript flies the icon off along SpriteAnimFunc_FlyFrom's path, enters the spawn point and lands it with SpriteAnimFunc_FlyTo. Teleport returns to the last Pokémon Center's town through IsSpawnPoint. Dig and the Escape Rope lead out of a cave to the warp EnterMapWarp's SaveDigWarp recorded, which saves now keep. newloadmap stops its script as StopScript does and the world resumes it on the new map, which the landing and return movements need. A destination that is not ported yet gives a notice. Closes #25 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
105 lines
3.6 KiB
TypeScript
105 lines
3.6 KiB
TypeScript
import { CrystalAssets } from "../src/game/rom/assets";
|
|
import { GameWorld } from "../src/game/world/world";
|
|
import { OW } from "../src/game/world/constants";
|
|
import { generatePartyMon } from "../src/game/party/pokemon";
|
|
|
|
/** `room` places the player at the bedroom PC or poster, "center" at
|
|
* Cherrygrove's Pokémon Center PC with two Pokémon ("candy": the first at
|
|
* level 13, with a Rare Candy); otherwise outdoors ("pokegear": with the
|
|
* Pokégear, its map and phone cards, and Mom's and Elm's numbers). "mom"
|
|
* faces Mom in the living room after the Mystery Egg, with her bank open
|
|
* and ¥2300 saved. "fly" stands outdoors with a Pidgeot that knows Fly,
|
|
* the Storm Badge, and New Bark Town and Cherrygrove City visited. */
|
|
export function foundationFixture(
|
|
assets: CrystalAssets,
|
|
room: boolean | "poster" | "center" | "candy" | "pokegear" | "mom" | "fly",
|
|
) {
|
|
const world = new GameWorld(
|
|
assets,
|
|
() => new Date("2026-09-22T12:00:00"),
|
|
() => 0,
|
|
);
|
|
world.state.scenes["24:4"] = 1;
|
|
world.state.bag.keyItems.push(OW.BICYCLE);
|
|
if (room === "center" || room === "candy") {
|
|
world.state.party = [155, 16].map((species, i) =>
|
|
generatePartyMon(assets.pokemon, {
|
|
species,
|
|
level: room === "candy" && !i ? 13 : 8 - i * 4,
|
|
item: 0,
|
|
otId: world.playerId,
|
|
ot: "CHRIS",
|
|
dvs: 0x9abc,
|
|
caughtData: 0,
|
|
}),
|
|
);
|
|
world.state.bag.items = [{ item: 18, quantity: 5 }]; // POTION
|
|
if (room === "candy") world.state.bag.items.push({ item: 0x20, quantity: 1 });
|
|
}
|
|
if (room === "pokegear" || room === "mom") {
|
|
world.state.party = [
|
|
generatePartyMon(assets.pokemon, {
|
|
species: 155,
|
|
level: 8,
|
|
item: 0,
|
|
otId: world.playerId,
|
|
ot: "CHRIS",
|
|
dvs: 0x9abc,
|
|
caughtData: 0,
|
|
}),
|
|
];
|
|
for (const flag of [OW.ENGINE_MAP_CARD, OW.ENGINE_PHONE_CARD, 4])
|
|
world.state.flags.add(flag); // 4: ENGINE_POKEGEAR
|
|
world.state.phone = [OW.PHONECONTACT_MOM, OW.PHONECONTACT_ELM];
|
|
world.state.events.add(26); // EVENT_GOT_A_POKEMON_FROM_ELM
|
|
// Walking outside clears the bedroom's temporary events.
|
|
for (let event = 0; event < 8; event++) world.state.events.delete(event);
|
|
}
|
|
if (room === "fly") {
|
|
const mon = generatePartyMon(assets.pokemon, {
|
|
species: 18, // PIDGEOT
|
|
level: 40,
|
|
item: 0,
|
|
otId: world.playerId,
|
|
ot: "CHRIS",
|
|
dvs: 0x9abc,
|
|
caughtData: 0,
|
|
});
|
|
mon.moves = [OW.FLY, 0, 0, 0];
|
|
mon.pp = [15, 0, 0, 0];
|
|
world.state.party = [mon];
|
|
world.state.flags.add(OW.ENGINE_STORMBADGE);
|
|
for (const spawn of [14, 15]) // SPAWN_NEW_BARK, SPAWN_CHERRYGROVE
|
|
world.state.flags.add(assets.spawnEngineFlag(spawn)!);
|
|
for (let event = 0; event < 8; event++) world.state.events.delete(event);
|
|
}
|
|
if (room === "mom") {
|
|
// EVENT_GOT_MYSTERY_EGG_FROM_MR_POKEMON, EVENT_GAVE_MYSTERY_EGG_TO_ELM
|
|
// and EVENT_TALKED_TO_MOM_AFTER_MYSTERY_EGG_QUEST.
|
|
for (const event of [30, 31, 64]) world.state.events.add(event);
|
|
world.state.flags.add(OW.ENGINE_MOM_ACTIVE);
|
|
world.state.scenes["24:6"] = 1;
|
|
world.state.momsMoney = 2300;
|
|
}
|
|
const save = world.save();
|
|
const [map, x, y] =
|
|
room === "center" || room === "candy"
|
|
? ["26:5", 9, 2]
|
|
: room === "poster"
|
|
? ["24:7", 6, 1]
|
|
: room === "mom"
|
|
? ["24:6", 7, 3]
|
|
: room && room !== "pokegear" && room !== "fly"
|
|
? ["24:7", 2, 2]
|
|
: ["24:4", 9, 6];
|
|
world.restore({
|
|
...save,
|
|
map,
|
|
x,
|
|
y,
|
|
direction: room === "mom" ? "down" : "up",
|
|
objects: [],
|
|
});
|
|
return world;
|
|
}
|