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