Files
2026-09-16 12:09:33 +02:00

121 lines
4.0 KiB
GDScript

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