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

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

