v0.1.33a: 物品闭环——符箓生效/幽灵物归位/灾年接入

【符箓闭环】talismanWarPrep 返回类型,开战消耗 1 张;风符全队×1.12/山符×1.15+受创减半(零 rng)
【符箓坊】建筑耗符纸×2+灵木×2/级,月造风符1枚;坊3级另出山符(消耗式零 rng)
【幽灵物品归位】and灵丹/虚元丹/玉澜刃补 ITEMS 定义(含 icon/价格/战力)+craftPill/forgeArtifact union 扩键+ARTIFACT_POWER 补玉澜刃 0.4
【灾年生效】farmFactor/mineFactor 从算而未用→真正乘入灵田/药园/矿场/灵果/木坊产量(旱灾×0.7等)
【金钟罩】0.1.33 基线重算(符箓/灾年/新丹受控变更),RAW+RES 共 18 值
【测试】+3(economy-loop-0.1.33 闭环矩阵) 全绿
This commit is contained in:
2026-08-23 21:31:19 +08:00
parent fa477fb3ef
commit bce50b6e2b
11 changed files with 127 additions and 31 deletions
+58
View File
@@ -0,0 +1,58 @@
import { describe, expect, it } from 'vitest'
import { World } from '../src/renderer/game/engine/runtime/World'
import { ITEMS, ARTIFACT_POWER } from '../src/renderer/game/data/items'
import { resolveEncounter } from '../src/renderer/game/engine/runtime/Systems/combat'
import { productionTick } from '../src/renderer/game/engine/runtime/Systems/production'
function mk(seed: string): World {
return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' })
}
describe('0.1.33 物品闭环:符箓生效/幽灵物归位/灾年生效', () => {
it('幽灵物品归位:丹方/铸器产出物均可命中物品表且可炼成', () => {
const w = mk('c33-ghost')
w.state.family.stones = 100000
w.state.family.inventory['lingcao'] = 1000
w.state.family.inventory['beastcore'] = 100
w.state.family.inventory['lingkuang'] = 500
w.state.family.buildings['danfang'] = 5
let ok = false
for (let i = 0; i < 30 && !ok; i++) ok = w.craftPill('heling') || w.craftPill('xudan') || w.forgeArtifact('weapon-yu')
expect(ok).toBe(true)
expect(ITEMS['pill-heling']).toBeTruthy()
expect(ITEMS['pill-xudan']).toBeTruthy()
expect(ITEMS['weapon-yu']).toBeTruthy()
expect(ARTIFACT_POWER['weapon-yu']).toBe(0.4)
expect((w.state.family.inventory['pill-heling'] ?? 0) + (w.state.family.inventory['pill-xudan'] ?? 0) + (w.state.family.inventory['weapon-yu'] ?? 0) >= 1).toBe(true)
})
it('符箓开战生效:消耗 1 张且战报记武备先声', () => {
const w = mk('c33-fu')
w.state.family.inventory['talisman-feng'] = 2
const crew = w.aliveMembers().slice(0, 3)
const res = resolveEncounter(w, {
title: '试锋', enemy: { id: 'z', name: '妖兽', realm: 'qi', strength: 0.4, desc: '野怪' },
risk: 0.2, team: crew, kind: 'war', year: w.state.year, month: w.state.month
})
expect(w.state.family.inventory['talisman-feng']).toBe(1)
expect(res.lines.some((l) => l.includes('武备先声'))).toBe(true)
})
it('灾年生效:同一世界无灾×0.7 减产(旱灾)实际作用', () => {
const w = mk('c33-cal-a')
w.state.family.buildings['lingtian'] = 2
w.state.family.inventory['lingcao'] = 0
w.advanceMonth()
if (w.state.worldSim) w.state.worldSim.calamity = '旱灾'
const before = w.state.family.inventory['lingcao'] ?? 0
productionTick(w)
const gain = (w.state.family.inventory['lingcao'] ?? 0) - before
expect(gain).toBeGreaterThan(0)
if (w.state.worldSim) w.state.worldSim.calamity = undefined
const before2 = w.state.family.inventory['lingcao'] ?? 0
productionTick(w)
const gain2 = (w.state.family.inventory['lingcao'] ?? 0) - before2
expect(gain).toBeLessThan(gain2)
expect(Math.abs(gain - gain2 * 0.7)).toBeLessThanOrEqual(1)
})
})