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

+1 -24
View File
@@ -235,7 +235,6 @@ func _build_ui() -> void:
info_panel.treasure_slot_clicked.connect(_treasure_ui.on_slot_clicked) # 迭代 7 T4——两步交互第一步
board_zone.stop_pressed.connect(_on_stop_pressed)
board_zone.refresh_confirmed.connect(_on_refresh_confirmed)
board_zone.convert_pressed.connect(_on_convert_pressed) # 积点兑换(迭代 22 秘宝批 T4——试炼镐 HUD 入口)
board_zone.legend_toggled.connect(_on_legend_toggled)
board_zone.hover_forbidden.connect(_on_hover_forbidden)
board_zone.chord_attempted.connect(_on_chord_attempted)
@@ -1240,32 +1239,10 @@ func _refresh_presentations() -> void:
# 每个核心信号/写调用返回后的全量重查装配(更新触发注记——无推送信号,命令式重查)
var refresh_remaining: int = maxi(0, int(db.action_economy.refresh_cap_per_round) - _refresh_used_round)
HudPresenter.refresh(stage, info_panel, ap_bar, settlement, runner, _level_active, db, refresh_remaining)
_sync_convert_button()
_treasure_ui.refresh_slots() # C 区秘宝槽重查(反哺批⑤——试炼镐积点进度随挖格刷新悬停浮窗)
_sync_settlement_visuals()
# 积点兑换钮态(迭代 22 秘宝批 T4——读数口命令式重查;未装配=隐藏零占位)
func _sync_convert_button() -> void:
if settlement == null:
board_zone.ap_bar.set_convert_state(false, 0, 0, "")
return
var cs: Dictionary = settlement.attune_convert_state()
board_zone.ap_bar.set_convert_state(bool(cs.get("assembled", false)), int(cs.get("points", 0)),
int(cs.get("need", 0)), String(cs.get("display_name", "")))
func _on_convert_pressed() -> void:
if settlement == null:
return
var v: Dictionary = settlement.use_attune_convert("trial_pick")
if not bool(v.get("ok", false)):
board_zone.toast.show_toast(String(v.get("reason", "无法兑换")), "warn")
return
logger.log_action("convert", Vector2i(-1, -1), true)
board_view.refresh()
_refresh_presentations()
func _sync_settlement_visuals() -> void:
# 结算阶段(round_end → 下一轮):D 区去饱和+金橙偏移锁输入(明度不变)+ 明细带展开 84px
var settling := _is_settling()
@@ -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:
@@ -112,9 +116,16 @@ func inventory_projection() -> Array:
cb = func(_c: Vector2i) -> bool:
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", ""))
# 积点进度浮窗行(反哺批⑤——自动兑付件 C 区悬停 tooltip 补 N/M 进度;件 id 锁定=装配行唯一)
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", "")),
@@ -122,7 +133,22 @@ func inventory_projection() -> Array:
"name": dn,
"used": bool(rec.get("used", false)),
"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
-17
View File
@@ -13,7 +13,6 @@ extends PanelContainer
signal stop_pressed
signal refresh_confirmed
signal legend_toggled
signal convert_pressed # 积点兑换意图(迭代 22 秘宝批 T4——写口唯一=BattleOrchestrator.use_attune_convert)
const COL_GOLD := UiKit.GOLD
const COL_DOT_OFF := UiKit.DOT_OFF
@@ -22,7 +21,6 @@ const COL_INK := UiKit.INK
var _dots: HBoxContainer
var _ap_label: Label
var _btn_stop: Button
var _btn_convert: Button # 积点兑换钮(迭代 22 秘宝批 T4——试炼镐 HUD 入口;未装配隐藏)
var _btn_legend: Button
var _btn_refresh: Button
var _refresh_sub: Label
@@ -63,12 +61,6 @@ func _init() -> void:
_btn_stop.pressed.connect(_emit_stop_pressed)
row.add_child(_btn_stop)
_btn_convert = UiKit.button("兑换", 0.0) # 行板紧凑钮豁免——积点兑换(试炼镐;未装配隐藏)
_btn_convert.size_flags_vertical = Control.SIZE_SHRINK_CENTER
_btn_convert.visible = false
_btn_convert.pressed.connect(func(): convert_pressed.emit())
row.add_child(_btn_convert)
var spacer := Control.new()
spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL
row.add_child(spacer)
@@ -136,15 +128,6 @@ func set_refresh_cost(cost: int) -> void:
_confirm_lab.text = "RAP−%d · 旧板旗作废" % cost
# 积点兑换钮(迭代 22 秘宝批 T4——试炼镐转化获取 HUD 入口:装配时在列〔visible〕、
# 积点未达 disabled;文案=件名+进度。未装配=隐藏零占位)
func set_convert_state(assembled: bool, points: int, need: int, display_name: String) -> void:
_btn_convert.visible = assembled
if assembled:
_btn_convert.text = "%s %d/%d" % [display_name, points, need]
_btn_convert.disabled = points < need
func set_refresh_state(remaining: int, ready: bool) -> void:
_refresh_sub.text = "RAP−%d · 剩 %d 次" % [refresh_cost, remaining]
_btn_refresh.disabled = not ready
@@ -18,7 +18,6 @@ var _board_area: Control # resized 命名转发用(原 lambda 局部捕获
signal action_requested(cell: Vector2i, kind: String)
signal stop_pressed
signal refresh_confirmed
signal convert_pressed # 积点兑换意图转发(迭代 22 秘宝批 T4——试炼镐 HUD 入口,源=ap_bar)
signal legend_toggled
signal hover_forbidden(cell: Vector2i)
signal chord_attempted(cell: Vector2i)
@@ -83,7 +82,6 @@ func _init() -> void:
board_view.chord_attempted.connect(_forward_chord)
ap_bar.stop_pressed.connect(_emit_stop_pressed)
ap_bar.refresh_confirmed.connect(_emit_refresh_confirmed)
ap_bar.convert_pressed.connect(_emit_convert_pressed)
ap_bar.legend_toggled.connect(_emit_legend_toggled)
@@ -107,10 +105,6 @@ func _emit_stop_pressed() -> void:
stop_pressed.emit()
func _emit_convert_pressed() -> void:
convert_pressed.emit()
func _emit_refresh_confirmed() -> void:
refresh_confirmed.emit()
@@ -220,4 +220,8 @@ func set_treasure_inventory(items: Array, selected_handle: int) -> void:
var border_col: Color = UiKit.GOLD if selected else UiKit.PANEL_BORDER
slot.add_theme_stylebox_override("panel",
UiKit.panel_flat(UiKit.PANEL_DATA, border_col, 0, 1 if not selected else 2, Vector4(4, 4, 4, 4)))
slot.tooltip_text = "%s%s" % [String(rec.get("name", "")), "(已用)" if used else ("(不可用——当前无有效目标)" if not usable else "")]
# note=积点进度行(反哺批⑤——自动兑付件悬停浮窗补「积点 N/M」,进度随挖格经组合根重查刷新)
var note := String(rec.get("note", ""))
slot.tooltip_text = "%s%s%s" % [String(rec.get("name", "")),
"(%s)" % note if note != "" else "",
"(已用)" if used else ("(不可用——当前无有效目标)" if not usable else "")]