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
