Da unser Event-Erzeugungsskript nun funktioniert, wollen wir euch kurz vorstellen, wie es funktioniert:
In jeder Region wird eine Reihe von Regeln ausgeführt. Hierbei erzeugt jede Regel entweder ein Event, ein Gebiet oder erzeugt Hilfsobjekte, die später von anderen Regeln genutzt werden können.
Zunächst laufen einige solcher Hilfsregeln:
- Alle Straßen und Wege der Region werden herausgesucht und es wird abgespeichert, ob sie Betreten werden dürfen.
- Alle Gebäude der Region werden herausgesucht.
- Alle besiedelten Flächen werden herausgesucht.
- Alle Schulen und Kindergärten werden herausgesucht.
- Alle Gewässer werden herausgesucht.
Nach diesen Hilfsregeln folgt die eigentliche Event- und Gebietserzeugung. Diese geht in den meisten Fällen von einem Tag in Openstreetmap aus. Hierzu werden alle Openstreetmap-Einträge mit dem entsprechenden tag (z.B. amenity=place_of_worship für Kirchen oder highway=pedestrian, area=yes für Fußgängerzonen) in der Region herausgesucht. Anschließend wird diese Liste wie folgt gefiltert:
- Die Liste wird mit einer Datenbank mit explizit verbotenen Orten vergleichen. Diese Datenbank muss manuell befüllt werden und dient als letzte Möglichkeit zum entfernen unerwünschter Gebiete/Events, falls alle anderen Mechanismen versagen. Sie wird beispielsweise genutzt, wenn Spieler ein Gebiet als ungeeignet (z.B. Privatgelände) melden.
- Bei Gebieten wird geprüft, ob ihre Form nicht zu stark fragmentiert und.
- Bei Gebieten wird geprüft, ob sie nicht zu viele Wege enthalten, die nicht betreten werden dürfen und nicht zu sehr mit Gebäuden bebaut sind
- Treffer, die mit bereits platzierten Objekten kollidieren oder sehr sehr nahe an ihnen dran sind, werden verworfen
- Je nach Regel werden manche Objekte zu Clustern zusammengefasst, die nur einen Kartenmarker erhalten (z.B. mehrere Krankenhausgebäude)
Diese Elternobjekte werden jetzt zugewiesen.
Jetzt werden alle verbleibenden Treffer gezählt. Jede Regel kann eine maximale Anzahl an zu platzierenden Objekten pro Region, pro Fläche oder pro Eltern-Objekt angeben (z.B. genau ein Wirtshaus pro Marktplatz). Damit nur die besten Treffer platziert werden, werden alle Treffer nach einer regelspezifischen Formel bewertet und nur die besten Treffer werden behalten.
Manche "Kind"-Objekte sind für ihr Eltern-Objekt verpflichtend. Wenn sie nicht platziert werden können, wird auch das Eltern-Objekt mitsamt aller anderen "Kind"-Objekte gelöscht. Dies geschieht zum Beispiel mit dem Marktplatz, wenn sich kein geeignetes Wirtshaus in der Nähe platzieren lässt.
Zusätzlich zum hier vorgestellten Weg, lassen sich auch Events an einer zufälligen Position innerhalb eines Gebiets erzeugen. Auf diese Weise werden unter anderem die Händler auf dem Marktplatz verteilt.
Es hat zwar einige Iterationen gedauert, aber inzwischen läuft das Skript äußerst zuverlässig und die erzeugten Gebiete und Events bilden nahezu immer ein gut funktionierendes Spieleerlebnis. Mit dieser Neuerung ist der Weg frei für eine deutschlandweit (weltweit?) spielbare Kampagne, die sich ohne größere Probleme erweitern lässt.