This commit is contained in:
team3
2026-09-16 01:37:30 +02:00
parent ae75ed8fa3
commit 9b3cd55ba7
6 changed files with 549 additions and 160 deletions

View File

@@ -8,6 +8,8 @@ const WALL_SEGS := 20 ## Bandensegmente - Godot kennt keinen hohlen Zylin
const WALL_H := 0.55 ## unsichtbare Begrenzung, damit nichts herausspringt
const SEAT_ARC := ZONE_RAD * 2.0 + 0.85 ## Bogenlänge, die ein Platz am Tischrand braucht
const MIN_ZONE_R := 1.15
const RIM_RUHE := Color(0.22, 0.15, 0.09) ## Zonenrand, wenn der Platz wartet
const RIM_ZUG := Color(0.85, 0.66, 0.22) ## Zonenrand des Platzes, der dran ist
const TILT_DEG := 15.0 ## Neigung der Kamera gegen die Senkrechte
const HUD_TOP := 0.13 ## Bildanteil oben für die Gebotsanzeige
const HUD_BOTTOM := 0.17 ## Bildanteil unten für die Ansage-Leiste
@@ -27,6 +29,7 @@ var bid_counts: Array[Label3D] = []
var bid_icons: Array[Sprite3D] = []
var _bid_anchor: Array[Vector3] = []
var plates: Array[Sprite3D] = []
var rims: Array[MeshInstance3D] = [] ## Rand der Zone, leuchtet beim Zug
var dice: Array = [] ## seat -> Array[Die]
var camera: Camera3D
@@ -172,8 +175,9 @@ func _build_seat(i: int) -> void:
tm.ring_segments = 8
rim.mesh = tm
rim.position = Vector3(0, 0.02, 0)
rim.material_override = _mat(Color(0.22, 0.15, 0.09), 0.6)
rim.material_override = _mat(RIM_RUHE, 0.6)
zone.add_child(rim)
rims.append(rim)
# Becher
var cup := Node3D.new()
@@ -393,17 +397,26 @@ func _mat(col: Color, rough: float) -> StandardMaterial3D:
## --- Würfel ---
## Nur die neu dazugekommenen Würfel werden hingelegt. Die schon liegenden
## bleiben, wie sie sind - ein Nachschub mitten in der Runde würde ihnen sonst
## die Drehung nehmen und damit auf dem Tisch die Augenzahl.
func set_dice_count(seat: int, count: int) -> void:
var arr: Array = dice[seat]
while arr.size() > count:
var d = arr.pop_back()
d.queue_free()
# Ein neuer Würfel darf nicht sichtbar sein, wenn die anderen unterm
# Becher liegen - sonst verrät er die Hand des Gegners.
var sichtbar: bool = arr.is_empty() or arr[0].visible
var ab := arr.size()
while arr.size() < count:
var d := Die.new()
add_child(d)
d.global_position = zones[seat].global_position + Vector3(0, 0.4, 0)
d.visible = sichtbar
arr.append(d)
_layout_idle(seat)
if arr.size() > ab:
_layout_idle(seat, ab)
func dice_of(seat: int) -> Array:
@@ -426,8 +439,9 @@ func throw_dice(seat: int, rng: RandomNumberGenerator) -> void:
arr[i].throw_from(zone.global_transform * off, rng)
## Legt die Würfel ordentlich nebeneinander (für Clients/Reveal).
func _layout_idle(seat: int) -> void:
## Legt die Würfel ordentlich nebeneinander (für Clients/Reveal). Ab `von`
## bleiben die davorliegenden unangetastet.
func _layout_idle(seat: int, von := 0) -> void:
var zone: Node3D = zones[seat]
var arr: Array = dice[seat]
# Bogen auf einem Kreis um die Zonenmitte - passt zur runden Bande.
@@ -435,7 +449,7 @@ func _layout_idle(seat: int) -> void:
# Würfels plus Luft, sonst überlappen die Bilder beim Aufdecken.
const BOGEN_R := 0.48 # etwas weiter aussen, damit das Namensschild frei bleibt
var schritt: float = (Die.SIZE * 1.7) / BOGEN_R
for i in arr.size():
for i in range(von, arr.size()):
var ang := PI + (float(i) - (arr.size() - 1) * 0.5) * schritt
var t := zone.global_transform
t.origin = zone.global_transform * Vector3(
@@ -458,6 +472,19 @@ func freeze_dice(seat: int) -> void:
d.set_kinematic(true)
## Der Platz, der dran ist, bekommt einen leuchtenden Rand. In der dunklen
## Szene ist das von jeder Ecke aus zu sehen - ein farbiger Name allein nicht.
func set_active_seat(seat: int) -> void:
for i in rims.size():
var m: StandardMaterial3D = rims[i].material_override
var dran: bool = i == seat
m.albedo_color = RIM_ZUG if dran else RIM_RUHE
m.emission_enabled = dran
if dran:
m.emission = Color(1.0, 0.78, 0.30)
m.emission_energy_multiplier = 1.1
func set_dice_visible(seat: int, on: bool) -> void:
for d in dice[seat]:
d.visible = on