v0.1.2: 宗族气韵(职事/悟道/谱系/碑录/庆典/飞升/音效)

- 职事任命:长老(+修炼)/供奉(+战力)/执事(+坊市)/掌教(+闭关) 每人加成叠加,上限管理
- 功法悟道:修习积悟性点,小成/大成逐级+战力,大境界突破传道于直系晚辈
- 宗族谱系页:世代分带 + 夫妻同卷 + 子孙连枝,点节点开详情,先人簿可查
- 功德碑:宗主辞世即勒石,宗祠页碑录永存
- 百年庆典 + 飞升之路事件链(留世坐镇/仙风入体 或 云游飞升/宗族蒙荫)
- 合成音效(WebAudio):鼓点/钟鸣/纸韵/磬响,设置页开关
- 单测 29→38;typecheck/build 通过;GUI 冒烟受限于 WSLg 掉线(SMOKE-TIMEOUT 优雅退出)
This commit is contained in:
2026-08-23 08:28:49 +08:00
parent 6b15a97d0c
commit fefbe1f1d7
22 changed files with 864 additions and 8 deletions
+20
View File
@@ -104,6 +104,26 @@ export default function TerritoryPanel() {
)
}
function MonumentList() {
const world = useGameStore((s) => s.world)
const revision = useGameStore((s) => s.revision)
void revision
if (!world) return null
const monuments = world.state.chronicle.filter((e) => e.text.startsWith('功德碑')).slice().reverse()
if (monuments.length === 0) return null
return (
<div className="monument-strip">
<div className="card-title" style={{ fontSize: '0.98rem' }}></div>
{monuments.slice(0, 4).map((m) => (
<div key={m.id} className="dim" style={{ lineHeight: 1.7 }}>
<span className="ch-year" style={{ marginRight: 8 }}>{m.year}</span>
{m.text.slice(3)}
</div>
))}
</div>
)
}
function itemLabel(k: string): string {
const map: Record<string, string> = {
stone: '灵石',