- 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
137 lines
4.1 KiB
GDScript
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)
|
|
|
|
|