blob: 921331da1b694eb1972a046f5801cde2bef14bec [file] [log] [blame]
Zesstraa729c712020-04-01 20:42:09 +02001AddVItem()
Zesstrab9cabc62019-03-18 22:25:01 +01002==========
3
4FUNKTION
5--------
6
Zesstra757864e2021-05-07 09:47:27 +02007 public varargs void AddVItem(string key, int refresh, mapping shadowprops, string path, mapping props)
Zesstrab9cabc62019-03-18 22:25:01 +01008
9
10DEFINIERT IN
11------------
12
13 /std/container/vitems.c
14
15ARGUMENTE
16---------
17
18 key
Zesstraa729c712020-04-01 20:42:09 +020019 Eindeutige Bezeichnung des vItems und mit dieser wieder loeschbar.
20 Das vItem bekommt dies u.U. auch als ID (s.u.)
Zesstrab9cabc62019-03-18 22:25:01 +010021 refresh
22 Refresheinstellungen des vItems, nachdem es mitgenommen wurde
23 shadowprops
24 Properties des vItems *im Raum* (optional, wenn <path> genutzt)
25 path
26 Vorlage/Templat des vItems und Blueprint fuer Clones (optional)
27 props
28 Properties, welche in Clones von der Vorlage gesetzt werden (optional)
29
30BESCHREIBUNG
31------------
32
33 Dem Container/Raum wird ein virtuelles Item hinzugefuegt. Dieses ist
34 kein im Container vorhandenes reales Objekt, kann aber (weitgehend) wie ein
35 solches untersucht und behandelt werden.
36
37 Falls das vItem ein reales Objekt als Templat hat (d.h. <path> angegeben
38 wird), kann das vItem standardmaessig mitgenommen werden, es wird dafuer
39 automatisch erzeugt. (Das Mitnehmen ist aber wie immer mit P_NOGET
40 verhinderbar.)
41
42 Das Mapping <shadowprops> enthaelt die Properties, welche das vItem
43 im Container beschreiben. Hat das vItem ein Templat, werden alle
44 Properties, welche *nicht* in <shadowprops> enthalten sind, aus dem
45 Templat entnommen. Auf diese Weise kann man einem Objekt im Raum
46 unterschiedliche Eigenschaften geben.
47
48 Wird ein vItem mitgenommen, wird <path> geclont und die im Argument <props>
49 angegebenen Properties in ihm gesetzt. Auf diese Weise kann man das
50 genommene Objekt noch individuell konfigurieren.
51
Zesstraa729c712020-04-01 20:42:09 +020052 Werden fuer ein reines vItem ohne Vorlage keine P_IDS in <shadowprops>
53 angegeben, so bekommt das vItem den string <key> als ID, damit es irgendwie
54 im Raum ansprechbar ist.
55
Zesstrab9cabc62019-03-18 22:25:01 +010056 Zu beachten ist: in <shadowprops> enthaltene Properties *ersetzen* (nicht
57 ergaenzen) im Regelfall diejenigen im Templat *und* in <props>. In <props>
58 enthaltene Properties *ersetzen* wiederum diejenigen im Templat.
59 Ausnahmen sind Properties, welche ein Mapping oder ein Array enthalten:
60 Deren Inhalt wird *hinzugefuegt*. Dies betrifft insbesondere die Properties:
61 P_DETAILS, P_READ_DETAILS, P_SMELLS, P_SOUNDS, P_TOUCH_DETAILS, P_IDS,
62 P_CLASS, P_ADJECTIVES.
63 Will man dies nicht, kann man den Propertynamen so angeben:
64 VI_PROP_RESET(P_DETAILS), was dazu fuehrt, dass P_DETAILS vor dem
65 Hinzufuegen geloescht wird.
66
67 Nachdem ein vItem mitgenommen wurde, ist es im Raum nicht mehr ansprechbar.
68 Es wird es je nach <refresh> wieder verfuegbar:
69
70 - VI_REFRESH_NONE
71 Es wird erst nach dem Neuladen/Neuerstellen des Containers wieder
72 verfuegbar.
73 - VI_REFRESH_ALWAYS
Zesstrab9cabc62019-03-18 22:25:01 +010074 - VI_REFRESH_REMOVE
Zesstra38f62e42019-12-09 22:10:50 +010075 Es wird mit dem naechsten Reset wieder verfuegbar, wenn das Item
76 genommen wurde (auch wenn es danach wieder um Raum abgelegt wurde).
77 *Vorsicht*
Zesstrab9cabc62019-03-18 22:25:01 +010078 - VI_REFRESH_DESTRUCT
79 Es wird mit dem naechsten Reset wieder verfuegbar, wenn das geclonte
80 Objekt nicht mehr existiert.
81 - VI_REFRESH_MOVE_HOME
82 Das geclonte Objekt wird im naechsten Reset 'zurueckgeholt', d.h.
83 zerstoert und das vItem ist wieder im Raum verfuegbar.
84 - VI_REFRESH_INSTANT
85 Es ist abweichend vom Normalverhalten sofort nach Mitnehmen wieder
86 verfuegbar und mitnehmbar. **Vorsicht!**
87
Zesstra757864e2021-05-07 09:47:27 +020088 Die Refresh-Konstanten sind in /sys/container/vitems.h definiert und nur
89 verfuegbar, wenn diese Datei inkludiert wird.
90
Zesstrab9cabc62019-03-18 22:25:01 +010091
92BEMERKUNGEN
93-----------
94
95 * vItems koennen geschachtelt werden, falls es sich um vItems mit Vorlagen
96 handelt.
97 * vItems sind verhaeltnismaessig aufwendig. Sie sollten nur verwendet
98 werden, wenn sie einen Mehrwert ggue. einfachen Details haben. Es bringt
99 nichts, jedes Detail gegen ein vItem zu ersetzen.
100 * Es kann aber praktisch sein, komplexe Detailbaeume an einem vItem zu
101 verankern, wenn man diesen Detailbaum ein- oder ausblenden will.
102
103BEISPIELE
104---------
105
Zesstrae66d53a2019-11-29 00:00:41 +0100106.. code-block:: pike
Zesstrab9cabc62019-03-18 22:25:01 +0100107
108 // Ein einfaches VItem ohne Templat, nicht nehmbar
109 AddVItem("regal", VI_REFRESH_NONE,
110 ([P_LONG: "Das Wandregal hat 3 schwarze Bretter.",
111 P_GENDER: NEUTER,
112 P_IDS: ({"wandregal"}), // "regal" hat es automatisch
113 P_DETAILS: ([
114 "bretter": "Die Regelbretter sind ganz zerkratzt.\n",
115 "kratzer": "Da war wohl jemand achtlos.\n"
116 ]),
117 P_TOUCH_DETAILS: ([
118 SENSE_DEFAULT: "Du erspuerste tiefe Kratzer.\n",
119 "kratzer": Oha, die Kratzer sind ganz schoen tief!\n",
120 ]),
121 P_READ_DETAILS: ([SENSE_DEFAULT:
122 "Auf dem Regal ist eingraviert: 'Dies ist ein vItem-Test.'\n"
123 ]),
124 P_SMELLS: ([SENSE_DEFAULT:
125 "Das Regal riecht gar nicht. Wirklich nicht.\n"]),
126 ]) );
127
128 // Ein VItem mit Templat, nehmbar
129 AddVItem("schaufel", VI_REFRESH_REMOVE, 0, "/items/schaufel");
130
131 // Ein VItem mit Templat, nicht nehmbar
132 AddVItem("schaufel", VI_REFRESH_NONE, ([P_NOGET:1]), "/items/schaufel");
133
134 // Ein VItem, welches P_DETAIL komplett ueberschreibt und alle Details
135 // loescht.
136 AddVItem("schaufel", VI_REFRESH_REMOVE,
137 ([VI_PROP_RESET(P_DETAILS): ([]) ]),
138 "/items/schaufel");
139
140 // Eine Zwiebel im Raum, eine andere Beschreibung hat als die im
141 // Spielerinventar
142 AddVItem("zwiebel", VI_REFRESH_REMOVE,
143 ([P_LONG: "Die Zwiebel sieht etwas vertrocknet aus.\n",
144 P_DETAILS: ([ ({"blatt","blaetter"}): "Sie haengen herab.\n"]),
145 ]),
146 "/items/kraeuter/zwiebel",
147 // Die hier gesammelte Zwiebel ist besonders toll
148 ([P_ZWIEBEL_TYP: EXTRA_STARK]) );
149
150 // Eine modifizierte Eisenstange
151 AddVItem("eisstange", VI_REFRESH_REMOVE,
152 0,
153 "/items/eisenstange",
154 ([P_LONG:BS("Diese Eisstange eignet sich hervorragend dazu, "
155 "mit ihr auf jemanden einzuschlagen.\n"),
156 P_SHORT:"Ein Eisstange.",
157 P_NAME: "Eisstange",
158 VI_PROP_RESET(P_IDS): ({"stange", "eisstange"}),
159 VI_PROP_RESET(P_MATERIAL): ([MAT_ICE: 100]),
160 VI_PROP_RESET(P_DAM_TYPE): ({DT_BLUDGEON, DT_COLD}),
161 P_WEIGHT: 5000,
162 P_VALUE: 500,
163 VI_PROP_RESET(P_SMELLS): ([SENSE_DEFAULT:
164 "Das Eis riecht nach Vanille!\n"]),
165 ])
166 );
167
168 // Ein Ueberraschungs-Ei - verwandelt sich beim Nehmen in was anderes.
169 // (Keine tolle Idee, soll nur zeigen, dass es geht.)
170 AddVItem("ue-ei", VI_REFRESH_REMOVE,
171 ([P_SHORT:"Ein Ue-Ei.",
172 P_LONG: BS("Da liegt tatsaechlich ein Ue-Ei auf dem Boden. "
173 "Wenn man es nimmt, verwandelt es sich in etwas anderes."),
174 VI_PROP_RESET(P_IDS): ({"ue-ei","ei"}),
175 ]),
176 "/items/schaufel"
177 );
178
179
180SIEHE AUCH
181----------
182
Zesstra757864e2021-05-07 09:47:27 +0200183 :doc:`RemoveVItem`, :doc:`AddItem`, :doc:`RemoveItem`,
184 /doc/std/vitems
Zesstrab9cabc62019-03-18 22:25:01 +0100185
186Last modified: 03.04.2019, Zesstra
187