121 lines
4.0 KiB
GDScript
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
|