Files
dreamer-game/scripts/woerter.gd
2026-09-15 23:17:07 +02:00

219 lines
11 KiB
GDScript

class_name Woerter
## Alltagswörter, mit denen jemand sich selbst beschreibt -- und was das Spiel
## daraus schließt. Vorne Wörter, die jeder an sich erkennt; hinten das Modell.
##
## Jedes Wort zieht an mehreren Stellen: Ursachen (was den Traum bremst),
## Blocker (was im Tag auftaucht), Klemmen (was in Momenten aufbricht) und
## Verhalten (wie der Mensch auf Techniken reagiert). Ein Wort kann an einer
## Stelle helfen und an einer anderen schaden -- so ist das bei Menschen.
## Die acht Verhaltenswerte, -2 bis +2:
## einrichten wie leicht ein System sich setzen lässt
## guete wie gut ein gesetztes System trägt
## abwehr wie stark die Abwehr nach einem Fehlschlag ist
## momente wie oft Momente aufbrechen
## dauer wie lange sie dauern
## tempo wie schnell der Traum von sich aus vorankommt
## sozial wie gut soziale Techniken greifen
## sichtbar wie schnell man ihm ansieht, was dahintersteckt
const VERHALTEN := ["einrichten", "guete", "abwehr", "momente", "dauer", "tempo", "sozial", "sichtbar"]
const GRUPPEN := {
"arbeit": "Arbeitsweise", "menschen": "Mit anderen", "gefuehl": "Gefühl",
"energie": "Energie", "selbst": "Selbstbild",
}
static var LISTE: Dictionary = {
# --- Arbeitsweise
"aufschiebend": {"name": "aufschiebend", "gruppe": "arbeit",
"ursachen": {"anfang": 2}, "blocker": ["putzflucht", "kaffee"], "verhalten": {"einrichten": -1}},
"perfektionistisch": {"name": "perfektionistisch", "gruppe": "arbeit",
"ursachen": {"halt": 1, "anfang": 1}, "blocker": ["perfekt"],
"probleme": {"perfektionismus": 2}, "verhalten": {"guete": 1, "abwehr": 1}},
"gruendlich": {"name": "gründlich", "gruppe": "arbeit",
"ursachen": {"anfang": 1}, "blocker": ["recherche"], "verhalten": {"guete": 1}},
"chaotisch": {"name": "chaotisch", "gruppe": "arbeit",
"ursachen": {"halt": 1}, "blocker": ["plan_neu"], "probleme": {"ueberforderung": 1},
"verhalten": {"guete": -1}},
"ordentlich": {"name": "ordentlich", "gruppe": "arbeit",
"ursachen": {"anfang": 1}, "blocker": ["liste", "mails"], "verhalten": {"guete": 1}},
"sprunghaft": {"name": "sprunghaft", "gruppe": "arbeit",
"ursachen": {"halt": 2}, "blocker": ["umschalten"], "verhalten": {"guete": -1, "momente": 1}},
"ablenkbar": {"name": "ablenkbar", "gruppe": "arbeit",
"ursachen": {"halt": 1, "zeit": 1}, "blocker": ["scrollen", "spielen"],
"probleme": {"unruhe": 1}},
"diszipliniert": {"name": "diszipliniert", "gruppe": "arbeit",
"verhalten": {"guete": 1, "einrichten": 1, "tempo": 1}},
"ehrgeizig": {"name": "ehrgeizig", "gruppe": "arbeit",
"probleme": {"stress": 1}, "verhalten": {"tempo": 1, "momente": 1}},
"bequem": {"name": "bequem", "gruppe": "arbeit",
"ursachen": {"kraft": 1, "anfang": 1}, "blocker": ["doesen", "bestellen"]},
"zielstrebig": {"name": "zielstrebig", "gruppe": "arbeit",
"verhalten": {"tempo": 1, "einrichten": 1}},
"unentschlossen": {"name": "unentschlossen", "gruppe": "arbeit",
"ursachen": {"anfang": 1}, "blocker": ["liste", "plan_neu"], "probleme": {"ueberforderung": 1}},
"ungeduldig": {"name": "ungeduldig", "gruppe": "arbeit",
"probleme": {"stress": 1}, "verhalten": {"abwehr": 1, "dauer": -1}},
"geduldig": {"name": "geduldig", "gruppe": "arbeit",
"verhalten": {"abwehr": -1, "dauer": 1}},
"neugierig": {"name": "neugierig", "gruppe": "arbeit",
"blocker": ["recherche", "umschalten"], "verhalten": {"einrichten": 1}},
"verbissen": {"name": "verbissen", "gruppe": "arbeit",
"probleme": {"stress": 1}, "verhalten": {"abwehr": 1, "tempo": 1}},
"spontan": {"name": "spontan", "gruppe": "arbeit",
"ursachen": {"halt": 1}, "verhalten": {"momente": 1}},
"pflichtbewusst": {"name": "pflichtbewusst", "gruppe": "arbeit",
"ursachen": {"zeit": 1}, "blocker": ["ueberstunden", "jasagen"], "verhalten": {"guete": 1}},
# --- Mit anderen
"gesellig": {"name": "gesellig", "gruppe": "menschen",
"ursachen": {"zeit": 1}, "verhalten": {"sozial": 1, "sichtbar": 1}},
"zurueckgezogen": {"name": "zurückgezogen", "gruppe": "menschen",
"blocker": ["absage"], "probleme": {"einsamkeit": 2}, "verhalten": {"sozial": -1, "sichtbar": -1}},
"hilfsbereit": {"name": "hilfsbereit", "gruppe": "menschen",
"ursachen": {"zeit": 2}, "blocker": ["jasagen"], "verhalten": {"sozial": 1}},
"konfliktscheu": {"name": "konfliktscheu", "gruppe": "menschen",
"ursachen": {"zeit": 1}, "blocker": ["jasagen"], "probleme": {"angst": 1},
"verhalten": {"abwehr": -1}},
"stur": {"name": "stur", "gruppe": "menschen",
"verhalten": {"abwehr": 2, "einrichten": -1}},
"nachgiebig": {"name": "nachgiebig", "gruppe": "menschen",
"ursachen": {"zeit": 1}, "verhalten": {"abwehr": -1, "einrichten": 1}},
"misstrauisch": {"name": "misstrauisch", "gruppe": "menschen",
"verhalten": {"einrichten": -1, "sozial": -1, "sichtbar": -1}},
"vertrauensvoll": {"name": "vertrauensvoll", "gruppe": "menschen",
"verhalten": {"einrichten": 1, "sozial": 1}},
"harmoniebeduerftig": {"name": "harmoniebedürftig", "gruppe": "menschen",
"ursachen": {"zeit": 1}, "blocker": ["jasagen"], "verhalten": {"abwehr": -1}},
"eigenbroetlerisch": {"name": "eigenbrötlerisch", "gruppe": "menschen",
"probleme": {"einsamkeit": 1}, "verhalten": {"sozial": -1}},
"redselig": {"name": "redselig", "gruppe": "menschen",
"blocker": ["klagen"], "verhalten": {"sichtbar": 1, "sozial": 1}},
"verschlossen": {"name": "verschlossen", "gruppe": "menschen",
"probleme": {"einsamkeit": 1}, "verhalten": {"sichtbar": -2}},
# --- Gefühl
"aengstlich": {"name": "ängstlich", "gruppe": "gefuehl",
"blocker": ["nachrichten"], "probleme": {"angst": 2}, "verhalten": {"momente": 1}},
"gelassen": {"name": "gelassen", "gruppe": "gefuehl",
"verhalten": {"momente": -1, "dauer": -1}},
"gruebelnd": {"name": "grüblerisch", "gruppe": "gefuehl",
"ursachen": {"grund": 1}, "blocker": ["waelzen"], "probleme": {"selbstzweifel": 1}},
"reizbar": {"name": "reizbar", "gruppe": "gefuehl",
"probleme": {"stress": 1}, "verhalten": {"momente": 1, "abwehr": 1}},
"optimistisch": {"name": "optimistisch", "gruppe": "gefuehl",
"verhalten": {"tempo": 1, "dauer": -1}},
"pessimistisch": {"name": "pessimistisch", "gruppe": "gefuehl",
"ursachen": {"grund": 2}, "blocker": ["klagen"], "verhalten": {"tempo": -1}},
"duennhaeutig": {"name": "dünnhäutig", "gruppe": "gefuehl",
"probleme": {"angst": 1, "selbstzweifel": 1}, "verhalten": {"dauer": 1}},
"nachtragend": {"name": "nachtragend", "gruppe": "gefuehl",
"verhalten": {"abwehr": 1}},
"heiter": {"name": "heiter", "gruppe": "gefuehl",
"verhalten": {"momente": -1}},
"schwermuetig": {"name": "schwermütig", "gruppe": "gefuehl",
"ursachen": {"grund": 1, "kraft": 1}, "probleme": {"erschoepfung": 1}, "verhalten": {"tempo": -1}},
# --- Energie
"nachtaktiv": {"name": "nachtaktiv", "gruppe": "energie",
"ursachen": {"kraft": 1}, "blocker": ["wach"], "probleme": {"erschoepfung": 1}},
"fruehaufsteher": {"name": "Frühaufsteher", "gruppe": "energie",
"verhalten": {"einrichten": 1}},
"erschoepft": {"name": "erschöpft", "gruppe": "energie",
"ursachen": {"kraft": 2}, "blocker": ["serie", "doesen"], "probleme": {"erschoepfung": 2}},
"rastlos": {"name": "rastlos", "gruppe": "energie",
"blocker": ["kuehlschrank"], "probleme": {"unruhe": 2}, "verhalten": {"momente": 1}},
"genuegsam": {"name": "genügsam", "gruppe": "energie",
"verhalten": {"dauer": -1}},
"bewegungsfaul": {"name": "bewegungsfaul", "gruppe": "energie",
"ursachen": {"kraft": 1}, "blocker": ["serie", "bestellen"]},
"sportlich": {"name": "sportlich", "gruppe": "energie",
"verhalten": {"tempo": 1, "momente": -1}},
"schlaflos": {"name": "schlaflos", "gruppe": "energie",
"ursachen": {"kraft": 1}, "blocker": ["wach", "snooze", "waelzen"], "probleme": {"erschoepfung": 1}},
# --- Selbstbild
"selbstkritisch": {"name": "selbstkritisch", "gruppe": "selbst",
"ursachen": {"grund": 1}, "probleme": {"selbstzweifel": 2}},
"selbstbewusst": {"name": "selbstbewusst", "gruppe": "selbst",
"verhalten": {"einrichten": 1, "sichtbar": 1}},
"unsicher": {"name": "unsicher", "gruppe": "selbst",
"blocker": ["recherche"], "probleme": {"selbstzweifel": 1, "angst": 1}, "verhalten": {"einrichten": -1}},
"bescheiden": {"name": "bescheiden", "gruppe": "selbst",
"verhalten": {"sozial": 1}},
"eitel": {"name": "eitel", "gruppe": "selbst",
"blocker": ["vergleichen"], "probleme": {"selbstzweifel": 1}},
"vergleichend": {"name": "vergleicht sich gern", "gruppe": "selbst",
"ursachen": {"grund": 1}, "blocker": ["vergleichen"], "probleme": {"selbstzweifel": 1}},
"hadernd": {"name": "hadert mit sich", "gruppe": "selbst",
"ursachen": {"grund": 2}, "blocker": ["waelzen"], "probleme": {"selbstzweifel": 1}},
}
const MINDESTENS := 6
const URSACHEN_MAX := 3
const PROBLEME_MAX := 2
static func name_von(key: String) -> String:
return str(LISTE[key]["name"]) if LISTE.has(key) else key
static func ids() -> Array:
return LISTE.keys()
static func in_gruppe(gruppe: String) -> Array:
var out: Array = []
for key in LISTE:
if LISTE[key]["gruppe"] == gruppe:
out.append(key)
return out
## Aus den angekreuzten Wörtern das Bild: Ursachen, Blocker, Klemmen, Verhalten.
static func profil(woerter: Array) -> Dictionary:
var ursachen: Dictionary = {}
var probleme: Dictionary = {}
var blocker: Array = []
var verhalten: Dictionary = {}
for v in VERHALTEN:
verhalten[v] = 0
for w in woerter:
if not LISTE.has(w):
continue
var e: Dictionary = LISTE[w]
for u in e.get("ursachen", {}):
ursachen[u] = int(ursachen.get(u, 0)) + int(e["ursachen"][u])
for p in e.get("probleme", {}):
probleme[p] = int(probleme.get(p, 0)) + int(e["probleme"][p])
for b in e.get("blocker", []):
if not blocker.has(b):
blocker.append(b)
for v in e.get("verhalten", {}):
verhalten[v] = int(verhalten[v]) + int(e["verhalten"][v])
for v in VERHALTEN:
verhalten[v] = clampi(int(verhalten[v]), -2, 2)
var urs := _oben(ursachen, URSACHEN_MAX, 2, Ursachen.LISTE.keys())
var prob := _oben(probleme, PROBLEME_MAX, 1, Probleme.LISTE.keys())
# Blocker müssen zu einer der Ursachen gehören, sonst passt keine Technik
var passend: Array = []
for b in blocker:
if urs.has(Ursachen.ursache_von(b)):
passend.append(b)
return {"ursachen": urs, "probleme": prob, "blocker": passend, "verhalten": verhalten}
## Die stärksten Einträge, mindestens `min`, höchstens `max`. Fehlt Gewicht,
## füllt die Reihenfolge des Katalogs auf -- niemand ist ohne Grund.
static func _oben(gewichte: Dictionary, max: int, min: int, katalog: Array) -> Array:
var keys: Array = gewichte.keys()
keys.sort_custom(func(a, b) -> bool: return int(gewichte[a]) > int(gewichte[b]))
var out: Array = []
for k in keys:
if int(gewichte[k]) <= 0 or out.size() >= max:
break
out.append(str(k))
for k in katalog:
if out.size() >= min:
break
if not out.has(str(k)):
out.append(str(k))
return out