Files
cards/scripts/ui/battle_gamepad.gd
Team3 0f2dc22ef6 Gegnerauswahl und Kampagne aufgeräumt, Hotseat entfernt
- 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
2026-09-17 21:05:09 +02:00

137 lines
4.1 KiB
GDScript

class_name BattleGamepad
extends RefCounted
## Gamepad-Steuerung des Kampfes: Steuerkreuz bewegt einen Zeiger über Hand, eigene Wesen und Ziele,
## A bestätigt, B bricht ab, Start beendet den Zug, Y überspringt Gegnerzüge, X macht rückgängig.
var screen # BattleScreen
var active := false
var zone := "hand"
var index := 0
var targets: Array = []
func _init(s) -> void:
screen = s
func button(button: int) -> void:
active = true
if screen.game == null:
return
match button:
JOY_BUTTON_START:
if screen.my_turn() and not screen.any_overlay():
screen.end_turn()
JOY_BUTTON_B:
if screen.confirm.visible:
screen.confirm.visible = false
screen.cancel_all()
zone = "hand"
JOY_BUTTON_Y:
if screen.b_skip.visible:
screen.skip_ai = true
JOY_BUTTON_X:
if screen.b_undo.visible:
screen.undo()
JOY_BUTTON_A:
confirm()
JOY_BUTTON_DPAD_LEFT:
move(-1)
JOY_BUTTON_DPAD_RIGHT:
move(1)
JOY_BUTTON_DPAD_UP, JOY_BUTTON_DPAD_DOWN:
if zone != "target":
zone = "own" if zone == "hand" else "hand"
index = 0
screen.refresh()
func items() -> Array:
match zone:
"hand":
return screen.hand_views
"own":
return screen.own_views.filter(func(v): return v.creature.can_attack())
"target":
return targets
return []
func move(dir: int) -> void:
var n := items().size()
if n > 0:
index = posmod(index + dir, n)
func confirm() -> void:
if screen.mulligan.visible:
screen.do_mulligan([])
return
if screen.overlay.visible:
screen.leave()
return
if screen.confirm.visible:
return
var items := items()
if items.is_empty():
return
index = clampi(index, 0, items.size() - 1)
var item = items[index]
match zone:
"hand":
screen.on_click("hand", item.card)
if screen.pending != null:
targets = []
var valid: Array = screen.game.valid_targets(screen.perspective, screen.pending.target_type())
for v in screen.enemy_views:
if v.creature in valid:
targets.append(v)
for v in screen.own_views:
if v.creature in valid:
targets.append(v)
for o in screen.others():
if o in valid:
targets.append(screen.hero_panels[o])
zone = "target"
index = 0
"own":
screen.on_click("own", item.creature)
if screen.selected != null:
targets = []
for v in screen.enemy_views:
if screen.game.can_attack(screen.selected, v.creature)[0]:
targets.append(v)
for o in screen.others():
if o.alive() and screen.game.can_attack(screen.selected, o)[0]:
targets.append(screen.hero_panels[o])
zone = "target"
index = 0
"target":
if item is CreatureView:
screen.on_tile_click(item.creature)
else:
for o in screen.hero_panels:
if screen.hero_panels[o] == item:
screen.on_click("hero", o)
zone = "hand"
index = 0
func draw_cursor() -> void:
Style.clear(screen.cursor_layer)
if not active or screen.game == null or not screen.my_turn():
return
var items := items()
if items.is_empty():
return
index = clampi(index, 0, items.size() - 1)
var item = items[index]
var r: Rect2 = Rect2(item.slot, item.size) if item is CreatureView else Rect2(item.position, item.size)
var hl := BattleScreen.Highlight.new()
hl.position = r.position - Vector2(6, 6)
hl.size = r.size + Vector2(12, 12)
hl.mouse_filter = Control.MOUSE_FILTER_IGNORE
screen.cursor_layer.add_child(hl)