Files
gplan-2/game/presentation/views/node_overlay.gd
T

90 lines
3.4 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-11
# 关卡节点覆盖层(模态):奖励点/恢复点兑付结果的确认呈现。
# 高内聚边界:节点文案的玩家可读化(谁获得什么/回复多少)内聚于此;"继续"意图经信号外发。
class_name NodeOverlay
extends Control
signal continue_pressed
signal item_chosen(item_id: String) # 迭代 7 T5——奖励节点三选一兑付(拍板②丙:奖励屏=小构筑点)
var _label: Label
var _btn: Button
var _choice_box: HBoxContainer # 道具三选一按钮区(show_reward_items 时呈现)
func _init() -> void:
var dim := ColorRect.new()
dim.color = Color(0, 0, 0, 0.6)
dim.set_anchors_preset(Control.PRESET_FULL_RECT)
add_child(dim)
var center := CenterContainer.new()
center.set_anchors_preset(Control.PRESET_FULL_RECT)
dim.add_child(center)
var box := VBoxContainer.new()
box.add_theme_constant_override("separation", 12)
center.add_child(box)
_label = UiKit.label("", 20, true)
_label.add_theme_color_override("font_color", UiKit.WARM)
_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
box.add_child(_label)
_btn = UiKit.button("继续")
_btn.pressed.connect(_emit_continue_pressed)
_choice_box = HBoxContainer.new()
_choice_box.add_theme_constant_override("separation", 12)
_choice_box.alignment = BoxContainer.ALIGNMENT_CENTER
box.add_child(_choice_box)
box.add_child(_btn)
visible = false
# 奖励节点兑付(迭代 7 T5——「节点奖励=功能道具正式渠道」关卡节点地图.md:110 定稿兑现;
# 拍板②丙=三选一呈现:池 ≤3 全列(当前有效道具三件——选一即全列),池扩充后加权摇三)。
# choices = [{item_id, display_name, glyph}](组合根组装——视图纯呈现,选择经信号外发)。
# 选择前「继续」隐藏(强制选择);选择即入库存+屏收。
func show_reward_items(choices: Array) -> void:
for c in _choice_box.get_children():
c.queue_free()
if choices.is_empty():
# 池空(全未解锁/表空合法态)——直通节点确认(切片期合法空态语义保留)
_label.text = "关卡奖励点
(此行无道具可取——继续前行)"
_btn.text = "继续"
_btn.visible = true
_choice_box.visible = false
visible = true
return
_label.text = "关卡奖励点
取一件魔法道具(加入关卡背包——关卡结束清空)"
for ch in choices:
var cid := String(ch.get("item_id", ""))
var btn := UiKit.button("%s %s" % [String(ch.get("glyph", "?")), String(ch.get("display_name", ""))])
btn.custom_minimum_size = Vector2(150, 72)
btn.pressed.connect(func(): item_chosen.emit(cid))
_choice_box.add_child(btn)
_btn.visible = false # 选择前不给出口(强制三选一——构筑点语义)
_choice_box.visible = true
visible = true
func show_rest(healed: int, hp_after: int, max_hp: int) -> void:
_label.text = "血量恢复点\n休息回复 %d HP(%d → %d / %d)" % [
healed, hp_after - healed, hp_after, max_hp]
_btn.text = "休息完毕,继续"
visible = true
# 选择完成收屏(组合根在 item_chosen 处理毕调——入库存+确认后回选路由同拍)
func close_reward() -> void:
_choice_box.visible = false
_btn.visible = true
visible = false
# 探针复用:以真实按钮路径触发继续
func press_continue() -> void:
_btn.pressed.emit()
func _emit_continue_pressed() -> void:
continue_pressed.emit()