update
This commit is contained in:
231
scripts/hud.gd
231
scripts/hud.gd
@@ -3,6 +3,8 @@ extends CanvasLayer
|
||||
|
||||
signal bid_pressed(count: int, face: int)
|
||||
signal challenge_pressed
|
||||
signal exact_pressed
|
||||
signal rematch_pressed
|
||||
signal booster_chosen(id: String, target: int)
|
||||
signal quit_pressed
|
||||
signal pause_changed(paused: bool)
|
||||
@@ -33,17 +35,22 @@ var _count_min := 1
|
||||
var _count_max := 30
|
||||
var _bid_count := 0 ## aktuelles Gebot, 0 = noch keins
|
||||
var _bid_face := 0
|
||||
var _min_raise := 1
|
||||
var _actual := 0 ## beim Aufdecken: tatsächlich gefundene Würfel
|
||||
var face_buttons: Array[Button] = []
|
||||
var bid_btn: Button
|
||||
var challenge_btn: Button
|
||||
var exact_btn: Button
|
||||
var verlauf_box: VBoxContainer
|
||||
var _verlauf_sig := "" ## Abbild des Gebotsverlaufs, gegen unnötigen Neuaufbau
|
||||
var action_panel: PanelContainer
|
||||
|
||||
var hand_panel: PanelContainer
|
||||
var hand_box: HBoxContainer
|
||||
var boost_slot: CenterContainer
|
||||
var pause_slot: Control
|
||||
var over_slot: Control
|
||||
var over_title: Label
|
||||
var over_again: Button
|
||||
var pause_hint: Label
|
||||
var boost_panel: PanelContainer
|
||||
var boost_cards: HBoxContainer
|
||||
@@ -102,34 +109,17 @@ class MuenzIcon extends Control:
|
||||
|
||||
func _zeichen(m: Vector2, s: float) -> void:
|
||||
match id:
|
||||
"reroll_all":
|
||||
_wuerfel(m + Vector2(-s * 0.16, -s * 0.06), s * 0.42, 5)
|
||||
_wuerfel(m + Vector2(s * 0.18, s * 0.10), s * 0.42, 2)
|
||||
"reroll_one":
|
||||
_wuerfel(m + Vector2(0, s * 0.10), s * 0.38, 3)
|
||||
_bogen(m + Vector2(0, s * 0.10), s * 0.34)
|
||||
"set_six":
|
||||
_wuerfel(m, s * 0.54, 6)
|
||||
"peek":
|
||||
_auge(m, s)
|
||||
"count":
|
||||
_striche(m, s)
|
||||
"set_face":
|
||||
_schiefer_wuerfel(m, s * 0.50)
|
||||
"gain_die":
|
||||
_wuerfel(m + Vector2(-s * 0.10, 0), s * 0.46, 4)
|
||||
_plus(m + Vector2(s * 0.26, -s * 0.20), s * 0.20)
|
||||
"cancel":
|
||||
draw_arc(m, s * 0.30, 0, TAU, 32, farbe, s * 0.08)
|
||||
draw_line(m + Vector2(-s * 0.21, -s * 0.21), m + Vector2(s * 0.21, s * 0.21),
|
||||
farbe, s * 0.08)
|
||||
"peek":
|
||||
_auge(m, s)
|
||||
"bid_up":
|
||||
_pfeil(m, s * 0.52, true)
|
||||
"raise_min":
|
||||
_pfeil(m + Vector2(-s * 0.14, 0), s * 0.44, true)
|
||||
_pfeil(m + Vector2(s * 0.14, 0), s * 0.44, true)
|
||||
"enemy_lower":
|
||||
_pfeil(m, s * 0.52, false)
|
||||
"fog":
|
||||
draw_circle(m + Vector2(-s * 0.16, s * 0.06), s * 0.16, farbe)
|
||||
draw_circle(m + Vector2(s * 0.16, s * 0.06), s * 0.16, farbe)
|
||||
draw_circle(m + Vector2(0, -s * 0.06), s * 0.20, farbe)
|
||||
"gag":
|
||||
var r := Rect2(m - Vector2(s * 0.28, s * 0.16), Vector2(s * 0.56, s * 0.32))
|
||||
draw_rect(r, farbe, false, s * 0.07)
|
||||
@@ -138,6 +128,23 @@ class MuenzIcon extends Control:
|
||||
_:
|
||||
draw_circle(m, s * 0.26, farbe)
|
||||
|
||||
## Vier Striche und einer quer - eine Strichliste, das Zeichen fürs Zählen.
|
||||
func _striche(mitte: Vector2, s: float) -> void:
|
||||
var w := maxf(1.5, s * 0.07)
|
||||
for i in 4:
|
||||
var x: float = mitte.x + (float(i) - 1.5) * s * 0.16
|
||||
draw_line(Vector2(x, mitte.y - s * 0.26), Vector2(x, mitte.y + s * 0.26), farbe, w)
|
||||
draw_line(mitte + Vector2(-s * 0.32, s * 0.20), mitte + Vector2(s * 0.32, -s * 0.20), farbe, w)
|
||||
|
||||
## Ein gekippter Würfel mit einem Auge - der wird gerade umgedreht.
|
||||
func _schiefer_wuerfel(mitte: Vector2, kante: float) -> void:
|
||||
var h := kante * 0.5
|
||||
var ecken := PackedVector2Array()
|
||||
for e: Vector2 in [Vector2(-h, -h), Vector2(h, -h), Vector2(h, h), Vector2(-h, h)]:
|
||||
ecken.append(mitte + e.rotated(0.35))
|
||||
draw_colored_polygon(ecken, farbe)
|
||||
draw_circle(mitte, kante * 0.11, FLAECHE)
|
||||
|
||||
func _wuerfel(mitte: Vector2, kante: float, augen: int) -> void:
|
||||
var r := Rect2(mitte - Vector2(kante, kante) * 0.5, Vector2(kante, kante))
|
||||
draw_rect(r, farbe, true)
|
||||
@@ -146,13 +153,6 @@ class MuenzIcon extends Control:
|
||||
for p: Vector2 in DieIcon.PIPS[augen]:
|
||||
draw_circle(mitte + p * weg, punkt, FLAECHE)
|
||||
|
||||
## Offener Kreisbogen mit Spitze - das Zeichen fürs Neuwerfen.
|
||||
func _bogen(mitte: Vector2, r: float) -> void:
|
||||
draw_arc(mitte, r, PI * 0.85, TAU * 0.92, 28, farbe, maxf(1.5, r * 0.20))
|
||||
var spitze := mitte + Vector2(cos(TAU * 0.92), sin(TAU * 0.92)) * r
|
||||
draw_colored_polygon([spitze + Vector2(-r * 0.30, -r * 0.10),
|
||||
spitze + Vector2(r * 0.24, -r * 0.16), spitze + Vector2(r * 0.02, r * 0.28)], farbe)
|
||||
|
||||
func _plus(mitte: Vector2, r: float) -> void:
|
||||
draw_rect(Rect2(mitte - Vector2(r, r * 0.28), Vector2(r * 2, r * 0.56)), farbe, true)
|
||||
draw_rect(Rect2(mitte - Vector2(r * 0.28, r), Vector2(r * 0.56, r * 2)), farbe, true)
|
||||
@@ -304,9 +304,17 @@ func _build() -> void:
|
||||
_place(pl, 1, 0, 1, 0, -16, 16, -16, 16)
|
||||
pl.grow_horizontal = Control.GROW_DIRECTION_BEGIN
|
||||
root.add_child(pl)
|
||||
var rechts := VBoxContainer.new()
|
||||
rechts.add_theme_constant_override("separation", 10)
|
||||
pl.add_child(rechts)
|
||||
players_box = VBoxContainer.new()
|
||||
players_box.add_theme_constant_override("separation", 6)
|
||||
pl.add_child(players_box)
|
||||
rechts.add_child(players_box)
|
||||
# Der Gebotsverlauf der Runde. Bluffs liest man daran, wer wie schnell
|
||||
# hochgegangen ist - nicht am letzten Gebot allein.
|
||||
verlauf_box = VBoxContainer.new()
|
||||
verlauf_box.add_theme_constant_override("separation", 2)
|
||||
rechts.add_child(verlauf_box)
|
||||
|
||||
# --- Aktive Booster oben links, Breite richtet sich nach dem Inhalt
|
||||
var bo := _panel()
|
||||
@@ -421,6 +429,13 @@ func _build() -> void:
|
||||
challenge_btn.pressed.connect(_on_challenge)
|
||||
av.add_child(challenge_btn)
|
||||
|
||||
exact_btn = Button.new()
|
||||
exact_btn.text = "Genau"
|
||||
exact_btn.tooltip_text = "Die Ansage trifft exakt. Stimmt es, verlieren alle anderen einen Würfel."
|
||||
exact_btn.custom_minimum_size = Vector2(96, 42)
|
||||
exact_btn.pressed.connect(_on_exact)
|
||||
av.add_child(exact_btn)
|
||||
|
||||
timer_bid = _label("", 18, DIM)
|
||||
timer_bid.custom_minimum_size = Vector2(TIMER_W, 0)
|
||||
timer_bid.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
|
||||
@@ -534,6 +549,34 @@ func _build() -> void:
|
||||
leave.pressed.connect(_on_quit)
|
||||
pv.add_child(leave)
|
||||
|
||||
# --- Spielende: wer gewonnen hat, und wie es weitergeht
|
||||
over_slot = Control.new()
|
||||
over_slot.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||||
over_slot.visible = false
|
||||
root.add_child(over_slot)
|
||||
var oc := CenterContainer.new()
|
||||
oc.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||||
over_slot.add_child(oc)
|
||||
var op := _panel(Color(0.05, 0.06, 0.09, 0.98))
|
||||
oc.add_child(op)
|
||||
var ov := VBoxContainer.new()
|
||||
ov.custom_minimum_size = Vector2(300, 0)
|
||||
ov.add_theme_constant_override("separation", 10)
|
||||
op.add_child(ov)
|
||||
over_title = _label("", 26, ACCENT)
|
||||
over_title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
ov.add_child(over_title)
|
||||
over_again = Button.new()
|
||||
over_again.text = "Nochmal"
|
||||
over_again.custom_minimum_size = Vector2(0, 42)
|
||||
over_again.pressed.connect(func() -> void: rematch_pressed.emit())
|
||||
ov.add_child(over_again)
|
||||
var menue := Button.new()
|
||||
menue.text = "Zum Menü"
|
||||
menue.custom_minimum_size = Vector2(0, 42)
|
||||
menue.pressed.connect(_on_quit)
|
||||
ov.add_child(menue)
|
||||
|
||||
|
||||
func _on_quit() -> void:
|
||||
quit_pressed.emit()
|
||||
@@ -542,10 +585,8 @@ func _on_quit() -> void:
|
||||
## Ein Gebot muss höher sein als das vorige. Bei gleicher Anzahl geht das nur
|
||||
## über eine höhere Augenzahl - die kleineren werden deshalb ausgeblendet.
|
||||
func _face_allowed(f: int) -> bool:
|
||||
if _bid_count <= 0 or _count >= _bid_count + _min_raise:
|
||||
if _bid_count <= 0 or _count > _bid_count:
|
||||
return true
|
||||
if _min_raise > 1:
|
||||
return false
|
||||
return _count == _bid_count and f > _bid_face
|
||||
|
||||
|
||||
@@ -568,12 +609,12 @@ func _lowest_bid() -> void:
|
||||
if _bid_count <= 0:
|
||||
_set_count(1)
|
||||
_on_face(1)
|
||||
elif _min_raise == 1 and _bid_face < 6:
|
||||
elif _bid_face < 6:
|
||||
# Gleiche Anzahl reicht, wenn die Augenzahl steigt.
|
||||
_set_count(_bid_count)
|
||||
_on_face(_bid_face + 1)
|
||||
else:
|
||||
_set_count(_bid_count + _min_raise)
|
||||
_set_count(_bid_count + 1)
|
||||
_on_face(1)
|
||||
|
||||
|
||||
@@ -597,6 +638,10 @@ func _on_challenge() -> void:
|
||||
challenge_pressed.emit()
|
||||
|
||||
|
||||
func _on_exact() -> void:
|
||||
exact_pressed.emit()
|
||||
|
||||
|
||||
func _unhandled_key_input(event: InputEvent) -> void:
|
||||
if event is InputEventKey and event.pressed and not event.echo \
|
||||
and event.keycode == KEY_ESCAPE:
|
||||
@@ -672,7 +717,7 @@ func update_state(st: Dictionary, my_seat: int) -> void:
|
||||
# Beim Aufdecken bleibt die Ansage stehen, wie sie war: die angesagten
|
||||
# Würfel normal, die fehlenden davon rot. Gab es mehr als angesagt,
|
||||
# kommen die überzähligen grün dahinter.
|
||||
var faerben: bool = st.phase == "reveal"
|
||||
var faerben: bool = st.phase == "reveal" and _actual >= 0
|
||||
var angesagt := int(st.bid.count)
|
||||
var gezeigt := maxi(angesagt, _actual) if faerben else angesagt
|
||||
var px := _fit_dice(gezeigt)
|
||||
@@ -686,10 +731,17 @@ func update_state(st: Dictionary, my_seat: int) -> void:
|
||||
bid_row.add_child(DieIcon.new(int(st.bid.face), px, bg))
|
||||
|
||||
_zeichne_hand(st)
|
||||
|
||||
_zeichne_mitte(st, my_seat)
|
||||
_zeichne_verlauf(st, my_seat)
|
||||
|
||||
banner_label.text = st.banner
|
||||
# Am Ende steht der Sieger im Endbildschirm; das Banner darüber wäre doppelt.
|
||||
banner_label.text = "" if st.phase == "over" else st.banner
|
||||
if st.phase == "over" and not over_slot.visible:
|
||||
over_title.text = String(st.banner)
|
||||
# Nochmal gibt es nur solo. Im Netz müsste der Server den Raum neu
|
||||
# aufsetzen; bis dahin geht es zurück ins Menü.
|
||||
over_again.visible = Net.room_code == Net.SOLO
|
||||
over_slot.visible = true
|
||||
|
||||
var my_turn: bool = st.phase == "bid" and st.turn == my_seat and st.seats[my_seat].alive
|
||||
var kam_dran := my_turn and not _my_turn
|
||||
@@ -708,19 +760,15 @@ func update_state(st: Dictionary, my_seat: int) -> void:
|
||||
action_panel.modulate = Color(1, 1, 1, 1.0 if my_turn else 0.45)
|
||||
bid_btn.disabled = not my_turn
|
||||
_count_max = maxi(1, int(st.total))
|
||||
_min_raise = maxi(1, int(st.min_raise))
|
||||
_bid_count = 0 if st.bid.is_empty() else int(st.bid.count)
|
||||
_bid_face = 0 if st.bid.is_empty() else int(st.bid.face)
|
||||
# Ein Maulkorb sperrt das Anfechten - ausser es gäbe gar kein gültiges
|
||||
# Gebot mehr, dann bliebe sonst kein einziger Knopf übrig.
|
||||
var gebot_moeglich: bool = _bid_count + _min_raise <= _count_max \
|
||||
or (_min_raise == 1 and _bid_face < 6)
|
||||
var gebot_moeglich: bool = _bid_count + 1 <= _count_max or _bid_face < 6
|
||||
challenge_btn.disabled = not my_turn or st.bid.is_empty() \
|
||||
or (st.must_bid and gebot_moeglich)
|
||||
var low := 1
|
||||
if _bid_count > 0:
|
||||
low = _bid_count + (_min_raise if _min_raise > 1 else 0)
|
||||
_count_min = clampi(low, 1, _count_max)
|
||||
exact_btn.disabled = challenge_btn.disabled
|
||||
_count_min = clampi(maxi(1, _bid_count), 1, _count_max)
|
||||
_set_count(_count)
|
||||
if kam_dran:
|
||||
_lowest_bid()
|
||||
@@ -803,10 +851,12 @@ func _zeichne_hand(st: Dictionary) -> void:
|
||||
# stünden nur klickbar im Weg.
|
||||
var dabei: bool = _my_seat < st.seats.size() and st.seats[_my_seat].alive
|
||||
hand_panel.visible = dabei and not muenzen.is_empty()
|
||||
var spielbar: bool = st.phase == "bid"
|
||||
# Geworfen wird nur am eigenen Zug. Was eine Ansage braucht, wartet auf eine.
|
||||
var spielbar: bool = st.phase == "bid" and int(st.turn) == _my_seat
|
||||
var gebot: bool = not st.bid.is_empty()
|
||||
# Jeder Zustand kommt mehrmals an. Ein Neuaufbau würde die Münze unter dem
|
||||
# Zeiger wegreissen und die Erklärung mitnehmen.
|
||||
var sig := "%s|%s" % [muenzen, spielbar]
|
||||
var sig := "%s|%s|%s" % [muenzen, spielbar, gebot]
|
||||
if sig == _hand_sig:
|
||||
return
|
||||
_hand_sig = sig
|
||||
@@ -819,7 +869,10 @@ func _zeichne_hand(st: Dictionary) -> void:
|
||||
|
||||
var btn := Button.new()
|
||||
btn.custom_minimum_size = Vector2(104, 120)
|
||||
btn.disabled = not spielbar
|
||||
btn.disabled = not spielbar or (BoosterDB.needs_bid(id) and not gebot)
|
||||
# Der gesperrte Knopf dunkelt nur seinen Rand ab; Münze und Name darauf
|
||||
# blieben sonst so hell wie bei einer werfbaren.
|
||||
btn.modulate = Color(1, 1, 1, 1.0 if not btn.disabled else 0.4)
|
||||
# Ein gesperrter Knopf meldet keine Maus mehr; die Erklärung soll aber
|
||||
# auch dann kommen, wenn gerade nicht geworfen werden darf.
|
||||
btn.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
@@ -845,35 +898,32 @@ func _zeichne_hand(st: Dictionary) -> void:
|
||||
v.add_child(name_l)
|
||||
|
||||
|
||||
## Was liegt in der Mitte, plus die Wirkungen, die gerade auf einem liegen.
|
||||
## Der Topf: was diese Runde geworfen wurde und wem es gehört, wenn er
|
||||
## das Aufdecken gewinnt. Darunter, was gerade auf einem selbst liegt.
|
||||
## Auch hier gilt: nur neu bauen, wenn sich etwas geändert hat.
|
||||
func _zeichne_mitte(st: Dictionary, my_seat: int) -> void:
|
||||
var boosts: Array = st.get("boosts", [])
|
||||
# Der neueste Wurf muss bei jedem Zustand geprüft werden, auch ohne Neubau.
|
||||
var neu := {}
|
||||
for i in mini(boosts.size(), st.seats.size()):
|
||||
var m: Dictionary = boosts[i]
|
||||
if not m.is_empty() and int(m.get("nr", 0)) > int(neu.get("nr", 0)):
|
||||
neu = {"nr": m.get("nr", 0), "id": m.get("id", ""),
|
||||
"stark": m.get("stark", false), "seat": i}
|
||||
for m in boosts:
|
||||
if int(m.get("nr", 0)) > int(neu.get("nr", 0)):
|
||||
neu = m
|
||||
_pruefe_wurf(neu, st)
|
||||
|
||||
var sig := "%s|%s|%s" % [boosts, st.min_raise, st.must_bid]
|
||||
var zaehlung: Dictionary = st.get("zaehlung", {})
|
||||
var sig := "%s|%s|%s" % [boosts, zaehlung, st.must_bid]
|
||||
if sig == _mitte_sig:
|
||||
return
|
||||
_mitte_sig = sig
|
||||
_clear(boosts_box)
|
||||
|
||||
var any := false
|
||||
for i in mini(boosts.size(), st.seats.size()):
|
||||
var m: Dictionary = boosts[i]
|
||||
if m.is_empty():
|
||||
continue
|
||||
boosts_box.add_child(_label("Topf" if not boosts.is_empty() else "Topf: leer", 13, DIM))
|
||||
for m in boosts:
|
||||
var id := String(m.get("id", ""))
|
||||
var b: Dictionary = BoosterDB.get_booster(id)
|
||||
if b.is_empty():
|
||||
continue
|
||||
any = true
|
||||
var wer := int(m.get("seat", 0))
|
||||
var line := HBoxContainer.new()
|
||||
line.add_theme_constant_override("separation", 5)
|
||||
# Der Container muss die Maus annehmen, sonst gibt es kein Überfahren.
|
||||
@@ -881,19 +931,55 @@ func _zeichne_mitte(st: Dictionary, my_seat: int) -> void:
|
||||
boosts_box.add_child(line)
|
||||
_info_an(line, id, true)
|
||||
line.add_child(MuenzIcon.new(id, _kind_col(b), 22.0))
|
||||
line.add_child(_label(_short(String(st.seats[i].name)) + ":", 14,
|
||||
ACCENT if i == my_seat else Color(0.78, 0.80, 0.86)))
|
||||
line.add_child(_label(String(b.get("name", "")), 14, _kind_col(b)))
|
||||
if bool(m.get("stark", false)):
|
||||
line.add_child(_label("· Wappen", 14, ACCENT))
|
||||
if int(st.min_raise) > 1:
|
||||
boosts_box.add_child(_label("Störfeuer: mind. %d erhöhen" % st.min_raise, 14, ACCENT))
|
||||
any = true
|
||||
if wer < st.seats.size():
|
||||
line.add_child(_label("von " + _short(String(st.seats[wer].name)), 13,
|
||||
ACCENT if wer == my_seat else DIM))
|
||||
# Ergebnis vom Zählen: so oft liegt die Augenzahl am Tisch.
|
||||
for f in zaehlung:
|
||||
var line := HBoxContainer.new()
|
||||
line.add_theme_constant_override("separation", 5)
|
||||
boosts_box.add_child(line)
|
||||
var von := int(zaehlung[f][0])
|
||||
var bis := int(zaehlung[f][1])
|
||||
var text := "Am Tisch: %d ×" % von if von == bis else "Am Tisch: %d–%d ×" % [von, bis]
|
||||
line.add_child(_label(text, 14, ACCENT))
|
||||
line.add_child(DieIcon.new(int(f), 18.0))
|
||||
if st.must_bid:
|
||||
boosts_box.add_child(_label("Maulkorb: du musst bieten", 14, ACCENT))
|
||||
any = true
|
||||
if not any:
|
||||
boosts_box.add_child(_label("Keine Münze in der Mitte", 14, DIM))
|
||||
|
||||
|
||||
## Die letzten Ansagen der Runde, die jüngste unten und hervorgehoben.
|
||||
func _zeichne_verlauf(st: Dictionary, my_seat: int) -> void:
|
||||
var verlauf: Array = st.get("verlauf", [])
|
||||
var sig := str(verlauf)
|
||||
if sig == _verlauf_sig:
|
||||
return
|
||||
_verlauf_sig = sig
|
||||
_clear(verlauf_box)
|
||||
if verlauf.is_empty():
|
||||
return
|
||||
verlauf_box.add_child(_label("Verlauf", 13, DIM))
|
||||
var ab := maxi(0, verlauf.size() - 6)
|
||||
for i in range(ab, verlauf.size()):
|
||||
var e: Dictionary = verlauf[i]
|
||||
var wer := int(e.get("seat", 0))
|
||||
if wer >= st.seats.size():
|
||||
continue
|
||||
var letzte: bool = i == verlauf.size() - 1
|
||||
var col := ACCENT if letzte else (Color(0.85, 0.87, 0.92) if wer != my_seat else Color(0.95, 0.85, 0.55))
|
||||
var line := HBoxContainer.new()
|
||||
line.add_theme_constant_override("separation", 5)
|
||||
verlauf_box.add_child(line)
|
||||
var nm := _label(_short(String(st.seats[wer].name)), 13, col)
|
||||
nm.custom_minimum_size = Vector2(64, 0)
|
||||
line.add_child(nm)
|
||||
line.add_child(_label("%d ×" % int(e.get("count", 0)), 13, col))
|
||||
line.add_child(DieIcon.new(int(e.get("face", 1)), 16.0))
|
||||
if bool(e.get("erhoeht", false)):
|
||||
line.add_child(_label("erhöht", 12, DIM))
|
||||
|
||||
|
||||
## Erklärung zu einer Münze, sobald die Maus daraufliegt. `unter` legt sie
|
||||
@@ -953,6 +1039,8 @@ func _pruefe_wurf(neu: Dictionary, st: Dictionary) -> void:
|
||||
return
|
||||
_letzter_wurf = nr
|
||||
var seat := int(neu.get("seat", 0))
|
||||
if seat >= st.seats.size():
|
||||
return
|
||||
_zeig_wurf(String(neu.get("id", "")), bool(neu.get("stark", false)),
|
||||
_short(String(st.seats[seat].name)))
|
||||
|
||||
@@ -971,6 +1059,7 @@ func _zeig_wurf(id: String, stark: bool, wer: String) -> void:
|
||||
wurf_label.text = "%s wirft\n%s" % [wer, b.name]
|
||||
wurf_label.add_theme_color_override("font_color", DIM)
|
||||
wurf_slot.visible = true
|
||||
Klang.muenze()
|
||||
if _wurf_tween != null and _wurf_tween.is_valid():
|
||||
_wurf_tween.kill()
|
||||
_wurf_tween = create_tween()
|
||||
|
||||
Reference in New Issue
Block a user