import { describe, expect, it } from 'vitest' import { World } from '../src/renderer/game/engine/runtime/World' import { ERA_CONF, WorldSimState } from '../src/renderer/game/engine/sim/worldsim-data' import { combatPowerOf } from '../src/renderer/game/engine/runtime/Systems/combat' describe('0.1.18 时代绘卷', () => { it('世纪弧状态机恒定在四态内且会转移', () => { const w = World.create({ seed: 'era-1', surname: '姜', familyName: '姜家', motto: 'm', difficulty: 'normal' }) let seen = new Set() let lastEra = '' for (let i = 0; i < 2400; i++) { if (w.state.gameOver) break w.advanceMonth() const ws = w.state.worldSim as WorldSimState const e = ws.era ?? 'pingshi' expect(Object.keys(ERA_CONF)).toContain(e) if (e !== lastEra) { seen.add(e) lastEra = e } } expect(seen.size).toBeGreaterThanOrEqual(2) // 200 年内至少转移过一次 }) it('NPC 景气存在且随断供/灾年受挫(值域 8~100)', () => { const w = World.create({ seed: 'era-2', surname: '路', familyName: '路家', motto: 'm', difficulty: 'normal' }) for (let i = 0; i < 600; i++) w.advanceMonth() const dyns = (w.state.worldSim as WorldSimState).npcDyn for (const d of Object.values(dyns)) { expect(d.prosperity).toBeGreaterThanOrEqual(8) expect(d.prosperity).toBeLessThanOrEqual(100) } }) it('十年鉴每十年一条史官快讯', () => { const w = World.create({ seed: 'era-3', surname: '柴', familyName: '柴家', motto: 'm', difficulty: 'normal' }) for (let i = 0; i < 1200; i++) w.advanceMonth() const news = (w.state.worldSim as WorldSimState).newsFeed const annals = news.filter((r) => r.kind === 'annal' && r.text.includes('史官')) expect(annals.length).toBeGreaterThanOrEqual(3) }) it('玩家战力排位随局势变化(群雄谱输入有效)', () => { const w = World.create({ seed: 'era-4', surname: '宋', familyName: '宋家', motto: 'm', difficulty: 'normal' }) for (let i = 0; i < 120; i++) w.advanceMonth() const myPower = w.aliveMembers().reduce((a, c) => a + combatPowerOf(w, c), 0) expect(myPower).toBeGreaterThan(0) }) it('灾年时秘境恢复减半(灵脉闭锁)', () => { const w = World.create({ seed: 'era-5', surname: '吕', familyName: '吕家', motto: 'm', difficulty: 'normal' }) w.advanceMonth() // 先实例化 worldSim(secretQi 各处 50) const ws = w.state.worldSim as WorldSimState if (!ws) throw new Error('worldSim 未初始化') // 钉死灾年后观察恢复量(此时灵气从 50 起,减值格 >70 规则不触发) ws.calamity = '旱灾' ws.calamityLeft = 3 const before = ws.secretQi['m-anmoku'] ?? 50 w.advanceMonth() const after = (w.state.worldSim as WorldSimState).secretQi['m-anmoku'] ?? 0 expect(after - before).toBeLessThanOrEqual(3) // 灾年恢复 0.5x=1~2.5 上限 }) })