guide层v1: 全局向导交互层落地(状态签名earcon/turn cue/静默看门狗/纠错) + 6游戏接线 + 8句向导语音 + 测试全绿
- engine/guide.js 运行时合成8个签名earcon(方法论L2硬参数),off档零定时器,插播queue不顶对白 - settings: guide三档(full/standard/off默认full) + 语速2.2视障档;audio: isVoicePlaying()/setRateBoostEnabled() 清两个已知问题 - 6游戏按schemes§2接线: storyline看门狗+无效手势纠错、simon免扣重听看门狗、escape turn cue+提前卡关提示、rhythm gd_answer/gd_miss+结算看门狗+快进豁免、space首撞指令提示+结算看门狗、rpg格挡纠错+60s催促+状态签名 - 大厅设置面板+向导文档(14-guide-layer.md)+00-global-ux §6;R5台词表补4条一致性 - 试玩转写含向导事件;6 playtest(guide=off断言零改动)+guide.test(34断言)+资产终检全绿
This commit is contained in:
+17
-4
@@ -38,8 +38,20 @@ export function installMock(gameDir) {
|
||||
return id;
|
||||
};
|
||||
globalThis.clearTimeout = (id) => { timers.delete(id); };
|
||||
globalThis.clearInterval = (id) => { timers.delete(id); };
|
||||
globalThis.setInterval = globalThis.setTimeout; // 转写场景无真实 interval 语义需求
|
||||
// 真·可重复的虚拟 interval:rhythm 的 40ms 调度泵、escape 的 5s 卡关轮询都依赖它
|
||||
const intervals = new Set();
|
||||
globalThis.setInterval = (cb, ms = 0, ...args) => {
|
||||
const id = timerSeq++;
|
||||
intervals.add(id);
|
||||
const step = (...a) => {
|
||||
if (!intervals.has(id)) return; // 已被 clearInterval
|
||||
cb(...a);
|
||||
if (intervals.has(id)) timers.set(id, { fireAt: now + Math.max(0, Number(ms) || 0), cb: step, args });
|
||||
};
|
||||
timers.set(id, { fireAt: now + Math.max(0, Number(ms) || 0), cb: step, args });
|
||||
return id;
|
||||
};
|
||||
globalThis.clearInterval = (id) => { intervals.delete(id); timers.delete(id); };
|
||||
Object.defineProperty(globalThis, 'performance', { value: { now: () => now }, configurable: true });
|
||||
|
||||
async function flush(rounds = 8) {
|
||||
@@ -104,9 +116,10 @@ export function installMock(gameDir) {
|
||||
}
|
||||
class MockAudioContext {
|
||||
constructor() {
|
||||
this.state = 'running'; this.currentTime = 0; this.destination = {};
|
||||
this.sampleRate = 44100;
|
||||
this.state = 'running'; this.destination = {}; this.sampleRate = 44100;
|
||||
}
|
||||
// 跟随虚拟时钟:rhythm 等用 ctx.currentTime 绝对排程的游戏才能在无头环境推进
|
||||
get currentTime() { return now / 1000; }
|
||||
createGain() { return new MockGainNode(); }
|
||||
createOscillator() { return new MockOscillator(); }
|
||||
createDynamicsCompressor() {
|
||||
|
||||
Reference in New Issue
Block a user