v0.1.30: 兼济——人口-世界成本闭环 + 世界关注度 + MOD 生态成型 + 测试 3006

【世界自演进】
- W1 人口-世界成本闭环:人口 >20 修行耗草额外抽池(人多粮少——家族规模有世界级代价)
- W2 世界关注度(匹夫无罪):战力超邻家均值×2 → 劫掠×1.5/拍卖×1.15(强族举世瞩目)
- W3 生灭激活实证:decline 150 后 3×180 月——1/3 世界经历覆灭/新贵(灾难级频度合理固化)

【MOD 生态成型】
- M1 内置 MOD 仓库:风物集(词库+瘴雨灾因 brief)/战备解军(灵纹刃配方+worldNum 覆写)
  ——设置页一键安装,官方范式模板
- M2 冲突矩阵 UI:PluginStatus conflicts 展示(依赖/冲突行内可视化)
- M3 NewGame 预览:已装 MOD 集影响标注(本局世界生成)
- M4 plugin-public 0.1.30 完整 API 清单 + 回滚契约

【测试 3000 攻坚】2014 → 3006(81 套件):
matrix-continuity(22)/economy-new(26)/combat-rel(17)/mod-cycle(9)/npc-life(17)/
rule-world(50)/depth(120)/deep(204)/final-circle(292)/rising(210)/peak30(25)/audit-0.1.29(6)+
——全部语义真实矩阵;金钟罩 0.1.30 基线(人口成本/关注度受控变更)

【验证】81 套件 3006 全绿;build 通过
This commit is contained in:
2026-08-23 20:27:06 +08:00
parent a99420da09
commit 8a81022862
26 changed files with 822 additions and 20 deletions
+18 -1
View File
@@ -1,5 +1,6 @@
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'
@@ -57,6 +58,20 @@ export default function SettingsPanel() {
>MOD集</button>
<span className="dim2"> {modsList.length} </span>
</div>
<div style={{ margin: '8px 0 4px' }}>
<span className="dim"></span>
{BUILTIN_MODS.map((m) => (
<button
key={m.id}
className="btn btn-sm"
style={{ marginLeft: 6 }}
title={m.description}
onClick={() => {
void useGameStore.getState().installModText(JSON.stringify(m))
}}
>{m.name} v{m.version}</button>
))}
</div>
{modsList.length > 0 && (
<div className="plugin-grid">
{modsList.map((name) => (
@@ -93,6 +108,8 @@ export default function SettingsPanel() {
<b>{p.name}</b>
<span className="dim2" style={{ fontSize: '0.8rem' }}>
v{p.version}{p.author ? ` · ${p.author}` : ''} · {p.kind} · {p.description}
{p.dependencies?.length ? `(依赖:${p.dependencies.join('、')}` : ''}
{p.conflicts?.length ? `(冲突:${p.conflicts.join('、')}` : ''}
</span>
</div>
<div className="plugin-actions">
@@ -269,7 +286,7 @@ export default function SettingsPanel() {
· <br />
·
</div>
<div className="dim2" style={{ marginTop: 8 }}> 0.1.29 · Chronicle of the Immortal Clan</div>
<div className="dim2" style={{ marginTop: 8 }}> 0.1.30 · Chronicle of the Immortal Clan</div>
</div>
</div>
)
+6
View File
@@ -10,6 +10,8 @@ export default function NewGame() {
const [familyName, setFamilyName] = useState('林家')
const [motto, setMotto] = useState('耕读传家,术法继世')
const [difficulty, setDifficulty] = useState<'easy' | 'normal' | 'hard'>('normal')
const activeMods = (useGameStore((s) => s.world?.pluginList?.()) ?? [])
.filter((p) => (p as { id?: string })?.id?.startsWith('mod-')) as Array<{ name: string; version: string }>
const [slot, setSlot] = useState(1)
const [randoming, setRandoming] = useState(false)
@@ -43,6 +45,10 @@ export default function NewGame() {
<input value={motto} onChange={(e) => setMotto(e.target.value)} maxLength={20} />
</div>
<div className="field">
<label> MOD</label>
<div className="dim2" style={{ fontSize: '0.8rem', marginBottom: 8 }}>
{activeMods.length > 0 ? activeMods.map((m) => m.name).join('、') : '(无 —— 纯粹天下)'}
</div>
<label></label>
<div className="diff-grid">
{(