This commit is contained in:
team3
2026-09-16 13:21:56 +02:00
parent 7979d5c336
commit 3be22351a3
25 changed files with 734 additions and 195 deletions

View File

@@ -476,10 +476,12 @@ func freeze_dice(seat: int) -> void:
## 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.
## ihre Wurfnummer; was nicht mehr in der Liste steht, ist beim Gewinner -
## dorthin fliegt sie dann auch (`ziel`), sonst verschwindet sie einfach.
## Lage und Drehung kommen aus der Nummer, damit Host und Clients dasselbe
## Häufchen sehen.
func set_topf(liste: Array) -> void:
## Häufchen sehen. Wappen-Münzen tragen einen geprägten Ring und leuchten
## stärker: so sieht man den Wurfausgang auf dem Tisch, nicht nur im Text.
func set_topf(liste: Array, ziel := -1) -> void:
var bleibt := {}
for m in liste:
var nr := int(m.get("nr", 0))
@@ -490,21 +492,43 @@ func set_topf(liste: Array) -> void:
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 wappen: bool = m.get("stark", false)
var lage := Vector3(cos(ang) * rad, TABLE_H + 0.007, 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.material_override = _muenz_stoff(wappen)
mi.position = lage + Vector3(0, 0.45, 0)
mi.rotation.y = r.randf() * TAU
add_child(mi)
if wappen:
var ring := MeshInstance3D.new()
ring.mesh = _praegung()
ring.material_override = _praegung_stoff()
ring.position = Vector3(0, 0.008, 0)
mi.add_child(ring)
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)
# Fällt drehend aus der Hand und bleibt flach liegen.
var tw := create_tween().set_parallel(true)
tw.tween_property(mi, "position", lage, 0.55).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
tw.tween_property(mi, "rotation:x", TAU * 3.0, 0.55).from(0.0)
for nr in topf_muenzen.keys():
if not bleibt.has(nr):
topf_muenzen[nr].queue_free()
topf_muenzen.erase(nr)
if bleibt.has(nr):
continue
var mi: MeshInstance3D = topf_muenzen[nr]
topf_muenzen.erase(nr)
if ziel < 0 or ziel >= zones.size():
mi.queue_free()
continue
# Zum Gewinner fliegen, dann weg.
var hin: Vector3 = zones[ziel].global_position + Vector3(0, 0.25, 0)
var tw := create_tween()
tw.tween_property(mi, "global_position", hin, 0.6).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN_OUT)
tw.tween_callback(mi.queue_free)
static var _muenz_mat_wappen: StandardMaterial3D
static var _praeg_mesh: TorusMesh
static var _praeg_mat: StandardMaterial3D
static func _muenz_form() -> CylinderMesh:
@@ -519,7 +543,7 @@ static func _muenz_form() -> CylinderMesh:
return _muenz_mesh
static func _muenz_stoff() -> StandardMaterial3D:
static func _muenz_stoff(wappen: bool) -> StandardMaterial3D:
if _muenz_mat == null:
_muenz_mat = StandardMaterial3D.new()
_muenz_mat.albedo_color = Color(0.80, 0.62, 0.26)
@@ -528,7 +552,27 @@ static func _muenz_stoff() -> StandardMaterial3D:
_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
_muenz_mat_wappen = _muenz_mat.duplicate()
_muenz_mat_wappen.emission_energy_multiplier = 0.9
return _muenz_mat_wappen if wappen else _muenz_mat
static func _praegung() -> TorusMesh:
if _praeg_mesh == null:
_praeg_mesh = TorusMesh.new()
_praeg_mesh.inner_radius = 0.035
_praeg_mesh.outer_radius = 0.065
_praeg_mesh.rings = 20
_praeg_mesh.ring_segments = 6
return _praeg_mesh
static func _praegung_stoff() -> StandardMaterial3D:
if _praeg_mat == null:
_praeg_mat = StandardMaterial3D.new()
_praeg_mat.albedo_color = Color(0.20, 0.14, 0.05)
_praeg_mat.roughness = 0.8
return _praeg_mat
## Beim Zählen leuchten die passenden Würfel nacheinander auf, mit einem