blob: 0b48656402eef1780a3754b021e2fe1fe5afdeb1 [file] [log] [blame]
Zesstraab13f8d2019-11-27 19:59:43 +01001
2AddvItem()
3**********
4
5
6FUNKTION
7========
8
Arathorn2e97b6a2019-12-03 00:37:34 +01009 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
24 loeschbar. Das vItem wird im Raum auch unter dieser ID
25 ansprechbar sein.
26
Zesstraab13f8d2019-11-27 19:59:43 +010027 refresh
Arathorn2e97b6a2019-12-03 00:37:34 +010028 Refresheinstellungen des vItems, nachdem es mitgenommen wurde
29
Zesstraab13f8d2019-11-27 19:59:43 +010030 shadowprops
Arathorn2e97b6a2019-12-03 00:37:34 +010031 Properties des vItems *im Raum* (optional, wenn <path> genutzt)
32
Zesstraab13f8d2019-11-27 19:59:43 +010033 path
Arathorn2e97b6a2019-12-03 00:37:34 +010034 Vorlage/Templat des vItems und Blueprint fuer Clones (optional)
35
Zesstraab13f8d2019-11-27 19:59:43 +010036 props
Arathorn2e97b6a2019-12-03 00:37:34 +010037 Properties, welche in Clones von der Vorlage gesetzt werden
38 (optional)
Zesstraab13f8d2019-11-27 19:59:43 +010039
40
41BESCHREIBUNG
42============
43
Arathorn2e97b6a2019-12-03 00:37:34 +010044 Dem Container/Raum wird ein virtuelles Item hinzugefuegt. Dieses
45 ist kein im Container vorhandenes reales Objekt, kann aber
46 (weitgehend) wie ein solches untersucht und behandelt werden.
Zesstraab13f8d2019-11-27 19:59:43 +010047
Arathorn2e97b6a2019-12-03 00:37:34 +010048 Falls das vItem ein reales Objekt als Templat hat (d.h. <path>
49 angegeben wird), kann das vItem standardmaessig mitgenommen werden,
50 es wird dafuer automatisch erzeugt. (Das Mitnehmen ist aber wie
51 immer mit P_NOGET verhinderbar.)
Zesstraab13f8d2019-11-27 19:59:43 +010052
53 Das Mapping <shadowprops> enthaelt die Properties, welche das vItem
54 im Container beschreiben. Hat das vItem ein Templat, werden alle
55 Properties, welche *nicht* in <shadowprops> enthalten sind, aus dem
56 Templat entnommen. Auf diese Weise kann man einem Objekt im Raum
57 unterschiedliche Eigenschaften geben.
58
Arathorn2e97b6a2019-12-03 00:37:34 +010059 Wird ein vItem mitgenommen, wird <path> geclont und die im Argument
60 <props> angegebenen Properties in ihm gesetzt. Auf diese Weise kann
61 man das genommene Objekt noch individuell konfigurieren.
Zesstraab13f8d2019-11-27 19:59:43 +010062
Arathorn2e97b6a2019-12-03 00:37:34 +010063 Zu beachten ist: in <shadowprops> enthaltene Properties *ersetzen*
64 (nicht ergaenzen) im Regelfall diejenigen im Templat *und* in
65 <props>. In <props> enthaltene Properties *ersetzen* wiederum
66 diejenigen im Templat. Ausnahmen sind Properties, welche ein
67 Mapping oder ein Array enthalten: Deren Inhalt wird *hinzugefuegt*.
68 Dies betrifft insbesondere die Properties: P_DETAILS,
69 P_READ_DETAILS, P_SMELLS, P_SOUNDS, P_TOUCH_DETAILS, P_IDS,
70 P_CLASS, P_ADJECTIVES. Will man dies nicht, kann man den
71 Propertynamen so angeben: VI_PROP_RESET(P_DETAILS), was dazu
72 fuehrt, dass P_DETAILS vor dem Hinzufuegen geloescht wird.
Zesstraab13f8d2019-11-27 19:59:43 +010073
Arathorn2e97b6a2019-12-03 00:37:34 +010074 Nachdem ein vItem mitgenommen wurde, ist es im Raum nicht mehr
75 ansprechbar. Es wird es je nach <refresh> wieder verfuegbar:
Zesstraab13f8d2019-11-27 19:59:43 +010076
Arathorn2e97b6a2019-12-03 00:37:34 +010077 * VI_REFRESH_NONE Es wird erst nach dem Neuladen/Neuerstellen
78 des Containers wieder verfuegbar.
79
Arathornb6667492020-01-08 21:48:54 +010080 * VI_REFRESH_ALWAYS
Arathorn2e97b6a2019-12-03 00:37:34 +010081
82 * VI_REFRESH_REMOVE Es wird mit dem naechsten Reset wieder
Arathornb6667492020-01-08 21:48:54 +010083 verfuegbar, wenn das Item genommen wurde (auch wenn es danach
84 wieder um Raum abgelegt wurde). *Vorsicht*
Arathorn2e97b6a2019-12-03 00:37:34 +010085
86 * VI_REFRESH_DESTRUCT Es wird mit dem naechsten Reset wieder
87 verfuegbar, wenn das geclonte Objekt nicht mehr existiert.
88
89 * VI_REFRESH_MOVE_HOME Das geclonte Objekt wird im naechsten
90 Reset 'zurueckgeholt', d.h. zerstoert und das vItem ist wieder
91 im Raum verfuegbar.
92
93 * VI_REFRESH_INSTANT Es ist abweichend vom Normalverhalten
94 sofort nach Mitnehmen wieder verfuegbar und mitnehmbar.
95 **Vorsicht!**
Zesstraab13f8d2019-11-27 19:59:43 +010096
97
98BEMERKUNGEN
99===========
100
Arathorn2e97b6a2019-12-03 00:37:34 +0100101 * vItems koennen geschachtelt werden, falls es sich um vItems mit
102 Vorlagen handelt.
103
104 * vItems sind verhaeltnismaessig aufwendig. Sie sollten nur
105 verwendet werden, wenn sie einen Mehrwert ggue. einfachen Details
106 haben. Es bringt nichts, jedes Detail gegen ein vItem zu
107 ersetzen.
108
109 * Es kann aber praktisch sein, komplexe Detailbaeume an einem
110 vItem zu verankern, wenn man diesen Detailbaum ein- oder
111 ausblenden will.
Zesstraab13f8d2019-11-27 19:59:43 +0100112
113
114BEISPIELE
115=========
116
117 // Ein einfaches VItem ohne Templat, nicht nehmbar
118 AddVItem("regal", VI_REFRESH_NONE,
119 ([P_LONG: "Das Wandregal hat 3 schwarze Bretter.",
120 P_GENDER: NEUTER,
121 P_IDS: ({"wandregal"}), // "regal" hat es automatisch
122 P_DETAILS: ([
123 "bretter": "Die Regelbretter sind ganz zerkratzt.\n",
124 "kratzer": "Da war wohl jemand achtlos.\n"
125 ]),
126 P_TOUCH_DETAILS: ([
127 SENSE_DEFAULT: "Du erspuerste tiefe Kratzer.\n",
128 "kratzer": Oha, die Kratzer sind ganz schoen tief!\n",
129 ]),
130 P_READ_DETAILS: ([SENSE_DEFAULT:
131 "Auf dem Regal ist eingraviert: 'Dies ist ein vItem-Test.'\n"
132 ]),
133 P_SMELLS: ([SENSE_DEFAULT:
134 "Das Regal riecht gar nicht. Wirklich nicht.\n"]),
135 ]) );
136
137 // Ein VItem mit Templat, nehmbar
138 AddVItem("schaufel", VI_REFRESH_REMOVE, 0, "/items/schaufel");
139
140 // Ein VItem mit Templat, nicht nehmbar
141 AddVItem("schaufel", VI_REFRESH_NONE, ([P_NOGET:1]), "/items/schaufel");
142
143 // Ein VItem, welches P_DETAIL komplett ueberschreibt und alle Details
144 // loescht.
145 AddVItem("schaufel", VI_REFRESH_REMOVE,
146 ([VI_PROP_RESET(P_DETAILS): ([]) ]),
147 "/items/schaufel");
148
149 // Eine Zwiebel im Raum, eine andere Beschreibung hat als die im
150 // Spielerinventar
151 AddVItem("zwiebel", VI_REFRESH_REMOVE,
152 ([P_LONG: "Die Zwiebel sieht etwas vertrocknet aus.\n",
153 P_DETAILS: ([ ({"blatt","blaetter"}): "Sie haengen herab.\n"]),
154 ]),
155 "/items/kraeuter/zwiebel",
156 // Die hier gesammelte Zwiebel ist besonders toll
157 ([P_ZWIEBEL_TYP: EXTRA_STARK]) );
158
159 // Eine modifizierte Eisenstange
160 AddVItem("eisstange", VI_REFRESH_REMOVE,
161 0,
162 "/items/eisenstange",
163 ([P_LONG:BS("Diese Eisstange eignet sich hervorragend dazu, "
164 "mit ihr auf jemanden einzuschlagen.\n"),
165 P_SHORT:"Ein Eisstange.",
166 P_NAME: "Eisstange",
167 VI_PROP_RESET(P_IDS): ({"stange", "eisstange"}),
168 VI_PROP_RESET(P_MATERIAL): ([MAT_ICE: 100]),
169 VI_PROP_RESET(P_DAM_TYPE): ({DT_BLUDGEON, DT_COLD}),
170 P_WEIGHT: 5000,
171 P_VALUE: 500,
172 VI_PROP_RESET(P_SMELLS): ([SENSE_DEFAULT:
173 "Das Eis riecht nach Vanille!\n"]),
174 ])
175 );
176
177 // Ein Ueberraschungs-Ei - verwandelt sich beim Nehmen in was anderes.
178 // (Keine tolle Idee, soll nur zeigen, dass es geht.)
179 AddVItem("ue-ei", VI_REFRESH_REMOVE,
180 ([P_SHORT:"Ein Ue-Ei.",
181 P_LONG: BS("Da liegt tatsaechlich ein Ue-Ei auf dem Boden. "
182 "Wenn man es nimmt, verwandelt es sich in etwas anderes."),
183 VI_PROP_RESET(P_IDS): ({"ue-ei","ei"}),
184 ]),
185 "/items/schaufel"
186 );
187
188
189SIEHE AUCH
190==========
191
Arathorn2e97b6a2019-12-03 00:37:34 +0100192 AddvItem(), AddItem(), RemoveItem() *../std/vitems*
Zesstraab13f8d2019-11-27 19:59:43 +0100193
194Last modified: 03.04.2019, Zesstra