This commit is contained in:
team3
2026-09-16 12:09:47 +02:00
parent 9b3cd55ba7
commit 7979d5c336
16 changed files with 974 additions and 342 deletions

View File

@@ -30,6 +30,9 @@ 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 topf_muenzen: Dictionary = {} ## Wurfnummer -> Münze in der Tischmitte
static var _muenz_mesh: CylinderMesh
static var _muenz_mat: StandardMaterial3D
var dice: Array = [] ## seat -> Array[Die]
var camera: Camera3D
@@ -472,6 +475,85 @@ func freeze_dice(seat: int) -> void:
d.set_kinematic(true)
## Der Topf liegt als Häufchen Messing in der Tischmitte. Jede Münze trägt
## ihre Wurfnummer; was nicht mehr in der Liste steht, ist beim Gewinner.
## Lage und Drehung kommen aus der Nummer, damit Host und Clients dasselbe
## Häufchen sehen.
func set_topf(liste: Array) -> void:
var bleibt := {}
for m in liste:
var nr := int(m.get("nr", 0))
bleibt[nr] = true
if topf_muenzen.has(nr):
continue
var r := RandomNumberGenerator.new()
r.seed = nr * 7919
var ang := r.randf() * TAU
var rad := r.randf_range(0.30, 0.55)
var ziel := Vector3(cos(ang) * rad, TABLE_H + 0.006, sin(ang) * rad)
var mi := MeshInstance3D.new()
mi.mesh = _muenz_form()
mi.material_override = _muenz_stoff()
mi.position = ziel + Vector3(0, 0.35, 0)
mi.rotation.y = r.randf() * TAU
add_child(mi)
topf_muenzen[nr] = mi
# Fällt aus der Hand auf den Tisch.
create_tween().tween_property(mi, "position", ziel, 0.35) \
.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
for nr in topf_muenzen.keys():
if not bleibt.has(nr):
topf_muenzen[nr].queue_free()
topf_muenzen.erase(nr)
static func _muenz_form() -> CylinderMesh:
if _muenz_mesh == null:
_muenz_mesh = CylinderMesh.new()
# Aus Kamerahöhe muss eine Münze fast so gross sein wie ein Würfel,
# sonst ist sie ein Punkt.
_muenz_mesh.top_radius = 0.11
_muenz_mesh.bottom_radius = 0.11
_muenz_mesh.height = 0.014
_muenz_mesh.radial_segments = 24
return _muenz_mesh
static func _muenz_stoff() -> StandardMaterial3D:
if _muenz_mat == null:
_muenz_mat = StandardMaterial3D.new()
_muenz_mat.albedo_color = Color(0.80, 0.62, 0.26)
_muenz_mat.metallic = 0.85
_muenz_mat.roughness = 0.35
_muenz_mat.emission_enabled = true
_muenz_mat.emission = Color(0.55, 0.40, 0.12)
_muenz_mat.emission_energy_multiplier = 0.35
return _muenz_mat
## Beim Zählen leuchten die passenden Würfel nacheinander auf, mit einem
## Tick je Würfel. So sieht man, woher die Zahl im Banner kommt.
func zaehlen_zeigen(face: int, werte: Array) -> void:
var k := 0
for seat in mini(werte.size(), dice.size()):
var dl: Array = dice[seat]
for i in mini(dl.size(), werte[seat].size()):
if int(werte[seat][i]) != face:
continue
var d = dl[i]
get_tree().create_timer(0.12 * k).timeout.connect(func() -> void:
if is_instance_valid(d):
d.hervorheben(true)
Klang.tick())
k += 1
func hervorhebung_weg() -> void:
for dl in dice:
for d in dl:
d.hervorheben(false)
## 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: