This commit is contained in:
Team3
2026-09-16 16:15:32 +02:00
parent e813b5f7aa
commit 7c4edaa439
19 changed files with 1244 additions and 636 deletions

View File

@@ -9,6 +9,7 @@ class_name HumanDB
## an da und leben ihren Tag.
const EINWOHNER := 16
const PASSANTEN := 12 # Leute ohne Geschichte, die die Straßen beleben
const BLOCKER_MAX := 4 # mehr Blocker, und der Tag wäre nur noch kaputt
const ACHSEN := [-72.0, -24.0, 24.0, 72.0] # Arterien in x wie in z
const ARTERIE := 7.0 # Breite einer Arterie
@@ -32,12 +33,10 @@ static var SONDER: Array = [
["baeckerei", "Bäckerei Keller", Color(0.85, 0.72, 0.50), 2],
["werkstatt", "Werkstatt Loos", Color(0.70, 0.58, 0.55), 1],
]
## Arbeitsorte, an denen die Leute auf verschiedenen Etagen sitzen. Café,
## Bäckerei und Werkstatt spielen sich unten ab.
static var ETAGEN_ARBEIT: Array = ["buero", "uni"]
static var PLACES: Dictionary = {}
static var LIST: Array = []
static var PASSANTEN_LISTE: Array = []
## Arbeitsplätze, die ein erzeugter Mensch bekommen kann.
static var ARBEIT: Array = ["uni", "cafe", "buero", "baeckerei", "werkstatt"]
@@ -200,7 +199,11 @@ static func erzeuge(_ungenutzt: int = 0) -> void:
_park_eintragen()
_sonderbauten_verteilen()
_wohnhaeuser_verteilen()
_ecken_eintragen()
_anker_setzen()
PASSANTEN_LISTE = []
for i in range(PASSANTEN):
PASSANTEN_LISTE.append(_passant(i))
var eigene := Aushaenge.laden()
var n_eigen := mini(eigene.size(), EINWOHNER)
for i in range(EINWOHNER - n_eigen):
@@ -408,6 +411,48 @@ static func _gasse_freischneiden(ab: int, start: Vector3, ende: Vector3, flanke:
PARZELLEN.append_array(neu)
## Straßenecken: die Kreuzungen des Netzes, Ziele für Passanten.
static func _ecken_eintragen() -> void:
var ecken: Array = []
for i in range(NETZ.knoten.size()):
if NETZ.nachbarn(i).size() >= 3:
ecken.append(i)
if ecken.size() < 4:
for i in range(NETZ.knoten.size()):
if not ecken.has(i):
ecken.append(i)
for k in range(mini(8, ecken.size())):
var p: Vector3 = NETZ.knoten[int(ecken[(k * 5) % ecken.size()])]
PLACES["ecke_%d" % k] = {
"name": "Straßenecke", "pos": [p.x, p.z], "size": [0.0, 0.0],
"dir": "none", "color": Color(0.5, 0.5, 0.5),
}
## Ein Passant: stündlich eine andere Ecke, dazwischen Park -- kein Name,
## kein Schild, keine Mission. Er ist da, damit die Straßen nicht leer sind.
static func _passant(i: int) -> Dictionary:
var ecken: Array = []
for key in PLACES:
if str(key).begins_with("ecke_"):
ecken.append(str(key))
var routine: Array = []
var letzte := ""
for h in range(24):
var ort := "park" if (h + i) % 7 == 3 else str(ecken[(i * 3 + h * 5) % ecken.size()])
if ort == letzte:
ort = str(ecken[(i * 3 + h * 5 + 1) % ecken.size()])
routine.append([h, ort, "unterwegs" if h % 2 == 0 else "wartet"])
letzte = ort
return {
"id": "passant_%d" % i,
"name": "Passant",
"stumm": true,
"farbe": Color.from_hsv(0.58 + float(i % 4) * 0.05, 0.12, 0.55 + float(i % 3) * 0.1),
"routine": routine,
}
# ------------------------------------------------------------ Belegung
static func _park_eintragen() -> void:
@@ -455,13 +500,12 @@ static func _sonderbauten_verteilen() -> void:
"size": [p["size"].x, p["size"].y],
"dir": p["dir"],
"color": SONDER[s][2],
"etagen": int(SONDER[s][3]),
}
## Die Wohnhäuser: gleichmäßig über den Bezirk verteilt, damit die Wege
## nicht alle in derselben Ecke enden.
const WOHNUNG_MIN := 7.0 # schmaler passt kein Treppenhaus mehr neben die Tür
const WOHNUNG_MIN := 7.0 # schmaler passt neben die Tür kein Bett mehr
static func _wohnhaeuser_verteilen() -> void:
var frei: Array = []
@@ -487,21 +531,9 @@ static func _wohnhaeuser_verteilen() -> void:
"size": [p["size"].x, p["size"].y],
"dir": p["dir"],
"color": Color.from_hsv(fmod(0.08 + float(i) * 0.113, 1.0), 0.28, 0.78),
"etagen": 2 + (i * 5 + 1) % 3,
}
## In welcher Etage jemand wohnt und arbeitet. Wohnhäuser sind Mehrfamilien-
## häuser: die eigene Wohnung liegt irgendwo im Haus.
static func etagen_fuer(i: int, heim: String, arbeit: String) -> Dictionary:
var out: Dictionary = {}
if PLACES.has(heim):
out[heim] = (i * 7 + 3) % Orte.etagen(PLACES, heim)
if PLACES.has(arbeit) and ETAGEN_ARBEIT.has(arbeit):
out[arbeit] = i % Orte.etagen(PLACES, arbeit)
return out
static func _anker_setzen() -> void:
for key in PLACES:
var s: Array = PLACES[key]["size"]
@@ -635,7 +667,6 @@ static func mensch_aus_profil(pr: Dictionary, i: int) -> Dictionary:
"eigen": true,
"mission": true,
"heim": heim,
"etage": etagen_fuer(i, heim, arbeit),
"farbe": Color.from_hsv(fmod(0.02 + float(i) * 0.191, 1.0), 0.5, 0.8),
"routine": _tag_belegen(TAGESTYPEN[typ], heim, arbeit, bild["blocker"],
bild["ursachen"], i),
@@ -678,7 +709,6 @@ static func _mensch(i: int) -> Dictionary:
"verhalten": {},
"mission": true,
"heim": heim,
"etage": etagen_fuer(i, heim, arbeit),
"farbe": Color.from_hsv(fmod(0.02 + float(i) * 0.191, 1.0), 0.5, 0.8),
"routine": _tagesablauf(i, heim, arbeit),
}
@@ -710,6 +740,13 @@ static func _nachname(i: int) -> String:
return str(NACHNAMEN[(i / VORNAMEN.size() + i) % NACHNAMEN.size()])
static func bewohner_von(heim: String) -> Dictionary:
for m in LIST:
if str(m.get("heim", "")) == heim:
return m
return {}
static func by_id(id: String) -> Dictionary:
for h in LIST:
if h["id"] == id: