This commit is contained in:
Team3
2026-08-30 19:56:47 +02:00
parent a46eba4145
commit f936dd2b2a
13 changed files with 1681 additions and 444 deletions

View File

@@ -1,9 +1,13 @@
class_name HumanDB
## Die Kleinstadt auf der Erde und die Menschen mit ihren Tagesabläufen.
## 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.
## pos = Standplatz drinnen, size = Grundfläche, dir = Richtung der Türlücke.
static var PLACES: Dictionary = {
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),
@@ -20,125 +24,184 @@ static var PLACES: Dictionary = {
"name": "Bäckerei Keller", "pos": [-31.0, 0.0], "size": [10.0, 12.0],
"dir": "right", "color": Color(0.85, 0.72, 0.50),
},
"haus_tobias": {
"name": "Wohnung Frank", "pos": [31.0, 0.0], "size": [10.0, 12.0],
"werkstatt": {
"name": "Werkstatt Loos", "pos": [31.0, 0.0], "size": [10.0, 12.0],
"dir": "left", "color": Color(0.70, 0.58, 0.55),
},
"haus_lena": {
"name": "Atelier Vogt", "pos": [-28.0, 27.0], "size": [12.0, 10.0],
"dir": "forward", "color": Color(0.66, 0.58, 0.72),
},
"haus_mira": {
"name": "Wohnheim", "pos": [0.0, 27.0], "size": [12.0, 10.0],
"dir": "forward", "color": Color(0.60, 0.68, 0.62),
},
"haus_bruno": {
"name": "Haus Keller", "pos": [28.0, 27.0], "size": [12.0, 10.0],
"dir": "forward", "color": Color(0.78, 0.66, 0.58),
},
"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 LIST: Array = [
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 = [
{
"id": "lena",
"name": "Lena Vogt",
"alter": 29,
"beruf": "Illustratorin",
"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"],
"mission": true,
"farbe": Color(0.85, 0.45, 0.55),
"routine": [
[0, "haus_lena", "schlaeft"],
[7, "haus_lena", "morgenroutine"],
[8, "cafe", "essen"],
[10, "haus_lena", "zoegert"],
[12, "haus_lena", "arbeitet"],
[13, "park", "pause"],
[15, "haus_lena", "arbeitet"],
[18, "park", "unterwegs"],
[20, "haus_lena", "aufraeumen"],
[21, "haus_lena", "gruebelt"],
[22, "haus_lena", "abendroutine"],
[23, "haus_lena", "schlaeft"],
],
},
{
"id": "bruno",
"name": "Bruno Keller",
"alter": 54,
"beruf": "Bäcker",
"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"],
"mission": true,
"farbe": Color(0.55, 0.45, 0.30),
"routine": [
[0, "haus_bruno", "schlaeft"],
[3, "baeckerei", "arbeitet"],
[10, "cafe", "pause"],
[12, "haus_bruno", "essen"],
[13, "haus_bruno", "ruht"],
[15, "haus_bruno", "zoegert"],
[16, "park", "unterwegs"],
[18, "haus_bruno", "muede"],
[20, "haus_bruno", "abendroutine"],
[21, "haus_bruno", "schlaeft"],
],
},
{
"id": "mira",
"name": "Mira Sahin",
"alter": 22,
"beruf": "Studentin",
"traum": "Ihre Abschlussarbeit vortragen, ohne zu erstarren.",
"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"],
"mission": true,
"farbe": Color(0.35, 0.60, 0.85),
"routine": [
[0, "haus_mira", "schlaeft"],
[8, "haus_mira", "morgenroutine"],
[9, "uni", "arbeitet"],
[13, "cafe", "angespannt"],
[15, "uni", "arbeitet"],
[17, "uni", "wartet"],
[18, "haus_mira", "gruebelt"],
[20, "park", "unterwegs"],
[21, "haus_mira", "ruht"],
[22, "haus_mira", "abendroutine"],
[23, "haus_mira", "schlaeft"],
],
},
{
"id": "tobias",
"name": "Tobias Frank",
"alter": 41,
"beruf": "Sachbearbeiter",
"traum": "Abends wieder Zeit für seine Tochter haben.",
"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"],
"mission": true,
"farbe": Color(0.40, 0.55, 0.45),
"routine": [
[0, "haus_tobias", "schlaeft"],
[6, "haus_tobias", "morgenroutine"],
[7, "buero", "arbeitet"],
[12, "cafe", "essen"],
[14, "buero", "arbeitet"],
[19, "buero", "angespannt"],
[20, "haus_tobias", "essen"],
[21, "haus_tobias", "muede"],
[23, "haus_tobias", "abendroutine"],
],
},
{
"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: