feat(timeline): P1 白模演出预览——时间线+俯视舞台播放

- /api/pointsets 增 anchors(含 pos/rot/kind/npc 坐标),保留 points 名字数组兼容下拉
- 新增 static/timeline.js:线性化主路径→按时长铺多轨时间线 + 2D 俯视白模舞台播放
  (走位插值/对话打字机/镜头俯视框示意/playhead/点击跳转);战斗/选择/随机仅标点不模拟
- 工具栏加「演出预览」按钮 + 预览遮罩 + 暗金主题样式
- 时长模型:对话=字数×打字机速度,走位=坐标距离÷速度,动画/镜头给缺省时长
- node 离线测试两样张(含 out_ref+fight+skip)逻辑全过;修掉结局重复渲染 bug

设计文档见主仓 docs/plans/2026-06-13-story-timeline-editor-and-whitebox-preview-design.md (P1 期)
This commit is contained in:
2026-06-13 10:52:20 +08:00
parent 81f62db9f3
commit dbf857769e
5 changed files with 431 additions and 2 deletions

View File

@ -26,6 +26,7 @@
<button id="btn-save" class="primary" disabled>保存</button>
<button id="btn-validate" disabled>校验</button>
<button id="btn-playtest" disabled>试走</button>
<button id="btn-timeline" disabled>演出预览</button>
<span class="sep"></span>
<button id="btn-confirm" disabled>确认</button>
<button id="btn-discard" disabled>丢弃</button>
@ -115,10 +116,28 @@
</div>
</div>
<!-- 演出预览遮罩:上=俯视白模舞台,下=时间线+playhead -->
<div id="tl-modal" class="overlay hidden">
<div class="modal huge">
<h3>演出预览(白模)<span id="tl-mapinfo" class="tl-mapinfo"></span><button class="modal-close" style="float:right">关闭</button></h3>
<div id="tl-stagewrap">
<canvas id="tl-stage" width="780" height="380"></canvas>
</div>
<div id="tl-controls">
<button id="tl-play" class="primary">▶ 播放</button>
<button id="tl-restart" class="mini">⏮ 重头</button>
<span id="tl-time" class="tl-time">0.0 / 0.0s</span>
<span class="tip">点时间轴任意处跳转 · 战斗/选择/随机仅标点不模拟 · 预览沿首出口主路径</span>
</div>
<div id="tl-tracks"></div>
</div>
</div>
<script src="vendor/drawflow.min.js"></script>
<script src="graph.js"></script>
<script src="form.js"></script>
<script src="playtest.js"></script>
<script src="timeline.js"></script>
<script src="app.js"></script>
</body>
</html>