ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/object.h
Revision: 1.104
Committed: Wed Mar 14 00:04:58 2007 UTC (17 years, 2 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.103: +1 -1 lines
Log Message:
- rewrote smooth face handling, as a side-effect, smoothing seems to work
  again and smooth faces can be reloaded.
- the server now sends the full animation for an object the first time
  it is seen, this uses slightly more bandwidth initially, but avoids
  the flickering for objects change their face later.

File Contents

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