
AddvItem()
**********


FUNKTION
========

   public varargs void AddvItem(string key, int refresh, mapping shadowprops,
                                string path, mapping props)


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

   /std/container/vitems.c


ARGUMENTE
=========

   key
     Eindeutige Bezeichnung des vItems und mit dieser wieder loeschbar. Das
     vItem wird im Raum auch unter dieser ID ansprechbar sein.
   refresh
     Refresheinstellungen des vItems, nachdem es mitgenommen wurde
   shadowprops
     Properties des vItems *im Raum* (optional, wenn <path> genutzt)
   path
     Vorlage/Templat des vItems und Blueprint fuer Clones (optional)
   props
     Properties, welche in Clones von der Vorlage gesetzt werden (optional)


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

   Dem Container/Raum wird ein virtuelles Item hinzugefuegt. Dieses ist
   kein im Container vorhandenes reales Objekt, kann aber (weitgehend) wie ein
   solches untersucht und behandelt werden.

   Falls das vItem ein reales Objekt als Templat hat (d.h. <path> angegeben
   wird), kann das vItem standardmaessig mitgenommen werden, es wird dafuer
   automatisch erzeugt. (Das Mitnehmen ist aber wie immer mit P_NOGET
   verhinderbar.)

   Das Mapping <shadowprops> enthaelt die Properties, welche das vItem
   im Container beschreiben. Hat das vItem ein Templat, werden alle
   Properties, welche *nicht* in <shadowprops> enthalten sind, aus dem
   Templat entnommen. Auf diese Weise kann man einem Objekt im Raum
   unterschiedliche Eigenschaften geben.

   Wird ein vItem mitgenommen, wird <path> geclont und die im Argument <props>
   angegebenen Properties in ihm gesetzt. Auf diese Weise kann man das
   genommene Objekt noch individuell konfigurieren.

   Zu beachten ist: in <shadowprops> enthaltene Properties *ersetzen* (nicht
   ergaenzen) im Regelfall diejenigen im Templat *und* in <props>. In <props>
   enthaltene Properties *ersetzen* wiederum diejenigen im Templat.
   Ausnahmen sind Properties, welche ein Mapping oder ein Array enthalten:
   Deren Inhalt wird *hinzugefuegt*. Dies betrifft insbesondere die Properties:
   P_DETAILS, P_READ_DETAILS, P_SMELLS, P_SOUNDS, P_TOUCH_DETAILS, P_IDS,
   P_CLASS, P_ADJECTIVES.
   Will man dies nicht, kann man den Propertynamen so angeben:
   VI_PROP_RESET(P_DETAILS), was dazu fuehrt, dass P_DETAILS vor dem
   Hinzufuegen geloescht wird.

   Nachdem ein vItem mitgenommen wurde, ist es im Raum nicht mehr ansprechbar.
   Es wird es je nach <refresh> wieder verfuegbar:

     - VI_REFRESH_NONE
       Es wird erst nach dem Neuladen/Neuerstellen des Containers wieder
       verfuegbar.
     - VI_REFRESH_ALWAYS
       Es wird mit dem naechsten Reset wieder verfuegbar. *Vorsicht!*
     - VI_REFRESH_REMOVE
       Es wird mit dem naechsten Reset wieder verfuegbar, wenn das geclonte
       Objekt nicht mehr im Raum ist.
     - VI_REFRESH_DESTRUCT
       Es wird mit dem naechsten Reset wieder verfuegbar, wenn das geclonte
       Objekt nicht mehr existiert.
     - VI_REFRESH_MOVE_HOME
       Das geclonte Objekt wird im naechsten Reset 'zurueckgeholt', d.h.
       zerstoert und das vItem ist wieder im Raum verfuegbar.
     - VI_REFRESH_INSTANT
       Es ist abweichend vom Normalverhalten sofort nach Mitnehmen wieder
       verfuegbar und mitnehmbar. **Vorsicht!**


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

   * vItems koennen geschachtelt werden, falls es sich um vItems mit Vorlagen
     handelt.
   * vItems sind verhaeltnismaessig aufwendig. Sie sollten nur verwendet
     werden, wenn sie einen Mehrwert ggue. einfachen Details haben. Es bringt
     nichts, jedes Detail gegen ein vItem zu ersetzen.
   * Es kann aber praktisch sein, komplexe Detailbaeume an einem vItem zu
     verankern, wenn man diesen Detailbaum ein- oder ausblenden will.


BEISPIELE
=========

   // Ein einfaches VItem ohne Templat, nicht nehmbar
   AddVItem("regal", VI_REFRESH_NONE,
            ([P_LONG: "Das Wandregal hat 3 schwarze Bretter.",
              P_GENDER: NEUTER,
              P_IDS: ({"wandregal"}), // "regal" hat es automatisch
              P_DETAILS: ([
                "bretter": "Die Regelbretter sind ganz zerkratzt.\n",
                "kratzer": "Da war wohl jemand achtlos.\n"
              ]),
              P_TOUCH_DETAILS: ([
                SENSE_DEFAULT: "Du erspuerste tiefe Kratzer.\n",
                "kratzer": Oha, die Kratzer sind ganz schoen tief!\n",
              ]),
              P_READ_DETAILS: ([SENSE_DEFAULT:
                "Auf dem Regal ist eingraviert: 'Dies ist ein vItem-Test.'\n"
              ]),
              P_SMELLS: ([SENSE_DEFAULT:
                "Das Regal riecht gar nicht. Wirklich nicht.\n"]),
            ]) );

   // Ein VItem mit Templat, nehmbar
   AddVItem("schaufel", VI_REFRESH_REMOVE, 0, "/items/schaufel");

   // Ein VItem mit Templat, nicht nehmbar
   AddVItem("schaufel", VI_REFRESH_NONE, ([P_NOGET:1]), "/items/schaufel");

   // Ein VItem, welches P_DETAIL komplett ueberschreibt und alle Details
   // loescht.
   AddVItem("schaufel", VI_REFRESH_REMOVE,
            ([VI_PROP_RESET(P_DETAILS): ([]) ]),
            "/items/schaufel");

   // Eine Zwiebel im Raum, eine andere Beschreibung hat als die im
   // Spielerinventar
   AddVItem("zwiebel", VI_REFRESH_REMOVE,
            ([P_LONG: "Die Zwiebel sieht etwas vertrocknet aus.\n",
              P_DETAILS: ([ ({"blatt","blaetter"}): "Sie haengen herab.\n"]),
            ]),
            "/items/kraeuter/zwiebel",
            // Die hier gesammelte Zwiebel ist besonders toll
            ([P_ZWIEBEL_TYP: EXTRA_STARK]) );

   // Eine modifizierte Eisenstange
   AddVItem("eisstange", VI_REFRESH_REMOVE,
            0,
            "/items/eisenstange",
            ([P_LONG:BS("Diese Eisstange eignet sich hervorragend dazu, "
                        "mit ihr auf jemanden einzuschlagen.\n"),
              P_SHORT:"Ein Eisstange.",
              P_NAME: "Eisstange",
              VI_PROP_RESET(P_IDS): ({"stange", "eisstange"}),
              VI_PROP_RESET(P_MATERIAL): ([MAT_ICE: 100]),
              VI_PROP_RESET(P_DAM_TYPE): ({DT_BLUDGEON, DT_COLD}),
              P_WEIGHT: 5000,
              P_VALUE: 500,
              VI_PROP_RESET(P_SMELLS): ([SENSE_DEFAULT:
                "Das Eis riecht nach Vanille!\n"]),
             ])
           );

   // Ein Ueberraschungs-Ei - verwandelt sich beim Nehmen in was anderes.
   // (Keine tolle Idee, soll nur zeigen, dass es geht.)
   AddVItem("ue-ei", VI_REFRESH_REMOVE,
          ([P_SHORT:"Ein Ue-Ei.",
            P_LONG: BS("Da liegt tatsaechlich ein Ue-Ei auf dem Boden. "
              "Wenn man es nimmt, verwandelt es sich in etwas anderes."),
            VI_PROP_RESET(P_IDS): ({"ue-ei","ei"}),
            ]),
          "/items/schaufel"
         );


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

   AddvItem(), AddItem(), RemoveItem() /std/vitems

Last modified: 03.04.2019, Zesstra
