update
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user