
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
