Und wieder ein großer Fortschritt:
Mein Lock&Key-System steht!
Damit in einer prozedural erstellten Umgebung Schlüssel und verschlossene Türen funktionieren, muß man diese so platzieren, daß man am Ende tatsächlich jeden Teil des Dungeons "öffnen" kann.
Dafür habe ich mir folgende Routine ausgedacht:
A)
- Einen zufälligen Prozentsatz an Türen als "Lockable" flaggen.
- Für jede dieser Türen eine A*-Suche von der einen Seite der Tür zur anderen durchführen (Türfeld-Kollision auf #True setzen).
- Wenn ein Pfad existiert, ist die Tür nicht als "Lockable" geeignet, da man den Bereich dahinter auf einem alternativen Pfad durch eine unverschlossene Tür erreichen kann.
- Die verbliebenen Türfelder auf eine offene Liste setzen.
- Anschließend die Kollision aller Türfelder der offenen Liste auf #True setzen.
B)
- Mit A*-Pfadsuche vom Startpunkt aus alle Türfelder der offenen Liste versuchen anzusteuern.
- Alle Türfelder, die mit A* erreicht werden, auf eine sekundäre offene Liste setzen.
- Von der sekundären offenen Liste ein zufälliges Element herauspicken.
- Einen Schlüssel mit keyIndex 1, welcher die Koordinaten seines Zielfeldes kennt, im Dungeon verstecken (da alle übrigen Türfelder immer noch positive Kollision haben, kann man hier leicht mit A* überprüfen, daß der Schlüssel an einer erreichbaren Stelle platziert wurde).
- Die entsprechende Tür öffnen (Kollision entfernen) und von der offenen Liste löschen.
- keyIndex +1
C)
- Alle Punkte unter B solange wiederholen, bis keine Elemente auf der offenen Liste übrig sind.
D)
- Da "absolute" Schlüssel langweilig sind, bekommt jeder Schlüssel eine zufällige Farbe (1-4).
- Die dazugehörige Tür (der Schlüssel kennt die Koordinaten) erhält dieselbe Farbe.
- Jeder farbige Schlüssel kann jetzt jede Tür derselben Farbe öffnen.
Mit dieser Methode kann es ab und zu vorkommen, daß man sich selber den Weg zum Ausgang versperrt, da man die Schlüssel in falscher Reihenfolge verwendet; deswegen werde ich später alternative Möglichkeiten, Türen zu öffnen (Tür aufbrechen, Magie, etc.), sow und alternative Verwendungszwecke für nicht benutzte Schlüssel implementieren.
So "zwingt" man den Spieler zu interessanten Entscheidungen.

Weitere Features:
- Monster können unverschlossene Türen öffnen (bzw. versuchen es; wenn sie es nach mehreren Versuchen nicht schaffen, suchen sie einen Weg drumherum).
- Ein Teil des Dungeons kann "abgekapselt" werden (an Türfeldern ohne alternativen Rückweg)
- Der Übergang wird entfernt und beide Teile des Dungeons werden über einen Teleporter verknüpft.
- Wenn die Trennlinie durch eine verschlossene Tür geht, benutze ich die Koordinaten des zugehörigen Schlüssel als Referenz für den ersten Teleporter.
- In diesem Fall kommt der zuvor initialisierte keyIndex zum Tragen: alle Türen mit keyIndex < Index der Übergangstür werden geöffnet, dahinter bleibt alles verschlosen!
- Das Zielfeld ist niemals der Teleporter zurück, den muß man erst finden!
- Das Zielfeld für den ersten Teleporter ist gültig, wenn es per A*-Suche die Trennlinie erreichen kann, aber NICHT den ersten Teleporter (Kollision der Trennlinie auf #True setzen).
- Die Koordinaten des zweiten Teleporters sind gültig, wenn man per A* die Trennline UND das Zielfeld des ersten Teleporters erreichen kann.
- Das Zielfeld für den zweiten Teleporter ist gültig, wenn man per A* Trennline UND ersten Teleporter errechen kann.
Nächster Meilenstein:
Ein Message-System, mit dem man Texte und Informationen einblenden kann (z.B. Innschriften und Informationen über Items und Monster)