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