v0.1.0: 仙途家族志 · Chronicle of the Immortal Clan

家族模拟器首版:修仙/经营/战斗/外交/叙事全套系统
- Electron + React + TS + MetonaSqlark(aria+OPFS)
- 水墨中国风 UI
- 引擎种子随机、确定性可回放
- 19 项单元测试、端到端冒烟验证
This commit is contained in:
2026-08-23 00:04:16 +08:00
commit adb22f0558
69 changed files with 14305 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
import { useGameStore } from '../store'
export default function SettingsPanel() {
const world = useGameStore((s) => s.world)
const bump = useGameStore((s) => s.bump)
const slot = useGameStore((s) => s.slot)
const saveNow = useGameStore((s) => s.saveNow)
const exportSave = useGameStore((s) => s.exportSave)
const importSave = useGameStore((s) => s.importSave)
const refreshSlots = useGameStore((s) => s.refreshSlots)
const go = useGameStore((s) => s.go)
const setSpeed = useGameStore((s) => s.setSpeed)
if (!world) return null
return (
<div>
<div className="card-title"></div>
<div className="set-row">
<span> {slot} </span>
<button className="btn btn-sm" onClick={() => void saveNow()}></button>
</div>
<div className="set-row">
<span>JSON </span>
<button className="btn btn-sm" onClick={() => void exportSave()}></button>
</div>
<div className="set-row">
<span></span>
<button className="btn btn-sm" onClick={() => void importSave(slot)}></button>
</div>
<div className="set-row">
<span></span>
<button className="btn btn-sm" onClick={() => void refreshSlots()}></button>
</div>
<div className="set-row">
<span></span>
<button className="btn btn-sm" onClick={() => setSpeed(0)}></button>
</div>
<div className="set-row">
<span></span>
<button
className="btn btn-sm"
onClick={() => {
void saveNow('离席前').then(() => {
setSpeed(0)
go('boot')
})
}}
>
</button>
</div>
<div className="set-row">
<span></span>
<button className="btn btn-sm" onClick={bump}></button>
</div>
<div className="card-title" style={{ marginTop: 20 }}></div>
<div className="help-text">
· <br />
· <br />
· <br />
· <br />
·
</div>
<div className="dim2"> 0.1.0 · Chronicle of the Immortal Clan</div>
</div>
)
}