186 lines
6.2 KiB
GDScript
186 lines
6.2 KiB
GDScript
extends Node3D
|
|
class_name EarthWorld
|
|
## Die Erde: eine Kleinstadt mit vier Menschen, die ihren Tag leben.
|
|
|
|
var spawn := Vector3(0, 3.0, 12.0)
|
|
var humans: Array = []
|
|
|
|
var _sun: DirectionalLight3D
|
|
var _sky: ProceduralSkyMaterial
|
|
var _env: Environment
|
|
var _nachtlichter: Array = []
|
|
|
|
|
|
func _ready() -> void:
|
|
_environment()
|
|
_boden()
|
|
_orte()
|
|
_park()
|
|
_saeule()
|
|
_menschen()
|
|
_himmel_aktualisieren()
|
|
|
|
|
|
func _environment() -> void:
|
|
var we := WorldEnvironment.new()
|
|
_env = Environment.new()
|
|
_env.background_mode = Environment.BG_SKY
|
|
var sky := Sky.new()
|
|
_sky = ProceduralSkyMaterial.new()
|
|
sky.sky_material = _sky
|
|
_env.sky = sky
|
|
_env.ambient_light_source = Environment.AMBIENT_SOURCE_SKY
|
|
_env.glow_enabled = true
|
|
_env.glow_intensity = 0.35
|
|
_env.fog_enabled = true
|
|
_env.fog_density = 0.0012
|
|
we.environment = _env
|
|
add_child(we)
|
|
|
|
_sun = DirectionalLight3D.new()
|
|
_sun.shadow_enabled = true
|
|
_sun.shadow_blur = 1.5
|
|
add_child(_sun)
|
|
|
|
|
|
func _boden() -> void:
|
|
Prims.box(self, Vector3(0, -0.5, 0), Vector3(240, 1, 240), Color(0.36, 0.52, 0.30))
|
|
# Ringweg, auf dem die Menschen gehen
|
|
for i in range(36):
|
|
var a := TAU * float(i) / 36.0
|
|
Prims.box(self, Vector3(cos(a) * 15.0, 0.03, sin(a) * 15.0),
|
|
Vector3(2.8, 0.06, 2.8), Color(0.62, 0.58, 0.50), false)
|
|
|
|
|
|
func _orte() -> void:
|
|
for key in HumanDB.PLACES:
|
|
if key == "park":
|
|
continue
|
|
var pl: Dictionary = HumanDB.PLACES[key]
|
|
var c := HumanDB.place_center(key)
|
|
var s: Array = pl["size"]
|
|
var groesse := Vector3(s[0], 2.3, s[1])
|
|
var farbe: Color = pl["color"]
|
|
var richtung: Vector3 = HumanDB.DIR_VEC[pl["dir"]]
|
|
Prims.room(self, c, groesse, farbe, farbe.darkened(0.35), richtung, 3.4, true)
|
|
Prims.label(self, c + Vector3(0, 5.0, 0), pl["name"], 0.6, Color(1, 1, 0.9))
|
|
_einrichtung(c, groesse, farbe, key)
|
|
|
|
var tuer := HumanDB.place_door(key)
|
|
var weg := tuer.normalized() * 15.0 - tuer
|
|
var b := Prims.box(self, (tuer + tuer.normalized() * 15.0) * 0.5 + Vector3(0, 0.03, 0),
|
|
Vector3(2.6, 0.06, weg.length()), Color(0.62, 0.58, 0.50), false)
|
|
b.rotation.y = atan2(weg.x, weg.z)
|
|
|
|
var l := OmniLight3D.new()
|
|
l.position = c + Vector3(0, 2.0, 0)
|
|
l.omni_range = 20.0
|
|
l.light_color = Color(1.0, 0.85, 0.6)
|
|
l.light_energy = 0.0
|
|
add_child(l)
|
|
_nachtlichter.append(l)
|
|
|
|
|
|
func _einrichtung(c: Vector3, groesse: Vector3, farbe: Color, key: String) -> void:
|
|
var h := groesse.z * 0.5 - 1.6
|
|
var w := groesse.x * 0.5 - 1.6
|
|
if key.begins_with("haus") or key == "wohnheim":
|
|
Prims.box(self, c + Vector3(-w + 1.0, 0.35, -h + 1.2), Vector3(2.0, 0.7, 3.4),
|
|
Color(0.85, 0.85, 0.90)) # Bett
|
|
Prims.box(self, c + Vector3(w - 1.0, 0.75, 0), Vector3(1.6, 0.15, 2.6),
|
|
farbe.darkened(0.5)) # Schreibtisch
|
|
Prims.box(self, c + Vector3(w - 1.0, 1.05, 0), Vector3(0.9, 0.6, 0.1),
|
|
Color(0.2, 0.25, 0.3)) # Bildschirm
|
|
elif key == "cafe":
|
|
for i in range(3):
|
|
Prims.cyl(self, c + Vector3(-3.0 + i * 3.0, 0.4, 0.5), 0.8, 0.8,
|
|
Color(0.55, 0.40, 0.30))
|
|
Prims.box(self, c + Vector3(0, 0.55, -3.2), Vector3(groesse.x - 3.0, 1.1, 0.8),
|
|
Color(0.45, 0.32, 0.24))
|
|
elif key == "buero":
|
|
for i in range(4):
|
|
Prims.box(self, c + Vector3(-4.5 + i * 3.0, 0.75, -1.0), Vector3(2.2, 0.15, 1.4),
|
|
Color(0.75, 0.75, 0.78))
|
|
elif key == "baeckerei":
|
|
Prims.box(self, c + Vector3(0, 0.55, 2.0), Vector3(groesse.x - 3.0, 1.1, 1.0),
|
|
Color(0.70, 0.55, 0.35))
|
|
Prims.box(self, c + Vector3(0, 0.85, -3.0), Vector3(3.0, 1.7, 1.5), Color(0.4, 0.4, 0.42))
|
|
elif key == "uni":
|
|
for i in range(3):
|
|
Prims.box(self, c + Vector3(0, 0.5, -2.0 + i * 2.2), Vector3(groesse.x - 4.0, 0.2, 0.8),
|
|
Color(0.66, 0.62, 0.58))
|
|
Prims.box(self, c + Vector3(0, 1.1, -4.0), Vector3(5.0, 1.6, 0.15), Color(0.15, 0.25, 0.20))
|
|
|
|
|
|
func _park() -> void:
|
|
var rng := RandomNumberGenerator.new()
|
|
rng.seed = 3
|
|
Prims.cyl(self, Vector3(-6, 0.05, 2), 4.0, 0.12, Color(0.30, 0.50, 0.72), false)
|
|
for i in range(14):
|
|
var a := rng.randf() * TAU
|
|
var r := rng.randf_range(5.0, 12.0)
|
|
var p := Vector3(cos(a) * r, 0, sin(a) * r + 2.0)
|
|
if p.length() < 4.0:
|
|
continue
|
|
var hoehe := rng.randf_range(2.4, 4.2)
|
|
Prims.cyl(self, p + Vector3(0, hoehe * 0.5, 0), 0.3, hoehe, Color(0.35, 0.26, 0.18))
|
|
Prims.sphere(self, p + Vector3(0, hoehe + 0.8, 0), rng.randf_range(1.2, 1.9),
|
|
Color(0.25, 0.5 + rng.randf() * 0.2, 0.22))
|
|
for i in range(4):
|
|
var a := TAU * float(i) / 4.0 + 0.4
|
|
var p := Vector3(cos(a) * 8.0, 0.45, sin(a) * 8.0 + 2.0)
|
|
var b := Prims.box(self, p, Vector3(2.4, 0.15, 0.7), Color(0.55, 0.40, 0.28))
|
|
b.rotation.y = -a
|
|
Prims.label(self, Vector3(0, 5.0, 10.0), "Stadtpark", 0.55, Color(1, 1, 0.9))
|
|
|
|
|
|
func _saeule() -> void:
|
|
var pos := Vector3(0, 0, 12.0)
|
|
Prims.cyl(self, pos + Vector3(0, 0.2, 0), 2.6, 0.4, Color(0.50, 0.48, 0.55), false)
|
|
Prims.cyl(self, pos + Vector3(0, 2.2, 0), 0.7, 4.0, Color(0.55, 0.80, 1.0), false, 1.6)
|
|
Prims.sphere(self, pos + Vector3(0, 4.6, 0), 0.9, Color(0.75, 0.92, 1.0), 2.2)
|
|
Prims.label(self, pos + Vector3(0, 6.0, 0), "Rückkehr in die Traumwelt", 0.4,
|
|
Color(0.75, 0.95, 1))
|
|
var n := Node3D.new()
|
|
n.position = pos + Vector3(0, 1.6, 0)
|
|
add_child(n)
|
|
n.add_to_group("interactable")
|
|
n.set_meta("kind", "traum")
|
|
n.set_meta("arg", "")
|
|
n.set_meta("titel", "Rückkehr in die Traumwelt")
|
|
|
|
|
|
func _menschen() -> void:
|
|
for i in range(HumanDB.LIST.size()):
|
|
var m := Human.new()
|
|
add_child(m)
|
|
m.setup(HumanDB.LIST[i], i)
|
|
humans.append(m)
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
_himmel_aktualisieren()
|
|
|
|
|
|
func _himmel_aktualisieren() -> void:
|
|
var t: float = Game.time_h
|
|
var sonne := clampf(sin((t - 6.0) / 12.0 * PI), 0.0, 1.0)
|
|
_sun.rotation_degrees = Vector3(-((t - 6.0) / 12.0) * 180.0, -35.0, 0.0)
|
|
_sun.light_energy = 0.25 + sonne * 1.0
|
|
_sun.light_color = Color(1.0, 0.75 + sonne * 0.25, 0.55 + sonne * 0.4)
|
|
|
|
var tag_top := Color(0.30, 0.55, 0.90)
|
|
var nacht_top := Color(0.03, 0.04, 0.12)
|
|
var tag_hor := Color(0.75, 0.85, 0.95)
|
|
var nacht_hor := Color(0.10, 0.10, 0.25)
|
|
_sky.sky_top_color = nacht_top.lerp(tag_top, sonne)
|
|
_sky.sky_horizon_color = nacht_hor.lerp(tag_hor, sonne)
|
|
_sky.ground_horizon_color = nacht_hor.lerp(Color(0.55, 0.60, 0.55), sonne)
|
|
_sky.ground_bottom_color = nacht_top.lerp(Color(0.30, 0.38, 0.28), sonne)
|
|
_env.ambient_light_energy = 0.45 + sonne * 0.8
|
|
_env.fog_light_color = nacht_hor.lerp(tag_hor, sonne)
|
|
|
|
var nacht := 1.0 - sonne
|
|
for l in _nachtlichter:
|
|
l.light_energy = clampf(nacht * 2.4 - 0.3, 0.0, 2.2)
|