
GetPhiolenInfos()
*****************


GetPhiolenInfos(L)
==================


FUNKTION
========

   mixed *GetPhiolenInfos();


BESCHREIBUNG
============

   Wird von der Phiole aufgerufen:
   /d/inseln/miril/sternquest/obj/phiole.c
   Der Raum muss /p/service/miril/phiole.h includen.
   Mit der Phiole kann ein Spieler durch Tueren schauen. Bei Tueren, die
   vom Doormaster (/obj/doormaster.c) verwaltet werden, klappt dies auto-
   matisch. Moechte man das verbieten, so muss die Funktion
   GetPhiolenInfos() im entsprechenden Raum definiert sein.
   Befinden sich Tueren im Raum, die nicht vom Doormaster verwaltet werden,
   aber bei denen die Phiole funktionieren soll, so kann dies ebenfalls
   mittels GetPhiolenInfos() geschehen.



   Funktion der Phiole:
   Sie projiziert ein Bild dessen, was hinter der Tuer liegt auf die Tuer.
   Steht die Tuer offen, so sieht der Spieler nur eine Wand, denn es wird
   gezeigt, was hinter dieser Tuer ist.



   Ist die Tuer jedoch ge- oder verschlossen, so sieht er auf der Tuer
   die Langbeschreibung des Raumes, der hinter der Tuer liegt, sowie das
   Inventar dieses Raumes.

   Aufbau der Funktion:
   mixed *GetPhiolenInfos() {
     return ({
              ([
                PHIOLE_DEST:     string,
                PHIOLE_IDS:      *string,
                PHIOLE_GENDER:   int,
                PHIOLE_STATUS:   int,     (optional)
                PHIOLE_LONG:     string,  (optional)
                PHIOLE_VERBOTEN: int      (optional)
              ]),
              ([
                ... Naechste Tuer
              ])
            });
   }



   PHIOLE_DEST      Dateiname des Zielraums
   PHIOLE_IDS       Array der Strings, mit denen sich die Tuer
                    ansprechen laesst
   PHIOLE_GENDER    Geschlecht der Tuer
   PHIOLE_STATUS    aktueller Status der Tuer:
                    0 geschlossen/verschlossen, 1 offen
                    Bei Tueren, die mit NewDoor erzeugt wurden
                    nicht setzen
   PHIOLE_LONG      Beschreibung des Zielraums (z.B. bei einer
                    Faketuer)
   PHIOLE_VERBOTEN  0 erlaubt, 1 verboten


BEISPIEL
========

   Ein Raum enthaelt eine Holztuer und ein Portal. Erstere ist mittels
   NewDoor(...) gebaut, soll aber nicht zu durchschauen sein, letztere ist
   selbstgestrickt. Die erste fuehrt in den Workroom von Jof, die zweite
   ist nur ein Fake und immer geschlossen. Bei vom Doormaster erzeugten
   Tueren sollte PHIOLE_STATUS nicht gesetzt werden, da dies automatisch
   abgefragt wird.



   #include "/p/service/miril/phiole.h"
   ...
   mixed *GetPhiolenInfos(){
     return ({
              ([
                PHIOLE_DEST:"/players/jof/workroom",
                PHIOLE_IDS:({"holztuer"}),
                PHIOLE_GENDER:FEMALE,
                PHIOLE_VERBOTEN:1
              ]),
              ([
                PHIOLE_DEST:0,
                PHIOLE_IDS:({"portal"}),
                PHIOLE_GENDER:NEUTER,
                PHIOLE_STATUS:0,
                PHIOLE_LONG:"Du stehst in einer riesigen Schatzkammer und "
                            "kannst Dein Glueck kaum fassen. Nun brauchst "
                            "Du nur noch zuzugreifen und bist der reichste "
                            "Bewohner des MorgenGrauen.",
                PHIOLE_VERBOTEN:0
              ])
            });
    }
    Mittels PHIOLE_LONG laesst sich auch bei erlaubten und verbotenen Tueren
    einstellen, was der Spieler statt der normalen Raumbeschreibung und den
    im Raum befindlichen Objekten sehen soll. Das koennte z.B. sinnvoll
    sein, falls der Spieler zwar die Raumbeschreibung, aber nicht den fiesen
    Drachen sehen soll, der sich ebenfalls im Raum befindet.


SIEHE AUCH
==========

   NewDoor(), QueryDoorStatus(), SetDoorStatus(), QueryAllDoors()

Letzte Aenderung: Sam, 14. Jan 2006, 12:21, Miril
