- 程序章程 research/new8/00-program.md(8款概念/回合协议/验收门/进度账) - 设计:docs/design/15-radio.md+voice-ids(132句,6状态9抉择4结局,电话滤波资产侧带通)/16-dungeon.md+voice-ids(125句,脉冲回声/7层seed生成/三档战斗/元进度遗产) - 资产:TTS 970文件(GPU flock串行)+ Mureka BGM 8首 $0.24(台账 mureka_log.md)+ 程序合成 sfx(含预pan侧墙/开口、phone_ring铃声、amb_cave呼吸层、turn_tick)+ 终检 check_all_assets 8游戏全绿 - radio:game.js+playtest 221断言(4结局矩阵/pendingChoice盲玩公平/RING两级看门狗/菜单循环/存档schema) - dungeon:game.js+playtest 1610断言(seed全网格回声一致性/学期零死/格挡80%/死亡归因真话/元进度/菜单冻结/上滑5段状态链) - 引擎修复:audio.js _playVoice 加载竞态补杀 token(R1真机71分钟语音风暴根因)+ 同id 3s窗口≥5次熔断保险丝 + gesture.js 长按boost事件门(+66行,9套件回归全绿) - 大厅:新增 radio/dungeon 卡片 + GAMES 数组 - harness:sessions/radio.mjs+dungeon.mjs(主线+压力双剧本)+ transcribe 注册 + voice_text.json 刷新(8游戏704句)+ 13号文档 §20 登记 - R1 存档:4人设评审×2游戏 + 真机试玩报告×2(radio 5/5愿意玩;dungeon 0/4→确诊风暴)+ synthesis×2 + 转写8份 - R2 修复:radio F1-F5(看门狗补挂/rep_low改词重录/真铃声/ASK续玩语义/链末跳过保护)+ dungeon D0-1..D1-6(风暴根治/回声真实性/密度下限+呼吸层/导航最短路/菜单关闭反馈/金币档同账本)+ 实现核对登记
36 lines
1.2 KiB
HTML
36 lines
1.2 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<!-- viewport 锁缩放,viewport-fit=cover 适配刘海屏 -->
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
|
||
<title>回声地窟 · SoundGame Web</title>
|
||
<link rel="stylesheet" href="../engine/style.css">
|
||
</head>
|
||
<body>
|
||
<!-- 全屏根元素:手势全屏捕获层,封面图放里面 -->
|
||
<div id="game-root">
|
||
<img class="cover" src="cover.png" alt="">
|
||
</div>
|
||
|
||
<!-- 标准接线:遮罩解锁音频 → start() → attachGestures(引擎手册"音频解锁流程") -->
|
||
<script type="module">
|
||
import { WebAudioEngine } from '../engine/audio.js';
|
||
import { attachGestures } from '../engine/gesture.js';
|
||
import { DungeonGame } from './game.js';
|
||
|
||
async function main() {
|
||
const root = document.getElementById('game-root');
|
||
const audio = new WebAudioEngine('audio/');
|
||
const game = new DungeonGame(audio, root);
|
||
|
||
await audio.showStartOverlay({ cover: 'cover.png', text: '轻触开始' });
|
||
game.start();
|
||
attachGestures(root, (g) => game.onGesture(g));
|
||
}
|
||
|
||
main();
|
||
</script>
|
||
</body>
|
||
</html>
|