HINWEIS: Das Skript benötigt mindestens die EXTRA-EDITON! Haben Sie nur die Standart, müssen Sie die Inventar-Bitmaps neu definieren! Das Skript funktioniert (momentan) nur auf einer Auflösung von 1024x768!

HANDBUCH: POINT AND CLICK-ADVENTURES

ERSTE VERSION DES HANDBUCHS. Bitte Fehler und vor allem unverständlichkeiten melden. Vielen Dank!

DER LEVELAUFBAU

Der Levelaufbau mit diesem Code funktioniert Bildschirmweise. Das heisst, jeder Raum bekommt seinen eigenen Level. Nachdem Sie ihren Level aufgebaut und mit Texturen versehen haben (Wichtig: Der Raum braucht eine Skybox, welche NICHT passable sein darf!!! Auch ein unsichtbarer Block ist da möglich), platzieren Sie die Kamera möglichst so, dass fast alles vom Level gesehen werden kann und der Spieler auf jeden wichtigen Punkt klicken kann.

Setzen Sie das Spielermodell ins Level. Geben Sie ihm die Action "hero". Wenn sie FLAG1setzen, wird der x-Wert der Kamera sowie der z-Wert der Kamera mit den Werten des Spielers gleichgesetzt. Dies ist bei langen Leveln nützlich. Setzen Sie FLAG2, so wird sich die Kamera immer auf den Spieler richten - wo auch immer dieser hingeht.

OBJEKTE EINBAUEN

Laden Sie das Objekt, dass sie einbauen möchten, in den WED. Sie müssen diesem nicht einmal eine Action geben (es sei denn, sie möchten später damit etwas anstellen, oder es soll damit etwas angestellt werden), einfach bei Skill1 eine bestimmte Zahl einsetzen. Diese Zahl sollten Sie sich merken (Sie wird im späteren ID genannt). Wenn Sie FLAG1 setzen, so kann das Objekt aufgenommen werden. Setzen Sie FLAG2, so kann man mit dem Objekt reden. Dazu später mehr.
Dem Objekt einen Namen geben
Öffnen Sie die Datei "names" mit einem Texteditor, etwa Notepad. NICHT Word oder so etwas! In dieser Datei stehen die Namen der Objekte. Der Name eines Objektes steht an der Stelle, die mit Skill1 angegeben wird. Hat ihr Objekt also 1 als Skill1, so hat es den Namen, der als erstes in dieser Datei zu lesen ist. Der nächste Name wird an das Objekt, mit der Nummer 2 als Skill1 vergeben, und so weiter. (Sie setzen also ein Objekt in ihr Level. Nehmen wir an, es handelt sich um einen Baum. Geben Sie nun einen Wert für Skill1 ein. Wenn ihr Baum das erste Objekt ist, geben Sie die Nummer 1 ein. In die Datei schreiben Sie nun "Baum" als erstes, fertig!) Die Verben ("Untersuche", "Nimm", "Rede mit", "Gehe zu") werden automatisch hinzugefügt.

SPRECHSTUNDE

Wenn Sie ein Objekt wünschen, das sprechen kann, so führen Sie die gleichen Schritte aus, wie beim einfügen normaler Objekte. Setzen Sie Flag2 und geben Sie der Entity einen bestimmten Namen. Dieser Name gibt die Datei an, in der der Dialog enthalten ist (Dateiendung wird automatisch hinzugefügt). Beispielsweise: Sie haben einen Smiley in ihr Level geladen. Setzen Sie Flag2 und geben Sie ihm den Namen "talk_smiley" (ohne die "). Nun Erstellen Sie eine neue TXT-Datei mit dem Namen talk_smiley. Nun geben Sie den Dialog ein. Dieser Prozess ist nicht ganz so einfach, da er viele Möglichkeiten bietet, aber ich erkläre ihn nun (wer hätte das gedacht).

Jeder Dialog ist in Kapitel aufgeteilt. Jedes Kapitel enthält eine Dialogzeile des Angesprochenen, sowie mehrere Zeilen zur Auswahl für den Spieler. Zu Anfang eines Kapitels müssen sie ein solches definieren, das machen Sie mit "chapter" und der Nummer des Kapitels. Zu Anfang ist dies 1 (das erste Kapitel MUSS 1 sein, es darf kein Kapitel 0 geben!). Schreiben Sie also:

chapter1

Gut, das Kapitel ist definiert. Nun die Dialogzeile des Angesprochenen (des Smileys, beispielsweise):

Hallo ich bin ein Smiley und lache den ganzen Tag!

WICHTIG: ES DARF KEIN KOMMA VORKOMMEN!
Dies ist also der Satz, den die Entity als erstes sagt. Nun tippen Sie die erste Antwortmöglichkeiten ein, bis zu Fünf (5) sind möglich:

Hallo Mr. Smiley
2

Sie fragen Sich, was die 2 zu bedeuten hat? Nachdem der Spieler diese Antwortmöglichkeit ausgewählt hat, springt der Dialog zu Kapitel 2. Wenn Sie möchten, dass nach Auswahl einer Zeile zu Kapitel 23 gesprungen wird, so schreiben Sie 23 unter die Zeile. Soll der Dialog danach beendet werden, schreiben Sie 0.
Mit der Zeilendefinition machen Sie nun weiter, bis Sie bei der letzten Zeile (entweder Sie möchten keine mehr, oder die fünfte ist erreicht) angekommen sind. Darunter schreiben Sie END. Sobald wir an dieser Zeile angekommen sind, weiss das Skript: Das Kapitel ist zu ende. Da das ganze evtl. nicht ganz leicht zu verstehen ist, habe ich die Datei demo_talk angehängt. Sie enthält einen funktionierenden, verzweigten Dialog mit erstaunlich wenig Humor.

BEFEHLE IM DIALOGSKRIPT

Vielleicht möchten Sie nach einer bestimmten Dialogzeile bestimmte Dinge geschehen lassen? Oder eine Zeile reicht ihnen nicht? Dafür gibt es bestimmte Parameter, die sie einfach vor die Zeile schreiben. Das sind die folgenden:

e:
Wenn Sie ein "e:" vor die Zeile schreiben, so spricht der Angesprochene mehrere Zeilen Text. (Funktioniert wie ein \n in WDL). BEISPIEL:
chapter4
Hallo?
e:Geht es dir gut?
...
"Geht es dir gut" wird in diesem Beispiel unter "Hallo?" angezeigt. HINWEIS: Diese Option steht nur beim Sprechenden zur Verfügung, nicht bei den Antworten.

do:
Führt die nachfolgende Zeile C-Skript aus. HINWEIS: Es sind KEINE While-Schleifen möglich! Zugriffe auf alle Pointer außer selected_entity ist möglich. Parameter von Modellen, die keine Action zugewiesen haben, lassen sich NICHT verändern! Alle Befehle, die ein warten veranlassen (sleep, beispielsweise) sind NICHT möglich. Beachten Sie, dass dies nur beim Angesprochenen zur Verfügung steht und die erste Zeile nach chapter ein normaler Text-String sein muss. BEISPIEL:
chapter4
Dafür werde ich dich verschwinden lassen!
do:player.invisible = on;
...
Hier wird der Player unsichtbar gemacht. Da der Spieler eine Action zugewiesen bekommen hat (hero), können wir auf ihn zugreifen.

wait:
Dieser Befehl funktioniert wie sleep in WDL. Nach der Eingabe von wait: können Sie eine beliebige Zahl eingeben. Das Skript wird diese Anzahl Sekunden warten, bis es fortfährt. So ist es möglich, dass der Sprecher eine kleine Pause macht. BEISPIEL:
chapter37
Okay. Mir fällt noch ein Witz ein!
wait:5
e:Äähm... Na gut. Doch nicht.
...
In diesem Beispiel wird die erste Zeile angezeigt. Anschließend wartet das Skript 5 Sekunden, dann wird die zweite Zeile angezeigt.

if:
Fügen Sie hiernach eine Bedingung ein (wie sie es zwischen den Klammern einer if-Bedingung in C-Skript tun). Die nachfolgende Zeile wird nur ausgeführt, wenn die Bedingung WAHR ist. BEISPIEL:
chapter7
Hallo!
if:adv_var[56]==1
e:Haben wir schon über dieses... Ding geredet?

In diesem Beispiel wird die Zeile "Haben wir schon über dieses... Ding geredet?" nur angezeit, wenn adv_var[56] (das ist ein Array) = 1 ist. Es ist zwar möglich, entity-Skills für die IF-Bedingung zu verwenden, es ist jedoch nicht empfehlenswert, da dieser nach einem Raum-wechsel (hier also ein Level-Wechsel) wieder 0 beträgt. HINWEIS: Für die IF-Bedingungen ist ein Array namens adv_var vordefiniert. Dieser speichert bis zu 500 Einträge. Um ihn nutzen zu können einfach adv_var[x] eingeben, wobei x eine Zahl zwischen 0 und 499 sein kann. adv_var[x] funktioniert ansonsten wie eine Variable (es ist also quasi so, als seien 500 Variablen vordefiniert). Denken Sie auch daran bei IF-Bedingungen zwei "=" zu verwenden!

HILFE!!! INVENTAR!

Manche Objekte lassen sich aufnehmen. Laden Sie dieses wie gewohnt in ihr Level, geben Sie die ID in Skill1 ein, Name und Beschreibung in die TXT-Dateien. Nun setzen Sie FLAG1. Jetzt öffnen Sie die Datei inventory_names. Im Inventar wird eine Bitmap angezeigt, welche das aufgenommene Objekt symbolisiert. Da ich nicht weiß, wieviele und vor allem welche Objekte Sie möchten, müssen sie diese wohl oder übel hier angeben. Schreiben Sie einfach den Namen einer zuvor in C-Skript definierten Bitmap hin. (also etwa cookie_map). Wenn Sie die Bitmap noch nicht definiert haben, tun Sie dies nun.
Schreiben Sie vor der INCLUDE - Zeile:
BMAP NAMEIHRERDEFINITION= IHREBITMAP;
Und setzen Sie einfach ihre Namen ein für NAMEIHRERDEFINITION (den selben Namen, der auch in der invent_files-Datei steht!) und IHRE BITMAP (verwenden Sie am spitze Klammern).

HILFE! ICH WERDE BENUTZT!

HINWEIS: Momentan ist es nicht möglich, Objekte innerhalb des Inventars zu benutzen. Dies wird in einer der nächsten Versionen integriert.
Oh mein Gott! Ein Objekt wird mit einem anderen benutzt! Damit dies möglich ist, benötigt das zu manipulierende Objekt eine angehängte Datei. Wenn man mit dem Objekt reden kann, können Sie die selbe benutzen. Ansonsten müssen Sie eine neue definieren. In diese schreiben Sie nun:

use_xxx
was geschehen soll

Anstatt des xxx setzen Sie den Skill1-Wert des Objektes ein, mit dem das Objekt benutzt wird.
BEISPIEL:
Sie haben also ein Objekt mit dem Wert 1 für Skill1 und Flag2 gesetzt. Nun kann man es aufnehmen (denken Sie an die Inventar-bitmap-definition!). Nun soll ein anderes Objekt ETWAS tun, wenn man es mit dem eben erwähnten Objekt benutzt. Schreiben Sie also in die definierte Datei use_001. Die nachfolgende Zeile wird ausgeführt, wenn der Spieler das zuerst definierte Objekt (mit 1 als Skill1) mit dem anderen Objekt (mit der angehängten Datei, die wir gerade ändern) benutzt. Hier wollen wir einen Dialog starten:

use_001
needb = 8; start_dialog=1;

Durch das Setzen der Variable start_dialog wird - wer kanns erraten - ein Dialog gestartet. Der Dialog beginnt in dem Kapitel, das durch needb angegeben wird (hier also 8). Denken Sie an die ";"!

DAS SETZEN DER NODES FÜR DIE WEGFINDUNGSROUTINE

Laden Sie ein beliebiges Model in den WED. Dafür können Sie etwa "dummy.mdl" benutzen. Nun verpassen Sie dem Objekt die Action "node". In SKILL1 tragen Sie nun eine Node-ID ein (HINWEIS: Die IDs von Nodes und anderen Objekten dürfen sich überlappen, da Sie im Spiel selbst vom Nutzer nicht erkannt werden können). In den darauffolgenden Skills tragen Sie ein, zu welchen anderen Nodes dieser eine Verbindung haben kann. Setzen Sie FLAG1, wird der Spieler erst zu diesem Node gehen und erst anschließend zum darauffolgenden Node.

TÜREN UND DURCHGÄNGE

Sie wollen mehr als einen Raum? Na so was. Zum Glück habe ich mit so etwas gerechnet und gleich die Action dafür geschrieben. Laden Sie das Türen-Modell in WED und setzen Sie (und dass ist wichtig) FLAG3. In Skill1 geben Sie wie gewohnt die ID ein, geben Sie auch Namen sowie einen Beobachtungstext in die beiden externen Dateien "names.txt" und "watch.txt" ein. Als Namen geben Sie der Entity den Namen des zu ladenden Levels (ohne Endung). In Skill2, Skill3 und Skill4 geben Sie die x, y und z-positionen des Ortes ein, an der Spieler erstellt wird.

SPEICHERN UND LADEN

Dafür gibt es zwei Funktionen: saving_number(stringa,a) und loading_number(stringa,a). Rufen Sie diese auf und geben Sie einen String an, sowie eine Nummer, welche an den String angehängt wird. Möglich wäre etwa saving_number("Test",1); . Dies würde ein Spiel unter dem Namen "Test1.sav" speichern. Um dieses zu laden loading_number("Test",1); verwenden. NICHT den Befehl game_save verwenden! NUR diese Funktionen!

So, das war glaube ich alles. Anschließend die komplette Liste an gültigen Befehlen, sowie was Skills und Flags bewirken

BEFEHLSLISTE

IM DIALOG

chapterx
FÜGEN SIE FÜR x EINE ZAHL EIN
Definiert ein neues Kapitel

ANTWORTMÖGLICHKEIT
Schreiben Sie nach allen Zeilen des Angesprochenen bis zu fünf Antwortmöglichkeiten. BEISPIEL:
chapter2
Hallo! Hier sprecht der Angesprochene!
Dies ist Antwortmöglichkeit Nummer 1!
5
Dies ist Antwortmöglichkeit Nummer 2!
6
Hier ist die dritte Antwortmöglichkeit!
7
Nach dieser Antwortmöglichkeit beenden!
0
END

Die Zahl unter der Antwortmöglichkeit gibt an, zu welchem Kapitel gesprungen wird, wenn diese Antwortmöglichkeit ausgewählt wurde. Bei 0 wird der Dialog beendet. Nach der letzten Antwortmöglichkeit muss END folgen, wenn keine fünf Antworten verwendet wurden.VERFÜGBAR: Zwischen Text und eventuellen nachfolgenden Befehlen des Angesprochenen und END.

e:
Fügt eine zusätzliche Zeile ein, die der Angesprochene spricht. BEISPIEL:
chapter6
Dies ist Zeile 1!
e:Dies ist die zweite Zeile! das e: am Anfang wird nicht angezeigt!
Hier Antwortmöglichkeit Nummer 1
14
VERFÜGBARKEIT: Nach der ersten Zeile Text des Angesprochenen, auch nach anderen Anweisungen. do: Führt sämtlichen in der selben Zeile nachfolgenden C-Skript-Code aus. Der my-Pointer zeigt auf die sprechende Entity. If-Anweisungen sind möglich, While-Schleifen nicht. Sämtliche Skills lassen sich zwar umdefinieren sind aber nach einem Level-wechsel (also raumwechsel) nicht mehr gültig - nehmen sie stattdessen besser Variablen. Zu diesem Zweck vordefiniert ist der Array adv_var[500]. BEISPIEL:
chapter22
Dies ist der Text des sprechenden!
do:adv_var[50]=6; my.pan -= 180; camera.roll = 90;
Dies ist die erste Antwortmöglichkeit!
6
In diesem Beispiel wird adv_var[50] auf 6 gesetzt, der sprechende dreht sich um und die Kamera dreht sich. Die Kamera-roll-definition sowie die my-pan definition sind nach einem Levelwechsel (=Raumwechsel) nicht mehr aktiv.VERFÜGBARKEIT: Nur solange der Angesprochene spricht. Die erste Zeile nach chapterx MUSS ein Text-String sein.

wait:
Wartet die angegebene Zahl von Sekunden. BEISPIEL:
chapter7
Ich warte 5 Sekunden...
e:dann sage ich noch was!
wait:5
e:Und zwar Hallo!
ANTWORTMÖGLICHKEIT 1
1
END
Hier wartet das Skript 5 Sekunden lang. VERFÜGBARKEIT: wait ist nur zwischen Textzeilen und Befehlen des Angesprochenen verfübar.

if:
Führt die nachfolgende Zeile C-Skript-Code aus, wenn die in der selben Zeile nachfolgende Bedingung WAHR ist. HINWEIS:If-Anweisungen sind auch im Do-Code möglich, dann jedoch im normalen C-Skript-Syntax (IF(bedingung==1) { ...).
Nach dem IF schreiben Sie die Bedingung so, wie sie auch zwischen den Klammern einer IF-Bedingung in C-Skript steht.BEISPIEL:
chapter1
if:adv_var[3]==0
BRING MIR WASSER!
if:adv_var[3]==1
Danke dass du mir Wasser gebracht hast!
Ups - mit dir wollt ich gar nicht reden...
0
if:adv_var[3]==0
Ich soll dir Wasser bringen?
3
if:adv_var[3]==1
Ich habe dir gerne Wasser gebracht
13
END
IF können Sie vor jede Zeile schreiben, die nachfolgende wird nur ausgeführt, wenn die Bedingung wahr ist. Schreiben Sie IF in einem Antwortstring, so werden die nächsten ZWEI Zeilen übersprungen, wenn die Bedingung falsch ist (also Antwortmöglichkeit + Kapitelzahl, in das gesprungen wird).VERFÜGBARKEIT: IF können Sie jederzeit verwenden, außer: vor einer Kapitelzahl, in das gesprungen werden soll (schreiben Sie iF stattdessen vor den Antwortstring und definieren Sie zwei verschiedene Antwortstrings), sowie vor dem ersten Antwortstring. Dieser muss ohne IF erfolgen (bestenfalls also hier eine Antwort die zum Abbruch des Gespräches führt).

use_xxx Verwenden Sie die ID des zu benutzenden Gegenstandes statt xxx!
Die nachfolgende Zeile C-Skript-Code wird ausgeführt, wenn der Spieler das Objekt mit dieser ID mit dem Objekt mit dieser angehängten Datei benutzt (angehängt bedeutet: Das Objekt hat denselben Namen wie die Datei). BEISPIEL:
use_012
my.pan -= 180; start_dialog = 1; needb = 57;
Hier gilt das selbe, wie bei do. Wenn start_dialog auf 1 gesetzt wird, wird ein Dialog gestartet. Dieser beginnt in dem Kapitel, welches durch needb angegeben wird (hier 57). VERFÜGBARKEIT: use ist NUR AM ANFANG der Datei verfügbar.

BAUSTEINE

Vielleicht wollen Sie, dass etwas bestimmtes geschieht, doch es gibt keinen Befehl dafür? Hier sind einige Codezeilen, die Sie verwenden können (bei do oder nach use_xxx zum Beispiel):
DEM SPIELER DAS OBJEKT WEGNEHMEN, MIT DEM ICH BENUTZT WURDE:
inventar[inventar_start+(maus_zahl-1)]=0;

DEM SPIELER EIN NEUES OBJEKT MIT DER ID xx GEBEN (Setzen Sie ihre eigenen Zahlenwert für xx ein!):
inventar[inventar_stelle+1]=xx;

DER SPIELER SOLL EINEN BESTIMMTEN TEXT SAGEN
Dafür gibt es die Funktion player_says(string). Soll der Spieler also etwa sagen "Was für ein seltsamer Ort", tippen Sie: player_says("Was für ein seltsamer Ort!");
Das Skript wartet danach eine gewisse Zeit, die von der Länge des Strings abhängt. Möchten Sie die Zeit selber festlegem, können Sie die Function player_says_time(string,a) aufrufen, wobei string der zu sagende String ist und a die Zeit, die gewartet werden soll (in Ticks). Dies steht aufgrund des benötigten Kommas NUR in den Skript-Dateieien zur Verfügung, NICHT in den TXT-Dateien!

DAS SKRIPT ANHALTEN
Setzen Sie die Variable adv_freeze auf 1, so werden innerhalb des nächsten Frames alle Funktionen gestoppt sein. Sobald die Variable wieder auf 0 steht, laufen die Skripte weiter.

VARIABLEN

Dies sind einige der wichtigsten Variablen. Alle sind auch im Dialogskript und nach dem Benutzen verfügbar!
start_dialog - Wenn 1 wird ein Dialog mit der Entity gestartet, auf die selected_entity zeigt! selected_entity ist, wenn nicht umdefiniert, die Entity, auf die mit der Maus gezeigt wird.
dont_move_there - Wenn diese Variable 1 ist, geht der Spieler nicht zum Objekt, mit dem es sprechen soll

BESCHRÄNKUNGEN

--> Das Inventar darf nie mehr als 100 Objekte enthalten (gleichzeitig)
--> In allen Dateien darf kein Komma (",") vorkommen!

SPEICHERN UND LADEN

Dafür gibt es zwei Funktionen: saving_number(stringa,a) und loading_number(stringa,a). Rufen Sie diese auf und geben Sie einen String an, sowie eine Nummer, welche an den String angehängt wird. Möglich wäre etwa saving_number("Test",1); . Dies würde ein Spiel unter dem Namen "Test1.sav" speichern. Um dieses zu laden loading_number("Test",1); verwenden. NICHT den Befehl game_save verwenden! NUR diese Funktionen!

SKILLS UND FLAGS

Neben der Tatsache, dass der Name eines Objektes gleich dem Namen der angehängten Datei ist, haben folgende Skills und Flags Auswirkungen:
NAME DES SKILLS/FLAGS FUNKTION BEMERKUNGEN
SKILL1 ID des Objektes Ist gleich die Position des Namens in "names.txt" und gleich der Position des Beschreibungstextes in "watch.txt".
SKILL2, SKILL3, SKILL4 Erstellungsvektor des Spielers bei Türen Ist nur wichtig, wenn FLAG3 gesetzt. Der Spieler wird nach dem Levelladen an diesem Vektor erstellt.
FLAG1 Das Objekt lässt sich aufnehmen Denken Sie daran die Bitmap für das Inventar zu definieren!
FLAG2 Man kann mit dem Objekt reden Sie müssen eine Datei an das Objekt hängen, indem sie den Namen derselben als Name für das Objekt nutzen.
FLAG3 Das Objekt ist eine "Tür" und führt in einen anderen Raum Geben Sie als Namen den Dateinamen des zu ladenden Levels ein (ohne Endung). Denken Sie an Skill2, Skill3 und Skill4!
FLAG4 Der Spieler muss dieses Objekt nicht erreichen, um mit ihm spreche zu können Wenn nicht gesetzt, bewegt sich der Spieler auf 90 Quants an die Entity heran