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