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

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