> FUNKTIONSWEISE VON TRANSPORTERN <
Version 1.0 (04.05.1993) von Rumata
===================================


INHALT:
======

	1.	Allgemeines
	2.	Properties
	3.	Haltestellen
	4.	Steuerung
	5.	Betreten und verlassen
	6.	Extras
	7.	Kommandos in Trnasportern


1. ALLGEMEINES
==============

	Ein Transporter ist ein Raum mit besonderen Eigenschaften.
	Waehrend normale Raume miteinnder starr verbunden sind,
	kann dieser Raum seine Verbindung zu anderen Raeumen mit
	der Zeit aendern.

	Jeder Transporter besitzt einen 'Kurs' den er abfaehrt; nach der
	letzten 'Haltestelle' beginnt der Kurs wieder von Vorne.
	Will man einen Kurs setzen, der entlang einer Strecke hin-
	und zurueck fuehrt, so muss man jede Haltestelle einmal fuer
	den Hinweg und einmal fuer den Rueckweg einfuegen.

	Ein Beispiel, wie man einen solchen Transporter programmiert,
	ist in /doc/beispiele/wolke.c zu sehen (und zu laden :-).

2. PROPERTIES
=============

	P_ENTERMSG
		Array mit zwei Meldungen in der Art von msgin und
		msgout.  Die erste Meldung ist fuer den Raum, den der
		Spieler verlaesst, und die zweite fuer den Transporter,
		in den er geht.

	P_LEAVEMSG
		Array mit zwei Meldungen, eine fuer den Transporter, den
		er verlaesst, und eine fuer den Raum, in den er kommt.

	P_ENTERFAIL
		Meldung an ein Wesen, wenn den vollen Transporter
		betreten will. Ist die Prop. ein Array, so wird das erste
		Element als Meldung an das Wesen, das zweite als Meldung
		an die Mitspieler im Raum geschickt. Ist die Property
		eine Closure, wird diese ausgefuehrt, wenn ein Spieler
		vergeblich versucht, den Transporter zu betreten.

	P_LEAVEFAIL
		Meldung an ein Wesen, wenn es ausserhalb der Anlegezeiten
		den Transporter verlassen will. Ist die Prop. ein Array,
		so wird das erste Element als Meldung an das Wesen, das
		zweite als Meldung an die Mitspieler im Transporter
		geschickt. Ist die Property eine Closure, wird diese
		ausgefuehrt, wenn ein Spieler vergeblich versucht, den
		Transporter zu verlassen.

	P_ARRIVEMSG
		Ein Array mit zwei Meldungen. Das erste Element ist die
		Meldung, die die Wesen im Transporter bekommen. Die
		zweite Meldung ist fuer die Wesen in dem Raum, an dem
		der Transporter anlegt. 

	P_DEPARTMSG
		Dito fuer das Ablegen.

	P_MAX_PASSENGERS
		Numerischer Wert fuer die maximale Anzahl von Wesen, die
		sich in dem Transporter aufhalten duerfen.
		0 bedeutet unbeschaenkte Spielerzahl.


3. HALTESTELLEN
===============

	Es gibt 3 Sorten von Haltestellen:

	1.) Raeume als Haltestellen.

	FUNKTION:
	
		AddRoute( raum, verweil, next );
		oder
		AddRoute( raum, verweil, next, code );

	PARAMETER:

		raum	- Raum, an dem der Transporter halten soll.
		verweil	- Zeit in Sekunden, die der Transporter in dem
			  Raum verbleibt, bis er weiterfaehrt.
		next	- Zeit in Sekunden bis zur naechsten Halte-
			  stelle.

		code	- Text, der von der Funktion QueryArrived
			  zurueckgegeben wird, wenn der Transporter
			  an dieser Haltestelle angelegt hat.
			  Wird dieser Parameter nicht angegeben, wird
			  ein leerer String als code gesetzt.

	2.) Meldungen als Haltestellen.

	FUNKTION:

	      AddMsg( text, next );

	PARAMETER:

		text	- Text, der Meldung, die in dem Transporter
			  ausgegeben wird.
		next	- Zeit in Sekunden bis zur naechsten Halte-
			  stelle.

	3.) Funktionsaufrufe als Haltestellen.

	FUNKTION:

		AddFun( fun, next );

	PARAMETER:

		fun	- Name einer Funktion, die im Transporter
			  aufgerufen wird.
		next	- Zeit in Sekunden bis zur naechsten Halte-
			  stelle.

4. STEUERUNG
============

	FUNKTION

		Start();
		oder
		Start(nummer);

	BESCHREIBUNG:

		Der Transporter soll sofort an der Haltestelle mit
		der angegebenen Nummer (keine Nummer heisst an der ersten)
		anlegen und von da ab seinen Kurs fahren.

	FUNKTION:

		Halt();

	BESCHREIBUNG:

		Halte die Fahrt an. Der Transporter bleibt stehen, wo
		er ist.


5. BETRETEN UND VERLASSEN
=========================

	Der Transporter hat keine Verben programmiert, mit denen man
	den Transporter betreten oder verlassen kann.
	Dafuer muessen mit AddCmd() Verben eingefuehrt werden, die
	auf selbstgeschriebene Funktionen zugreifen.

	FUNKTION:

		Enter();

	BESCHREIBUNG:

		Teste, ob fuer dun aktuellen Spieler (this_player())
		noch Platz im Transporter ist und ob er sich ausserhalb
		des Transporters befindet. Wenn ja, bewege ihn in den
		Transporter. Wenn der Transporter eine Reaktion (Bewegen des
		Spielers oder Ueberlauf), so gib eine 1 zurueck sonst eine 0.

		Wenn der Transporter nicht da (also unsichtbar) ist, tue fuer
		die Spieler ausserhalb des Transporters so,
		als ob das Verb nicht definiert wurde.

		Dieser Wert kann im allgemeinen direkt als returnwert benutzt
		werden.

	FUNKTION:

		Leave();

	BESCHREIBUNG:

		Wenn der Momentane Spieler nicht im Transporter ist, so gib
		eine Fehlermeldung aus. Anderenfalls teste, ob der
		Transporter an einen Raum angelegt hat. Wenn nein, gebe
		die LEAVEFAIL Meldung aus; und wenn alles ok ist, so
		bewege den Spieler aus dem Transporter.

6. EXTRAS
=========

	FUNKTION:

		QueryArrived();

	BESCHREIBUNG:

		Gebe den Code des Raumes zurueck, an dem der Transporter
		gerade anliegt. Hat der Raum keinen Code, gebe einen
		Leerstring zurueck. Liegt der Transporter an keinem Raum
		an, so gebe 0 zurueck.

		Diese Funktion bietet sich an um mittels process_string
		die Ankunfts- und Abfahrtsmeldungen abwechslungsreich
		zu gestalten.

	FUNKTION:

		QueryPassengers(),

	BESCHREIBUNG:

		Gebe eine Liste mit allen Lebewesen, die sich auf/in dem
		Transporter befinden, zurueck.

	FUNKTION:

		RemoveRoute();

	BESCHREIBUNG:

		Halte den Transporter an und loesche dessen Kurs.

7. KOMMANDOS IN TRANSPORTERN
============================

	Da sich der Transporter in dem Raum befindet, in dem er angelegt
	hat, sind alle Kommandos des Transporters auch dort verfuegbar.
	Selbst wenn der Transporter abgelegt hat, steht er noch immer
	unsichtbar dort herum.

	Deshabl muss in den Kommandos vorsorge grtroffen werden, dass nur
	die richtigen Spieler (die drinnen und die draussen) die richtigen
	Kommandos ausfuehren koennen.

	KOMMANDOS FUER SPIELER AUSSERHALB:

		Es muss abgetestet werden, ob der Spieler nicht im
		Transporter ist, und ob der Transporter angelegt hat.

		if( environment(this_player())==this_object() 
			|| !QueryArrived() ) return 0;

	KOMMANDOS FUER SPIELER INNERHALB:

		Abtesten, ob der Spieler wirklich im Transport ist.

		if( environment(this_player())!=this_object() )
			return 0;

		Vorsicht auch bei AddExits innerhalb des Transporters,
		aber daran arbiete ich noch... :-)

	Die Funktionen Enter() und Leave() haben diese Funktionalitaet
	eingebaut.

