

Um die Geschichte besser erzählen zu können, habe ich eine Textbox erstellt. Zuerst hatte ich mich informiert, wie so etwas geht, anhand eines Youtube Videos.
Das Video erstellt eine rudimentäre Textbox, diese ist schonmal gut, aber genügt meinen Anforderungen nicht.



Charaktere
Für bessere Immersion braucht die Textbox noch das Bild und den Namen des Sprechers. Manchmal verändert sich der Sprecher, in meinem Spiel muss man auf die Kachel der Hütte des Sprechers um mit ihm zu interagieren. Es wurde auch eine kleine Animation auf die Kachel gesetzt um der Overworld noch etwas mehr Bewegung und Leben zu geben.
Der Charakter hier ist Pheus, seine Hütte wird direkt zu Begin des Spiels in der Mitte der Karte erstellt. Er ist der Mentor in der Geschichte, und hilft Taja -der Heldin- wieder auf die Beine. Seine Hütte ist direkt im Blickfeld des Spielers wenn man das Spiel das erste mal startet.

Mit einem identifizierbaren Kacheltyp kann ich auch ein Modul schreiben, welches darauf prüft ob der Spieler Interaktion nutzt wenn er auf PHEUS_HUETTE steht.
func checkForTalker():
if State.Map_Array[State.Shared_Player_Position.x][State.Shared_Player_Position.y] == "PHEUS_HUETTE":

So lassen sich auch mehrere Charaktere erstellen, welche auf unterschiedlichen Kacheln aktiviert werden.
Den Dialog selbst lade ich aus einer JSON Datei. Die Dialog-Textblöcke in der JSON Datei sind Indexiert, und werden runtergebrochen auf Textblöcke die für die Textbox verarbeitbar sind.
Ich nutzte eine JSON Datei um einen Zentralen Punkt zu haben wo die Textausgaben gespeichert sind, um diese im Laufe der Entwicklung einfacher verändern zu können.

Code Logik
Das laden des Textes aus der JSON Datei braucht eine kleine Funktion, welche die Datei öffnet, den Inhalt in einer Variable kopiert und dann wieder schließt.
ressource
ist hier der Pfad zur JSON Datei.

Den Text herunterzubrechen war eine kleine Herausforderung, da es zuerst mitten im Wort runtergebrochen wurde. Ich habe das dann gelöst mit:
var lastSpace = clip48.rfind(" ")
rfind(" ")
sucht das letzte Leerzeichen und speichert dessen Position, später habe ich dann einfach die Brüche an dieser Position gemacht.

Ich habe die Struktur so geschrieben, dass die Texte welche der Charakter sagt indexiert sind. Zum Beispiel ist Index 0 der Erste Satz welcher zu Taja am Start des Spiels gesagt wird:"Pheus": {
"0": "Ich bin Pheus, ich habe dich aus dem Wasser an der Küste gefischt und dir wieder auf die Beine geholfen!",
Ich setzte im Spiel später Milestones welche nach Abschluss mancher Story Beats gesetzt werden, mit diesen wird dann auch Progression im Dialog gemacht.



Schwierigkeiten
Die meisten Schwierigkeiten entstanden durch die Abfolge, also Wann was passiert. Ich hatte zum Beispiel eine Lange Zeit den Text doppelt ausgegeben bekommen.
Bis ich dahinter kahm, dass ich den Charakter nochmal anspreche, da ich auf dessen Feld stehe und die Aktionstaste für Fortfahren in seinem Text nutze ist viel Zeit vergangen.
Lösungsansätze hierfür waren: einen Switch zu erstellen, der bei verlassen des Feldes erst wieder auf true
geht. Sowie ein Timer -welchen ich letztendlich behalten habe- der das ansprechen einige Sekunden verhindert.
Der Timer wird gestartet wenn der Text gelesen wurde.