class_name TopBar extends Control ## Kopfzeile: Runde, Phase, Uhr, Gold, Kader, Serie, nächster Gegner, Knöpfe. signal ready_pressed signal xp_pressed signal speed_pressed signal pause_pressed const PANEL_BG := Color(0.14, 0.15, 0.19) var lbl_round: Label var lbl_phase: Label var lbl_timer: Label var lbl_hp: Label var lbl_gold: Label var lbl_slots: Label var lbl_streak: Label var lbl_next: Label var btn_xp: Button var btn_speed: Button var btn_ready: Button var btn_pause: Button func build(width: float, height: float) -> void: position = Vector2.ZERO size = Vector2(width, height) mouse_filter = Control.MOUSE_FILTER_IGNORE var bar := ColorRect.new() bar.color = PANEL_BG bar.size = size bar.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(bar) var h := HBoxContainer.new() h.position = Vector2(14, 9) h.size = Vector2(width - 28, 30) h.add_theme_constant_override("separation", 18) add_child(h) lbl_round = UiKit.label("Runde 1", 18) lbl_phase = UiKit.label("Planung", 16, Color(0.7, 0.85, 1.0)) lbl_timer = UiKit.label("30 s", 16, Color(0.95, 0.85, 0.45)) lbl_hp = UiKit.label("Leben 100", 16, Color(0.5, 0.9, 0.55)) lbl_gold = UiKit.label("Gold 4", 16, Color(1.0, 0.85, 0.35)) lbl_slots = UiKit.label("Kader 0/3", 16) lbl_streak = UiKit.label("Serie 0", 16, Color(0.85, 0.7, 1.0)) lbl_next = UiKit.label("", 15, Color(1.0, 0.75, 0.6)) for l in [lbl_round, lbl_phase, lbl_timer, lbl_hp, lbl_gold, lbl_slots, lbl_streak, lbl_next]: h.add_child(l) btn_xp = UiKit.button("XP kaufen %d Gold [X]" % Data.XP_BUY_COST, Color(0.36, 0.30, 0.50)) btn_xp.custom_minimum_size = Vector2(170, 28) btn_xp.pressed.connect(func(): xp_pressed.emit()) h.add_child(btn_xp) var spacer := Control.new() spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL h.add_child(spacer) btn_pause = UiKit.button("Pause [P]", Color(0.25, 0.28, 0.36)) btn_pause.custom_minimum_size = Vector2(96, 28) btn_pause.pressed.connect(func(): pause_pressed.emit()) h.add_child(btn_pause) btn_speed = UiKit.button("Tempo 1x", Color(0.25, 0.28, 0.36)) btn_speed.custom_minimum_size = Vector2(96, 28) btn_speed.pressed.connect(func(): speed_pressed.emit()) h.add_child(btn_speed) btn_ready = UiKit.button("Kampf starten [Leer]", Color(0.24, 0.52, 0.34)) btn_ready.custom_minimum_size = Vector2(190, 28) btn_ready.pressed.connect(func(): ready_pressed.emit()) h.add_child(btn_ready) func refresh(game: Game, combat_speed: float) -> void: var p := game.human lbl_round.text = "Runde %d" % game.round_no lbl_hp.text = "Leben %d" % p.hp var interest := Data.interest(p.gold) lbl_gold.text = "Gold %d (+%d Zins)" % [p.gold, interest] if interest > 0 else "Gold %d" % p.gold if p.level >= Data.MAX_LEVEL: lbl_slots.text = "Kader %d/%d (Level max)" % [p.board.size(), p.team_slots()] else: lbl_slots.text = "Kader %d/%d Level %d XP %d/%d" % [p.board.size(), p.team_slots(), p.level, p.xp, Data.xp_needed(p.level)] var s := p.streak lbl_streak.text = "Serie %s%d (+%d Gold)" % ["+" if s > 0 else "", s, Data.streak_gold(s)] btn_speed.text = "Tempo %dx" % int(combat_speed) btn_xp.disabled = game.phase != Game.Phase.PLANNING or not p.can_buy_xp() var opp := game.human_opponent() match game.phase: Game.Phase.PLANNING: lbl_phase.text = "Planung" lbl_next.text = "Nächster Gegner: %s" % opp.pname if opp else "" btn_ready.text = "Kampf starten [Leer]" btn_ready.disabled = false Game.Phase.COMBAT: lbl_phase.text = "Kampf gegen %s" % (opp.pname if opp else "?") lbl_next.text = "" btn_ready.text = "Kampf überspringen" btn_ready.disabled = false _: lbl_phase.text = "Spiel vorbei" lbl_next.text = "" btn_ready.disabled = true refresh_timer(game) func refresh_timer(game: Game) -> void: if game.phase == Game.Phase.PLANNING and game.timer_enabled: lbl_timer.text = "%d s" % int(ceil(game.plan_left)) lbl_timer.add_theme_color_override("font_color", Color(1.0, 0.45, 0.4) if game.plan_left <= 5.0 else Color(0.95, 0.85, 0.45)) lbl_timer.visible = true else: lbl_timer.visible = false