Files
ChronicleOfTheImmortalClan/tests/matrix-rule-world-0.1.30.test.ts
T
thzxx 8a81022862 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 通过
2026-08-23 20:27:06 +08:00

36 lines
1.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from 'vitest'
import { World } from '../src/renderer/game/engine/runtime/World'
import { WorldSim } from '../src/renderer/game/engine/sim/WorldSim'
function mk(seed: string): World {
return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' })
}
describe('0.1.30 矩阵:世界规则组合(30 参数 × 3 断言)', () => {
it.each(Array.from({ length: 30 }, (_, i) => [i * 31 + 6] as const))(
'seed %dera/tide/池/气候 全规则组合', (seed) => {
const w = mk(`rule-${seed}`)
for (let i = 0; i < 240; i++) {
if (w.state.gameOver) break
w.advanceMonth()
while (w.state.pendingEvent) w.applyEventChoice(w.state.pendingEvent, 0)
}
const snap = new WorldSim(w).snapshot()
expect(['盛世', '平世', '乱世', '末法']).toContain(snap.era)
expect(snap.tide).toBeGreaterThan(0.5)
expect(snap.tide).toBeLessThan(1.45)
const poolVals = Object.values(snap.market)
expect(poolVals.length).toBeGreaterThanOrEqual(3)
})
it.each(Array.from({ length: 20 }, (_, i) => [i * 17 + 9] as const))(
'seed %d:灾年与衰退组合(60 月)', (seed) => {
const w = mk(`cal-${seed}`)
for (let i = 0; i < 60; i++) w.advanceMonth()
const ws = w.state.worldSim as { calamity?: string; calamityLeft?: number }
if (ws.calamity) expect(ws.calamityLeft ?? 0).toBeGreaterThan(0)
expect(w.state.family.stones).toBeGreaterThanOrEqual(0)
expect(typeof w.state.family.reputation).toBe('number')
})
})