// 存档点专项测试:触碰 -> 激活 -> 死亡 -> 回到存档点 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);