Kartengenerator
Neben einfachen dynamischen, statischen und exakten Landkarten steht auch ein leistungsfähiger dynamischer Kartengenerator für komplexe, mit Zufallswerten erzeugte Landschaften zur Verfügung.
Dieser arbeitet mit verschachtelten und durch Operatoren verknüpfte Ebenen, denen jeweils ein Materialwert und diverse Attribute zugewiesen werden, die die Form beschreiben. Der Landschaftsgenerator rendert dabei die Karten mit Hilfe dieser Ebenen. Sie werden dann später wie reguläre statische Karten vergrößert
Die Objektstruktur aus Karten, Ebenen und Attributen wird aus der Datei 'Landscape.txt' im Szenario gelesen.
Syntax
Die Sprache zur Beschreibung solcher Karten arbeitet grundsätzlich mit Objekten, Attributen und Operatoren. Groß- und Kleinschreibung wird beachtet. Objekte werden wie folgt definiert:
Object_type [Name] { Attribute };
Die Angabe eines Namens ist optional. Für die Objekttypen stehen momentan map, overlay und point (für den Algorithmus poly) zur Verfügung. Wenn ein Objekt benannt wird, kann es später also Vorlage für eine weitere Instanz definieren, die man mit
Name { Attribute };
definiert. Hier würde das vorher definierte Objekt 'Name' kopiert und gegebenenfalls um die entsprechenden Attribute ergänzt werden. Werden keine weiteren Attribute angegeben, können die Klammern hier auch weggelassen werden.
Attribute haben grundsätzlich die Form
Attribut=Value;
und können in beliebiger Reihenfolge im Objekt definiert werden. Sie können dabei optional % oder px als Einheit haben, und als Konstante oder Wertbereich (Zahl1 - Zahl2) angegeben werden. Bei Doppelten Zuweisungen gilt das zuletzt definierte.
Zusätzlich zu den Attributen können wieder untergeordnete Objekte definiert und mit Operatoren verknüpft werden:
Object1 Operator Object2;
Operatorketten können beliebig lang sein und steuern die Kombination von Ebenen. Mögliche Operatoren sind | (oder), & (und) und ^ (exklusiv oder).
Einige Beispiele gibt es in den Dynamischen Welten.
Attribute
Ebenen (overlay)
Folgende Attribute sind definiert:
Attribut | Typ | Beschreibung |
---|---|---|
mat | Material | Material. Das Material muss in der entsprechenden Material.ocg definiert sein. Standard ist Himmel. |
tex | Textur | Textur. Die Material-Textur-Kombination sollte in der geladenen TexMap vorhanden sein. |
x, y, wdt, hgt | Integer | Größe der beschriebenen Ebene auf der übergeordneten Ebene in Prozent. |
algo | Algorithmus | Füllungstyp der Ebene. Für verfügbare Füllungen siehe Füllalgorithmen |
zoomX, zoomY | Integer | Gibt die entsprechende Zoomstufe an, um die die Füllung vergrößert/verkleinert werden soll. -100 bis +99 |
ox, oy | Integer | Offset auf den Füllalgorithmus in Prozent. Hiermit kann z.B. eine Sinuskurve verschoben werden. |
a, b | Integer | Zusatzparameter für den Füllalgorithmus |
turbulence | Integer | 10 bis 10.000; Deformierung der Ebene |
rotate | Integer | -180 bis +180. Drehung der Ebene. |
invert | Boolean | 0 oder 1. Bei 1 wird die Ebenenfüllung umgekehrt. |
seed | Integer | Zufallsseed für die Ebenenberechnung. Bei festem Seed wird die Ebene immer gleich erzeugt. |
loosebounds | Boolean | Legt fest, ob die Grenzen durch rotate, turbulence, ox und oy mit transformiert werden. |
mask | Boolean | 0 oder 1. Bei 1 wird die Ebene nie gezeichnet. Auf untergeordnete Ebenen hat dies keinen Effekt. |
grp | b | 0 oder 1. Bei 1 gilt die Ebene als gesetzt, wenn der lokale Algorithmus oder eine der untergeordneten Ebenen erfüllt ist. Folgt ein Operator, so wird die Ebene selber nicht gezeichnet. |
sub | Boolean | 0 oder 1. Bei 1 ist das Material unterirdisch (standard) |
lambda | Integer | 0 bis 20. Zusätzliche turbulence-Iterationen. |
Karten (map)
Karten enthalten grundsätzlich alle Attribute, die Ebenen auch enthalten. Allerdings machen hier nur mat, tex und sub wirklich Sinn, und geben die Hintergrundfüllung an.
Füllalgorithmen
Um festzustellen, ob ein Punkt auf der Karte eine Ebene trifft, wird er zunächst verschoben (zoom, turbulence, rotate, ox/oy), und anschließend ihr Algorithmus ausgewertet. Außerdem wird geprüft, ob er innerhalb der Maskengrenzen (x, y, wdt, hgt) liegt. Normalerweise vor, bei loosebounds nach der Transformation.
- solid
-
Standardalgorithmus. Gibt immer wahr zurück.
- random
-
Zufall. Der Parameter a gibt die Wahrscheinlichkeit an; je höher a, desto seltener ist der Punkt ausgefüllt.
- checker
-
Abwechselnd ausgefüllte Kästen der Größe 10 (bei normalem Zoom)
- bozo
-
Flecken. Über a kann die Fleckengröße verringert werden.
- sin
-
Horizontale Sinuskurve; Bei Standardzoom beträgt die Amplitude 10, die Periode 20 Pixel.
- boxes
-
Regelmäßige Blöcke. a gibt die Blockgröße, b den Abstand der Mittelpunkte an.
- rndchecker
-
Wie checker, jedoch ist die Erfüllung nicht alternierend sondern zufällig.
- lines
-
Senkrechte Linien. a gibt die Linienstärke an; b den Abstand der Linienmitten.
- border
-
Zieht einen inneren Rahmen im übergeordnete Layer (bzw der gesamten Operatorkette). a und b sind die horizontale und vertikale Rahmendicke. Da zur Berechnung das übergeordnete Layer abgefragt werden muss, darf dieses natürlich nicht als Gruppe (grp) definiert sein.
- mandel
-
Zeichnet die Mandelbrotmenge in den Zielbereich. Über den Parameter a kann die Iterationstiefe verändert werden (Standard 1000). Ungezommt wird das gesamte "Apfelmännchen" in den Zielbereich gezeichnet (entspricht dem Bereich -2-2i bis 2+2i)
- rndall
-
Der gesamten Bereich gilt als erfüllt oder nicht erfüllt, je nach Zufallswert. Der Parameter a gibt die Erfüllungschance in Prozent an. Mit diesem algo können beispielsweise mehrere Karten untergeordnet von einem mask=1-Layer angegeben werden, zwischen denen dann gewählt wird.
- Script
-
Das Verhalten des Algorithmus wird durch eine Script-Funktion im Szenarioscript festgelegt. Diese sollte folgende Form haben:
func ScriptAlgo[Overlay-Name](x, y, alpha, beta)
Als Rückgabewert wird 0 (= kein Material) oder 1 (= Material) erwartet. x und y sind die Koordinaten (in Pixeln), für den der Algorithmuswert zurückgegeben werden soll. iAlpha und iBeta entsprechen den Algo-Parametern a und b.Hat die Ebene keinen Namen, wird die Funktion "ScriptAlgo" benutzt. - poly
-
Ein Pixel gilt als erfüllt, wenn er innerhalb des durch die im overlay enthaltenen Punkte definierten Polygons liegt. Punkte können wie folgt angegeben werden
point { x=<X-Coordinate of the vertex><Unit>; y=<Y-Coordinate>><Unit>; };
Beispiel:overlay { algo=poly; mat=Earth; point { x=10px; y=25%; }; point { x=20px; y=25%; }; point { x=10px; y=75%; }; point { x=20px; y=75%; }; point { x=30px; y=50%; }; };
Operatoren
Mehrere Ebenen können mit Operatoren verbunden werden. Diese werden von oben nach unten ausgewertet, und es wird nur das unterste Glied der Operatorkette ggf gezeichnet. Bei einer Gruppe (grp) werden zusätzlich die untergeordneten Ebenen in die Auswertung mit einbezogen und nicht gezeichnet. Definierte Operatoren sind | (oder), & (und) und ^ (exklusiv oder).