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 {}