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