STANDARDOBJEKT FUER TRANSPORTER:
Rumata@Morgengrauen 04.05.1993
ueberarbeitet von
- Holger@Wunderland 14.08.1999
- Gum@Wunderland 19.01.2000
BENUTZUNG:
inherit "std/transport";
#include <transport.h>
BESCHREIBUNG:
Ein Transporter ist ein Raum mit besonderen Eigenschaften.
Waehrend normale Raume miteinander 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.
Es gibt 3 Arten von 'Haltestellen', doch nur mit AddRoute() koennen
Punkte markiert werden, bei denen Ein/Aussteigen moeglich ist. Mit
AddMsg() und AddFun() kann eine Message ausgegeben oder eine Funktion
ausgefuehrt werden. Fuer besseres Verstaendnis siehe <BEISPIELE>.
PROPERTIES:
P_ENTERMSG
Drei-elementiges Array aus Strings. Meldungen in der Art von
Argument 'msgs' fuer move() bei Livings.
Wird ausgegeben, wenn der Spieler den Transporter betritt.
P_LEAVEMSG
Drei-elementiges Array aus Strings. Meldungen in der Art von
Argument 'msgs' fuer move() bei Livings.
Wird ausgegeben, wenn der Spieler den Transporter verlaesst.
P_ENTERFAIL
String oder Array aus zwei Elementen. Fehlermeldung an ein Wesen,
wenn es den bereits vollen Transporter betreten will. Ist die Pro-
pertie ein Array, so wird das erste Element als Meldung an das Wesen,
das zweite als Meldung an die Mitspieler im Raum ausgegeben.
P_LEAVEFAIL
String oder Array aus zwei Elementen. Meldung an ein Wesen, wenn es
ausserhalb der Anlegezeiten den Transporter verlassen will. Ver-
wendung entspricht P_LEAVEFAIL.
P_ARRIVEMSG
Ein Array mit zwei Strings. 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
Ein Array mit zwei Strings. Entspricht P_ARRIVEMSG, aber fuer die
Abfahrt.
P_MAX_PASSENGERS
Numerischer Wert fuer die maximale Anzahl von Wesen, die den Trans-
porter gleichzeitig benutzen duerfen. 0 == unbeschraenkt.
P_TRANSPARENT
Numerischer Wert, im Normalfall 0 oder 1. Er gibt an, ob man an
Haltepunkten des Transporters aus diesem nach draussen sehen kann
und in der Langbeschreibung des Transporters die Beschreibung des
Haltestellen-Raumes mit sieht. Ist der Wert 0, sieht man die
Beschreibung nicht, sonst ist sie zu sehen. Waehrend der Fahrt ist
die Beschreibung des umgebenden Raumes unabhaengig von diesem Wert
generell nicht zu sehen.
P_TRANSLUCENT
Sollte fuer Transporter immer 0 sein, damit sie das Lichtlevel der
Start/Zielraeume nicht veraendern. Es ist aber denkbar, P_TRANSLUCENT
zu setzen, um genau diesen Effekt zu erzielen. Dann wird aber in
jedem Fall waehrend des Fluges P_TRANSLUCENT auf 0 gesetzt, um Fehler
bei der Lichtberechnung durch QueryLight(L) zu vermeiden.
FUNKTIONEN FUER HALTEPUNKTE:
nomask void AddRoute(string room, int stay, int next, string code);
Markiert 'room' als Haltestelle fuer die Route. Einsteigen und
Aussteigen ist moeglich.
room - Raum, in dem der Transporter halten soll.
stay - Zeit in Sekunden, die der Transporter in dem Raum verbleibt
bis er weiterfaehrt (Zeit zum Ein/Aussteigen).
next - Zeit in Sekunden bis zum naechsten Haltepunkt.
code - Text, der von der Funktion QueryArrived() zurueckgegeben
wird, wenn der Transporter an diesem Haltepunkt angelegt
hat.
nomask void AddMsg(string msg, int next);
Gibt eine Meldung aus und wartet 'next' Sekunden bis zum naechsten
Haltepunkt.
msg - Text der Meldung, die in dem Transporter ausgegeben wird.
Der Text wird automatisch umgebrochen.
next - Zeit in Sekunden bis zum naechsten Haltepunkt.
nomask void AddFun(string fun, int next);
Ruft eine Funktion 'fun' im Transporter auf, die bestimmte Dinge, wie
das Ausgeben einer Meldung an den Zielraum, Startraum und/oder den
Transporter selbst oder aehnliches erledigen kann.
fun - Name einer Funktion, die im Transporter aufgerufen wird.
next - Zeit in Sekunden bis zum naechsten Haltepunkt.
nomask void RemoveRoute();
Haelt den Transporter an und loescht dessen Kurs.
FUNKTIONEN FUER DIE STEUERUNG:
void Start(int pos);
Der Transporter soll sofort an dem Haltepunkt mit der angegebenen
Nummer anlegen und von da ab seinen Kurs fahren. Ist 'nummer' nicht
angegeben, beginnt der Transporter am Anfang der Haltepunktliste.
pos - Nummer einer Haltestelle oder 0. Die erste Haltestelle hat die
Nummer 0.
void Halt();
Halte die Fahrt an. Der Transporter bleibt stehen, wo er gerade ist.
Ist der Transporter nicht mit einer Haltestelle verbunden, so ist
kein Ein- und Aussteigen mehr moeglich!
varargs nomask void ReStart(int time);
Setzt eine mit Halt() unterbrochene Fahrt nach <time> Sekunden fort.
Wird time nicht angegeben, wird als Defaultwert 0 genommen.
time - Zeit in Sekunden, nach der die unterbrochene Fahrt fortgesetzt
wird.
moegliche Werte:
>0: Verhalten wie beschrieben.
0: Fahrt wird sofort ohne Zeitverzoegerung fortgesetzt.
<0: beim Aufruf von Halt wird sich gemerkt, wieviel Zeit bis
zum Fortsetzen der Fahrt noch verbleibt. Dieser Wert wird
hier als Zeitverzoegerung benutzt.
FUNKTIONEN ZUM BETRETEN UND VERLASSEN:
Der standardmaessige Transporter hat keine Kommandos, mit denen man
den Transporter betreten oder verlassen kann. Dafuer muessen mit
AddCmd() Kommandos definiert werden, die auf selbstgeschriebene
Funktionen zugreifen und folgende Transporterfunktionen aufrufen:
int Enter();
Testet, ob fuer den 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 Spieler den
Transporter erfolgreich betreten konnte oder wenn der Transporter
ueberfuellt ist, gib 1 zurueck, ansonsten 0.
Wenn der Transporter nicht da (also unsichtbar) ist, wird ebenfalls
0 zurueckgegeben, um den Eindruck erscheinen zu lassen, das Kommando
sei nicht definiert.
Dieser Wert kann im allgemeinen direkt als Returnwert benutzt werden.
(In der eignen Kommando-Funktion am Ende: return Enter();)
int Leave();
Wenn der aktuelle 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. Kann
auch wie Enter() als direkter Returnwert benutzt werden.
FUNKTIONEN FUER ABFRAGEN:
nomask string QueryArrived();
Gebe den Anlegecode des Raumes zurueck, an dem der Transporter gerade
anliegt. Hat der Raum keinen Code, gib einen Leerstring zurueck.
Liegt der Transporter an keinem Raum an, so gib 0 zurueck. Der Code
entspricht dem Argument 'code' von AddRoute().
Diese Funktion bietet sich an, um mittels process_string() die
Ankunfts- und Abfahrtsmeldungen abwechslungsreich zu gestalten.
nomask object *QueryPassengers();
Gibt ein Array mit allen Lebewesen, die sich auf/in dem Transporter
befinden, zurueck.
nomask mixed QueryPosition();
Gibt die aktuelle Position des Transporters zurueck. Rueckgabewert
ist ein zweielementiges Array, das den Raum|die Message|die Funktion
jeweils des letzten und des naechsten Haltepunktes als String
enthaelt.
BEISPIELE:
Ein Beispiel, wie man einen echten Transporter programmiert, ist
in /doc/beispiele/transport/kutsche.c zu sehen.
Ein Beispiel fuer einen Transporter mit variabler/zufaelliger
Route ist RayOnes Workroom /players/rayone/workroom.c
Ein Beispiel fuer eine einzelne Fahrtroute eines Transporters.
Diese Funktionen werden im allgemeinen im create() aufgerufen,
wenn sich die Fahrstrecke des Transporters nicht aendert:
// Eine echte Haltestelle. Verweile dort 20 Sekunden und dann
// warte 10 Sekunden bis zum naechsten Haltepunkt
AddRoute("/foo/room/anleger1", 20, 10, "am Anlegesteg Nummer 1");
// Text-Haltepunkte. Gib Meldung aus und warte immer 10 Sekunden.
AddMsg("Die Reise beginnt. Du schnallst Dich an.", 10);
AddMsg("Die Haelfte hast Du schon geschafft.", 10);
AddMsg("Dein Ziel rueckt naeher, Du schnallst Dich ab.", 10);
// Haltestelle und Wendepunkt. Warte 20 Sek. und fahre dann weiter.
AddRoute("/foo/room/anleger2", 20, 10, "am Anlegesteg Nummer 2");
// Text-Haltepunkte. Gib Meldung aus und warte immer 10 Sekunden.
AddMsg("Die Rueckreise beginnt. Du schnallst Dich an.", 10);
AddMsg("Die Haelfte des Rueckwegs hast Du schon geschafft.", 10);
AddMsg("Anleger1 rueckt naeher, Du schnallst Dich ab.", 10);
// Jetzt ist der Fahrplan fertig. Der Transporter beginnt wieder
// von vorn, also bei Anlegesteg 1. Jetzt muessen wir den Trans-
// porter nur noch starten.
Start();
// Fertig! Der Transporter pendelt zwischen Anleger1 und Anleger2.
SIEHE AUCH:
P_ENTERMSG, P_LEAVEMSG, P_ENTERFAIL, P_LEAVEFAIL, P_ARRIVEMSG
P_DEPARTMSG, P_MAX_PASSENGERS, P_TRANSPARENT, AddRoute(L),
AddMs(L), move(L)
|