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