Merge branch 'master' into iter23-forge-20261012

# Conflicts:
#	design/gdd/systems/表现与支撑/存档序列化.md
This commit is contained in:
DKChan committed 2026-10-13 01:34:15 +08:00
commit 3392ea7e2d
19 files changed
+257 -332

No files matched your search

+46 -9
View File
@@ -71,19 +71,45 @@ func _init() -> void:
var ob4 = orch_s.new(db, rng4)
Kit.check_quiet(ob4.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp), "attunement": ["trial_pick"]}),
"试炼镐:装配起战")
var v_bad: Dictionary = ob4.use_attune_convert("trial_pick")
Kit.check_quiet(not bool(v_bad.get("ok", true)) and String(v_bad.get("reason", "")).contains("积点未达"),
"试炼镐边界:积点未达拒绝零副作用(受理闸 counter_spend)")
# 自动兑付(反哺批⑤ 2026-10-12 用户裁):无玩家入口——揭示缓冲点即时计数,满 charge_n 自动
# grant_ap(cell_revealed 先于本格扣费→AP 归零恰逢满点时先兑再扣、轮不结束)。直调揭示处理器
# 构造 7+1 格序列(缓冲路径与真挖格同链;授予段无积点段无二次计数)
var ap_before4 := int(ob4.action_economy._ap)
ob4._fx.counter_add("trial_pick_bank", 1) # 直摆积点(模拟 8 安全格积点——计数链断言归冒烟集成段)
Kit.check_quiet(bool(ob4.use_attune_convert("trial_pick").get("ok", false))
and int(ob4.action_economy._ap) == ap_before4 + 1,
"试炼镐正常:满点兑付当轮 AP +1(counter_spend 消耗+grant_ap)")
for _i7 in 7:
ob4._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, _i7)})
Kit.check_quiet(int(ob4.action_economy._ap) == ap_before4,
"试炼镐边界:7 格未达阈值零兑付(AP 不变)")
ob4._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, 7)})
Kit.check_quiet(int(ob4.action_economy._ap) == ap_before4 + 1,
"试炼镐正常:第 8 格自动兑付当轮 AP+1(无玩家入口)")
var cs4: Dictionary = ob4.attune_convert_state()
Kit.check_quiet(bool(cs4.get("assembled", false)) and int(cs4.get("points", -1)) == 0
and int(cs4.get("need", -1)) == 8 and String(cs4.get("item_id", "")) == "trial_pick",
"试炼镐读数口:兑付后进度归零(8 取余)、阈值=charge_n、C 区浮窗数据源")
var rng4b = load("res://core/rng_service.gd").new(); rng4b.set_master_seed(252)
var ob4b = orch_s.new(db, rng4b)
ob4b.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp)})
Kit.check_quiet(not bool(ob4b.use_attune_convert("trial_pick").get("ok", true)),
"试炼镐反例:未装配拒绝(且积点清账——用后清账滑耗)")
ob4b._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, 0)})
var ap_base := int(db.action_economy.ap_per_round)
Kit.check_quiet(int(ob4b.action_economy._ap) == ap_base and not bool(ob4b.attune_convert_state().get("assembled", true)),
"试炼镐反例:未装配零兑付零计数(AP=整轮表值、读数口 assembled=false)")
# ④b 自动兑付件 C 区展示行(反哺批⑤补——charges=0 不入骑库存〔_reseed 注入循环跳过〕,
# 展示行=C 区悬停浮窗进度唯一承载:handle=-1 非库存句柄+note 进度;空骑库存桩直构投影链)
var rng4c = load("res://core/rng_service.gd").new(); rng4c.set_master_seed(253)
var ob4c = orch_s.new(db, rng4c)
ob4c.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp), "attunement": ["trial_pick"]})
var ctrl4 = load("res://presentation/treasure_interact_controller.gd").new(db, null, null, null, null,
func(): return ob4c, func(): return StubAutoInvRunner.new())
var proj4: Array = ctrl4.inventory_projection()
Kit.check_quiet(proj4.size() == 1 and int(proj4[0].get("handle", 0)) == -1
and String(proj4[0].get("item_id", "")) == "trial_pick"
and String(proj4[0].get("note", "")) == "积点 0/8",
"试炼镐 C 区展示行:装配即入投影(handle=-1 合成行+悬停进度 note=积点 N/8——charges=0 不入骑库存的浮窗承载)")
ob4c._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, 0)})
var proj4b: Array = ctrl4.inventory_projection()
Kit.check_quiet(String(proj4b[0].get("note", "")) == "积点 1/8",
"试炼镐展示行进度刷新:开格后 note=积点 1/8(组合根重查链)")
# ⑤ 刷新练习(存量账一次性加仓/临时账不动)
var rng5 = load("res://core/rng_service.gd").new(); rng5.set_master_seed(261)
@@ -310,3 +336,14 @@ func _cell_at(orch, c: Vector2i) -> Vector2i:
if b != null and b.in_bounds(c):
return c
return Vector2i(-9, -9)
# 自动兑付件展示行测试桩(反哺批⑤——空骑库存 runner 桩:charges=0 件不入骑库存,
# 展示行合成逻辑在 treasure_interact_controller.inventory_projection 末段)
class StubAutoInvRunner:
extends RefCounted
var treasure_inventory: StubAutoInv = StubAutoInv.new()
class StubAutoInv:
extends RefCounted
func query_inventory(_cb: Callable) -> Array:
return []