
P_NETDEAD_INFO
**************


NAME
====

   P_NETDEAD_INFO                "netdead_info"


DEFINIERT IN
============

   /sys/player.h


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

   Wird im Raum X gesetzt und wirkt nur, falls dieser Raum ein '#' im
   object_name() hat (normale Clones, zB "/room/void#10153018").



   Bei Einschlafen eines Spielers in diesem Raum werden die Werte aus
   der Property im Spieler gespeichert (Netztoteninformationen).

   Ist beim Aufwachen des Spielers das Raumobjekt X zerstoert worden, dann
   wird bei der Blueprint von X per SetProp() die gespeicherte Information
   gesetzt. Der Rueckgabewert des SetProp wird als Pfad zu einem Ausweich-
   Aufwach-Raum interpretiert und der Spieler wird in dem Fall dorthin
   bewegt.


BEMERKUNGEN
===========

   Zum Clonen von Raeumen sollten Virtual Compiler benutzt werden:
   Wird in den erzeugten Objektnamen KEIN '#' verwendet, dann ist diese
   Property nicht sinnvoll und wird nicht verwendet. Ein ordentlicher
   VC kann Bewegen eines Spielers in dessen alten, nicht mehr existierenden
   Raum oder einen Ersatzraum beim Aufwachen selbst loesen.


BEISPIELE
=========

   // #1: geclonter Raum mit Ausweich-Aufwachraum: Klerus-Gilde
   #include <properties.h>
   inherit "/std/room";



   void create() {
     ::create();

     SetProp(P_NETDEAD_INFO, "/gilden/klerus");
     SetProp(P_LIGHT, 1);
   }



   // #2: komplexerer Beispielraum fuer P_NETDEAD_INFO-Funktionalitaet
   // Siehe auch: /doc/beispiele/testobjekte/netdead_info_testraum.c
   #include <properties.h>
   inherit "/std/room";

   void create() {
     ::create();

     if (clonep(this_object()))
       // setze Informationen, die im Netztoten gespeichert werden sollen
       Set(P_NETDEAD_INFO, random(5));
     else
       // Blueprint: hier kann man zu einem Cloneraum gehen
       AddExit("cloneraum", #'create_room);

     // Set-Method, um die Informationen aus P_NETDEAD_INFO beim Aufwachen
     // in der Blueprint auswerten zu koennen
     Set(P_NETDEAD_INFO, #'create_destiny, F_SET_METHOD);
     SetProp(P_LIGHT, 1);
   }



   // Raum entfernen, normalerweise so KEINE GUTE IDEE!
   void BecomesNetDead(object pl) {
     call_out(#'remove, 30);
   }

   // erzeuge einen Cloneraum und bewege den Spieler dahin
   int create_room(string dir) {
     object dest = clone_object(object_name(this_object()));
     this_player()->move(dest, M_NOCHECK);
     return 1;
   }



   // Set-Method fuer P_NETDEAD_INFO: gibt Pfad zurueck
   // benutze die Informationen aus dem jetzt aufwachenden Netztoten, um
   // einen alternativen Aufwachraum zu ermitteln, da der Einschlafraum
   // zerstoert ist
   string create_destiny(mixed val) {
     if (intp(val)) {
       switch (val) {
         case 0:
           return "/d/ebene/room/PortVain/po_haf1";
         case 1:
           return "/gilden/klerus";
         case 2:
           return "/gilden/karate";
         default:
       }
       return "/d/ebene/room/waldweg4";
     }
   }

2. Jan 2012 Gloinson
