Merge branch 'master' into iter23-forge-20261012
# Conflicts: # design/gdd/systems/表现与支撑/存档序列化.md
This commit is contained in:
commit
3392ea7e2d
19 files changed
+257
-332
No files matched your search
@@ -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 []
|
||||
Reference in new issue
Block a user