211 lines
8.1 KiB
GDScript
211 lines
8.1 KiB
GDScript
class_name HumanDB
|
|
## Die Kleinstadt auf der Erde. Die Gebäude im Ring um den Park stehen fest;
|
|
## Wohnhäuser und ihre Bewohner kommen dazu, solange Menschen Hilfe brauchen.
|
|
|
|
const HAEUSER_JE_RING := 8
|
|
const RING_ERSTER := 62.0
|
|
const RING_ABSTAND := 16.0
|
|
|
|
## Gebäude liegen im Ring um den Park. Alle Türen zeigen zur Mitte.
|
|
static var FEST: Dictionary = {
|
|
"uni": {
|
|
"name": "Hochschule", "pos": [-28.0, -27.0], "size": [14.0, 10.0],
|
|
"dir": "back", "color": Color(0.72, 0.70, 0.66),
|
|
},
|
|
"cafe": {
|
|
"name": "Café Nadel", "pos": [0.0, -27.0], "size": [12.0, 10.0],
|
|
"dir": "back", "color": Color(0.82, 0.62, 0.45),
|
|
},
|
|
"buero": {
|
|
"name": "Büro Ostwind", "pos": [28.0, -27.0], "size": [14.0, 10.0],
|
|
"dir": "back", "color": Color(0.62, 0.66, 0.72),
|
|
},
|
|
"baeckerei": {
|
|
"name": "Bäckerei Keller", "pos": [-31.0, 0.0], "size": [10.0, 12.0],
|
|
"dir": "right", "color": Color(0.85, 0.72, 0.50),
|
|
},
|
|
"werkstatt": {
|
|
"name": "Werkstatt Loos", "pos": [31.0, 0.0], "size": [10.0, 12.0],
|
|
"dir": "left", "color": Color(0.70, 0.58, 0.55),
|
|
},
|
|
"park": {
|
|
"name": "Stadtpark", "pos": [0.0, 4.0], "size": [0.0, 0.0],
|
|
"dir": "none", "color": Color(0.45, 0.65, 0.38),
|
|
},
|
|
}
|
|
|
|
static var PLACES: Dictionary = FEST.duplicate(true)
|
|
static var LIST: Array = []
|
|
|
|
## Arbeitsplätze, die ein erzeugter Mensch bekommen kann.
|
|
static var ARBEIT: Array = ["uni", "cafe", "buero", "baeckerei", "werkstatt"]
|
|
|
|
static var VORNAMEN: Array = ["Lena", "Bruno", "Mira", "Tobias", "Halim", "Jorunn",
|
|
"Pia", "Anselm", "Ceyda", "Rune", "Malte", "Ida", "Vito", "Nour", "Greta", "Kasper"]
|
|
static var NACHNAMEN: Array = ["Vogt", "Keller", "Sahin", "Frank", "Berg", "Ostermann",
|
|
"Ruiz", "Lind", "Aslan", "Weiss", "Petit", "Novak"]
|
|
static var BERUFE: Array = ["Illustratorin", "Bäcker", "Studentin", "Sachbearbeiter",
|
|
"Pfleger", "Tischlerin", "Lehrer", "Programmiererin", "Fahrer", "Archivarin",
|
|
"Köchin", "Musiker"]
|
|
|
|
## Anliegen sind echte Klemmen, keine erzeugten Sätze — sie tragen den Sinn
|
|
## des Spiels. Erzeugt werden Person, Wohnort und Tagesablauf drumherum.
|
|
static var ANLIEGEN: Array = [
|
|
{
|
|
"traum": "Ihr Bilderbuch endlich zu Ende zeichnen.",
|
|
"problem": "Sie schiebt die letzten zwölf Seiten seit acht Monaten vor sich her. Jeder Entwurf kommt ihr zu schlecht vor, also fängt sie lieber gar nicht erst an.",
|
|
"tags": ["prokrastination", "selbstzweifel", "ablenkung"],
|
|
},
|
|
{
|
|
"traum": "Wieder Klavier spielen wie mit zwanzig.",
|
|
"problem": "Das Klavier steht zugestellt im Flur. Nach der Frühschicht ist er zu müde, um auch nur den Deckel zu öffnen.",
|
|
"tags": ["gewohnheit", "erschoepfung", "ablenkung"],
|
|
},
|
|
{
|
|
"traum": "Die Abschlussarbeit vortragen, ohne zu erstarren.",
|
|
"problem": "Die Arbeit ist längst fertig. Aber vor jedem Vortrag wird ihr schwarz vor Augen, und sie meldet sich wieder ab.",
|
|
"tags": ["angst", "ueberforderung", "selbstzweifel"],
|
|
},
|
|
{
|
|
"traum": "Abends wieder Zeit für die Tochter haben.",
|
|
"problem": "Er sagt zu jeder Bitte ja und sitzt dafür jeden Abend bis acht im Büro. Zu Hause ist er nur noch müde.",
|
|
"tags": ["stress", "grenzen", "erschoepfung"],
|
|
},
|
|
{
|
|
"traum": "Endlich wieder durchschlafen.",
|
|
"problem": "Der Feierabend franst aus, das Handy leuchtet bis zwei. Morgens steht er zerschlagen auf und trinkt sich wach.",
|
|
"tags": ["erschoepfung", "gesundheit", "gewohnheit"],
|
|
},
|
|
{
|
|
"traum": "Den alten Freundeskreis zurückholen.",
|
|
"problem": "Sie wartet seit Monaten, dass sich jemand meldet, und meldet sich selbst nie. Jede Einladung erscheint ihr aufdringlich.",
|
|
"tags": ["einsamkeit", "selbstzweifel"],
|
|
},
|
|
{
|
|
"traum": "Die Werkstatt in der Garage wieder aufmachen.",
|
|
"problem": "Alles liegt bereit, aber der erste Handgriff wirkt jedes Mal wie ein Berg. Am Ende räumt er lieber auf.",
|
|
"tags": ["prokrastination", "ueberforderung"],
|
|
},
|
|
{
|
|
"traum": "Vor Publikum sprechen, ohne dass die Hände zittern.",
|
|
"problem": "Schon Tage vorher liegt ihr der Termin im Magen. Kurz davor wird die Luft knapp und der Kopf leer.",
|
|
"tags": ["angst", "stress"],
|
|
},
|
|
{
|
|
"traum": "Nach dem Rückschlag noch einmal anfangen.",
|
|
"problem": "Seit die Prüfung schiefging, redet sie mit sich, wie sie mit niemandem reden würde. Jeder neue Versuch fühlt sich sinnlos an.",
|
|
"tags": ["rueckschlag", "selbstzweifel"],
|
|
},
|
|
{
|
|
"traum": "Drei Abende in der Woche für sich behalten.",
|
|
"problem": "Der Kalender füllt sich mit fremden Anliegen, weil ein Nein unhöflich wirkt. Am Ende bleibt nichts übrig.",
|
|
"tags": ["grenzen", "stress", "ueberforderung"],
|
|
},
|
|
]
|
|
|
|
## Tagesabläufe: Platzhalter werden durch Wohnung und Arbeitsplatz ersetzt.
|
|
## Tagesabläufe: Platzhalter werden durch Wohnung und Arbeitsplatz ersetzt.
|
|
## Die Reihenfolge passt zu den Anliegen — wer aufschiebt, arbeitet zu Hause.
|
|
static var ABLAEUFE: Array = [
|
|
[[0, "heim", "schlaeft"], [7, "heim", "zoegert"], [10, "heim", "arbeitet"],
|
|
[13, "park", "pause"], [15, "heim", "arbeitet"], [18, "cafe", "wartet"],
|
|
[20, "heim", "zoegert"], [22, "heim", "gruebelt"], [23, "heim", "abendroutine"]],
|
|
[[0, "heim", "schlaeft"], [4, "arbeit", "arbeitet"], [10, "cafe", "pause"],
|
|
[12, "heim", "essen"], [14, "heim", "ruht"], [16, "heim", "zoegert"],
|
|
[18, "park", "unterwegs"], [20, "heim", "muede"], [22, "heim", "abendroutine"]],
|
|
[[0, "heim", "schlaeft"], [8, "heim", "morgenroutine"], [10, "arbeit", "arbeitet"],
|
|
[13, "cafe", "angespannt"], [15, "arbeit", "wartet"], [18, "heim", "gruebelt"],
|
|
[20, "park", "unterwegs"], [22, "heim", "abendroutine"]],
|
|
[[0, "heim", "schlaeft"], [6, "heim", "morgenroutine"], [8, "arbeit", "arbeitet"],
|
|
[12, "cafe", "essen"], [14, "arbeit", "arbeitet"], [19, "arbeit", "angespannt"],
|
|
[21, "heim", "essen"], [23, "heim", "muede"]],
|
|
[[0, "heim", "schlaeft"], [7, "heim", "morgenroutine"], [9, "arbeit", "arbeitet"],
|
|
[12, "cafe", "essen"], [14, "arbeit", "arbeitet"], [17, "park", "unterwegs"],
|
|
[19, "heim", "aufraeumen"], [21, "heim", "gruebelt"], [23, "heim", "abendroutine"]],
|
|
]
|
|
|
|
|
|
static func heim_key(i: int) -> String:
|
|
return "heim_%d" % i
|
|
|
|
|
|
## Baut Wohnhäuser und Menschen für so viele Bewohner neu auf.
|
|
static func erzeuge(menschen: int) -> void:
|
|
PLACES = FEST.duplicate(true)
|
|
LIST = []
|
|
for i in range(maxi(menschen, 0)):
|
|
PLACES[heim_key(i)] = _heim(i)
|
|
LIST.append(_mensch(i))
|
|
|
|
|
|
static func _heim(i: int) -> Dictionary:
|
|
var ring := i / HAEUSER_JE_RING
|
|
var winkel := float(i % HAEUSER_JE_RING) * TAU / float(HAEUSER_JE_RING) + 0.39
|
|
var r := RING_ERSTER + float(ring) * RING_ABSTAND
|
|
var x := sin(winkel) * r
|
|
var z := cos(winkel) * r
|
|
return {
|
|
"name": "%s %s" % [_nachname(i), "Weg %d" % (i + 1)],
|
|
"pos": [x, z],
|
|
"size": [12.0 + float(i % 3) * 2.0, 10.0],
|
|
"dir": _tuer_zur_mitte(x, z),
|
|
"color": Color.from_hsv(fmod(0.08 + float(i) * 0.113, 1.0), 0.28, 0.78),
|
|
}
|
|
|
|
|
|
static func _tuer_zur_mitte(x: float, z: float) -> String:
|
|
if absf(x) > absf(z):
|
|
return "left" if x > 0.0 else "right"
|
|
return "forward" if z > 0.0 else "back"
|
|
|
|
|
|
static func _mensch(i: int) -> Dictionary:
|
|
var anliegen: Dictionary = ANLIEGEN[i % ANLIEGEN.size()]
|
|
var arbeit: String = str(ARBEIT[i % ARBEIT.size()])
|
|
var heim := heim_key(i)
|
|
var ablauf: Array = []
|
|
for e in ABLAEUFE[i % ABLAEUFE.size()]:
|
|
var ort: String = str(e[1])
|
|
if ort == "heim":
|
|
ort = heim
|
|
elif ort == "arbeit":
|
|
ort = arbeit
|
|
ablauf.append([e[0], ort, e[2]])
|
|
return {
|
|
"id": "mensch_%d" % i,
|
|
"name": "%s %s" % [_vorname(i), _nachname(i)],
|
|
"alter": 22 + (i * 7) % 38,
|
|
"beruf": str(BERUFE[i % BERUFE.size()]),
|
|
"traum": str(anliegen["traum"]),
|
|
"problem": str(anliegen["problem"]),
|
|
"tags": (anliegen["tags"] as Array).duplicate(),
|
|
"mission": true,
|
|
"heim": heim,
|
|
"farbe": Color.from_hsv(fmod(0.02 + float(i) * 0.191, 1.0), 0.5, 0.8),
|
|
"routine": ablauf,
|
|
}
|
|
|
|
|
|
static func _vorname(i: int) -> String:
|
|
return str(VORNAMEN[i % VORNAMEN.size()])
|
|
|
|
|
|
static func _nachname(i: int) -> String:
|
|
return str(NACHNAMEN[(i / VORNAMEN.size() + i) % NACHNAMEN.size()])
|
|
|
|
|
|
## Die Tätigkeiten eines Menschen in der Reihenfolge seines Tages, ohne Dopplung.
|
|
static func aktivitaeten(id: String) -> Array:
|
|
var out: Array = []
|
|
for e in by_id(id)["routine"]:
|
|
if not out.has(e[2]):
|
|
out.append(e[2])
|
|
return out
|
|
|
|
|
|
static func by_id(id: String) -> Dictionary:
|
|
for h in LIST:
|
|
if h["id"] == id:
|
|
return h
|
|
return {}
|