import { useState } from 'react'
import { useGameStore } from '../store'
import { BUILTIN_MODS } from '../../game/data/builtin-mods'
import { examplePlugin } from '../../game/engine/runtime/demo-plugins'
import { ensureFx } from '../fx'
import { SYSTEM_DEFS } from '../../game/engine/runtime/capabilities'
import { buildBiography } from '../../game/engine/narrative/biography'
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 modsList = useGameStore((s) => s.modsList)
const exportSave = useGameStore((s) => s.exportSave)
const importSave = useGameStore((s) => s.importSave)
const refreshSlots = useGameStore((s) => s.refreshSlots)
const refreshSnapshots = useGameStore((s) => s.refreshSnapshots)
const restoreSnapshot = useGameStore((s) => s.restoreSnapshot)
const snapshots = useGameStore((s) => s.snapshots)
const go = useGameStore((s) => s.go)
const setSpeed = useGameStore((s) => s.setSpeed)
const soundOn = useGameStore((s) => s.soundOn)
const toggleSound = useGameStore((s) => s.toggleSound)
const setNextToast = useGameStore((s) => s.setNextToast)
const [fxMode, setFxModeState] = useState('std')
const setFxMode = (m: 'soft' | 'std' | 'full') => {
setFxModeState(m)
ensureFx().setMode(m)
}
if (!world) return null
const hasDemo = world.pluginList().some((p) => p.id === 'demo-peaks')
return (
{/* ===== MOD 层:外部内容包(userData/mods/*.cotymod|json)===== */}
MOD 层(外部内容包)
MOD 放置于 userData/mods/(*.cotymod / *.json,一个文件一个包)。
安装后于新开档的世界生成中生效(事件/模板/词库/配方);与插件同管线:可启停、随档持久化、卸载自动回滚。
发现 {modsList.length} 个候选包
内置仓库(官方示范包):
{BUILTIN_MODS.map((m) => (
))}
{modsList.length > 0 && (
{modsList.map((name) => (
{name}
候选文件——点击安装为内容插件
))}
)}
{/* ===== 插件层:万物皆是插件的实证窗口 ===== */}
插件层(manifest 清单)
「万物皆是插件」:系统 / 数据包 / 事件池统一走 CotycPlugin 协议。核心三插件受保护常驻,
第三方插件可随时安装/卸载(卸载即全摘钩子)。点击下方体验按钮,立刻注入一个真实插件——
事件「山鬼怒吼」将在消息池中定期浮现,同时年首添『护山之力』。
{world.pluginList().map((p) => (
{p.id}
{p.name}
v{p.version}{p.author ? ` · ${p.author}` : ''} · {p.kind} · {p.description}
{p.dependencies?.length ? `(依赖:${p.dependencies.join('、')})` : ''}
{p.conflicts?.length ? `(冲突:${p.conflicts.join('、')})` : ''}
{p.protected ? '核心' : p.enabled ? '已启用' : '已停用'}
{!p.protected && (
<>
>
)}
))}
{!hasDemo && (
)}
{/* ===== 系统仪表盘:12 能力卡启停 ===== */}
系统仪表盘(能力卡 · 12 张启停)
{SYSTEM_DEFS.map((s) => {
const enabled = world.sysEnabled(s.id)
return (
{s.name}
{s.id} v{s.version}
{s.desc}
)
})}
{/* ===== 存档与导出 ===== */}
存档与导出
| 手动存点(当前第 {slot} 档) |
|
| 回档时间轴(每季自动快照,最近12份) |
|
{snapshots.slice(0, 12).map((sn, i) => (
|
{sn.year}年{sn.month}月{sn.label !== '自动' ? ` · ${sn.label}` : ''}
{sn.year === world.state.year && sn.month === world.state.month ? '(当前)' : ''}
|
|
))}
| 导出存档(JSON 文件) |
|
| 导入存档到当前位置 |
|
| 音效(合成音:鼓点·钟鸣·纸韵) |
|
| 动效档位(灵雾/金砂粒子) |
{(['soft', 'std', 'full'] as const).map((m) => (
))}
|
| 暂停时间 |
|
| 回到主菜单(会先自动保存) |
|
玩法说明
· 日常以「月」流转:成员修炼、建筑产出、往事兴替、事件沓来。
· 「宗」字牌成员可闭关、服丹、冲击瓶颈;瓶颈即修为满百者,成功率看灵气、丹药与家主督学。
· 「探秘」选人结队远行,途中见战报;凯旋带回灵石、法帖、法器诸宝。
· 「外交」与四邻结好联姻;仇雠之族隔岁来犯,打得赢名望大涨,打不赢蚀钱伤丁。
· 「史书」自动记述繁华与凋零——百年之后,后人翻开这一卷家族志,见代代薪火、历历雪泥。
版本 0.1.33 · Chronicle of the Immortal Clan
)
}