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