Title: miniworlds: Textsignale

In miniworlds sind Strings nicht nur Konsolenausgaben. Du kannst sie direkt
in einer Spielwelt anzeigen: als Titel, Schild, Statusanzeige, Hinweis oder
Dialogzeile.

Der einfachste Schritt ist ein Text-Objekt in der Welt:

import miniworlds

world = miniworlds.World(520, 280)

ort = "verlassene Bibliothek"
hinweis = miniworlds.Text((30, 30), f"Ort: {ort.title()}")
hinweis.font_size = 26

world.run()

Hier wird aus dem String `ort` ein sichtbarer Text. Das ist viel näher an
einem Spiel als ein reines `print()`: Die Information steht direkt in der
Szene.

!!! note Text sichtbar machen
`miniworlds.Text((x, y), text)` erzeugt einen Text-Actor. Standardmäßig ist
die Textfarbe weiß. Die Position `(x, y)` beschreibt die obere linke Ecke des
Textes. Auf hellen Hintergründen solltest du daher oft eine dunkle
Textfarbe setzen.

### Text als Statusanzeige

In Spielen zeigen Strings oft einen Zustand an: Lebenspunkte, Auftrag,
Inventar, Raumname oder Warnungen.

import miniworlds

world = miniworlds.World(520, 280)

name = "Nia"
raum = "Westflügel"
schluessel = 2

status = miniworlds.Text((25, 25), "")
status.font_size = 22
status.text = f"{name} | {raum} | Schlüssel: {schluessel}"

world.run()

Der Text wird zuerst leer erzeugt und danach über `status.text` gesetzt. Das
ist ein typisches Muster: Im Spiel ändert sich etwas, und die Anzeige wird
neu zusammengesetzt.

Spielzustand -> String bauen -> Anzeige aktualisieren

### Text entscheidet über die Szene

Strings können auch Regeln steuern. Ein Statuswort kann zum Beispiel
entscheiden, welche Farbe ein Signal bekommt.

import miniworlds

world = miniworlds.World(520, 280)

status = "alarm".strip().lower()
meldung = miniworlds.Text((25, 25), f"Status: {status.upper()}")
meldung.font_size = 24

signal = miniworlds.Circle((260, 150), 45)

if status == "alarm":
elif status == "bereit":
else:

world.run()

So entstehen aus einfachen Textvergleichen erste Spielregeln. Genau dieselbe
Idee kannst du später für Türen, Dialogoptionen oder Quest-Zustände nutzen.

!!! note Verbindung zu Strings
Hier werden mehrere String-Ideen kombiniert: `strip()` bereinigt den Text,
`lower()` macht Vergleiche robuster und `upper()` formatiert die Anzeige.

### Typisches Spielbeispiel: Dialog

Viele Spiele bestehen aus kurzen Dialogen. Ein Programm kann die passende
Dialogzeile aus einer Liste holen und in der Welt anzeigen.

import miniworlds

world = miniworlds.World(560, 320)

sprecher = "Archivarin"
dialog = [
"Der Schlüssel passt nicht zu dieser Tür.",
"Aber die Rune am Griff leuchtet kurz auf.",
"Vielleicht fehlt noch ein zweites Zeichen.",

schritt = 1
zeile = dialog[schritt]

name_text = miniworlds.Text((35, 35), sprecher.upper())
name_text.font_size = 22

box = miniworlds.Text((35, 80), f"{sprecher}: {zeile}")
box.font_size = 20
box.max_width = 480

world.run()

Die Liste `dialog` enthält mehrere mögliche Sätze. Mit `dialog[schritt]`
wird eine Zeile ausgewählt. In einem echten Spiel könnte `schritt` durch eine
Taste, eine Entscheidung oder eine Bedingung verändert werden.

### Dialog mit Antwort

Jetzt wird es spieltypischer: Eine Antwort verändert, welche Meldung angezeigt
wird.

import miniworlds

world = miniworlds.World(560, 320)

antwort = "links".strip().lower()

if antwort == "links":
text = "Du folgst dem kalten Luftzug zur alten Treppe."
elif antwort == "rechts":
text = "Du findest eine Karte mit drei eingerissenen Ecken."
else:
text = "Du bleibst stehen und lauschst in den Flur."

ueberschrift = miniworlds.Text((35, 35), "Entscheidung")
ueberschrift.font_size = 26
ueberschrift.color = (26, 32, 46)

meldung = miniworlds.Text((35, 90), text)
meldung.font_size = 21
meldung.max_width = 490

world.run()

Das ist die Grundidee von Dialogen und Textadventures: Ein String wird
bereinigt, verglichen und in eine passende Reaktion übersetzt.

### Aufgabe zum Ausprobieren

Baue eine kleine Dialogszene.

Ändere das Beispiel so, dass:

- eine Variable `figur` einen Namen enthält
- eine Variable `ort` einen Raum oder Ort enthält
- eine Variable `antwort` eine Entscheidung wie `"fragen"` oder `"gehen"` enthält
- aus diesen Variablen ein sichtbarer Dialogtext gebaut wird
- bei zwei verschiedenen Antworten unterschiedliche Texte erscheinen

Beispiel:

import miniworlds

world = miniworlds.World(560, 320)

figur = "Taro"
ort = "Uhrenturm"
antwort = "fragen"

if antwort == "fragen":
dialog = f"{figur} fragt nach dem Weg zum {ort}."
else:
dialog = f"{figur} verlässt den {ort} ohne ein Wort."

titel = miniworlds.Text((35, 35), f"Szene: {ort}")
titel.font_size = 26

text = miniworlds.Text((35, 90), dialog)
text.font_size = 21
text.max_width = 490

world.run()