【世界自演进】 - 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 通过
73 lines
2.9 KiB
TypeScript
73 lines
2.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
||
import { World } from '../src/renderer/game/engine/runtime/World'
|
||
import { Rng, seedToRng } from '../src/renderer/game/engine/kernel/rng'
|
||
import { monthlyRate } from '../src/renderer/game/engine/runtime/Systems/cultivation'
|
||
|
||
function mk(seed: string): World {
|
||
return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' })
|
||
}
|
||
|
||
describe('0.1.30 矩阵:引擎深度(30×6+40×8)', () => {
|
||
it.each(Array.from({ length: 30 }, (_, i) => [i * 61 + 8] as const))(
|
||
'seed %d:rng 十步恒等', (seed) => {
|
||
const a = new Rng(seedToRng(`deep-${seed}`))
|
||
const b = new Rng(seedToRng(`deep-${seed}`))
|
||
const sa = Array.from({ length: 10 }, () => a.next())
|
||
const sb = Array.from({ length: 10 }, () => b.next())
|
||
expect(sa).toEqual(sb)
|
||
})
|
||
|
||
it.each([
|
||
['m1', 1], ['v1', 1], ['s3', 3], ['x2', 2], ['l0', 0], ['h5', 5]
|
||
] as const)('修行 %s:rate 恒正', (label, opt) => {
|
||
const w = mk(`rate-${label}`)
|
||
const c = Object.values(w.state.members)[0]!
|
||
c.realm = { major: 'qi', minor: opt }
|
||
const r = monthlyRate(w, c, 1)
|
||
expect(r).toBeGreaterThan(0)
|
||
})
|
||
|
||
it.each([
|
||
['军1'], ['军2'], ['军3'], ['军4'], ['军5'], ['军6']
|
||
] as const)('世族 %s:换代与更替(120 月)', (label) => {
|
||
const w = mk(`dy-${label}`)
|
||
for (let i = 0; i < 120; i++) w.advanceMonth()
|
||
const dyns = (w.state.worldSim as { npcDyn?: object }).npcDyn
|
||
expect(dyns).toBeTruthy()
|
||
})
|
||
|
||
it.each(Array.from({ length: 24 }, (_, i) => [i * 3 + 1] as const))(
|
||
'seed %d:季推 36 月三验', (seed) => {
|
||
const w = mk(`se-${seed}`)
|
||
for (let i = 0; i < 36; i++) w.advanceMonth()
|
||
expect(w.state.month).toBeGreaterThanOrEqual(1)
|
||
expect(w.state.month).toBeLessThanOrEqual(12)
|
||
expect(w.state.year).toBeGreaterThanOrEqual(3)
|
||
})
|
||
|
||
it.each(Array.from({ length: 24 }, (_, i) => [i * 5 + 2] as const))(
|
||
'seed %d:家族五维数据有限', (seed) => {
|
||
const w = mk(`fd-${seed}`)
|
||
w.advanceMonth()
|
||
expect(Number.isFinite(w.state.family.reputation)).toBe(true)
|
||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||
expect(Number.isFinite(w.state.family.generation)).toBe(true)
|
||
expect(typeof w.state.family.name).toBe('string')
|
||
})
|
||
|
||
it.each(Array.from({ length: 20 }, (_, i) => [i * 9 + 4] as const))(
|
||
'seed %d:世代持续冒烟(60 月)', (seed) => {
|
||
const w = mk(`tw-${seed}`)
|
||
for (let i = 0; i < 60; i++) w.advanceMonth()
|
||
expect(Object.keys(w.state.members).length).toBeGreaterThanOrEqual(5)
|
||
})
|
||
|
||
it.each([
|
||
['甲'], ['乙'], ['丙'], ['丁'], ['戊'], ['己'], ['庚'], ['辛'], ['壬'], ['癸']
|
||
] as const)('%s:九曜校验(30 月)', (label) => {
|
||
const w = mk(`jy-${label}`)
|
||
for (let i = 0; i < 30; i++) w.advanceMonth()
|
||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||
})
|
||
})
|