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