94 lines
3.5 KiB
GDScript
94 lines
3.5 KiB
GDScript
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 teuersten eigenen Karten des gewählten Filters.
|
|
|
|
var app
|
|
var filter := ""
|
|
var grid: CardGrid
|
|
var count_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(""))
|
|
for i in Cards.ELEMENTS.size():
|
|
var e: String = Cards.ELEMENTS[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)
|
|
var hint := Style.label(self, "Klick nimmt eine Karte in den Stapel oder heraus. Auffüllen nimmt die teuersten Karten des Filters.", 15, Style.MUTED, Rect2(840, 160, 380, 60), "center")
|
|
hint.autowrap_mode = TextServer.AUTOWRAP_WORD
|
|
Style.button(self, "Auffüllen", Rect2(840, 240, 380, 46), fill_up)
|
|
Style.button(self, "Leeren", Rect2(840, 296, 380, 46), clear_deck, Color("5a3c28"))
|
|
msg_label = Style.label(self, "", 15, Style.RED, Rect2(840, 360, 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 teuersten 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)
|
|
app.save()
|
|
refresh()
|
|
|
|
|
|
func clear_deck() -> void:
|
|
app.profile.deck = []
|
|
app.save()
|
|
refresh()
|
|
|
|
|
|
## Eigene Karten, die im Stapel zuerst, sonst 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
|
|
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)
|
|
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)
|