fix(迭代22反哺⑤补): 试炼镐C区展示行——charges=0件被_reseed_attune_charges注入循环跳过不入骑库存,而C区槽投影遍历骑库存→试炼镐C区不可见/悬停浮窗进度无处承载(追认批集成缺口,单测只测读数口未覆盖投影链)。修复=inventory_projection末段追加自动兑付件展示行(合成handle=-1非库存句柄+note积点N/8+槽点击走说明toast不进两步交互); use_attune_convert删除遗留孤儿函数头注释清一; 单测新增④b展示行断言两条(装配即入投影handle=-1+note=积点0/8/开格后1/8组合根重查链)+StubAutoInvRunner空骑库存桩。重闸全绿: 冒烟898/0+单测22套+probe_gate --full+render_gate golden 3屏0.00%+doc三闸对基线零新增(死链3/拔旗1/gdd_lint三文件表格占比FAIL均实证存量=79aac07版本对比表格行零变化)+熵增闸PASS; 06裁决小节与实现报告⑤条补集成补丁注记
This commit is contained in:
1 parent
8455b4aeff
commit
cff741ea2a
5 files changed
+52
-5
No files matched your search
@@ -263,9 +263,6 @@ func _reseed_attune_charges(reset: String) -> void:
|
||||
treasure_inventory.add_item(iid, "attunement", Vector2i(-1, -1), 0)
|
||||
|
||||
|
||||
# 积点制主动件受理(迭代 22 秘宝批 T3——试炼镐「转化获取」唯一入口:不经库存 handle
|
||||
# 〔charges=0 零骑库存〕,受理闸=行 triggers counter_spend 积点账〔dig_reveal 通用化计数段
|
||||
# 逐 charge_n 积 1 点〕;消耗成功才兑付当轮 AP=magnitude。返回 use_treasure 同构 verdict)
|
||||
# 积点制件进度读数(迭代 22 反哺批⑤——自动兑付无玩家发起入口,读数口=C 区秘宝槽悬停浮窗进度行:
|
||||
# assembled=装配在册/points=本战安全格进度(charge_n 取余)/need=charge_n/item_id=装配行 id。
|
||||
# 未装配=assembled false)
|
||||
|
||||
@@ -52,7 +52,8 @@ func active_selection() -> int:
|
||||
return _use_selection
|
||||
|
||||
|
||||
# 槽点击(第一步):AP 类(target=none)点击即用(无目标);空间类进/出选中态(toggle 取消)。
|
||||
# 槽点击(第一步):AP 类(target=none)点击即用(无目标);空间类进/出选中态(toggle 取消);
|
||||
# 自动兑付件展示行(handle<0)无使用动作——点击给说明提示(反哺批⑤)。
|
||||
func on_slot_clicked(slot_handle: int) -> void:
|
||||
var settlement = _settlement_get.call()
|
||||
var runner = _runner_get.call()
|
||||
@@ -62,6 +63,9 @@ func on_slot_clicked(slot_handle: int) -> void:
|
||||
_use_selection = 0
|
||||
refresh_slots()
|
||||
return
|
||||
if slot_handle < 0:
|
||||
toast.show_toast("自动兑付件:满足条件自动生效,无需手动使用", "info")
|
||||
return
|
||||
var rec: Dictionary = {}
|
||||
for r in inventory_projection():
|
||||
if int(r.get("handle", 0)) == slot_handle:
|
||||
@@ -113,6 +117,7 @@ func inventory_projection() -> Array:
|
||||
return ms.has_unrevealed() # 只读查询面(排雷玩法 has_unrevealed——手搓全板双循环收口)
|
||||
var out: Array = []
|
||||
var cs: Dictionary = settlement.attune_convert_state() if settlement != null else {}
|
||||
var auto_seen := false # 自动兑付件是否已随骑库存出现(恒否——charges=0 不入骑库存;守合成行重复)
|
||||
for rec in runner.treasure_inventory.query_inventory(cb):
|
||||
var arow: Dictionary = db.treasure_item_row(String(rec.get("item_id", "")))
|
||||
var dn := String(arow.get("display_name", ""))
|
||||
@@ -120,6 +125,7 @@ func inventory_projection() -> Array:
|
||||
var note := ""
|
||||
if bool(cs.get("assembled", false)) and String(cs.get("item_id", "")) == String(rec.get("item_id", "")):
|
||||
note = "积点 %d/%d" % [int(cs.get("points", 0)), int(cs.get("need", 0))]
|
||||
auto_seen = true
|
||||
out.append({
|
||||
"handle": int(rec.get("handle", 0)),
|
||||
"item_id": String(rec.get("item_id", "")),
|
||||
@@ -129,6 +135,20 @@ func inventory_projection() -> Array:
|
||||
"usable": bool(rec.get("usable", true)),
|
||||
"note": note,
|
||||
})
|
||||
# 自动兑付件展示行(反哺批⑤补——charges=0 不入骑库存〔_reseed_attune_charges 跳过注入〕,
|
||||
# C 区四槽末尾补合成行承载悬停进度;handle=-1 非库存句柄:槽点击走说明 toast 分支不进两步交互)
|
||||
if bool(cs.get("assembled", false)) and not auto_seen:
|
||||
var adn := String(cs.get("display_name", ""))
|
||||
if adn != "":
|
||||
out.append({
|
||||
"handle": -1,
|
||||
"item_id": String(cs.get("item_id", "")),
|
||||
"glyph": adn.left(1),
|
||||
"name": adn,
|
||||
"used": false,
|
||||
"usable": true,
|
||||
"note": "积点 %d/%d" % [int(cs.get("points", 0)), int(cs.get("need", 0))],
|
||||
})
|
||||
return out
|
||||
|
||||
|
||||
|
||||
@@ -94,6 +94,23 @@ func _init() -> void:
|
||||
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)
|
||||
var adr5 = runner_s.new(db, rng5)
|
||||
@@ -319,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