round2: 看门狗礼仪F1(不重播/单句升级/idle-skip) + 分档归因F2 + 交接count-in/answer F3 + 教学看表现F4-F5 + 警报去叠F6 + 回绕F7 + 开场瘦身F8 + 10句新语音 + 测试全绿(6playtest零改动+guide52断言+资产终检)
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12
-19
@@ -64,10 +64,10 @@ const TEACH_BLUNT = {
|
||||
const BEST_KEY = 'soundgame.simon.best';
|
||||
const AUTH_KEY = 'soundgame.auth'; // 大厅登录写入(见 web/index.html)
|
||||
|
||||
// 向导层(schemes.md §2):input 阶段静默看门狗——10s 轻提醒+gd_relisten(不改变
|
||||
// 重听扣机会规则),25s 免扣机会自动重听一次(每局 2 次)
|
||||
// 向导层(14 号文档 + round2 synthesis F1.2):input 阶段静默看门狗——10s 轻提醒
|
||||
// +gd_relisten(不改变重听扣机会规则);25s 升级取消自动重播序列(P1:泄题且与
|
||||
// 扣机会规则矛盾)→ 改为 confirm 震 + turn earcon(纯标记,无语音)
|
||||
const GUIDE_INPUT_WATCHDOG_AT = [10000, 25000];
|
||||
const GUIDE_AUTO_RELISTEN_MAX = 2;
|
||||
|
||||
export class SimonGame extends Game {
|
||||
constructor(audio, root) {
|
||||
@@ -87,7 +87,6 @@ export class SimonGame extends Game {
|
||||
this._menuIdx = 0;
|
||||
this._session = 0; // 会话令牌:重开后使旧计时器/语音链回调失效
|
||||
this._timers = [];
|
||||
this._guideRelistens = 0; // 向导免机会自动重听已用次数(每局重置)
|
||||
}
|
||||
|
||||
start() {
|
||||
@@ -206,8 +205,10 @@ export class SimonGame extends Game {
|
||||
if (this.teachIdx + 1 < GESTURES.length) {
|
||||
this._teachStep(this.teachIdx + 1);
|
||||
} else {
|
||||
// T7:收尾两句 → 正式对局
|
||||
this._speakGuarded(['voice/t7_ready', 'voice/t7_retry'], () => this._beginGame(), 12000);
|
||||
// T7:收尾两句 + 机会经济一句(round2 F5:记不住就双击重听、免费两次、
|
||||
// 用完扣机会——P1「经济不透明」开局一句话讲清)→ 正式对局
|
||||
this._speakGuarded(['voice/t7_ready', 'voice/t7_retry', 'voice/gd_economy'],
|
||||
() => this._beginGame(), 20000);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -233,7 +234,6 @@ export class SimonGame extends Game {
|
||||
this.sequence = [];
|
||||
this.round = 0;
|
||||
this.chances = 1;
|
||||
this._guideRelistens = 0; // 向导免机会自动重听每局重置
|
||||
this._nextRound();
|
||||
}
|
||||
|
||||
@@ -332,26 +332,19 @@ export class SimonGame extends Game {
|
||||
_toInput() {
|
||||
this.phase = 'input';
|
||||
this.inputIdx = 0;
|
||||
// 向导层静默看门狗(schemes §2,全 6 款最危险的静默等待):input 阶段无 BGM
|
||||
// 无超时,挂机永久静默。10s → nudge + gd_relisten 提示(不改变重听扣机会
|
||||
// 规则);25s → 免扣机会自动重听序列一次(每局 2 次),防挂机死等。
|
||||
// 向导层静默看门狗(round2 F1.2 礼仪重构):input 阶段无 BGM 无超时,挂机
|
||||
// 永久静默。10s → nudge + gd_relisten 提示(不改变重听扣机会规则);25s 升级
|
||||
// **取消免扣机会自动重播序列**(P1:等答案自动重念,双击重听的经济就矛盾了,
|
||||
// 还顺手拆了记忆难度)→ 只发 confirm 震 + turn earcon(纯标记,无语音)。
|
||||
this.guide.watchdog({
|
||||
arm: true,
|
||||
at: GUIDE_INPUT_WATCHDOG_AT,
|
||||
say: ['gd_relisten', null],
|
||||
onEscalate: (n) => { if (n === 2) this._guideAutoRelisten(); },
|
||||
onEscalate: (n) => { if (n === 2) this.guide.turn({ haptic: true }); },
|
||||
cond: () => this.phase === 'input',
|
||||
});
|
||||
}
|
||||
|
||||
/** 向导兜底:免扣机会自动重听当前序列(每局最多 2 次,序列不变进度重输)。 */
|
||||
_guideAutoRelisten() {
|
||||
if (this._guideRelistens >= GUIDE_AUTO_RELISTEN_MAX) return;
|
||||
this._guideRelistens++;
|
||||
if (this.phase !== 'input') return;
|
||||
this._playSequence();
|
||||
}
|
||||
|
||||
_onInput(g) {
|
||||
// 双击的上下文判定(见文件头"设计冲突的处理"):
|
||||
// 期望输入是 doubletap → 答题;否则 → 主动重听(耗机会)
|
||||
|
||||
Reference in New Issue
Block a user