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
    - VI_REFRESH_REMOVE
      Es wird mit dem naechsten Reset wieder verfuegbar, wenn das Item
      genommen wurde (auch wenn es danach wieder um Raum abgelegt wurde).
      *Vorsicht*
    - 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
---------

.. code-block:: pike

  // 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
----------

  :doc:`RemoveVItem`, :doc:`AddItem`, :doc:`RemoveItem`
  :doc:`../std/vitems`

Last modified: 03.04.2019, Zesstra

