Files
game-code-4/tests/unit/cases/test_economy_state.gd
T

160 lines
6.1 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
extends RefCounted
# 用例:EconomyState 状态机(点击/购买/殿门/冤气/prestige/敕封)
func run(a, data) -> void:
_test_first_purchase(a, data)
_test_hall_gate(a, data)
_test_upgrades_and_meta(a, data)
_test_wrath(a, data)
_test_prestige(a, data)
_test_enthrone(a, data)
_test_event_and_offline(a, data)
# ---- 首购循环:15 点击 → 买 gen1 → 产出 0.1/s(GDD demo 验证点)----
func _test_first_purchase(a, data) -> void:
var e := EconomyState.new(data)
a.near(e.merit, 0.0, 1e-9, "初始阴德 0")
a.near(e.output_per_sec(), 0.0, 1e-9, "初始产出 0")
for _i in 15:
e.click()
a.near(e.merit, 15.0, 1e-9, "15 次点击 = 15 阴德")
a.near(e.click_value(), 1.0, 1e-9, "点击价值 = 1")
var r: Dictionary = e.buy_generator(0, 1)
a.true_(bool(r.get("ok", false)), "15 阴德可买游魂×1")
a.eq(e.gen_levels[0], 1, "游魂 1 级")
a.near(e.merit, 0.0, 1e-9, "买后阴德 0")
a.near(e.output_per_sec(), 0.1, 1e-9, "产出 0.1/s")
var r2: Dictionary = e.buy_generator(0, 1)
a.true_(not bool(r2.get("ok", false)), "0 阴德再买失败")
e.merit = 100.0
var r3: Dictionary = e.buy_upgrade("up_click_1")
a.true_(bool(r3.get("ok", false)), "买指诀·倍力 I(50)")
a.near(e.click_value(), 2.0, 1e-9, "点击价值 ×2")
# ---- 殿门单计数器闸门 ----
func _test_hall_gate(a, data) -> void:
var e := EconomyState.new(data)
a.false_(e.generator_unlocked(2), "gen3 初始锁定")
e.merit_run_total = 1999.0
e.tick(0.1)
a.eq(e.halls_passed, 0, "1999 不过 H1")
e.merit_run_total = 2000.0
e.tick(0.1)
a.eq(e.halls_passed, 1, "2000 过 H1(单计数器闸门)")
a.true_(e.upgrade_visible(data.upgrade("up_eff_gen_03_guizu_1")), "H1 后 gen3 效率可见")
a.true_(e.upgrade_visible(data.upgrade("up_gate_guizu")), "H1 后入职文书可见")
a.false_(e.generator_unlocked(2), "过殿但未买文书 → gen3 仍锁")
e.merit = 1000.0
var r: Dictionary = e.buy_upgrade("up_gate_guizu")
a.true_(bool(r.get("ok", false)), "买鬼卒班入职文书(800)")
a.true_(e.generator_unlocked(2), "双闸齐 → gen3 解锁")
var r2: Dictionary = e.buy_generator(2, 1)
a.true_(bool(r2.get("ok", false)), "gen3 可购")
# ---- 升级/宿慧商店 ----
func _test_upgrades_and_meta(a, data) -> void:
var e := EconomyState.new(data)
e.suihui = 10
var r: Dictionary = e.buy_meta("meta_01")
a.true_(bool(r.get("ok", false)), "买枕旧梦(3 宿慧)")
a.eq(e.suihui, 7, "扣 3 宿慧")
a.eq(int(e.meta_ranks.get("meta_01", 0)), 1, "meta_01 阶 1")
var r2: Dictionary = e.buy_meta("meta_01")
a.true_(not bool(r2.get("ok", false)), "meta_01 一阶限购")
e.suihui = 100
var r3: Dictionary = e.buy_meta("meta_03")
a.true_(bool(r3.get("ok", false)), "买宿慧通透(8)")
# 效率升级进班底区
e.merit = 100000.0
e.gen_levels[0] = 10
var r4: Dictionary = e.buy_upgrade("up_eff_gen_01_youhun_1")
a.true_(bool(r4.get("ok", false)), "买游魂操练 I(83)")
a.near(e.gen_mult(0), 2.0, 1e-9, "班底区 ×2(+100%)")
# ---- 冤气线 ----
func _test_wrath(a, data) -> void:
var e := EconomyState.new(data)
e.devour(100.0)
a.near(e.wrath, 100.0, 1e-9, "吞噬 +100 冤气")
a.eq(e.devour_count, 1, "吞噬计数")
a.eq(e.wrath_layer_cost(), 8, "第 1 层成本 8")
var r: Dictionary = e.buy_wrath_layer()
a.true_(bool(r.get("ok", false)), "买第 1 层怨煞")
a.eq(e.wrath_layers, 1, "1 层")
a.near(e.global_mult(), 1.25, 1e-9, "全局 ×1.25(每层 +25%)")
a.near(e.wrath_penalty(), 0.03, 1e-9, "宿慧削减 3%")
e.wrath = 0.0
var r2: Dictionary = e.buy_wrath_layer()
a.true_(not bool(r2.get("ok", false)), "冤气不足买不了")
e.wrath = 1e6
for _i in 21:
e.buy_wrath_layer()
a.eq(e.wrath_layers, 22, "22 层上限")
var r3: Dictionary = e.buy_wrath_layer()
a.true_(not bool(r3.get("ok", false)), "满层后再买失败")
# ---- 轮回转世 ----
func _test_prestige(a, data) -> void:
var e := EconomyState.new(data)
a.false_(e.prestige_available(), "初始不可轮回")
e.merit_run_total = 1.5e9
a.true_(e.prestige_available(), "H10 门达成 → 可轮回")
a.eq(e.suihui_gain(), 193, "1.5B → 193 宿慧")
e.gen_levels[0] = 50
e.merit = 123.0
var r: Dictionary = e.do_prestige()
a.true_(bool(r.get("ok", false)), "执行轮回")
a.eq(e.suihui, 193, "宿慧入账")
a.eq(e.rebirths, 1, "转世 1 次")
a.near(e.merit, 0.0, 1e-9, "阴德清零")
a.eq(e.gen_levels[0], 950, "跳过机制:193/5=38 ×25 = 950 级")
a.eq(e.halls_passed, 0, "殿门进度重置")
a.eq(e.bought.size(), 0, "升级清空")
# 第二轮更快(宿慧全局 +3%)
a.near(e.global_mult(), 1.0 + 193 * 0.03, 1e-9, "宿慧全局加成")
# ---- 阴司敕封 + gen12 愿景档 ----
func _test_enthrone(a, data) -> void:
var e := EconomyState.new(data)
e.rebirths = 2
e.suihui = 100
a.true_(e.enthrone_ready(), "转世 2 + 宿慧 100 → 敕封就绪")
e.merit_run_total = 1.5e9
e.merit = 1e12
var r: Dictionary = e.buy_upgrade("up_gate_tianzi")
a.true_(bool(r.get("ok", false)), "买敕封诏书(800B)")
a.true_(e.enthrone_available(), "受敕可用")
a.false_(e.generator_unlocked(11), "未受敕 → gen12 仍锁(P-12)")
var r2: Dictionary = e.do_enthrone()
a.true_(bool(r2.get("ok", false)), "执行受敕")
a.true_(e.enthroned, "enthroned 旗标")
a.true_(e.generator_unlocked(11), "受敕 → gen12 解锁")
# 全局区 = 1 + 宿慧100×3% + 敕封 25% = 4.25
a.near(e.global_mult(), 4.25, 1e-9, "全局 ×4.25(宿慧+敕封)")
# gen12 产出接入
e.gen_levels[11] = 1
a.near(e.output_per_sec(), 1073741824.0 * 4.25, 1.0, "gen12 1 级产出")
# ---- 事件瞬时区 + 离线倍率 ----
func _test_event_and_offline(a, data) -> void:
var e := EconomyState.new(data)
e.gen_levels[0] = 10
var base_out := e.output_per_sec()
e.set_event_mult(5.0)
a.near(e.output_per_sec(), base_out * 5.0, 1e-9, "事件 ×5 瞬时区")
e.set_event_mult(1.0)
a.near(e.offline_mult(), 1.0, 1e-9, "无长明灯 → ×1")
e.halls_passed = 4 # 离线升级出现条件
e.merit = 1e9
var r: Dictionary = e.buy_upgrade("up_offline_1")
a.true_(bool(r.get("ok", false)), "买长明灯 I")
a.near(e.offline_mult(), 1.15, 1e-9, "离线 ×1.15(P-13 乘性链)")