Files
ModelTest20260714/Fable-5-High/tools/e2e_doors.mjs
T

63 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 门往返专项:每条通道双向走一遍,确认到达后 1.2 秒内不被弹回(防出生点压住触发区)
import { chromium } from "playwright";
import { createServer } from "vite";
const server = await createServer({ server: { port: 5193 } });
await server.listen();
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
const errors = [];
page.on("console", m => { if (m.type() === "error") errors.push(m.text()); });
page.on("pageerror", e => errors.push(e.message));
const sleep = ms => page.waitForTimeout(ms);
const tp = (x, y) => page.evaluate(([x, y]) => {
const sc = window.__game.scene.getScenes(true).find(s => s.player);
sc.player.setPosition(x, y); sc.player.body.reset(x, y);
}, [x, y]);
const cur = () => page.evaluate(() => window.__director.currentScene);
const failures = [];
// 沿指定方向持续走 ms 毫秒(模拟真实按键走进出口)
const walk = async (key, ms) => { await page.keyboard.down(key); await sleep(ms); await page.keyboard.up(key); };
await page.goto("http://localhost:5193/");
await sleep(2500);
await page.fill("#name-input", "门测");
await page.press("#name-input", "Enter");
await sleep(1800);
// [出发场景, 门口站位, 行走方向, 目标场景]
const LEGS = [
["house", [88, 110], "s", "plaza"], // 小屋 → 广场
["plaza", [72, 90], "w", "house"], // 广场 → 小屋
["house", [88, 110], "s", "plaza"],
["plaza", [152, 90], "w", "bakery"], // 广场 → 面包房
["bakery", [128, 140], "s", "plaza"],
["plaza", [344, 90], "w", "store"], // 广场 → 杂货店
["store", [128, 140], "s", "plaza"],
["plaza", [424, 90], "w", "clinic"], // 广场 → 诊所
["clinic", [96, 110], "s", "plaza"],
["plaza", [20, 148], "a", "lake"], // 广场 → 湖畔
["lake", [360, 120], "d", "plaza"], // 湖畔 → 广场
["plaza", [462, 148], "d", "field"], // 广场 → 花田
["field", [24, 104], "a", "plaza"], // 花田 → 广场
["plaza", [232, 24], "w", "well"], // 广场 → 古井
["well", [112, 136], "s", "plaza"], // 古井 → 广场
["plaza", [232, 296], "s", "fogwall"], // 广场 → 雾墙
["fogwall", [168, 30], "w", "plaza"], // 雾墙 → 广场(用户报告的死循环路径)
];
for (const [from, [x, y], dir, to] of LEGS) {
const at = await cur();
if (at !== from) { console.log(`FAIL 前置不在 ${from}(在 ${at}`); failures.push(from + "->" + to); continue; }
await tp(x, y); await sleep(250);
await walk(dir, 900);
let arrived = false;
for (let i = 0; i < 20; i++) { await sleep(150); if ((await cur()) === to) { arrived = true; break; } }
await sleep(1200); // 到达后必须站得住
const settled = (await cur()) === to;
console.log(`${arrived && settled ? "PASS" : "FAIL"} ${from}${to}${arrived && !settled ? "(被弹回!)" : ""}`);
if (!(arrived && settled)) failures.push(from + "->" + to);
}
console.log("CONSOLE ERRORS:", errors.length);
console.log("FAILURES:", failures.length, failures.join(" | "));
await browser.close(); await server.close();
process.exit(errors.length || failures.length ? 1 : 0);