91 lines
3.7 KiB
GDScript
91 lines
3.7 KiB
GDScript
class_name CampaignScreen
|
|
extends Control
|
|
|
|
var app
|
|
var chapter := 1
|
|
var perk_box: OptionButton
|
|
|
|
|
|
func _ready() -> void:
|
|
var p: Profile = app.profile
|
|
chapter = mini(Campaign.chapter(p.campaign_stage), Campaign.CHAPTERS.size())
|
|
build()
|
|
|
|
|
|
func build() -> void:
|
|
Style.clear(self)
|
|
var p: Profile = app.profile
|
|
var col := Style.column(self, 1000, 16, 5)
|
|
Style.clabel(col, "Kampagne", 34, Style.GOLD, "center", true)
|
|
var tabs := Style.row(col, 10)
|
|
tabs.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
for c in Campaign.CHAPTERS.size():
|
|
var b := Style.cbutton(tabs, "Kapitel %d" % (c + 1), Vector2(140, 36), set_chapter.bind(c + 1), Color("285a3c") if chapter == c + 1 else null)
|
|
b.disabled = p.campaign_stage < c * Campaign.STAGES.size()
|
|
if p.perk_unlocked():
|
|
var pr := Style.row(tabs, 8)
|
|
Style.clabel(pr, "Dein Merkmal:", 15, Style.MUTED, "right", false, 110)
|
|
perk_box = OptionButton.new()
|
|
perk_box.custom_minimum_size = Vector2(300, 36)
|
|
perk_box.add_item("keins")
|
|
var keys: Array = Game.PERKS.keys()
|
|
for k in keys:
|
|
perk_box.add_item(Game.PERKS[k])
|
|
perk_box.select(keys.find(p.perk) + 1 if p.perk != "" else 0)
|
|
perk_box.item_selected.connect(func(i: int):
|
|
p.perk = "" if i == 0 else keys[i - 1]
|
|
app.save())
|
|
pr.add_child(perk_box)
|
|
var offset := (chapter - 1) * Campaign.STAGES.size()
|
|
for k in Campaign.STAGES.size():
|
|
var i := offset + k
|
|
var st := Campaign.stage(i)
|
|
var done := i < p.campaign_stage
|
|
var next := i == p.campaign_stage
|
|
var panel := PanelContainer.new()
|
|
panel.add_theme_stylebox_override("panel", Style.box(Style.PANEL if not done else Style.darker(Style.PANEL, 0.8), 6,
|
|
Style.GOLD if next else null, 2 if next else 0))
|
|
col.add_child(panel)
|
|
var pad := MarginContainer.new() # Innenabstand, damit Name und Knopf nicht am Rahmen kleben
|
|
for side in ["left", "right"]:
|
|
pad.add_theme_constant_override("margin_" + side, 14)
|
|
panel.add_child(pad)
|
|
var r := Style.row(pad, 10)
|
|
r.custom_minimum_size = Vector2(0, 50)
|
|
var nm := Style.clabel(r, "%s · %s" % [st.name, st.title], 16, Style.TEXT if not done else Style.MUTED, "left", true, 420)
|
|
nm.size_flags_horizontal = Control.SIZE_EXPAND_FILL # schiebt die Punkte und den Knopf nach rechts
|
|
var dots := Control.new()
|
|
dots.custom_minimum_size = Vector2(60, 0)
|
|
dots.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
var elems: Array = st.elements
|
|
dots.draw.connect(func():
|
|
for m in elems.size():
|
|
dots.draw_circle(Vector2(10 + m * 18, dots.size.y / 2), 7, Cards.ELEMENT_COLORS[elems[m]]))
|
|
r.add_child(dots)
|
|
if done:
|
|
Style.cbutton(r, "Wiederholen", Vector2(130, 36), _start.bind(i))
|
|
elif next:
|
|
Style.cbutton(r, "Kämpfen", Vector2(130, 36), _start.bind(i), Color("285a3c"))
|
|
else:
|
|
var b := Style.cbutton(r, "Gesperrt", Vector2(130, 36), func(): pass)
|
|
b.disabled = true
|
|
if p.campaign_stage >= Campaign.total():
|
|
Style.clabel(col, "Alle Kapitel abgeschlossen", 16, Style.GREEN, "center", true)
|
|
var br := Style.row(col)
|
|
br.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
Style.cbutton(br, "Zurück", Vector2(160, 40), func(): app.show_screen(MenuScreen.new()))
|
|
|
|
|
|
func set_chapter(c: int) -> void:
|
|
chapter = c
|
|
build()
|
|
|
|
|
|
func _start(stage: int) -> void:
|
|
app.show_screen(BattleScreen.new(0, stage))
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE:
|
|
app.show_screen(MenuScreen.new())
|