                                                        25.04.1994
                                                        Wilnsdorf
Wie man neue Level fr das Spiel 'KARL QUAPPE'
                (Copyright 1994 Malban)
erstellt.


Ein Level kann mit jedem blichen Editor erstellt werden.
Ein '#' leitet immer Einen Kommentar ein, dort kann stehen was will.
( Mit Umlauten kann es Schwierigkeiten geben !!! )
Es werden immer die Zahlen hintereinander gelesen, was fr ein Zeichen
dazwischen steht, ist eigentlich egal, ich verwende immer ein Komma,
es erscheint mir am sinnvollsten.
Natrlich muessen aufeinanderfolgende Zahlen IRGENDWIE voneinander
unterscheidbar sein, sprich- es muss ein Trennzeichen vorhanden sein.
Rein theoretisch kann man den ganzen Level in eine Zeile packen,
wird nur ein wenig unbersichtlich.
Man kann auch nur jede zweite Zeile eine Zahl schreiben, aber das ist
dann genauso unbersichtlich.


Um die erstellten Level in das Spiel mit einzubeziehen, muessen diese in
die 'level.ini'-Datei bernommen werden.
Dies kann man ebenso mit jedem Texteditor machen.
Die Zahl die ganz am Anfang steht ist die Anzahl der LEVEL.

Dann werden die Dateinamen der Level angegeben, es empfiehlt sich die
Level mit '.lvl' enden zu lassen.
Zwischen den Dateinamen der Level drfen KEINE Leerzeilen stehen.
Die Dateinamen sind NUR die Namen, keine Pfadangaben. Die Level werden immer
in dem LEVEL Unterverzeichnis gesucht.


Konvention:
===========

Auf der Strae werden fnf Fahrzeugreihen untereinander dargestellt, um diese
Fahrtrichtungen auseinanderzuhalten, spreche ich von nun an von LANE 1-5.
Wobei lane 1 die unterste Fahrtrichtung darstellt, und lane 5 die dem
Grnstreifen am nchsten gelegene.
Im Flu werde ich diese Streifen im weiteren mit RIVER 1-5 bezeichnen, wobei
river 1 dem Grnstreifen am nchsten ist und river 5 dem Ziel.

Angaben der Strukturen wie in 'C'.


Folgendes sind die verwendeten Strukturen
=========================================


MOBs
====

Als erstes die Struktur eines MOBs (Movable OBject).
Der Bildschirm ist ja in zwei Hlften aufgeteilt, in der unteren fahren die
Autos, in der oberen Hlfte schwimmen Sachen in einem Flu.

Jedes dieser Autos, bzw. Sachen im Flu ist ein solches MOB.
In den Leveln werden die MOBs durch eine Struktur dargestellt, die wie folgt
definiert ist:

typedef struct {
		int start_x,
		    start_y,
		    speed,
		    loeschen,
		    item,
		    zusatz;
		} MOB;

Also hat jedes MOB eine Startposition, gegeben durch die Koordinaten
'start_x' und 'start_y'. Diese Startposition ist relativ zu der virtuellen
Breite des jeweiligen Levels (siehe weiter unten).
Jedes dieser MOBs hat noch eine Geschwindigkeit, 'speed', dieser
Wert reicht von -5 bis +5. Wobei das Vorzeichen die Richtung angibt, und
der Betrag, die Geschwindigkeit angibt.
Eine Null gibt an, das auf dieser lane kein MOB mehr kommt.
Der nchste Eintrag, 'loeschen', ist redundant zum vorherigen, ich glaube sogar
er wird berhaupt nicht mehr benutzt, ist aber aus Faulheit in der Struktur
geblieben. Hier sollte man 2*(ABS(speed)) eintragen. (Also den doppelten
Wert der Geschwindigkeit, wenn dieser im negativen liegt, dann das 'Minus'
weglassen)
Der nchste Eintrag, 'item', bezieht sich auf das Aussehen des Objektes.
Ist man auf der Strasse, so sind Werte von 0-4 zugelassen, das sind die
5 unterschiedlichen Autotypen.

        0 - rotes Auto
        1 - weies Auto
        2 - blaues Auto
        3 - LKW
        4 - kleines Auto

Wenn man MOBs im Flu darstellen will, gilt folgendes:

        0 - groer Baumstamm
        1 - kleiner Baumstamm
        2 - Krokodil
        3 - Schildkrte

Der letzte Eintrag, 'zusatz', spielt nur in den river-Gebieten eine Rolle.
Eine 1 hinter einer Schildkroete bedeutet sie kann abtauchen.
(steht eine 0 hinter der Schildkroete, dann taucht sie NIE ab)
Eine 2 hinter einem Krokodil bedeutet, da es sein Maul auf und zu machen kann.
Fr die Lnge der einzelnen Phasen, siehe weiter unten.
Man sollte wenn keines der gerade erwhnten Effekte gewnscht wird IMMER
eine 0 eintragen, es knnte sonst zu komischen Nebenwirkungen kommen.


Gleichaussehende MOBs knnen sich NUR in eine Richtung bewegen, bewegen sich
MOBs mit dem gleichen Aussehen in entgegengesetzte Richtungen, kommt es zu einer
Fehlermeldung.
Einzige Ausnahmen sind Schildkrten und kleine Baumstmme, diese knnen jeweils
in beide Richtungen vorhanden sein.


Der eigentliche Level
=====================

In jeder lane und in jedem river knnen maximal 9 MOBs sein. insgesamt also
theoretisch bis zu 90 MOBs. Dieser Wert ist allerdings nicht erreichbar, ich
habe die Anzahl der MOBs auf 60 beschrnkt (Ohne jede Motivation, ich denke
einfach 60 reichen (mein Rechner schafft 'eh nicht mehr), wenn jemand mehr
bentigt, dann ist das kein Problem, einfach Bescheid sagen).


So sieht die Level-Struktur aus :

typedef struct {
		MOB Lane[5][9];
		MOB River[5][9];  // in aufsteigender Reihenfolge, wichtig fuer otter

		int croco_auf;
		int croco_zu;

		int turtel_oben;
		int turtel_unten;

		int zeit_zaehler;

		int fliege_erlaubt;
		int zeit_fliege;
		int zeit_keine_fliege;

		int ali_erlaubt;
		int zeit_ali;
		int zeit_keine_ali;

		int frog_girl;	// 0 keine, >0 ja, auf Baumstamm lane 0 log frog_girl-1
		int level_breite_fluss;
		int level_breite_strasse;
		int frog_appearence;

		int snake1_speed;  // auf gruen1 0 nicht da sonst +- Richtung und speed
		int snake1_wieoft;
		int snake1_anim_speed;
		int snake1_art;    // 0 auf gruen, >0 big_log-1
		int snake1_pos;
		int snake2_speed;  // auf gruen2 0 nicht da sonst +- Richtung und speed
		int snake2_wieoft;
		int snake2_anim_speed;
		int snake2_art;
		int snake2_pos;
		int snake3_speed;  // auf Baumstamm1 (log_big)  gruen2 0 nicht da sonst +- Richtung und speed
		int snake3_wieoft;
		int snake3_anim_speed;
		int snake3_art;
		int snake3_pos;

		int otter_allow;
		int otter_wann;
		} LEVEL;


Als erstes werden die weiter oben eingefhrten MOBs fr den ganzen Level
angegeben. Diese sind in 9er Gruppen aufgeteilt, nmlich immer 9 mgliche
fr jede lane und fr jeden river.
Werden in einer lane oder river weniger als 9 bentigt, so muss als
'speed'-Wert eine 0 eingegeben werden, dann werden die restlichen des
9er-Packets nicht mehr beachtet.

In den river Bereichen mssen die Elemente in aufsteigender Reihenfolge
angegeben sein. Das heit, ein Element das im Flu weiter rechts steht, mu in
der Auflistung weiter unten stehen. (Die bentige ich fr das auf- und
unter-tauchen des Otter)

Nachdem die ganzen MOBs eingegeben sind, werden jetzt noch Werte fr die
Extras bentigt (Fliegen, Otter, Krokodile, Weibchen ...).


Als erstes kommen die Zeiten fr das Maul des im Fluss schwimmenden
Krokodils. Wenn hinter einem Krokodilmob als 'zusatz' eine 2 steht, dann
gelten fr das Krokodil folgende Werte:

'croco_auf'     Gibt den Wert in Ticks an, nachdem das Krokodil das Maul
                wieder zumacht.

'croco_zu'      Gibt die Zeit in Ticks (eine von mir in dem
                Spiel verwendete Zeiteinheit 1 Tick = ca. 1/60 sec),
                an, die das Krokodil das Maul zu hat.

Der erste Wert muss also groesser sein als der zweite. Die Differenz der
beiden Werte gibt an, wie lange (in Ticks) das Maul auf bleibt.
Der niedrigere Wert gibt an, wann das Krokodil das Maul auf macht, der hhere,
wann er das Maul wieder zu macht.
(Ist eine etwas blde Konstruktion ich wei, aber es ist nun erstmal so
programmiert, und dann nicht mehr gendert worden ...)

Die nchsten Werte sind genauso dmlich konstruiert:

'turtel_oben'   Gibt in Ticks den Wert an, wann die Schildkroete wieder
                auftauchen soll.

'turtel_unten'  Gibt in Ticks den Wert an, wann die Schildkroete anfangen
                soll unterzutauchen.

Bedeutung der Werte ist genauso zu interpretieren, wie die der Krokodilmuler.


Der nchste Wert,'zeit_zaehler', gibt die Geschwindigkeit an, mit der die Zeit
heruntergezaehlt wird. Da ich auf (Zeit MODULO 100)==0 prfe, sind nur
folgende Werte zugelassen :1, 2, 4, 5, 10, 20  25, 50, c*100(c Element [1..50])
Sinnvoll sind allerdings nur die Zahlen 1, 2, 4, 5
Wobei 5 schon ziemlich schnell herunterzhlt.
(Die Zeit die ein Frosch zur Verfgung hat, wenn hier der Wert 1 eingetragen
 ist, betrgt 5400 Ticks).


'fliege_erlaubt' ist ziemlich selbsterklaerend, eine 0 bedeutet es erscheint
keine Fliege im Huschen, eine 1 bedeutet eine Fliege erscheint (zufllig).

'zeit_fliege' gibt die Zeit in Ticks an, die eine Fliege in dem Huschen
bleibt.

'zeit_keine_fliege' gibt die Zeit in Ticks an, die zwischen dem
verschwinden einer Fliege und dem erneuten Auftauchen einer Fliege vergeht.

Die folgenden drei Eintrge 'ali_erlaubt', 'zeit_ali', 'zeit_keine_ali',
entsprechen genau den obigen Werten nur in Bezug auf das Krokodil in dem
Huschen, nicht auf die Fliege.


'frog_girl' gibt an, ob ein Mdchen auftaucht oder nicht. 0 bedeutet, dass kein
Mdchen auftaucht. Ein Wert grsser Null, gibt das MOB in River 1 an, auf dem
das Mdchen auftaucht. Es wird immer angenommen, da ein kleiner
Baumstamm dort zu finden ist (Es kann zu seltsamen Effekten kommen, sollte
dort kein kleiner Baumstamm sein, sondern was anderes).

'level_breite_fluss' gibt die virtuelle Levelbreite des Flusses an.
Mindestens sollte hier 412 gewhlt werden, nach oben gibt es (fast) keine
Einschrnkungen. (Fast, weil eine integer Zahl verwendet wird, also ist
bei 32767 Schluss, aber so grosse Werte sind Unsinn)
Die Werte muessen durch 4 teilbar sein !!!
Virtuelle Levelbreite bezeichnet, im Gegensatz zu Bildschirmbreite, die Breite,
die z.B. ein Baumstamm zurcklegen muss, um wieder auf der gleichen Stelle zu
sein. Wre dieser Wert gleich der Bildschirmbreite, so wrde jeder Baumstamm,
der aus dem Bildschirm treibt, sofort wieder auf der anderen Seite des
Bildschirmes hereintreiben.
Dieser Wert gilt nur fr die obere Bildschirmhlfte.

'level_breite_strasse' der den obigen Wert entsprechende fr die
untere Bildschirmhlfte.

'frog_appearence' dieser Wert gehrt noch zu den Einstellungen von dem
Frosch-Mdchen. Er gibt an, alle wieviele 'Runden' das Mdchen auf dem
Baumstamm erscheint. 1 bedeutet jede Runde, 5 bedeutet z.B. nur
alle 5 Runden.

Es folgen die Einstellungen fr die Schlangen. Die Werte sind
3 mal vollkommen identisch, weshalb ich auch nur die Werte fr
eine Schlange angebe.

'snake_speed' gibt die Geschwindigkeit der Schlange an, Werte von -5 bis +5
sind hier wie oben zugelassen (0 bedeutet, da keine Schlange auftaucht).

'snake_wieoft' gibt den Verzgerungswert fr das Auftauchen einer
Schlange in Ticks an. Dies gilt nur, wenn die Schlange sich auf dem Grnstreifen
bewegt.

'snake_anim_speed' gibt einen Wert fr die Bewegungsgeschwindigkeit der Schlange
an. Eine Schlange mit hherer Geschwindigkeit wird sich auch schneller bewegen.
Werte von 4-20 sind sinnvoll. 4 bedeutet, die Schlange bewegt sich schnell,
20 - sie bewegt sich langsam.

'snake_art' Wenn hier eine 0 steht, dann wird die Schlange auf dem
Grnstreifen auftauchen. Steht hier ein Wert grsser als 0, dann wird
die Schlange auf dem in river 3 befindlichen Baumstamm mit der Nummer, die hier
angegeben ist auftauchen. Es wird immer angenommen, da es sich dabei um
einen grossen Baumstamm handelt. (Sollte man auch so erstellen, sonst kann
es wie blich zu seltsamen Effekten kommen)

'snake_pos' gibt den offset zur Position 0 an. Wenn die Schlange sich auf
dem Grnstreifen bewegt, dann wird hier einfach die X-Koordinate
angegeben, bei der die Schlange auftauchen soll (0-320).
Befindet sich die Schlange auf einem Baumstamm, wird dieser Wert zu
Startposition des Baumstammes hinzuaddiert. (Dies sollte dann natuerlich nicht
die Lnge des Baumstammes berschreiten, sonst kann es schon wieder zu diesen
oben genannten seltsamen Effekten kommen)

'otter_allow' eine 0 besagt, da kein Otter auftauchen wird. Eine 1 besagt dann
natrlich, da Otter auftauchen knnen.

'otter_wann' gibt wieder die Zeit in Ticks an, die zwischen dem Abtauchen eines
Otter und dem erneuten wieder Auftauchen eines Otter verstreichen mu.





