merge: M7 三选一bcard化+商店同构(第二波收口;三闸全绿)
This commit is contained in:
commit
37e5d53694
1 file changed
+78
-23
@@ -13,38 +13,58 @@ signal continue_pressed
|
||||
signal refresh_requested # 三选一刷新意图(迭代 11 第①批 T5b——P1 甲 X/Y 双源;重抽归组合根)
|
||||
|
||||
var _label: Label
|
||||
var _choice_box: HBoxContainer # 三卡按钮区(pick 态)
|
||||
var _choice_box: HBoxContainer # 三卡区(pick 态——M7 bcard 竖卡)
|
||||
var _replace_box: VBoxContainer # 替换子面板(replace 态)
|
||||
var _confirm_btn: Button # 确认钮(点选后点亮——两段式第二拍)
|
||||
var _continue_btn: Button # 继续钮(兑付反馈态唯一出口)
|
||||
var _refresh_btn: Button # 刷新钮(迭代 11 第①批 T5b——余量>0 才显示)
|
||||
var _refresh_btn: Button # 刷新钮(迭代 11 第①批 T5b——余量>0 才显示;M7 升顶条图标钮)
|
||||
var _refresh_badge: Label # M7 余量角标(图标钮右上——demo ⑥ 同构)
|
||||
var _refresh_l: Label # 刷新余量读数(X 优先 + Y 冒险池)
|
||||
var _refresh_allowance := 0 # 组合根投喂余量(本视图零核心引用)
|
||||
var _selected := "" # 点选暂存(确认前可改选)
|
||||
var _header := "" # 停点头部文案(选择态保持显示)
|
||||
var _card_meta: Array = [] # open_pick 缓存 [{id, text}]——高亮还原读面
|
||||
var _bcards: Array = [] # M7 bcard 引用列(select 高亮=set_selected)
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# M7(UI 落码批):与商店同构(demo ⑥ 用户令两屏一致)——通栏顶条(标题+刷新图标钮/角标)+
|
||||
# 居中入账信息行 + bcard 三竖卡 + 底部唯一主钮「确认选择」;差异白名单=免费选择/✓章/无价签
|
||||
var box: VBoxContainer = UiKit.modal_shell(self, Color(0, 0, 0, 0.6)).box
|
||||
_label = UiKit.label("", 20, true, UiKit.WARM)
|
||||
var top := HBoxContainer.new()
|
||||
top.add_theme_constant_override("separation", 12)
|
||||
box.add_child(top)
|
||||
top.add_child(UiKit.label("战利品三选一", 22, true, UiKit.WARM))
|
||||
var top_sp := Control.new()
|
||||
top_sp.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
top.add_child(top_sp)
|
||||
_refresh_btn = UiKit.button("")
|
||||
_refresh_btn.icon = UiKit.load_tex(UiKit.TEX_ICON_REFRESH)
|
||||
_refresh_btn.custom_minimum_size = Vector2(44, 44)
|
||||
_refresh_btn.tooltip_text = "刷新候选——装配刷新件 X 优先,Y 为冒险池;不消耗 AP"
|
||||
_refresh_btn.pressed.connect(_emit_refresh_requested)
|
||||
_refresh_btn.visible = false
|
||||
top.add_child(_refresh_btn)
|
||||
_refresh_badge = UiKit.label("0", 12, true, UiKit.INK_ON_GOLD)
|
||||
_refresh_badge.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
_refresh_badge.set_anchors_preset(Control.PRESET_TOP_RIGHT)
|
||||
_refresh_badge.offset_left = -22.0
|
||||
_refresh_badge.offset_top = -6.0
|
||||
_refresh_btn.add_child(_refresh_badge)
|
||||
_refresh_l = UiKit.label("", 12, false, UiKit.WARM_SOFT)
|
||||
_refresh_l.visible = false
|
||||
top.add_child(_refresh_l)
|
||||
_label = UiKit.label("", 15, false, UiKit.WARM_SOFT)
|
||||
_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
box.add_child(_label)
|
||||
_choice_box = HBoxContainer.new()
|
||||
_choice_box.add_theme_constant_override("separation", 12)
|
||||
_choice_box.add_theme_constant_override("separation", 20)
|
||||
_choice_box.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||
box.add_child(_choice_box)
|
||||
_confirm_btn = UiKit.button("确认选择")
|
||||
_confirm_btn = UiKit.primary_button("确认选择")
|
||||
_confirm_btn.pressed.connect(_on_confirm_pressed)
|
||||
_confirm_btn.visible = false
|
||||
box.add_child(_confirm_btn)
|
||||
# 三选一刷新面(迭代 11 第①批 T5b——程序占位用 UiKit 既有件;余量 0 = 隐藏)
|
||||
_refresh_btn = UiKit.button("刷新候选")
|
||||
_refresh_btn.pressed.connect(_emit_refresh_requested)
|
||||
_refresh_btn.visible = false
|
||||
box.add_child(_refresh_btn)
|
||||
_refresh_l = UiKit.label("", 13, false, UiKit.STONE)
|
||||
box.add_child(_refresh_l)
|
||||
_replace_box = VBoxContainer.new()
|
||||
_replace_box.add_theme_constant_override("separation", 8)
|
||||
_replace_box.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||
@@ -65,12 +85,28 @@ func open_pick(header: String, cards: Array) -> void:
|
||||
_card_meta = (cards as Array).duplicate(true)
|
||||
for c in _choice_box.get_children():
|
||||
c.queue_free()
|
||||
_bcards.clear()
|
||||
for ch in cards:
|
||||
var cid := String(ch.get("id", ""))
|
||||
var btn := UiKit.button(String(ch.get("text", "")))
|
||||
btn.custom_minimum_size = Vector2(170, 88)
|
||||
btn.pressed.connect(_select_card.bind(cid)) # 具名方法 bind(仓内惯例——内联 lambda 退役)
|
||||
_choice_box.add_child(btn)
|
||||
var full := String(ch.get("text", ""))
|
||||
var lines := full.split("\n")
|
||||
var title := lines[0]
|
||||
var desc := "\n".join(lines.slice(1)) if lines.size() > 1 else ""
|
||||
var idl := cid.to_lower()
|
||||
var band := Color8(194, 178, 100) # 通用增益(默认——§4.2 类型微光族色)
|
||||
if idl.contains("heal"):
|
||||
band = Color8(102, 164, 87)
|
||||
elif idl.contains("magic") or idl.contains("blast"):
|
||||
band = Color8(138, 114, 196)
|
||||
elif idl.contains("pierce"):
|
||||
band = Color8(87, 160, 160)
|
||||
var card := UiKit.bcard(title, desc, band, _icon_for_id(idl))
|
||||
card.gui_input.connect(func(ev: InputEvent) -> void:
|
||||
if ev is InputEventMouseButton and ev.pressed and ev.button_index == MOUSE_BUTTON_LEFT:
|
||||
_select_card(cid))
|
||||
card.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
_choice_box.add_child(card)
|
||||
_bcards.append(card)
|
||||
_choice_box.visible = true
|
||||
_confirm_btn.visible = false
|
||||
_replace_box.visible = false
|
||||
@@ -84,7 +120,9 @@ func open_pick(header: String, cards: Array) -> void:
|
||||
func set_refresh_info(allowance: int) -> void:
|
||||
_refresh_allowance = maxi(0, int(allowance))
|
||||
_refresh_btn.visible = _refresh_allowance > 0
|
||||
_refresh_l.text = "可刷新 %d 次(装配刷新件 X 优先消耗,Y 为冒险池)" % _refresh_allowance if _refresh_allowance > 0 else ""
|
||||
_refresh_badge.text = str(_refresh_allowance)
|
||||
_refresh_l.text = "免费 · 不消耗 AP" if _refresh_allowance > 0 else ""
|
||||
_refresh_l.visible = _refresh_allowance > 0
|
||||
|
||||
|
||||
func _emit_refresh_requested() -> void:
|
||||
@@ -93,11 +131,10 @@ func _emit_refresh_requested() -> void:
|
||||
|
||||
func _select_card(id: String) -> void:
|
||||
_selected = id
|
||||
for i in _choice_box.get_child_count():
|
||||
var btn := _choice_box.get_child(i) as Button
|
||||
# 选中态=木描边+✓章(demo ⑥;set_selected 逐卡置真值防改选残留)
|
||||
for i in _bcards.size():
|
||||
var meta: Dictionary = _card_meta[i] if i < _card_meta.size() else {}
|
||||
var base_text := String(meta.get("text", ""))
|
||||
btn.text = ("✓ " + base_text) if String(meta.get("id", "")) == id else base_text
|
||||
(_bcards[i] as UiKit.BCard).set_selected(String(meta.get("id", "")) == id)
|
||||
_confirm_btn.visible = true
|
||||
|
||||
|
||||
@@ -108,8 +145,9 @@ func _on_confirm_pressed() -> void:
|
||||
|
||||
# 探针/测试复用:以真实按钮路径触发点选、确认与继续(树序遮挡纪律——断言走真实信号路径)
|
||||
func press_card(index: int) -> void:
|
||||
if index >= 0 and index < _choice_box.get_child_count():
|
||||
(_choice_box.get_child(index) as Button).pressed.emit()
|
||||
# M7:卡载体 Button→bcard(gui_input 点选)——真实路径=同一 _select_card 处理器,探针语义不变
|
||||
if index >= 0 and index < _card_meta.size():
|
||||
_select_card(String(_card_meta[index].get("id", "")))
|
||||
|
||||
|
||||
func press_confirm() -> void:
|
||||
@@ -170,3 +208,20 @@ func _emit_continue_pressed() -> void:
|
||||
|
||||
func _emit_replace_chosen(tag: int) -> void:
|
||||
replace_chosen.emit(tag)
|
||||
|
||||
|
||||
# M7:id → 手绘图标键(子串映射容错 id 词表演进;缺位=BCard 空图标槽不炸)
|
||||
func _icon_for_id(idl: String) -> String:
|
||||
if idl.contains("heal"):
|
||||
return UiKit.TEX_ICON_MEDKIT
|
||||
if idl.contains("blast") or idl.contains("magic"):
|
||||
return UiKit.TEX_ICON_BLAST
|
||||
if idl.contains("gp") or idl.contains("coin"):
|
||||
return UiKit.TEX_ICON_COINBAG
|
||||
if idl.contains("attack"):
|
||||
return UiKit.TEX_ICON_SWORD
|
||||
if idl.contains("armor"):
|
||||
return UiKit.TEX_ICON_SHIELD
|
||||
if idl.contains("ap") or idl.contains("action"):
|
||||
return UiKit.TEX_ICON_POUCH
|
||||
return UiKit.TEX_ICON_COINBAG
|
||||
Reference in new issue
Block a user