
Gespraeche		02.11.1996
==========

Die Gespraeche der Spielercharaktere werden durch eine eigene
"Programmiersprache" gesteuert.

Das sogenannte "Gespraechsprogramm" ist in einer gewoehnlichen
Textdatei abgelegt, die den Namen "Gespraech_<nr>.txt" traegt,
wobei <nr> eine Zahl ist.

WICHTIG: Es duerfen maximal 250 Zeichen pro Textzeile verwendet werden.

Wenn ein "Gespraechsprogramm" ausgefuehrt wird, wird in der ersten
Zeile des "Programms" begonnen und Zeile fuer Zeile ausgefuehrt.


PRAEPROZESSOR
-------------

Die Datei "Gespraech_<nr>.txt" wird beim Einlesen schon bearbeitet,
um Speicher zu sparen

	- Alle Kommentare werden entfernt
	- Alle Tabulatoren werden durch EIN Leerzeichen ersetzt
	- Fuehrende Leerzeichen werden entfernt
	- Nachfolgende Leerzeichen werden entfernt

Entstehen dadurch Leerzeilen, so werden diese erst gar nicht eingelesen.

ACHTUNG: Die Anzahl der hiernach verbleibenden Textzeilen ist
	 programmintern begrenzt: Dies ist die Ausgabe "Max. Zeilenzahl
	 in Gespraechsdatei" im Hauptmenu (zur Zeit 250 Zeilen).


Danach wird die im Speicher befindliche Datei weiterbearbeitet:
  - bei Sprunganweisungen (ausgenommen der INPUT-Befehl) werden
    die Sprungmarken durch Zeilennummern ersetzt. Dadurch ist es
    waehrend eines Gespraechs nicht mehr noetig, die Sprungmarke zu
    suchen, sondern man das Programm kann die Zeilen direkt anspringen
  - die Befehle werden durch Zahlencode ersetzt (=> spart Platz)


BEFEHLE
-------

In jede Zeile kann nur ein Befehl stehen, wobei allerdings fuehrende
Leerzeichen zulaessig sind.

AUSNAHME: In einer Zeile kann ein Befehl stehen, der von einem
	  Kommentar gefolgt werden kann - schliesslich ist ein
	  Kommentar kein Befehl.

WICHTIG:  Befehle sind "case-sensitive", d.h. sie muessen genau so,
	  wie hier angegeben, geschrieben werden - die Gross- bzw.
	  Kleinschreibung muss genau eingehalten werden.


&<text> 	Kommentar
		Alle dem Kaufmannsund folgenden Zeichen bis zum
		Zeilenende werden ignoriert


END		Gespraechsende
		Dieser Befehl beendet das Gespraech an dieser Stelle

		ACHTUNG: Es darf kein "Open End" geben - das Gespraech
			 muss immer durch ein END abgeschlossen sein


#<text> 	Textausgabe
		Der dem Kreuz folgende Text wird auf dem Bildschirm
		ausgegeben.
		Nach der Textausgabe wird der gesamte Text um eine
		Zeile hochgescrollt.

		In <text> duerfen folgende Steueranweisungen vorkommen:

		  Die []-Anweisung:
		      <text1>[<text2>]<text3>
		      Hierdurch wird der <text2> farblich hervorgehoben
		      Bsp: Mein Name ist [Ragor], der Grossartige
		      Hierdurch wird das Wort "Ragor" hervorgehoben.

		  Die *-Anweisung
		      Der Stern '*' wird durch den Namen des Charakters
		      ersetzt, der gerade redet.
		      Z.B.: Der Charakter Ragor redet.

		      Dann wird die Zeile:
			   #Hallo *!
		      ausgegeben als:
			   Hallo Ragor!

		      ACHTUNG: Ein Name kann bis zu 20 Zeichen lang sein,
			       es muss daher darauf geachtet werden, dass
			       noch genug Platz in der Zeile ist, um den
			       Namen einfuegen zu koennen.

<text> 	Sprungmarke
		Der hinter dem Paragraphenzeichen stehende Text wird als
		Name der Sprungmarke betrachtet.
		Sprungmarken sind "case-insensitiv", d.h. es wird nicht
		auf Gross- und Kleinschreibung geachtet.
		Der Grund dafuer ist der Befehl INPUT - durch die
		Nichtbeachtung der Rechtschreibung wird die Abfrage
		wesentlich vereinfacht...

		Bsp: Verkauf

		ACHTUNG: Sprungmarkennamen muessen eindeutig sein!!


GOTO <text>	Sprungbefehl
		Der hinter dem GOTO folgende Text wird als Name der
		der anzuspringenden Sprungmarke angesehen

		Bsp: GOTO Verkauf


INPUT <arg1> ... <arg n>
		Benutzergelenkter Sprungbefehl

		Erwartet eine Texteingabe. Diese Texteingabe wird mit den
		angegebenen Argumenten verglichen (case-insensitiv).
		Gibt es eine Uebereinstimmung zwischen einem Wort in dem
		eingegebenen Text und den angegebenen Argumenten, so wird
		zu der Sprungmarke mit diesem Namen gesprungen.
		Wird keine Uebereinstimmung gefunden, so wird in der
		folgenden Zeile fortgesetzt
		Die Argumente werden durch Leerzeichen getrennt angegeben
		Nach erfolgter Eingabe wird der Text um eine Zeile
		hochgescrollt.

		ACHTUNG: Eine leere Eingabe, d.h. druecken der RETURN-Taste
		ohne Eingabe beendet das Gespraech!

		Bsp: INPUT Name Beruf Alter


SET <nr>
		Setzt die interne Merkvariable mit der Nummer <nr>
		Das Programm wird in der naechsten Zeile fortgesetzt

		Bsp: SET 2


UNSET <nr>
		Loescht die interne Merkvariable mit der Nummer <nr>
		Das Programm wird in der naechsten Zeile fortgesetzt

		Bsp: UNSET 3

		HINWEIS: Die Merkervariablen haben nur zwei Zustaende,
			 naemlich gesetzt oder ungesetzt.

IFSET <nr> <posmarke>
		Falls die interne Merkvariable mit der Nummer <nr>
		gesetzt ist wird zur Sprungmarke mit dem Namen <posmarke>
		gesprungen. Ist sie nicht gesetzt, so wird in der
		naechsten Programmzeile fortgefahren


INKEY
		Gibt einen Hinweistext in der untersten Zeile aus und
		wartet auf Tastendruck/Maustaste. Nach erfolgtem Druck
		wird die Zeile geloescht. Es erfolgt kein Scrolling



YN <posmarke>
		Wartet auf die Eingabe von "Ja" oder "Nein"
		Bei Eingabe von "Ja" wird zur Marke "posmarke" gesprungen,
		bei Eingabe von "Nein" wird in der folgenden Zeile
		fortgesetzt

EP <anz>
		<anz> Erfahrungspunkte werden an die Gruppe verteilt
		Es wird der Text:
		"Die Gruppe erhaelt <anz> Erfahrungspunkte"
		ausgegeben.

IFUNSET <nr> <posmarke>
		Falls die interne Merkvariable mit der Nummer <nr>
		NICHT gesetzt ist wird zur Sprungmarke mit dem
		Namen <posmarke> gesprungen Ist sie nicht gesetzt, so
		wird in der naechsten Zeile fortgefahren

GETITEM <name>
		Die Gruppe erhaelt den Gegenstand mit Namen <name>.
		Dieser Gegenstandsname muss eindeutig sein (und,
		natuerlich, existieren)
		Bsp: GETITEM Schwert

		Bemerkung: Da beim Erhalten eines Gegenstands der
		Textausgabebereich geloescht wird, sollte vor
		dem Aufruf von GETITEM der Befehl INKEY verwendet werden.



GIVEITEM <name> <marke>
		Es soll ein Mitglied der Gruppe ausgewaehlt werden, welches
		den Gegenstand mit Namen <name> hergibt. Dieser Name muss
		NICHT eindeutig sein, d.h. das Mitglied kann mehrere
		Gegenstaende dieses Namens bei sich tragen
		Wird kein Gruppenmitglied ausgewaehlt oder hat das
		gewaehlte Gruppenmitglied den Gegenstand nicht, dann
		wird zu <marke> gesprungen.
		Andernfalls wird in der naechsten Zeile fortgesetzt und
		der Gegenstand wird abgegeben.
		Bsp: GIVEITEM Schwert HatEsNicht



MONEY <anz>
		<anz> Silberstuecke werden an die Gruppe verteilt.
		Es wird der Text:
		"Die Gruppe erhaelt <anz> Silberstuecke"
		ausgegeben.

GIVEMONEY <anz> <marke>
		Es soll ein Mitglied der Gruppe ausgewaehlt werden, welches
		<anz> Geldstuecke hergibt.
		Wird kein Gruppenmitglied ausgewaehlt oder hat es nicht
		genug Geld, dann wird zu <marke> gesprungen.
		Andernfalls wird in der naechsten Zeile fortgesetzt und
		das Geld wird abgegeben.
		Bsp: GIVEMONEY 20 HatKeinGeld

FOLLOW <nr> <fehlermarke>
		Die Charakterdatei mit der Nummer <nr> wird geladen und der
		darin enthaltene Charakter der Gruppe hinzugefuegt
		Tritt hierbei ein Fehler auf (Datei nicht gefunden, kein
		Platz in der Gruppe, ...) dann wird zur Marke
		<fehlermarke> gesprungen

TEST <nr> <negmarke>
		Fuehrt eine Menschenkenntnisprobe modifiziert mit <nr> durch
		   <nr> > 0 Erschwernis
		   <nr> < 0 Erleichterung
		Misslingt die Probe, dann wird zur <negmarke> gesprungen
		Andernfalls wird in der naechsten Zeile fortgesetzt

		Z.B. kann man hiermit den Spielern Zusatzinfos zukommen
		lassen - zur Illustration ein kurzes Beispiel:

			#Allerbeste Ware! Nur 10000 Goldstuecke...
			TEST 0 misslungen
			#Du hast das Gefuehl, der Haendler luegt.

			misslungen
			#Wollt ihr es kaufen?


ATTACK <nr> <anz> <siegmarke>
		Die Gruppe wird von <anz> Gegnern mit der Nummer <nr>
		angegriffen. Im Falle des Sieges wird zu <siegmarke>
		gesprungen
		Andernfalls wird in der naechsten Zeile fortgesetzt.
		Kann der angegebene Gegner nicht geladen werden (d.h. tritt
		ein Fehler auf), dann wird in der naechsten Zeile fortgesetzt
		der Kampf wird also als verloren gewertet.

		Bsp:
			ATTACK 1 4 sieg


RACE <nr> <posmarke>
		Falls der Sprecher zur Rasse <nr> gehoert
		wird zur Sprungmarke mit dem Namen <posmarke> gesprungen
		Ist dies nicht der Fall, so wird in der naechsten Zeile
		fortgefahren

		Zur Zeit gibt es folgende Rassen:

			Rasse		<nr>
			SONSTIGE	  0
			MENSCH		  1
			TROLL		  2
			ELF		  3
			GOBLIN		  4
			KOBOLD		  5
			ZWERG		  6
			ORK		  7
			HALBELF 	  8
			HALBORK 	  9
			HOBBIT		 10


		Bsp:
			RACE 1 IstMensch

		Bemerkung: Hiermit kann man Abneigungen/Vorlieben von
			   Gespraechspartnern gegenueber bestimmten Rassen
			   einbauen

LEARN <nr>
		Der Sprecher lernt die Rezeptur <nr>
			0 = Heiltrank

		siehe auch: Rezepte.txt

		Bsp: LEARN 0



STYLE-GUIDE
===========

* In jedem Gespraech sollten folgende Begriffe akzeptiert werden:

    ende  - Um das Gespraech zu beenden
    name  - Um den Namen des Gespraechspartners zu erfahren
    beruf - Um den Beruf des Gespraechspartners zu erfahren
    alter - Um das Alter des Gespraechspartners zu erfahren

* Erscheinen im Text Schluesselwoerter, dann sollten sie mit
  den Klammern [ ] hervorgehoben werden.


