59 lines
2.5 KiB
JavaScript
59 lines
2.5 KiB
JavaScript
// 存档点专项测试:触碰 -> 激活 -> 死亡 -> 回到存档点
|
|
const handlers = {};
|
|
const addL = (t, fn) => { (handlers[t] = handlers[t] || []).push(fn); };
|
|
globalThis.addEventListener = addL;
|
|
globalThis.window = { addEventListener: addL };
|
|
const key = (type, code) => (handlers[type] || []).forEach(fn => fn({ code, preventDefault() { }, repeat: false }));
|
|
const down = c => key('keydown', c);
|
|
const up = c => key('keyup', c);
|
|
|
|
const { LEVELS } = await import('../js/levels/index.js');
|
|
const { Level } = await import('../js/level.js');
|
|
const { Player } = await import('../js/player.js');
|
|
const { Input } = await import('../js/input.js');
|
|
|
|
let fail = 0;
|
|
const err = m => { console.log(' ✗ ' + m); fail++; };
|
|
|
|
for (const d of LEVELS) {
|
|
const L = new Level(d);
|
|
const P = new Player(L);
|
|
const saves = L.entities.filter(e => e.type === 'save');
|
|
if (!saves.length) { console.log(` ${d.id} 无存档点`); continue; }
|
|
|
|
// 依次把玩家瞬移到每个存档点,检查是否激活
|
|
for (const s of saves) {
|
|
P.x = s.x + s.w / 2 - P.w / 2;
|
|
P.y = s.y + s.h - P.h;
|
|
P.vx = 0; P.vy = 0; P.dead = false; P.alive = true;
|
|
L.update(1, P, null);
|
|
P.update(1);
|
|
Input.endFrame();
|
|
if (!s.active) err(`${d.id} 存档点(${s.tx},${s.ty}) 触碰后未激活`);
|
|
if (!P.savePoint) err(`${d.id} 存档点(${s.tx},${s.ty}) 未写入 player.savePoint`);
|
|
}
|
|
|
|
// 死亡后应回到最后一个存档点
|
|
const last = saves[saves.length - 1];
|
|
const want = { x: last.x + last.w / 2 - P.w / 2, y: last.y + last.h - P.h };
|
|
const spawn = L.spawn;
|
|
P.kill();
|
|
for (let i = 0; i < 45; i++) { L.update(1, P, null); P.update(1); Input.endFrame(); }
|
|
const dx = Math.abs(P.x - want.x), dy = Math.abs(P.y - want.y);
|
|
const backToStart = Math.abs(P.x - spawn.x) < 3 && Math.abs(P.y - spawn.y) < 3;
|
|
const ok = dx < 2 && dy < 2;
|
|
console.log(` ${d.id.padEnd(3)} 存档=${saves.length} 重生=(${P.x.toFixed(0)},${P.y.toFixed(0)}) 期望=(${want.x.toFixed(0)},${want.y.toFixed(0)}) ${ok ? 'OK' : (backToStart ? '❌回到了起点' : '❌位置不符')}`);
|
|
if (!ok) err(`${d.id} 死亡后未回到存档点`);
|
|
|
|
// 重生后是否立刻死亡
|
|
const alive0 = P.alive;
|
|
for (let i = 0; i < 20; i++) { L.update(1, P, null); P.update(1); Input.endFrame(); }
|
|
if (alive0 && !P.alive) err(`${d.id} 在存档点重生后立刻死亡`);
|
|
|
|
// 存档点状态是否在软重置后保留
|
|
if (!last.active) err(`${d.id} 软重置后存档点激活状态丢失`);
|
|
}
|
|
|
|
console.log(fail ? `\n❌ ${fail} 项失败` : '\n✅ 存档点全部正常');
|
|
process.exit(fail ? 1 : 0);
|