class_name DeckScreen extends Control ## Deck zusammenstellen: alle eigenen Karten im Raster, ein Klick nimmt eine Karte in den ## Stapel oder wieder heraus. Karten außerhalb des Stapels sind abgedunkelt. Der Stapel hält ## 40 bis 60 Karten; „Auffüllen“ nimmt die wertvollsten eigenen Karten des gewählten Filters. ## „Stärke“ ist der mittlere Kartenwert (100 Grundkarten … 500 Ultimate Rare). var app var filter := "" var grid: CardGrid var count_label: Label var strength_label: Label var msg_label: Label func _ready() -> void: Style.header(self, "Deck", func(): app.show_screen(MenuScreen.new())) Style.button(self, "Alle", Rect2(40, 86, 60, 34), set_filter.bind("")) var filters: Array = Cards.ELEMENTS + [Cards.NEUTRAL] for i in filters.size(): var e: String = filters[i] var fb := Style.button(self, e, Rect2(108 + i * 82, 86, 78, 34), set_filter.bind(e), Style.darker(Cards.ELEMENT_COLORS[e], 0.8)) fb.add_theme_font_size_override("font_size", 14) grid = CardGrid.new(Rect2(40, 132, CardGrid.COLS * (CardGrid.CW + CardGrid.GAP) + 10, 650)) grid.card_clicked.connect(toggle) add_child(grid) Style.panel(self, Rect2(820, 86, 420, 696)) count_label = Style.chip(self, "", Rect2(860, 100, 340, 36), Style.BLUE) strength_label = Style.chip(self, "", Rect2(860, 144, 340, 36), Style.GOLD) var hint := Style.label(self, "", 15, Style.MUTED, Rect2(840, 188, 380, 66), "center") hint.autowrap_mode = TextServer.AUTOWRAP_WORD # vor dem Text, sonst wächst die Breite auf eine Zeile hint.text = "Klick nimmt eine Karte in den Stapel oder heraus. Auffüllen nimmt die wertvollsten Karten des Filters." Style.button(self, "Auffüllen", Rect2(840, 262, 380, 46), fill_up) Style.button(self, "Leeren", Rect2(840, 318, 380, 46), clear_deck, Color("5a3c28")) msg_label = Style.label(self, "", 15, Style.RED, Rect2(840, 382, 380, 48), "center") refresh() func _input(event: InputEvent) -> void: if event.is_action_pressed("ui_cancel"): app.show_screen(MenuScreen.new()) func set_filter(e: String) -> void: filter = e refresh() func toggle(card: Cards.Card) -> void: var err: String = app.profile.toggle_deck(card.id) msg_label.text = err if err == "": app.sfx.play("click") app.save() refresh() ## Füllt mit den wertvollsten eigenen Karten des gewählten Filters bis zum Höchstwert auf. func fill_up() -> void: var p: Profile = app.profile var pool: Array = p.collection.keys() if filter != "": pool = pool.filter(func(id): return filter in Cards.by_id(id).elements) p.deck = DeckGen.fill(p.deck, pool, Game.DECK_MAX, p.collection) app.save() refresh() func clear_deck() -> void: app.profile.deck = [] app.save() refresh() ## Eigene Karten, die im Stapel zuerst, dann höchste Stufen vorn, dann nach Kosten. func cards() -> Array: var p: Profile = app.profile var out: Array = p.collection.keys().map(func(id): return Cards.by_id(id)) if filter != "": out = out.filter(func(c): return filter in c.elements) out.sort_custom(func(a, b): var ia: bool = a.id in p.deck var ib: bool = b.id in p.deck if ia != ib: return ia if p.level(a.id) != p.level(b.id): return p.level(a.id) > p.level(b.id) return a.cost < b.cost if a.cost != b.cost else a.id < b.id) return out func refresh() -> void: var p: Profile = app.profile count_label.text = tr("Stapel: %d Karten (%d bis %d)") % [p.deck.size(), Game.DECK_MIN, Game.DECK_MAX] count_label.add_theme_color_override("font_color", Style.RED if p.deck.size() < Game.DECK_MIN else Style.BLUE) strength_label.text = tr("Stärke %d") % DeckGen.strength(p.deck, p.collection) var shown := cards() grid.fill(shown.map(func(c): return c.leveled(p.level(c.id))), func(c): return Cards.RARITIES[c.look]) var views := grid.views() for i in views.size(): views[i].dim = not (shown[i].id in p.deck)