175 lines
6.1 KiB
GDScript
175 lines
6.1 KiB
GDScript
class_name CollectionScreen
|
|
extends Control
|
|
## Sammlung: alle Karten des Spiels, die fehlenden abgedunkelt. Eigene Karten lassen sich
|
|
## aufwerten (Staub) oder zerlegen (bringt Staub), fehlende herstellen (Staub).
|
|
|
|
var app
|
|
var filter := ""
|
|
var search := ""
|
|
var selected: Cards.Card = null
|
|
var grid: CardGrid
|
|
var search_box: LineEdit
|
|
var dust_label: Label
|
|
var msg_label: Label
|
|
var preview_holder: Control
|
|
var info_label: Label
|
|
var b_dismantle: Button
|
|
var b_upgrade: Button
|
|
var b_craft: Button
|
|
|
|
|
|
func _ready() -> void:
|
|
Style.header(self, "Sammlung", 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)
|
|
search_box = LineEdit.new()
|
|
search_box.position = Vector2(526, 86)
|
|
search_box.size = Vector2(190, 34)
|
|
search_box.placeholder_text = "Suche"
|
|
search_box.text_changed.connect(func(t: String):
|
|
search = t
|
|
refresh())
|
|
add_child(search_box)
|
|
grid = CardGrid.new(Rect2(40, 132, CardGrid.COLS * (CardGrid.CW + CardGrid.GAP) + 10, 650))
|
|
grid.card_clicked.connect(select)
|
|
add_child(grid)
|
|
Style.panel(self, Rect2(820, 86, 420, 696))
|
|
dust_label = Style.chip(self, "", Rect2(860, 100, 340, 36), Style.BLUE)
|
|
preview_holder = Control.new()
|
|
preview_holder.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
add_child(preview_holder)
|
|
info_label = Style.label(self, "", 15, Style.MUTED, Rect2(840, 476, 380, 30), "center")
|
|
b_upgrade = Style.button(self, "", Rect2(840, 530, 380, 46), upgrade, Style.PRIMARY)
|
|
b_dismantle = Style.button(self, "", Rect2(840, 586, 380, 46), dismantle, Color("5a3c28"))
|
|
b_craft = Style.button(self, "", Rect2(840, 530, 380, 46), craft, Style.PRIMARY)
|
|
msg_label = Style.label(self, "", 15, Style.GREEN, Rect2(840, 650, 380, 48), "center")
|
|
refresh()
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("ui_cancel") and not search_box.has_focus():
|
|
app.show_screen(MenuScreen.new())
|
|
|
|
|
|
func set_filter(e: String) -> void:
|
|
filter = e
|
|
refresh()
|
|
|
|
|
|
## Eigene Karten zuerst (höhere Stufen vorn), dann die fehlenden, sonst in Kartenreihenfolge.
|
|
func cards() -> Array:
|
|
var out: Array = Cards.all().duplicate()
|
|
if filter != "":
|
|
out = out.filter(func(c): return filter in c.elements)
|
|
if search != "":
|
|
var q := search.to_lower()
|
|
out = out.filter(func(c): return q in c.name.to_lower() or q in c.title().to_lower() or q in c.text().to_lower() or q in c.combo().to_lower())
|
|
var p: Profile = app.profile
|
|
var order := {}
|
|
for i in out.size():
|
|
order[out[i].id] = i
|
|
out.sort_custom(func(a, b):
|
|
if p.owns(a.id) != p.owns(b.id):
|
|
return p.owns(a.id)
|
|
return p.level(a.id) > p.level(b.id) if p.level(a.id) != p.level(b.id) else order[a.id] < order[b.id])
|
|
return out
|
|
|
|
|
|
func select(card: Cards.Card) -> void:
|
|
selected = card
|
|
msg_label.text = ""
|
|
refresh()
|
|
|
|
|
|
func say(m: String, ok: bool) -> void:
|
|
msg_label.text = m
|
|
msg_label.add_theme_color_override("font_color", Style.GREEN if ok else Style.RED)
|
|
|
|
|
|
func upgrade() -> void:
|
|
if selected == null:
|
|
return
|
|
var err: String = app.profile.upgrade(selected.id)
|
|
if err == "":
|
|
app.sfx.play("play")
|
|
app.save()
|
|
say(tr("%s ist jetzt %s") % [selected.title(), tr(app.profile.rarity(selected.id))], true)
|
|
else:
|
|
say(err, false)
|
|
refresh()
|
|
|
|
|
|
func dismantle() -> void:
|
|
if selected == null:
|
|
return
|
|
var lvl: int = app.profile.level(selected.id)
|
|
var err: String = app.profile.dismantle(selected.id)
|
|
if err == "":
|
|
app.sfx.play("click")
|
|
app.save()
|
|
say(tr("%s zerlegt (+%d Staub)") % [selected.title(), Profile.DUST_DISMANTLE[Cards.RARITIES[lvl]]], true)
|
|
else:
|
|
say(err, false)
|
|
refresh()
|
|
|
|
|
|
func craft() -> void:
|
|
if selected == null:
|
|
return
|
|
var err: String = app.profile.craft(selected.id)
|
|
if err == "":
|
|
app.sfx.play("combo")
|
|
app.save()
|
|
say(tr("%s hergestellt") % selected.title(), true)
|
|
else:
|
|
say(err, false)
|
|
refresh()
|
|
|
|
|
|
func refresh() -> void:
|
|
var p: Profile = app.profile
|
|
dust_label.text = "Staub: %d" % p.dust
|
|
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 p.owns(shown[i].id)
|
|
Style.clear(preview_holder)
|
|
b_craft.visible = false
|
|
b_upgrade.visible = true
|
|
b_dismantle.visible = true
|
|
if selected == null:
|
|
info_label.text = "Keine Karte gewählt"
|
|
b_upgrade.text = "Aufwerten"
|
|
b_dismantle.text = "Zerlegen"
|
|
b_upgrade.disabled = true
|
|
b_dismantle.disabled = true
|
|
return
|
|
var v := CardView.new(selected.leveled(p.level(selected.id)), Vector2(220, 308), false, p.rarity(selected.id))
|
|
v.position = Vector2(920, 152)
|
|
v.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
preview_holder.add_child(v)
|
|
var lvl := p.level(selected.id)
|
|
if not p.owns(selected.id):
|
|
info_label.text = tr("Nicht in der Sammlung")
|
|
b_upgrade.visible = false
|
|
b_dismantle.visible = false
|
|
b_craft.visible = true
|
|
b_craft.text = tr("Herstellen (%d Staub)") % Profile.CRAFT_COST
|
|
b_craft.disabled = p.dust < Profile.CRAFT_COST
|
|
return
|
|
info_label.text = "%s · %s" % [tr(selected.combo()), tr(p.rarity(selected.id))]
|
|
if lvl >= Cards.RARITIES.size() - 1:
|
|
b_upgrade.text = "Höchste Stufe"
|
|
b_upgrade.disabled = true
|
|
else:
|
|
var next: String = Cards.RARITIES[lvl + 1]
|
|
b_upgrade.text = "Aufwerten zu %s (%d Staub)" % [tr(next), Profile.DUST_UPGRADE[next]]
|
|
b_upgrade.disabled = p.dust < Profile.DUST_UPGRADE[next]
|
|
b_dismantle.text = "Zerlegen (+%d Staub)" % Profile.DUST_DISMANTLE[Cards.RARITIES[lvl]]
|
|
b_dismantle.disabled = false
|