This commit is contained in:
Team3
2026-09-16 16:15:32 +02:00
parent e813b5f7aa
commit 7c4edaa439
19 changed files with 1244 additions and 636 deletions

View File

@@ -33,6 +33,9 @@ var ueberwunden: Dictionary = {} # human_id -> {problem -> true}
var gesehen_zaehler: Dictionary = {} # "human:problem" -> wie oft dabeigewesen
var completed: Array = []
var markiert: Dictionary = {} # human_id -> true: wer gerade ein Schild trägt
var welt_version := 0 # zählt hoch, wenn Dorf oder Stadt neu erzeugt wurden
var spuren: Dictionary = {} # human_id -> {ursache -> true}: in der Wohnung gelesen
var notizen: Dictionary = {} # human_id -> [Zeilen mit Tag und Uhrzeit], für die Akte
var time_h: float = 7.0
var day: int = 1
var teleport_lock: float = 0.0
@@ -151,6 +154,7 @@ func insel_radius() -> float:
func welt_erzeugen() -> void:
DreamDB.erzeuge(haeuser())
HumanDB.erzeuge()
welt_version += 1
## Das Traumdorf beginnt leer. Mit jedem erfüllten Traum zieht ein Wesen ein.
@@ -352,11 +356,15 @@ func sehen(human_id: String, nr: int) -> void:
## Der Zustand einer Stunde. HUD und Panel zeichnen denselben -- zwei
## Auslegungen würden mit der Zeit auseinanderlaufen.
enum Stunde { UNBEKANNT, GESEHEN, SCHLAF, UNGEKLAERT, BENANNT, GEBAUT }
enum Stunde { UNBEKANNT, GESEHEN, SCHLAF, UNGEKLAERT, BENANNT, GEBAUT, VERDAECHTIG }
func slot_zustand(human_id: String, nr: int) -> int:
if not gesehen_slot(human_id, nr):
# eine gelesene Spur macht die Stunden ihrer Ursache verdächtig: dort lohnt es, dabei zu sein
var g := slot_grund(human_id, nr)
if Ursachen.ist_blocker(g) and spur_bekannt(human_id, Ursachen.ursache_von(g)):
return Stunde.VERDAECHTIG
return Stunde.UNBEKANNT
if not system_in(human_id, nr).is_empty():
return Stunde.GEBAUT
@@ -405,6 +413,7 @@ func notieren(human_id: String, nr: int) -> String:
if not Ursachen.ist_blocker(grund):
notiz_sperre = NOTIZ_SPERRE
notified.emit("Nichts schief: %s" % Orte.text(grund), Color(1, 0.75, 0.55))
notiz(human_id, "Beobachtet: %s — nichts schief" % Orte.text(grund))
return "daneben"
if erkannt(human_id, nr):
notified.emit("Schon notiert: %s" % Orte.text(grund), Color(0.8, 0.85, 1))
@@ -414,13 +423,60 @@ func notieren(human_id: String, nr: int) -> String:
erkannt_slots[human_id][nr] = true
notified.emit("Erkannt: %s — %s" % [Ursachen.BLOCKER[grund]["name"],
Ursachen.LISTE[Ursachen.ursache_von(grund)]["name"]], Color(0.8, 0.95, 1))
notiz(human_id, "Erkannt: %s (%s)" % [Ursachen.BLOCKER[grund]["name"],
Ursachen.LISTE[Ursachen.ursache_von(grund)]["name"]])
state_changed.emit()
return "treffer"
## Eine Ursache gilt als erkannt, sobald eine ihrer Tätigkeiten aufgedeckt ist.
## Nur eine Quelle -- sonst driften Slot und Ursache auseinander.
## Ein Traumwesen flüstert eine Spur des Menschen, um den es gerade geht --
## das Dorf hilft dem, der ihm seine Bewohner gebracht hat.
func wesen_fluestert(index: int) -> String:
var wesen: Dictionary = DreamDB.LIST[index] if index < DreamDB.LIST.size() else {"name": "Ein Wesen"}
var wer := active_mission
if wer == "":
var offen := offene_missionen()
wer = str(offen[0]["id"]) if not offen.is_empty() else ""
if wer == "":
return "%s lächelt nur. Nimm dir am Schwarzen Brett jemanden vor." % wesen["name"]
var mensch := HumanDB.by_id(wer)
for u in ursachen_von(wer):
if spur_lesen(wer, str(u)):
return "%s flüstert: Bei %s liegt etwas -- %s" % [wesen["name"], mensch["name"],
Ursachen.LISTE[u]["spur_text"]]
return "%s flüstert: Was bei %s herumliegt, kennst du schon. Geh hin und sieh, wann es geschieht." % \
[wesen["name"], mensch["name"]]
## Eine Zeile in die Akte: was wann festgestellt wurde.
func notiz(human_id: String, text: String) -> void:
if not notizen.has(human_id):
notizen[human_id] = []
notizen[human_id].append("Tag %d, %02d Uhr — %s" % [day, int(time_h), text])
## Eine Spur in der Wohnung lesen: die Ursache ist damit bekannt, ihre
## Stunden im Tag werden verdächtig. Liefert false, wenn sie schon bekannt war.
func spur_lesen(human_id: String, ursache: String) -> bool:
if spur_bekannt(human_id, ursache):
return false
if not spuren.has(human_id):
spuren[human_id] = {}
spuren[human_id][ursache] = true
notiz(human_id, "Spur: %s" % Ursachen.LISTE[ursache]["spur"])
state_changed.emit()
return true
func spur_bekannt(human_id: String, ursache: String) -> bool:
return spuren.get(human_id, {}).has(ursache)
func ursache_bekannt(human_id: String, ursache: String) -> bool:
if spur_bekannt(human_id, ursache):
return true
for nr in erkannt_slots.get(human_id, {}):
if Ursachen.ursache_von(slot_grund(human_id, int(nr))) == ursache:
return true
@@ -507,7 +563,8 @@ func system_setzen(human_id: String, nr: int, tech_id: String, widerstand: bool)
var guete := float(pruef["guete"]) * (1.0 + 0.1 * float(verhalten(human_id, "guete")))
systeme[human_id][nr] = {"tech": tech_id, "guete": guete}
add_xp(tech_id, 2)
notified.emit("System steht: %s um %02d:00" %
notiz(human_id, "Routine gesetzt: %s" % TechDB.by_id(tech_id)["name"])
notified.emit("Neue Routine steht: %s um %02d:00" %
[TechDB.by_id(tech_id)["name"], int(slots(human_id)[nr][0])], Color(0.6, 1, 0.7))
state_changed.emit()
return {"ok": true, "erfolg": true, "guete": float(pruef["guete"])}
@@ -699,7 +756,7 @@ func situation_anwenden(tech_id: String) -> Dictionary:
ueberwunden[id] = {}
ueberwunden[id][problem] = true
res["ueberwunden"] = true
notified.emit("%s überwunden" % Probleme.name_von(problem), Color(1, 0.85, 0.4))
notified.emit("%s — ein Schritt weiter" % Probleme.name_von(problem), Color(1, 0.85, 0.4))
state_changed.emit()
return res