class_name BoosterScreen extends Control const CARD_W := 200 const CARD_H := 280 var app var cards: Array = [] # {"card", "rarity", "upgraded", "dust"} je Karte var revealed := {} var coins_label: Label var msg_label: Label var b_buy: Button var b_all: Button var slots: Control class CardBack extends Control: signal clicked func _init(sz: Vector2) -> void: size = sz custom_minimum_size = sz mouse_filter = Control.MOUSE_FILTER_STOP focus_mode = Control.FOCUS_ALL focus_entered.connect(queue_redraw) focus_exited.connect(queue_redraw) func _gui_input(event: InputEvent) -> void: if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: accept_event() clicked.emit() elif has_focus() and event.is_action_pressed("ui_accept"): accept_event() clicked.emit() func _draw() -> void: var rect := Rect2(Vector2.ZERO, size) draw_style_box(Style.box(Color("3c285a"), 8, Style.GOLD, 5 if has_focus() else 3), rect) Style.border(self, rect.grow(-15), Color("5a3c82"), 2, 6) Style.text(self, "?", 48, Style.GOLD, size / 2, "center", true) func slot_rect(i: int) -> Rect2: var gap := 20 var x0 := (1280 - Profile.BOOSTER_SIZE * CARD_W - (Profile.BOOSTER_SIZE - 1) * gap) / 2 return Rect2(x0 + i * (CARD_W + gap), 230, CARD_W, CARD_H) func _ready() -> void: Style.label(self, "Booster", 36, Style.GOLD, Rect2(0, 20, 1280, 50), "center", true) coins_label = Style.label(self, "", 22, Style.GOLD, Rect2(0, 78, 1280, 30), "center") slots = Control.new() slots.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(slots) msg_label = Style.label(self, "", 17, Style.RED, Rect2(0, 700, 1280, 22), "center") b_buy = Style.button(self, "Booster kaufen (%d Münzen)" % Profile.BOOSTER_COST, Rect2(290, 720, 330, 48), buy, Color("5a4628")) b_all = Style.button(self, "Alle aufdecken", Rect2(640, 720, 200, 48), reveal_all) Style.button(self, "Zurück", Rect2(860, 720, 130, 48), func(): app.show_screen(MenuScreen.new())) refresh() func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE: app.show_screen(MenuScreen.new()) func buy() -> void: var p: Profile = app.profile var got: Array = p.open_booster() if got.is_empty(): msg_label.text = "Nicht genug Münzen" msg_label.add_theme_color_override("font_color", Style.RED) return app.save() app.sfx.play("play") cards = got revealed = {} msg_label.text = "" refresh() func reveal(i: int) -> void: revealed[i] = true app.sfx.play("click") refresh() func reveal_all() -> void: for i in Profile.BOOSTER_SIZE: revealed[i] = true refresh() func refresh() -> void: var p: Profile = app.profile coins_label.text = "Münzen: %d" % p.coins b_buy.disabled = p.coins < Profile.BOOSTER_COST b_all.disabled = cards.is_empty() or revealed.size() >= Profile.BOOSTER_SIZE Style.clear(slots) for i in Profile.BOOSTER_SIZE: var r := slot_rect(i) if cards.is_empty(): Style.panel(slots, r, Style.PANEL, 8, Style.PANEL_LIGHT, 2) elif revealed.has(i): var res: Dictionary = cards[i] var c: Cards.Card = res.card var v := CardView.new(c, r.size, false, res.rarity) v.position = r.position slots.add_child(v) Style.label(slots, tr(res.rarity), 16, Cards.RARITY_COLORS[res.rarity], Rect2(r.position.x, r.end.y + 8, r.size.x, 24), "center", true) if res.upgraded: Style.label(slots, "Aufgewertet", 16, Style.GREEN, Rect2(r.position.x, r.end.y + 32, r.size.x, 24), "center", true) else: Style.label(slots, "+%d Staub" % res.dust, 14, Style.MUTED, Rect2(r.position.x, r.end.y + 32, r.size.x, 24), "center") else: var back := CardBack.new(r.size) back.position = r.position back.clicked.connect(reveal.bind(i)) slots.add_child(back)