class_name BattleLayout ## Feste Bildschirmaufteilung des Duells (1280x800). Mitte von oben nach unten: Hand des Gegners ## (Rückseiten), sein Brett, eigenes Brett, eigene Hand. Links: Kasten des Gegners, daneben die ## Elementzähler beider Seiten je neben ihrem Brett, Zusatzzeile und Meldungen. Rechts von oben: ## Stapel und Kasten des Gegners, die Vorschau, eigener Kasten und Stapel. Optionen per Esc. const B_UNDO := Rect2(20, 10, 210, 32) # links oben: Rückgängig, darunter Überspringen (Gegnerzug) const B_SKIP := Rect2(20, 48, 210, 32) const OPP_DECK := Rect2(1090, 10, 130, 182) # Stapel des Gegners rechts oben const OPP_BOX := Rect2(1050, 200, 210, 70) # Kasten des Gegners darunter const OPP_HAND_Y := 22 # Bogen hebt die äußeren Rückseiten um bis zu 12 Pixel const OPP_ELEMENTS := Rect2(20, 220, 210, 128) # Elementzähler des Gegners, links von seinem Brett const OWN_ELEMENTS := Rect2(20, 440, 210, 128) # eigene Elementzähler, links vom eigenen Brett const INFO := Rect2(20, 580, 210, 60) # Zusatzzeile zur Vorschau const MSG := Rect2(20, 650, 210, 80) # Meldungen const STATUS := Rect2(1050, 526, 210, 70) # eigener Kasten rechts über dem Stapel const DECK := Rect2(1090, 606, 130, 182) # eigener Stapel rechts unten const OPTIONS := Rect2(440, 180, 400, 420) # Optionsmenü (Esc) const OWN_X := 295 const HAND_W := 130 # Handkarten so groß wie die Wesen auf dem Feld const HAND_H := 165 const HAND_GAP := 6 const HAND_Y := 605 const HAND_ARC := 3.0 # Grad Neigung und Pixel Absenkung je Platz von der Mitte (leichter Bogen) const LOG_PANEL := Rect2(240, 60, 800, 560) const PREVIEW_SIZE := Vector2(170, 238) const CENTER_X := 240 const CENTER_W := 800 static func own_slot(j: int) -> Rect2: return Rect2(OWN_X + j * 140, 410, HAND_W, HAND_H) ## Brett des Gegners über seiner Elementleiste. static func opp_slot(j: int) -> Rect2: return Rect2(OWN_X + j * 140, 205, HAND_W, HAND_H) ## Hand: alle Karten unten, mittig; passen sie nicht nebeneinander, überlappen sie sich ## gleichmäßig. Den Bogen legt hand_arc dazu. static func hand_rect(count: int, i: int) -> Rect2: var step: float = HAND_W + HAND_GAP if count > 1: step = minf(step, float(CENTER_W - HAND_W) / (count - 1)) var total: float = HAND_W + (count - 1) * step var x := CENTER_X + (CENTER_W - total) / 2 return Rect2(x + i * step, HAND_Y, HAND_W, HAND_H) ## Hand des Gegners oben, gleich groß, nur die Rückseiten. static func opp_hand_rect(count: int, i: int) -> Rect2: var r := hand_rect(count, i) r.position.y = OPP_HAND_Y return r ## Leichter Bogen: Karte i von count dreht sich um ihre Mitte und sinkt zum Rand hin ab ## (mirrored: für den Gegner oben spiegelverkehrt). Liefert [Grad, y-Versatz]. static func hand_arc(count: int, i: int, mirrored: bool = false) -> Array: var t := i - (count - 1) / 2.0 var sign := -1.0 if mirrored else 1.0 return [t * HAND_ARC * sign, t * t * HAND_ARC * sign] ## Vorschau der gezeigten Karte: fest rechts zwischen den beiden Kästen. static func preview_rect(_anchor: Rect2) -> Rect2: return Rect2(Vector2(1070, 278), PREVIEW_SIZE) ## Zusatzzeile (Elementbonus, Eigenschaften) links unter den Elementzählern. static func info_rect(_preview: Rect2) -> Rect2: return INFO