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