This commit is contained in:
team3
2026-09-16 17:00:41 +02:00
parent f1c78f66f4
commit 9800c614bb
21 changed files with 497 additions and 191 deletions

View File

@@ -8,7 +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 Stoffe = preload("res://scripts/stoffe.gd") ## Holz, Filz, Messing aus Rauschen
const Stoffe = preload("res://scripts/stoffe.gd") ## Materialien aus Regeln, ohne Dateien
const Formen = preload("res://scripts/formen.gd") ## Becher, Fass, Laterne aus Primitiven
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
@@ -33,7 +34,7 @@ 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: ShaderMaterial
static var _muenz_mat: StandardMaterial3D
var dice: Array = [] ## seat -> Array[Die]
var camera: Camera3D
@@ -52,9 +53,19 @@ func build(count: int, local_index: int) -> void:
for i in count:
_build_seat(i)
dice.append([])
_deko()
_build_camera()
## Eine Laterne am Tischrand - weit genug draussen, dass sie keine Zone
## verdeckt, nah genug, dass ihr Schein den Filz erreicht. Das Fass aus den
## Formregeln bleibt weg: vom Boden aus ist es aus Kamerahöhe nur ein Fleck.
func _deko() -> void:
var laterne := Formen.laterne()
laterne.position = Vector3(-(table_r + 0.35), TABLE_H, table_r * 0.55)
add_child(laterne)
func _build_room() -> void:
var env := WorldEnvironment.new()
var e := Environment.new()
@@ -64,6 +75,10 @@ func _build_room() -> void:
e.ambient_light_color = Color(0.35, 0.38, 0.45)
e.ambient_light_energy = 1.1
e.tonemap_mode = Environment.TONE_MAPPER_FILMIC
e.glow_enabled = true
e.glow_intensity = 0.45
e.glow_bloom = 0.05
e.glow_hdr_threshold = 0.9
e.fog_enabled = true
e.fog_light_color = Color(0.05, 0.06, 0.09)
e.fog_density = 0.02
@@ -81,6 +96,9 @@ func _build_room() -> void:
lamp.shadow_enabled = true
add_child(lamp)
# Kein sichtbarer Lampenschirm: die Kamera schaut fast senkrecht von oben,
# alles über der Tischmitte hinge ihr vor der Linse.
var fill := DirectionalLight3D.new()
fill.rotation_degrees = Vector3(-55, 35, 0)
fill.light_energy = 0.25
@@ -98,6 +116,8 @@ func _build_room() -> void:
var fpm := PlaneMesh.new()
fpm.size = Vector2(24, 24)
floor_mi.mesh = fpm
# Bewusst glatt und dunkel: eine Maserung auf der riesigen Fläche wird aus
# Kamerahöhe zu Rauschen, und der Nebel soll den Boden ohnehin schlucken.
floor_mi.material_override = _mat(Color(0.08, 0.07, 0.09), 0.9)
floor_body.add_child(floor_mi)
add_child(floor_body)
@@ -118,7 +138,7 @@ func _build_room() -> void:
tcm.height = 0.12
tmi.mesh = tcm
tmi.position = Vector3(0, TABLE_H - 0.06, 0)
tmi.material_override = Stoffe.filz(Color(0.10, 0.28, 0.17), table_r, 0.35)
tmi.material_override = Stoffe.filz()
table.add_child(tmi)
add_child(table)
@@ -130,7 +150,7 @@ func _build_room() -> void:
lcm.height = TABLE_H - 0.12
leg.mesh = lcm
leg.position = Vector3(0, (TABLE_H - 0.12) * 0.5, 0)
leg.material_override = Stoffe.holz(Color(0.30, 0.19, 0.09), Color(0.16, 0.10, 0.05), 0.5, 4.0)
leg.material_override = Stoffe.holz()
add_child(leg)
@@ -167,7 +187,7 @@ func _build_seat(i: int) -> void:
fm.radial_segments = 32
felt.mesh = fm
felt.position = Vector3(0, 0.006, 0)
felt.material_override = Stoffe.filz(Color(0.07, 0.20, 0.13), ZONE_RAD, 0.6)
felt.material_override = Stoffe.filz()
zone.add_child(felt)
# Sichtbarer Rand
@@ -179,7 +199,7 @@ func _build_seat(i: int) -> void:
tm.ring_segments = 8
rim.mesh = tm
rim.position = Vector3(0, 0.02, 0)
rim.material_override = _mat(RIM_RUHE, 0.6)
rim.material_override = Stoffe.rand()
zone.add_child(rim)
rims.append(rim)
@@ -187,17 +207,7 @@ func _build_seat(i: int) -> void:
var cup := Node3D.new()
cup.position = Vector3(0, 0.02, 0)
zone.add_child(cup)
var cup_mi := MeshInstance3D.new()
var cm := CylinderMesh.new()
cm.top_radius = 0.33
cm.bottom_radius = 0.42
cm.height = 0.44
cup_mi.mesh = cm
cup_mi.position = Vector3(0, 0.22, 0)
# Enge, weiche Maserung: die Ringe laufen am Becher senkrecht, zu grob sähe
# das nach Fassdauben aus.
cup_mi.material_override = Stoffe.holz(Color(0.40, 0.17, 0.11), Color(0.30, 0.12, 0.08), 0.5, 5.0)
cup.add_child(cup_mi)
cup.add_child(Formen.becher())
cups.append(cup)
cup_tweens.append(null)
@@ -550,7 +560,7 @@ func set_topf(liste: Array, ziel := -1) -> void:
tw.tween_callback(mi.queue_free)
static var _muenz_mat_wappen: ShaderMaterial
static var _muenz_mat_wappen: StandardMaterial3D
static var _praeg_mesh: TorusMesh
static var _praeg_mat: StandardMaterial3D
@@ -567,9 +577,9 @@ static func _muenz_form() -> CylinderMesh:
return _muenz_mesh
static func _muenz_stoff(wappen: bool) -> ShaderMaterial:
static func _muenz_stoff(wappen: bool) -> StandardMaterial3D:
if _muenz_mat == null:
_muenz_mat = Stoffe.messing(0.35)
_muenz_mat = Stoffe.messing(0.25)
_muenz_mat_wappen = Stoffe.messing(0.9)
return _muenz_mat_wappen if wappen else _muenz_mat
@@ -620,12 +630,8 @@ func hervorhebung_weg() -> void:
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
m.emission_enabled = i == seat
m.emission_energy_multiplier = 1.2
func set_dice_visible(seat: int, on: bool) -> void: