blob: dd37328537ed4e65e93f0e522d62cd0aed1f3e62 [file] [log] [blame]
Zesstraa729c712020-04-01 20:42:09 +02001AddVItem()
Zesstrab9cabc62019-03-18 22:25:01 +01002==========
3
4FUNKTION
5--------
6
Zesstra38f62e42019-12-09 22:10:50 +01007 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
88
89BEMERKUNGEN
90-----------
91
92 * vItems koennen geschachtelt werden, falls es sich um vItems mit Vorlagen
93 handelt.
94 * vItems sind verhaeltnismaessig aufwendig. Sie sollten nur verwendet
95 werden, wenn sie einen Mehrwert ggue. einfachen Details haben. Es bringt
96 nichts, jedes Detail gegen ein vItem zu ersetzen.
97 * Es kann aber praktisch sein, komplexe Detailbaeume an einem vItem zu
98 verankern, wenn man diesen Detailbaum ein- oder ausblenden will.
99
100BEISPIELE
101---------
102
Zesstrae66d53a2019-11-29 00:00:41 +0100103.. code-block:: pike
Zesstrab9cabc62019-03-18 22:25:01 +0100104
105 // Ein einfaches VItem ohne Templat, nicht nehmbar
106 AddVItem("regal", VI_REFRESH_NONE,
107 ([P_LONG: "Das Wandregal hat 3 schwarze Bretter.",
108 P_GENDER: NEUTER,
109 P_IDS: ({"wandregal"}), // "regal" hat es automatisch
110 P_DETAILS: ([
111 "bretter": "Die Regelbretter sind ganz zerkratzt.\n",
112 "kratzer": "Da war wohl jemand achtlos.\n"
113 ]),
114 P_TOUCH_DETAILS: ([
115 SENSE_DEFAULT: "Du erspuerste tiefe Kratzer.\n",
116 "kratzer": Oha, die Kratzer sind ganz schoen tief!\n",
117 ]),
118 P_READ_DETAILS: ([SENSE_DEFAULT:
119 "Auf dem Regal ist eingraviert: 'Dies ist ein vItem-Test.'\n"
120 ]),
121 P_SMELLS: ([SENSE_DEFAULT:
122 "Das Regal riecht gar nicht. Wirklich nicht.\n"]),
123 ]) );
124
125 // Ein VItem mit Templat, nehmbar
126 AddVItem("schaufel", VI_REFRESH_REMOVE, 0, "/items/schaufel");
127
128 // Ein VItem mit Templat, nicht nehmbar
129 AddVItem("schaufel", VI_REFRESH_NONE, ([P_NOGET:1]), "/items/schaufel");
130
131 // Ein VItem, welches P_DETAIL komplett ueberschreibt und alle Details
132 // loescht.
133 AddVItem("schaufel", VI_REFRESH_REMOVE,
134 ([VI_PROP_RESET(P_DETAILS): ([]) ]),
135 "/items/schaufel");
136
137 // Eine Zwiebel im Raum, eine andere Beschreibung hat als die im
138 // Spielerinventar
139 AddVItem("zwiebel", VI_REFRESH_REMOVE,
140 ([P_LONG: "Die Zwiebel sieht etwas vertrocknet aus.\n",
141 P_DETAILS: ([ ({"blatt","blaetter"}): "Sie haengen herab.\n"]),
142 ]),
143 "/items/kraeuter/zwiebel",
144 // Die hier gesammelte Zwiebel ist besonders toll
145 ([P_ZWIEBEL_TYP: EXTRA_STARK]) );
146
147 // Eine modifizierte Eisenstange
148 AddVItem("eisstange", VI_REFRESH_REMOVE,
149 0,
150 "/items/eisenstange",
151 ([P_LONG:BS("Diese Eisstange eignet sich hervorragend dazu, "
152 "mit ihr auf jemanden einzuschlagen.\n"),
153 P_SHORT:"Ein Eisstange.",
154 P_NAME: "Eisstange",
155 VI_PROP_RESET(P_IDS): ({"stange", "eisstange"}),
156 VI_PROP_RESET(P_MATERIAL): ([MAT_ICE: 100]),
157 VI_PROP_RESET(P_DAM_TYPE): ({DT_BLUDGEON, DT_COLD}),
158 P_WEIGHT: 5000,
159 P_VALUE: 500,
160 VI_PROP_RESET(P_SMELLS): ([SENSE_DEFAULT:
161 "Das Eis riecht nach Vanille!\n"]),
162 ])
163 );
164
165 // Ein Ueberraschungs-Ei - verwandelt sich beim Nehmen in was anderes.
166 // (Keine tolle Idee, soll nur zeigen, dass es geht.)
167 AddVItem("ue-ei", VI_REFRESH_REMOVE,
168 ([P_SHORT:"Ein Ue-Ei.",
169 P_LONG: BS("Da liegt tatsaechlich ein Ue-Ei auf dem Boden. "
170 "Wenn man es nimmt, verwandelt es sich in etwas anderes."),
171 VI_PROP_RESET(P_IDS): ({"ue-ei","ei"}),
172 ]),
173 "/items/schaufel"
174 );
175
176
177SIEHE AUCH
178----------
179
180 :doc:`RemoveVItem`, :doc:`AddItem`, :doc:`RemoveItem`
181 :doc:`../std/vitems`
182
183Last modified: 03.04.2019, Zesstra
184