- Einzelspieler: Schwierigkeit, darunter nur die zwei Deckstärken, Gegnerzahl als Schieberegler, Starten und Zurück; kein Würfeln, die Gegnerdecks entstehen beim Start - Kampagne: nur noch Name, Elementpunkte und Knopf, mit Innenabstand in den Zeilen - Hotseat (Lokal zu mehreren) samt Übergabe-Vorhang, Auswahlbildschirm und Tests entfernt - Netzwerktests laufen nur mit DINGER_NETZ=1, weil die Bot-Prozesse Minuten brauchen Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QPgKvy5W9WRNFHjkm5QsHx
80 lines
3.1 KiB
GDScript
80 lines
3.1 KiB
GDScript
class_name OpponentSelectScreen
|
|
extends Control
|
|
## Einzelspieler: Schwierigkeit wählen und die Gegnerzahl schieben. Die Gegnerdecks
|
|
## werden erst beim Start zufällig gezogen (siehe BattleScreen und DeckGen).
|
|
|
|
var app
|
|
var rating_label: Label
|
|
var diff_buttons := {}
|
|
var count_slider: HSlider
|
|
var count_label: Label
|
|
var info_label: Label
|
|
|
|
|
|
func _ready() -> void:
|
|
var col := Style.column(self, 1000, 60, 14)
|
|
Style.clabel(col, "Einzelspieler", 36, Style.GOLD, "center", true)
|
|
Style.spacer(col, 10)
|
|
Style.clabel(col, "Schwierigkeit", 20, Style.TEXT, "center", true)
|
|
var dr := Style.row(col, 10)
|
|
dr.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
for key in ["leicht", "normal", "schwer"]:
|
|
var k: String = key
|
|
diff_buttons[k] = Style.cbutton(dr, Profile.DIFFICULTIES[k].name, Vector2(150, 40), func(): set_difficulty(k))
|
|
rating_label = Style.clabel(col, "", 15, Style.MUTED)
|
|
Style.spacer(col, 24)
|
|
count_label = Style.clabel(col, "", 20, Style.TEXT, "center", true)
|
|
var sr := Style.row(col, 12)
|
|
sr.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
Style.clabel(sr, "1", 15, Style.MUTED, "right", false, 20)
|
|
count_slider = HSlider.new()
|
|
count_slider.min_value = 1
|
|
count_slider.max_value = Game.MAX_OPPONENTS
|
|
count_slider.step = 1
|
|
count_slider.value = 1
|
|
count_slider.tick_count = Game.MAX_OPPONENTS
|
|
count_slider.ticks_on_borders = true
|
|
count_slider.custom_minimum_size = Vector2(420, 32)
|
|
count_slider.value_changed.connect(func(_v): refresh())
|
|
sr.add_child(count_slider)
|
|
Style.clabel(sr, str(Game.MAX_OPPONENTS), 15, Style.MUTED, "left", false, 20)
|
|
info_label = Style.clabel(col, "", 15, Style.MUTED)
|
|
Style.spacer(col, 30)
|
|
var br := Style.row(col, 16)
|
|
br.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
Style.cbutton(br, "Starten", Vector2(190, 46), start, Color("285a3c"))
|
|
Style.cbutton(br, "Zurück", Vector2(150, 46), func(): app.show_screen(MenuScreen.new()))
|
|
refresh()
|
|
|
|
|
|
func set_difficulty(key: String) -> void:
|
|
app.profile.settings.difficulty = key
|
|
app.save()
|
|
refresh()
|
|
|
|
|
|
func opponents() -> int:
|
|
return int(count_slider.value)
|
|
|
|
|
|
func start() -> void:
|
|
app.show_screen(BattleScreen.new(opponents()))
|
|
|
|
|
|
func refresh() -> void:
|
|
var p: Profile = app.profile
|
|
for key in diff_buttons:
|
|
var b: Button = diff_buttons[key]
|
|
var active: bool = key == p.settings.difficulty
|
|
b.add_theme_stylebox_override("normal", Style.box(Color("285a3c") if active else Style.PANEL_LIGHT, 8, Style.GOLD if active else Style.MUTED, 2))
|
|
b.add_theme_stylebox_override("hover", Style.box(Style.lighter(Color("285a3c") if active else Style.PANEL_LIGHT), 8, Style.GOLD if active else Style.MUTED, 2))
|
|
rating_label.text = tr("Deine Deckstärke %.1f · Gegnerdecks %.1f") % [p.deck_rating(), p.target_rating()]
|
|
var n := opponents()
|
|
count_label.text = tr("1 Gegner") if n == 1 else tr("%d Gegner") % n
|
|
info_label.text = (tr("Duell") if n == 1 else tr("%d am Tisch") % (n + 1)) + " · " + tr("%d Münzen") % Profile.REWARD_WIN[n]
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("ui_cancel"):
|
|
app.show_screen(MenuScreen.new())
|