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:
Objekttyp [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=Wert;
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 (Ab CE). Bei Doppelten Zuweisungen gilt das zuletzt definierte.
Zusätzlich zu den Attributen können wieder untergeordnete Objekte definiert und mit Operatoren verknüpft werden:
Objekt1 Operator Objekt2;
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.c4g 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](iX, iY, iAlpha, iBeta)
Als Rückgabewert wird 0 (= kein Material) oder 1 (= Material) erwartet. iX und iY 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 durch
point { x=<X-Koordinate des Eckpunkts><Einheit>; y=<Y-Koordinate>><Einheit>; };
angegeben werden. Ab CE. 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).
Sven2, Juli 2001