v0.1.23: 生灭千秋 + 插件生态化第一课(1027 全绿)
【世界模型:世界会死人也会新生】 - 家族生灭:declineYears(power<58+景气<38 连续8年)→ 覆灭(最强邻分食+史官广播)+ 新贵补位(6%/年,乱世×2) —— NPC 永远四家铁打的现状终结;玩家补刀(raid×0.82)可加速衰亡 - npcById 双源可空(静态+动态注册表;不再 throw——15 处消费者防御化) - purgeNpc 全局清理(raidCD/事件队列/恩怨网/distress/动态 def) - 秘境产出回池(loot 20% 经 tradeSettle 回流)——资源循环最后单向封口 - WorldSnapshot 只读摘要门面(UI/史书消费,零行为变更) - 潮汐长波(10 年正弦 ±0.08 叠加,灵潮三十年河东) 【插件生态化(0.1.8 后第一次大进化)】 - 持久化:GameState.plugins 落盘 + PLUGIN_REGISTRY 读档重装(engineFromSnapshot 真实路径验证) - plugin-public.ts 公共导出面(第三方单入口+纪律) - 双闸:能力卡随插件启停联动;池自动回滚 - 契约补完:Proxy 追踪(池/卡/pack 自动回滚)+ onUninstall 真调 + 能力卡入 World 实例(防跨档泄漏) - SettingsPanel 启停按钮/依赖详情;demo 与 tests 去重(发现并修复:npcById 双源静态源未绑定——全局 NPC 停滞回归) 【测试】1027 全绿(44 套件):dynasty-plugin 7 例(覆灭/新贵/回池/快照/持久化/双闸/自动回滚); 金钟罩 0.1.23 基线固化;build 通过
This commit is contained in:
@@ -25,6 +25,7 @@ export default function DiplomacyPanel() {
|
||||
</div>
|
||||
{sorted.map((npc) => {
|
||||
const def = npcById(npc.id)
|
||||
if (!def) return null
|
||||
const [relLabel, relCls] = REL_TYPE(npc.relation)
|
||||
const married = npc.allied
|
||||
return (
|
||||
|
||||
@@ -55,15 +55,29 @@ export default function SettingsPanel() {
|
||||
{p.protected ? '核心' : p.enabled ? '已启用' : '已停用'}
|
||||
</span>
|
||||
{!p.protected && (
|
||||
<button
|
||||
className="btn btn-sm btn-danger"
|
||||
onClick={() => {
|
||||
world.removePlugin(p.id)
|
||||
bump()
|
||||
}}
|
||||
>
|
||||
卸载
|
||||
</button>
|
||||
<>
|
||||
<button
|
||||
className={`btn btn-sm ${p.enabled ? '' : 'btn-primary'}`}
|
||||
onClick={() => {
|
||||
const r = world.setPluginEnabled(p.id, !p.enabled)
|
||||
if (!r.ok) setNextToast(`启停失败:${r.reason ?? ''}`)
|
||||
bump()
|
||||
}}
|
||||
>
|
||||
{p.enabled ? '停用' : '启用'}
|
||||
</button>
|
||||
<button
|
||||
className="btn btn-sm btn-danger"
|
||||
title={p.dependencies?.length ? `依赖:${p.dependencies.join('、')}` : ''}
|
||||
onClick={() => {
|
||||
world.removePlugin(p.id)
|
||||
setNextToast('插件已卸载(钩子/池/能力卡全摘)。')
|
||||
bump()
|
||||
}}
|
||||
>
|
||||
卸载
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
@@ -210,7 +224,7 @@ export default function SettingsPanel() {
|
||||
· 「外交」与四邻结好联姻;仇雠之族隔岁来犯,打得赢名望大涨,打不赢蚀钱伤丁。<br />
|
||||
· 「史书」自动记述繁华与凋零——百年之后,后人翻开这一卷家族志,见代代薪火、历历雪泥。
|
||||
</div>
|
||||
<div className="dim2" style={{ marginTop: 8 }}>版本 0.1.22 · Chronicle of the Immortal Clan</div>
|
||||
<div className="dim2" style={{ marginTop: 8 }}>版本 0.1.23 · Chronicle of the Immortal Clan</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -166,6 +166,7 @@ export default function WorldPanel() {
|
||||
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
||||
{Object.values(w.state.npcFamilies).map((npc) => {
|
||||
const def = npcById(npc.id)
|
||||
if (!def) return null
|
||||
const dyn = (ws.npcDyn ?? {})[npc.id]
|
||||
const open = view === npc.id
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user