import { describe, expect, it } from 'vitest' import { World } from '../src/renderer/game/engine/runtime/World' import { combatPowerOf, resolveEncounter } from '../src/renderer/game/engine/runtime/Systems/combat' function mk(seed: string): World { return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' }) } describe('0.1.30 矩阵:相对化战斗', () => { it.each([ ['碾压', 6000, 60, 0.5], ['均衡', 1000, 900, 0.85], ['被殴', 200, 800, 2.55], ['悬殊', 100, 900, 2.6] ] as const)('敌强度 %s:公式在 [0.5, 2.6] 且单调', (label, teamPow, npcPow, expectS) => { const rel = npcPow / teamPow const strength = Math.min(2.6, Math.max(0.5, 0.35 + rel * 0.55)) expect(strength).toBeGreaterThanOrEqual(0.5) expect(strength).toBeLessThanOrEqual(2.6) void expectS void label }) it.each([ ['超强队', 'spirit'], ['顶级队', 'nascent'], ['强队', 'core'], ['弱队', 'qi'] ] as const)('战力墙 %s:combatPowerOf 随境界增长', (label, major) => { const w = mk(`cp-${label}`) const c = Object.values(w.state.members)[0]! c.realm = { major: major as never, minor: 0 } expect(combatPowerOf(w, c)).toBeGreaterThan(0) }) it.each([ ['硬打', 0.3], ['险战', 0.7], ['浪战', 0.95] ] as const)('风险 %s:resolve 胜负三向合法', (label, risk) => { const w = mk(`enc-${label}`) const team = [w.state.members['x1']!, w.state.members['x2']!] for (const c of team) { c.realm = { major: 'core', minor: 1 }; c.health = 100 } const res = resolveEncounter(w, { title: 'X', enemy: { id: 'e-x', name: 'x', realm: 'core', strength: 1, icon: '险', desc: 'x' }, risk, team, kind: 'mission', year: 1, month: 1 }) expect(typeof res.win).toBe('boolean') expect(Array.isArray(res.lines)).toBe(true) }) it.each(Array.from({ length: 6 }, (_, i) => [i * 7 + 1] as const))( 'seed %d:长跑 60 月战争系统月月可推', (seed) => { const w = mk(`war-${seed}`) for (let i = 0; i < 60; i++) w.advanceMonth() expect(w.state.seq).toBeGreaterThan(0) }) })