ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/object.h
Revision: 1.135
Committed: Sun Jul 1 05:00:18 2007 UTC (16 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.134: +11 -12 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

File Contents

# User Rev Content
1 root 1.92 /*
2 root 1.135 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 root 1.128 *
4     * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5     * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7     *
8 root 1.135 * Crossfire TRT is free software: you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation, either version 3 of the License, or
11     * (at your option) any later version.
12 root 1.128 *
13 root 1.135 * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17 root 1.128 *
18 root 1.135 * You should have received a copy of the GNU General Public License
19     * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 root 1.128 *
21     * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 root 1.86 */
23 root 1.1
24     #ifndef OBJECT_H
25     #define OBJECT_H
26    
27 root 1.56 #include <bitset>
28    
29 root 1.6 #include "cfperl.h"
30 root 1.7 #include "shstr.h"
31 root 1.6
32 root 1.81 typedef int tag_t;
33 root 1.109
34 root 1.118 enum {
35 root 1.122 body_skill,
36     body_combat,
37 root 1.118 body_range,
38     body_shield,
39     body_arm,
40     body_torso,
41     body_head,
42     body_neck,
43     body_finger,
44     body_shoulder,
45     body_foot,
46     body_hand,
47     body_wrist,
48     body_waist,
49     NUM_BODY_LOCATIONS
50     };
51 root 1.1
52 root 1.121 enum slottype_t
53     {
54     slot_none,
55     slot_combat,
56     slot_ranged,
57     };
58    
59 root 1.1 /* See common/item.c */
60    
61 root 1.20 typedef struct Body_Locations
62     {
63 root 1.127 keyword save_name; /* Name used to load/save it to disk */
64 root 1.20 const char *use_name; /* Name used when describing an item we can use */
65     const char *nonuse_name; /* Name to describe objects we can't use */
66 root 1.1 } Body_Locations;
67    
68     extern Body_Locations body_locations[NUM_BODY_LOCATIONS];
69    
70     /*
71     * Each object (this also means archetypes!) could have a few of these
72     * "dangling" from it; this could also end up containing 'parse errors'.
73     *
74     * key and value are shared-strings.
75     *
76     * Please use get_ob_key_value(), set_ob_key_value() from object.c rather than
77     * accessing the list directly.
78     * Exception is if you want to walk this list for some reason.
79     */
80 root 1.20 struct key_value
81     {
82     key_value *next;
83     shstr key, value;
84 root 1.15 };
85 root 1.1
86 root 1.34 struct UUID
87     {
88     uint64 seq;
89 root 1.53
90     UUID () { }
91     UUID (uint64 seq) : seq(seq) { }
92     operator uint64() { return seq; }
93     void operator =(uint64 seq) { this->seq = seq; }
94 root 1.34 };
95    
96     extern void init_uuid ();
97     extern UUID gen_uuid ();
98 elmex 1.45 extern const uint64 UUID_SKIP;
99 root 1.1
100     /* Definition for WILL_APPLY values. Replaces having harcoded values
101     * sprinkled in the code. Note that some of these also replace fields
102     * that were in the can_apply area. What is the point of having both
103     * can_apply and will_apply?
104     */
105 root 1.27 #define WILL_APPLY_HANDLE 0x01
106     #define WILL_APPLY_TREASURE 0x02
107     #define WILL_APPLY_EARTHWALL 0x04
108     #define WILL_APPLY_DOOR 0x08
109 root 1.14 #define WILL_APPLY_FOOD 0x10
110 root 1.1
111 root 1.116 struct body_slot
112     {
113 root 1.117 signed char info:4; /* body info as loaded from the file */
114     signed char used:4; /* Calculated value based on items equipped */
115 root 1.116 };
116    
117 root 1.68 INTERFACE_CLASS (object)
118 root 1.65 // these are being copied
119 root 1.68 struct object_copy : attachable
120 root 1.18 {
121 root 1.65 typedef bitset<NUM_FLAGS> flags_t;
122 root 1.1
123 root 1.68 sint16 ACC (RW, x), ACC (RW, y); /* Position in the map for this object */
124 root 1.117
125     uint8 ACC (RW, type); /* PLAYER, BULLET, etc. See define.h */
126     uint8 ACC (RW, subtype); /* subtype of object */
127 root 1.68 sint8 ACC (RW, direction); /* Means the object is moving that way. */
128     sint8 ACC (RW, facing); /* Object is oriented/facing that way. */
129 root 1.117
130 root 1.20 shstr ACC (RW, name); /* The name of the object, obviously... */
131     shstr ACC (RW, name_pl); /* The plural name of the object */
132 root 1.46 shstr ACC (RW, title); /* Of foo, etc */
133 root 1.20 shstr ACC (RW, race); /* human, goblin, dragon, etc */
134     shstr ACC (RW, slaying); /* Which race to do double damage to */
135 root 1.68 /* If this is an exit, this is the filename */
136 root 1.46 shstr ACC (RW, skill); /* Name of the skill this object uses/grants */
137 root 1.20 shstr ACC (RW, msg); /* If this is a book/sign/magic mouth/etc */
138     shstr ACC (RW, lore); /* Obscure information about this object, */
139 root 1.68 /* To get put into books and the like. */
140 root 1.20 shstr ACC (RW, materialname); /* specific material name */
141     shstr ACC (RW, custom_name); /* Custom name assigned by player */
142 root 1.96 // materialtype_t *ACC (RW, material); /* What material this object consists of */
143 root 1.41 object_ptr ACC (RW, owner); /* Pointer to the object which controls this one */
144     object_ptr ACC (RW, enemy); /* Monster/player to follow even if not closest */
145     object_ptr ACC (RW, attacked_by); /* This object start to attack us! only player & monster */
146     object_ptr ACC (RW, chosen_skill); /* the skill chosen to use */
147     object_ptr ACC (RW, spellitem); /* Spell ability monster is choosing to use */
148     object_ptr ACC (RW, spell); /* Spell that was being cast */
149     object_ptr ACC (RW, current_weapon); /* Pointer to the weapon currently used */
150 root 1.62 arch_ptr ACC (RW, arch); /* Pointer to archetype */
151     arch_ptr ACC (RW, other_arch);/* Pointer used for various things - mostly used for what */
152 elmex 1.63
153 root 1.46 float ACC (RW, speed); /* The overall speed of this object */
154 root 1.20 float ACC (RW, speed_left); /* How much speed is left to spend this round */
155 root 1.46 uint32 ACC (RW, nrof); /* How many of the objects */
156 root 1.18
157     /* This next big block are basically used for monsters and equipment */
158 root 1.20 uint16 ACC (RW, client_type); /* Public type information. see doc/Developers/objects */
159 root 1.117
160 root 1.67 sint16 ACC (RW, resist[NROFATTACKS]); /* Resistance adjustments for attacks */
161 root 1.20 uint32 ACC (RW, attacktype); /* Bitmask of attacks this object does */
162 root 1.46 uint32 ACC (RW, path_attuned);/* Paths the object is attuned to */
163 root 1.20 uint32 ACC (RW, path_repelled); /* Paths the object is repelled from */
164     uint32 ACC (RW, path_denied); /* Paths the object is denied access to */
165 root 1.96 uint16 ACC (RW, materials); /* What materials this object consists of */
166 root 1.46 sint8 ACC (RW, magic); /* Any magical bonuses to this item */
167     uint8 ACC (RW, state); /* How the object was last drawn (animation) */
168 root 1.20 sint32 ACC (RW, value); /* How much money it is worth (or contains) */
169 root 1.18 /* Note that the last_.. values are sometimes used for non obvious
170     * meanings by some objects, eg, sp penalty, permanent exp.
171     */
172 root 1.20 sint32 ACC (RW, last_heal); /* Last healed. Depends on constitution */
173     sint32 ACC (RW, last_sp); /* As last_heal, but for spell points */
174     sint16 ACC (RW, last_grace); /* as last_sp, except for grace */
175     sint16 ACC (RW, last_eat); /* How long since we last ate */
176     sint16 ACC (RW, invisible); /* How much longer the object will be invis */
177 root 1.26 sint16 ACC (RW, level); /* Level of creature or object */
178 root 1.20 uint8 ACC (RW, pick_up); /* See crossfire.doc */
179     sint8 ACC (RW, item_power); /* power rating of the object */
180 root 1.46 sint8 ACC (RW, gen_sp_armour);/* sp regen penalty this object has (was last_heal) */
181 root 1.26 sint8 ACC (RW, glow_radius); /* indicates the glow radius of the object */
182 root 1.20 sint32 ACC (RW, weight); /* Attributes of the object */
183 root 1.46 sint32 ACC (RW, weight_limit);/* Weight-limit of object */
184 root 1.20 sint32 ACC (RW, carrying); /* How much weight this object contains */
185     sint64 ACC (RW, perm_exp); /* Permanent exp */
186     uint32 ACC (RW, weapontype); /* type of weapon */
187     uint32 ACC (RW, tooltype); /* type of tool or build facility */
188 root 1.116 body_slot slot [NUM_BODY_LOCATIONS];
189 root 1.104 faceidx ACC (RW, face); /* Face with colors */
190 root 1.36 living ACC (RO, stats); /* Str, Con, Dex, etc */
191 root 1.68 /* See the pod/objects.pod for more info about body locations */
192 root 1.18
193     /* Following mostly refers to fields only used for monsters */
194 root 1.46 uint32 ACC (RW, hide); /* The object is hidden, not invisible */
195 root 1.68
196 root 1.18 /* allows different movement patterns for attackers */
197 root 1.20 sint32 ACC (RW, move_status); /* What stage in attack mode */
198     uint16 ACC (RW, attack_movement); /* What kind of attack movement */
199 root 1.26 uint16 ACC (RW, run_away); /* Monster runs away if it's hp goes below this percentage. */
200     float ACC (RW, expmul); /* needed experience = (calc_exp*expmul) - means some */
201 root 1.68 /* races/classes can need less/more exp to gain levels */
202 root 1.18
203     /* Spell related information, may be useful elsewhere
204     * Note that other fields are used - these files are basically
205     * only used in spells.
206     */
207 root 1.20 sint16 ACC (RW, duration); /* How long the spell lasts */
208 root 1.46 sint16 ACC (RW, casting_time);/* time left before spell goes off */
209 root 1.117
210 root 1.26 uint16 ACC (RW, start_holding);
211     uint8 ACC (RW, duration_modifier); /* how level modifies duration */
212 root 1.20 uint8 ACC (RW, dam_modifier); /* How going up in level effects damage */
213 root 1.117
214 root 1.46 sint8 ACC (RW, range); /* Range of the spell */
215 root 1.20 uint8 ACC (RW, range_modifier); /* How going up in level effects range */
216 root 1.68 MoveType ACC (RW, move_type); /* Type of movement this object uses */
217     MoveType ACC (RW, move_block);/* What movement types this blocks */
218 root 1.117
219 root 1.68 MoveType ACC (RW, move_allow);/* What movement types explicitly allowd */
220     MoveType ACC (RW, move_on); /* Move types affected moving on to this space */
221     MoveType ACC (RW, move_off); /* Move types affected moving off this space */
222     MoveType ACC (RW, move_slow); /* Movement types this slows down */
223 root 1.117
224 root 1.68 float ACC (RW, move_slow_penalty); /* How much this slows down the object */
225    
226 root 1.36 char *ACC (RW, spellarg);
227 root 1.18
228     /* Following are values used by any object */
229 root 1.56 /* this objects turns into or what this object creates */
230 root 1.40 treasurelist *ACC (RW, randomitems); /* Items to be generated */
231 root 1.66 flags_t flag; /* various flags */
232 root 1.67 #if FOR_PERL
233     bool ACC (RW, flag[NUM_FLAGS]);
234     #endif
235 root 1.46 uint16 ACC (RW, animation_id);/* An index into the animation array */
236     uint8 ACC (RW, anim_speed); /* ticks between animation-frames */
237     uint8 ACC (RW, last_anim); /* last sequence used to draw face */
238 root 1.68 sint16 ACC (RW, elevation); /* elevation of this terrain - not currently used */
239 root 1.46 uint8 ACC (RW, smoothlevel); /* how to smooth this square around */
240 root 1.32 uint8 ACC (RW, will_apply); /* See crossfire.doc */
241 elmex 1.4 };
242    
243 root 1.68 struct object : zero_initialised, object_copy
244 root 1.18 {
245 root 1.65 // These variables are not changed by ->copy_to
246 root 1.68 maptile_ptr ACC (RW, map); /* Pointer to the map in which this object is present */
247 root 1.65
248     UUID ACC (RW, uuid); // Unique Identifier, survives saves etc.
249 root 1.82 int ACC (RO, count);
250 root 1.134 object_vector_index ACC (RO, index); // index into objects
251     object_vector_index ACC (RO, active); // index into actives
252 root 1.65
253     player_ptr ACC (RW, contr); /* Pointer to the player which control this object */
254 root 1.81
255 root 1.65 object *ACC (RW, below); /* Pointer to the object stacked below this one */
256     object *ACC (RW, above); /* Pointer to the object stacked above this one */
257     /* Note: stacked in the *same* environment */
258     object *inv; /* Pointer to the first object in the inventory */
259 root 1.83
260     //TODO: container must move into client
261 root 1.99 object_ptr ACC (RW, container); /* Current container being used. I think this
262 root 1.65 * is only used by the player right now.
263     */
264     object *ACC (RW, env); /* Pointer to the object which is the environment.
265     * This is typically the container that the object is in.
266     */
267     object *ACC (RW, more); /* Pointer to the rest of a large body of objects */
268     object *head; /* Points to the main object of a large body */ // NO ACC, perl semantics are different
269     client_container *seen_by; // seen by which player/container currently?
270 root 1.105 key_value *key_values; /* Fields not explictly known by the loader. */
271 root 1.65
272 root 1.100 bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all
273 root 1.118 void post_load_check (); // do some adjustments after parsing
274 root 1.101 static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go.
275 root 1.100 bool write (object_freezer &f);
276    
277 root 1.121 MTH int slottype () const;
278 root 1.69 MTH static object *create ();
279 root 1.105 object &operator =(const object &src);
280 root 1.69 MTH void copy_to (object *dst);
281     MTH object *clone (); // create + copy_to
282 root 1.68 void do_destroy ();
283     void gather_callbacks (AV *&callbacks, event_type event) const;
284 root 1.69 MTH void destroy (bool destroy_inventory = false);
285 root 1.68
286     // recursively destroy all objects in inventory, optionally dropping them to the ground instead
287 root 1.69 MTH void destroy_inv (bool drop_to_ground = false);
288     MTH object *insert (object *item); // insert into inventory
289 root 1.95 void do_remove ();
290 root 1.88 MTH void remove ()
291     {
292     if (!flag [FLAG_REMOVED])
293 root 1.95 do_remove ();
294 root 1.88 }
295 root 1.22
296 root 1.51 static bool can_merge_slow (object *op1, object *op2);
297    
298     // this is often used in time-critical code, so optimise
299 root 1.69 MTH static bool can_merge (object *op1, object *op2)
300 root 1.51 {
301 root 1.52 return op1->value == op2->value
302     && op1->name == op2->name
303 root 1.51 && can_merge_slow (op1, op2);
304     }
305 root 1.19
306 root 1.69 MTH void set_owner (object *owner);
307 root 1.70 MTH void set_speed (float speed);
308 root 1.120 MTH bool change_weapon (object *ob);
309 root 1.123 MTH bool change_skill (object *ob);
310 root 1.51
311 root 1.99 MTH void open_container (object *new_container);
312     MTH void close_container ()
313     {
314     open_container (0);
315     }
316    
317 root 1.126 // overwrite the attachable should_invoke function with a version that also checks ev_want_type
318     bool should_invoke (event_type event)
319 root 1.125 {
320 root 1.126 return ev_want_event [event] || ev_want_type [type] || cb;
321 root 1.125 }
322    
323 root 1.100 MTH void instantiate ();
324 root 1.34
325 root 1.62 // recalculate all stats
326 root 1.69 MTH void update_stats ();
327     MTH void roll_stats ();
328     MTH void swap_stats (int a, int b);
329     MTH void add_statbonus ();
330     MTH void remove_statbonus ();
331     MTH void drain_stat ();
332     MTH void drain_specific_stat (int deplete_stats);
333     MTH void change_luck (int value);
334 root 1.62
335 root 1.33 // info must hold 256 * 3 bytes currently
336 root 1.73 const char *debug_desc (char *info) const;
337 root 1.113 MTH const char *debug_desc () const; // uses at least 3 round-robin buffers
338 root 1.75 const char *flag_desc (char *desc, int len) const;
339 root 1.33
340 root 1.96 int number_of () const
341     {
342     return nrof ? nrof : 1;
343     }
344    
345     uint64 total_weight () const
346     {
347     return weight * number_of ();
348     }
349    
350     // return the dominant material of this item, always return something
351 root 1.97 const materialtype_t *dominant_material () const;
352 root 1.96
353 root 1.98 // return the volume of this object in cm³
354 root 1.96 uint64 volume () const
355     {
356 root 1.98 return total_weight ()
357     * 1000
358     * (type == CONTAINER ? 1000 : 1)
359     / dominant_material ()->density;
360 root 1.96 }
361    
362 root 1.69 MTH bool is_weapon () const { return type == ARROW || type == BOW || type == WEAPON; }
363     MTH bool is_armor () const { return type == ARMOUR || type == SHIELD || type == HELMET
364     || type == CLOAK || type == BOOTS || type == GLOVES
365     || type == BRACERS || type == GIRDLE; }
366     MTH bool is_alive () const { return (type == PLAYER
367     || flag [FLAG_MONSTER]
368     || (flag [FLAG_ALIVE] && !flag [FLAG_GENERATOR] && type != DOOR))
369     && !flag [FLAG_IS_A_TEMPLATE]; }
370     MTH bool is_arrow () const { return type == ARROW
371     || (type == SPELL_EFFECT
372     && (subtype == SP_BULLET || subtype == SP_MAGIC_MISSILE)); }
373 root 1.114 MTH bool is_range () const { return type == BOW || type == ROD || type == WAND || type == HORN; }
374 root 1.57
375 elmex 1.74 MTH bool has_active_speed () const { return FABS(speed) >= MIN_ACTIVE_SPEED; }
376    
377 root 1.76 // temporary: wether the object can be saved in a map file
378 root 1.72 // contr => is a player
379     // head => only save head of a multitile object
380     // owner => can not reference owner yet
381 root 1.90 MTH bool can_map_save () const { return !contr && !head && !owner && !flag [FLAG_NO_MAP_SAVE]; }
382 root 1.72
383 root 1.57 /* This return true if object has still randomitems which
384     * could be expanded.
385     */
386 root 1.69 MTH bool has_random_items () const { return randomitems && !flag [FLAG_IS_A_TEMPLATE]; }
387 root 1.57
388 root 1.60 // returns the player that has this object in his inventory, or 0
389 root 1.69 MTH object *in_player () const
390 root 1.60 {
391     for (object *op = env; op; op = op->env)
392     if (op->type == PLAYER)
393     return op;
394    
395     return 0;
396     }
397    
398 root 1.71 // "temporary" helper function
399     MTH object *head_ ()
400     {
401     return head ? head : this;
402     }
403    
404 root 1.130 MTH bool is_head ()
405     {
406     return head_ () == this;
407     }
408    
409 root 1.110 MTH std::string long_desc (object *who = 0);
410     MTH std::string describe_monster (object *who = 0);
411     MTH std::string describe_item (object *who = 0);
412     MTH std::string describe (object *who = 0);
413    
414 root 1.109 // If this object has no extra parts but should have them,
415     // add them, effectively expanding heads into multipart
416     // objects. This method only works on objects not inserted
417     // anywhere.
418 root 1.111 MTH void expand_tail ();
419    
420     MTH void create_treasure (treasurelist *tl, int flags = 0);
421 root 1.109
422 root 1.71 // insert object at same map position as 'where'
423     // handles both inventory and map "positions"
424     MTH object *insert_at (object *where, object *originator = 0, int flags = 0);
425    
426 root 1.78 MTH void activate ();
427     MTH void deactivate ();
428     MTH void activate_recursive ();
429     MTH void deactivate_recursive ();
430 root 1.73
431 root 1.79 // set the givne flag on all objects in the inventory recursively
432     MTH void set_flag_inv (int flag, int value = 1);
433    
434 root 1.112 void enter_exit (object *exit);//Perl
435 root 1.73 MTH void enter_map (maptile *newmap, int x, int y);
436    
437 root 1.61 // returns the mapspace this object is in
438     mapspace &ms () const;
439    
440 root 1.29 // fully recursive iterator
441     struct iterator_base
442     {
443     object *item;
444    
445 root 1.30 iterator_base (object *container)
446     : item (container)
447 root 1.29 {
448     }
449    
450     operator object *() const { return item; }
451    
452     object *operator ->() const { return item; }
453     object &operator * () const { return *item; }
454     };
455    
456 root 1.77 MTH unsigned int random_seed () const
457     {
458     return (unsigned int)uuid.seq;
459     }
460    
461 root 1.30 // depth-first recursive iterator
462     struct depth_iterator : iterator_base
463 root 1.29 {
464 root 1.30 depth_iterator (object *container);
465 root 1.29 void next ();
466     object *operator ++( ) { next (); return item; }
467     object *operator ++(int) { object *i = item; next (); return i; }
468     };
469    
470     object *begin ()
471     {
472 root 1.30 return this;
473 root 1.29 }
474    
475     object *end ()
476     {
477 root 1.30 return this;
478 root 1.29 }
479    
480 root 1.84 /* This returns TRUE if the object is something that
481     * should be displayed in the floorbox/inventory window
482     */
483     MTH bool client_visible () const
484     {
485     return !invisible && type != PLAYER;
486     }
487    
488 root 1.93 MTH struct region *region () const;
489    
490 root 1.23 protected:
491 root 1.130 void link ();
492 root 1.24 void unlink ();
493    
494 root 1.23 object ();
495     ~object ();
496 elmex 1.4 };
497 root 1.1
498 root 1.124 // move this object to the top of its env's inventory to speed up
499     // searches for it.
500     static object *
501     splay (object *ob)
502     {
503     if (ob->env && ob->env->inv != ob)
504     {
505     if (ob->above) ob->above->below = ob->below;
506     if (ob->below) ob->below->above = ob->above;
507    
508     ob->above = 0;
509     ob->below = ob->env->inv;
510     ob->below->above = ob;
511     ob->env->inv = ob;
512     }
513    
514     return ob;
515     }
516    
517 root 1.20 typedef struct oblnk
518     { /* Used to link together several objects */
519 root 1.43 object_ptr ob;
520 root 1.1 struct oblnk *next;
521     } objectlink;
522    
523 root 1.20 typedef struct oblinkpt
524     { /* Used to link together several object links */
525 root 1.1 struct oblnk *link;
526 root 1.20 long value; /* Used as connected value in buttons/gates */
527 root 1.1 struct oblinkpt *next;
528     } oblinkpt;
529    
530 root 1.122 object *find_skill_by_name (object *who, const char *name);
531     object *find_skill_by_name (object *who, const shstr &sh);
532     object *find_skill_by_number (object *who, int skillno);
533    
534 root 1.1 /*
535     * The archetype structure is a set of rules on how to generate and manipulate
536     * objects which point to archetypes.
537     * This probably belongs in arch.h, but there really doesn't appear to
538     * be much left in the archetype - all it really is is a holder for the
539     * object and pointers. This structure should get removed, and just replaced
540     * by the object structure
541     */
542    
543 root 1.68 INTERFACE_CLASS (archetype)
544 root 1.130 struct archetype : object
545 root 1.15 {
546 root 1.130 archetype (const char *name);
547 root 1.22 ~archetype ();
548 root 1.68 void gather_callbacks (AV *&callbacks, event_type event) const;
549 root 1.22
550 root 1.108 static archetype *read (object_thawer &f);
551     static archetype *get (const char *name); // find or create
552 root 1.94 static archetype *find (const char *name);
553 root 1.38
554 root 1.130 void link ();
555     void unlink ();
556 root 1.44
557 root 1.134 object_vector_index ACC (RW, archid); // index in archvector
558 root 1.129 shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */
559     bool ACC (RW, stub); // if true, this is an invalid archetype
560 root 1.38 uint32 ACC (RW, editable); /* editable flags (mainly for editor) */
561 root 1.129
562     sint8 ACC (RW, min_x), ACC (RW, min_y); /* extents, compared to the head (min_x, min_y should be zero, but aren't...) */
563     sint8 ACC (RW, max_x), ACC (RW, max_y);
564 root 1.21 };
565 root 1.1
566 root 1.132 inline void
567     object_freezer::put (keyword k, archetype *v)
568     {
569     put (k, v ? &v->archname : (const char *)0);
570     }
571    
572 root 1.129 typedef object_vector<object, &object::index > objectvec;
573     typedef object_vector<object, &object::active> activevec;
574     typedef object_vector<archetype, &archetype::archid> archvec;
575    
576     extern objectvec objects;
577     extern activevec actives;
578     extern archvec archetypes;
579    
580     #define for_all_objects(var) \
581     for (unsigned _i = 0; _i < objects.size (); ++_i) \
582     statementvar (object *, var, objects [_i])
583    
584     #define for_all_actives(var) \
585     for (unsigned _i = 0; _i < actives.size (); ++_i) \
586     statementvar (object *, var, actives [_i])
587    
588     #define for_all_archetypes(var) \
589     for (unsigned _i = 0; _i < archetypes.size (); ++_i) \
590     statementvar (archetype *, var, archetypes [_i])
591    
592 root 1.1 /* Used by update_object to know if the object being passed is
593     * being added or removed.
594     */
595     #define UP_OBJ_INSERT 1
596     #define UP_OBJ_REMOVE 2
597     #define UP_OBJ_CHANGE 3
598 root 1.20 #define UP_OBJ_FACE 4 /* Only thing that changed was the face */
599 root 1.1
600     /* These are flags passed to insert_ob_in_map and
601     * insert_ob_in_ob. Note that all flags may not be meaningful
602     * for both functions.
603     * Most are fairly explanatory:
604     * INS_NO_MERGE: don't try to merge inserted object with ones alrady
605     * on space.
606     * INS_ABOVE_FLOOR_ONLY: Put object immediatly above the floor.
607     * INS_NO_WALK_ON: Don't call check_walk_on against the
608     * originator - saves cpu time if you know the inserted object
609     * is not meaningful in terms of having an effect.
610     * INS_ON_TOP: Always put object on top. Generally only needed when loading
611     * files from disk and ordering needs to be preserved.
612     * INS_BELOW_ORIGINATOR: Insert new object immediately below originator -
613     * Use for treasure chests so the new object is the highest thing
614     * beneath the player, but not actually above it. Note - the
615     * map and x,y coordinates for the object to be inserted must
616     * match the originator.
617     * INS_MAP_LOAD: disable lots of checkings done at insertion to
618     * speed up map loading process, as we assume the ordering in
619     * loaded map is correct.
620     *
621     * Note that INS_BELOW_ORIGINATOR, INS_ON_TOP, INS_ABOVE_FLOOR_ONLY
622     * are mutually exclusive. The behaviour for passing more than one
623     * should be considered undefined - while you may notice what happens
624     * right now if you pass more than one, that could very well change
625     * in future revisions of the code.
626     */
627 root 1.14 #define INS_NO_MERGE 0x0001
628     #define INS_ABOVE_FLOOR_ONLY 0x0002
629     #define INS_NO_WALK_ON 0x0004
630     #define INS_ON_TOP 0x0008
631     #define INS_BELOW_ORIGINATOR 0x0010
632     #define INS_MAP_LOAD 0x0020
633 root 1.1
634     #define ARCH_DEPLETION "depletion"
635    
636     #endif
637 root 1.44