Integrate battles with the overworld UI and validate browser flows
Checks / web (push) Canceled after 0s
Checks / web (push) Canceled after 0s
- Drive wild battles through the real UI in Chromium and WebKit using a test-only encounter fixture: victory with level-up, escape, whiteout, mid-battle backup restore and unsupported-effect rollback. - Add keyboard and on-screen D-pad navigation for battle menus. - Accept pending stat experience in saves (awarded without CalcMonStats). - Commit whiteout healing, money loss and destination callbacks together; aborted scripts restore state and map. - Give long notices their own status-bar row on narrow screens. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c08d250cf6
commit
11d1153802
11 files changed
+462
-13
No files matched your search
@@ -0,0 +1,37 @@
|
||||
import { CrystalAssets } from "../src/game/rom/assets";
|
||||
import { generatePartyMon } from "../src/game/party/pokemon";
|
||||
import { GameWorld } from "../src/game/world/world";
|
||||
|
||||
export type BattleScenario = "win" | "loss" | "unsupported";
|
||||
|
||||
/** Test-only encounters on an existing floor: production maps stay gated.
|
||||
* Everything after selection runs through the ROM's real wild-battle script. */
|
||||
export function battleFixtureWorld(assets: CrystalAssets, scenario: BattleScenario = "win") {
|
||||
assets.grassCollisions = () => [assets.collision(assets.map("24:7"), 3, 2)];
|
||||
assets.grassWildMons = (id) => id === "24:7" ? {
|
||||
rates: [256, 256, 256],
|
||||
slots: [0, 1, 2].map(() => Array.from({ length: 7 }, () => ({ species: 16, level: 3 }))),
|
||||
} : undefined;
|
||||
let seed = 1;
|
||||
const world = new GameWorld(assets, () => new Date("2026-09-22T12:00:00"), () => {
|
||||
seed = (seed * 1103515245 + 12345) >>> 0;
|
||||
return (seed >>> 16) & 255;
|
||||
});
|
||||
const mon = generatePartyMon(assets.pokemon, {
|
||||
species: 155, level: 5, item: 0, otId: world.playerId,
|
||||
ot: "CHRIS", dvs: 0x823b, caughtData: 0,
|
||||
});
|
||||
mon.exp = 178; // One battle away from level 6 and Smokescreen.
|
||||
if (scenario === "loss") mon.hp = 1;
|
||||
if (scenario === "unsupported") {
|
||||
mon.moves = [144, 0, 0, 0]; // Transform is explicitly refused.
|
||||
mon.pp = [10, 0, 0, 0];
|
||||
}
|
||||
world.state.party.push(mon);
|
||||
world.state.pokedex.seen.add(155);
|
||||
world.state.pokedex.caught.add(155);
|
||||
world.state.money = 3001;
|
||||
return world;
|
||||
}
|
||||
|
||||
export const ENCOUNTER_WALK = ["up", "right", "right", "right", "right"] as const;
|
||||
Reference in new issue
Block a user