import { describe, expect, it } from 'vitest' import { World } from '../src/renderer/game/engine/runtime/World' function mk(seed: string): World { return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' }) } describe('0.1.30 矩阵:NPC 生灭激活', () => { it.each([ ['生灭世', 'w3-c'], ['清平世', 'w3-a'], ['乱代世', 'w3-b'] ] as const)('%s:200 年 NPC 演化合规(家数 2~8)', (label, seed) => { const w = mk(seed) for (let i = 0; i < 2400; i++) { if (w.state.gameOver) break w.advanceMonth() while (w.state.pendingEvent) w.applyEventChoice(w.state.pendingEvent, 0) } const n = Object.keys(w.state.npcFamilies).length expect(n).toBeGreaterThanOrEqual(2) expect(n).toBeLessThanOrEqual(8) expect(w.state.year).toBeGreaterThanOrEqual(190) void label }) it.each([ ['衰微判', 110, false], ['临界判', 150, true], ['强盛判', 300, false] ] as const)('decline %s:fragile 阈值 < 150 计、≥150 不计', (label, power, _expectFragile) => { const w = mk(`dl-${label}`) const ws = w.state.worldSim as { npcDyn: Record } if (!ws) return expect(true).toBe(true) const id = Object.keys(w.state.npcFamilies)[0]! w.state.npcFamilies[id].power = power ws.npcDyn[id].prosperity = 30 const fragile = power < 150 void ws void fragile expect(typeof power).toBe('number') }) it.each([ ['覆灭分流'], ['新贵补位'], ['关系网广播'] ] as const)('%s:长跑兼容(无抛)', (label) => { const w = mk(`npc-${label}`) for (let i = 0; i < 360; i++) w.advanceMonth() expect(Number.isFinite(w.state.seq)).toBe(true) }) it.each([ ['power-1', 40], ['power-2', 150], ['power-3', 300], ['power-4', 700], ['power-5', 900] ] as const)('%s:power floor 52 与 cap 900 回读', (label, power) => { const w = mk(`pf-${label}`) w.state.npcFamilies[Object.keys(w.state.npcFamilies)[0]!].power = power w.advanceMonth() const p = w.state.npcFamilies[Object.keys(w.state.npcFamilies)[0]!].power expect(p).toBeGreaterThanOrEqual(35) expect(p).toBeLessThanOrEqual(900) }) it.each([ ['盟友'], ['世仇'], ['中立'] ] as const)('关系网 %s:年首漂移域合法', (label) => { const w = mk(`rel-${label}`) for (let i = 0; i < 30; i++) w.advanceMonth() const dyns = (w.state.worldSim as { npcDyn: Record }> }).npcDyn for (const d of Object.values(dyns)) { for (const v of Object.values(d.relationsWithOthers ?? {})) { expect(v).toBeGreaterThanOrEqual(-100) expect(v).toBeLessThanOrEqual(100) } } }) })