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, 11 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

# Content
1 /*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 *
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 * 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 *
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, see <http://www.gnu.org/licenses/>.
20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 */
23
24 #ifndef OBJECT_H
25 #define OBJECT_H
26
27 #include <bitset>
28
29 #include "cfperl.h"
30 #include "shstr.h"
31
32 typedef int tag_t;
33
34 enum {
35 body_skill,
36 body_combat,
37 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
52 enum slottype_t
53 {
54 slot_none,
55 slot_combat,
56 slot_ranged,
57 };
58
59 /* See common/item.c */
60
61 typedef struct Body_Locations
62 {
63 keyword save_name; /* Name used to load/save it to disk */
64 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 } 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 struct key_value
81 {
82 key_value *next;
83 shstr key, value;
84 };
85
86 struct UUID
87 {
88 uint64 seq;
89
90 UUID () { }
91 UUID (uint64 seq) : seq(seq) { }
92 operator uint64() { return seq; }
93 void operator =(uint64 seq) { this->seq = seq; }
94 };
95
96 extern void init_uuid ();
97 extern UUID gen_uuid ();
98 extern const uint64 UUID_SKIP;
99
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 #define WILL_APPLY_HANDLE 0x01
106 #define WILL_APPLY_TREASURE 0x02
107 #define WILL_APPLY_EARTHWALL 0x04
108 #define WILL_APPLY_DOOR 0x08
109 #define WILL_APPLY_FOOD 0x10
110
111 struct body_slot
112 {
113 signed char info:4; /* body info as loaded from the file */
114 signed char used:4; /* Calculated value based on items equipped */
115 };
116
117 INTERFACE_CLASS (object)
118 // these are being copied
119 struct object_copy : attachable
120 {
121 typedef bitset<NUM_FLAGS> flags_t;
122
123 sint16 ACC (RW, x), ACC (RW, y); /* Position in the map for this object */
124
125 uint8 ACC (RW, type); /* PLAYER, BULLET, etc. See define.h */
126 uint8 ACC (RW, subtype); /* subtype of object */
127 sint8 ACC (RW, direction); /* Means the object is moving that way. */
128 sint8 ACC (RW, facing); /* Object is oriented/facing that way. */
129
130 shstr ACC (RW, name); /* The name of the object, obviously... */
131 shstr ACC (RW, name_pl); /* The plural name of the object */
132 shstr ACC (RW, title); /* Of foo, etc */
133 shstr ACC (RW, race); /* human, goblin, dragon, etc */
134 shstr ACC (RW, slaying); /* Which race to do double damage to */
135 /* If this is an exit, this is the filename */
136 shstr ACC (RW, skill); /* Name of the skill this object uses/grants */
137 shstr ACC (RW, msg); /* If this is a book/sign/magic mouth/etc */
138 shstr ACC (RW, lore); /* Obscure information about this object, */
139 /* To get put into books and the like. */
140 shstr ACC (RW, materialname); /* specific material name */
141 shstr ACC (RW, custom_name); /* Custom name assigned by player */
142 // materialtype_t *ACC (RW, material); /* What material this object consists of */
143 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 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
153 float ACC (RW, speed); /* The overall speed of this object */
154 float ACC (RW, speed_left); /* How much speed is left to spend this round */
155 uint32 ACC (RW, nrof); /* How many of the objects */
156
157 /* This next big block are basically used for monsters and equipment */
158 uint16 ACC (RW, client_type); /* Public type information. see doc/Developers/objects */
159
160 sint16 ACC (RW, resist[NROFATTACKS]); /* Resistance adjustments for attacks */
161 uint32 ACC (RW, attacktype); /* Bitmask of attacks this object does */
162 uint32 ACC (RW, path_attuned);/* Paths the object is attuned to */
163 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 uint16 ACC (RW, materials); /* What materials this object consists of */
166 sint8 ACC (RW, magic); /* Any magical bonuses to this item */
167 uint8 ACC (RW, state); /* How the object was last drawn (animation) */
168 sint32 ACC (RW, value); /* How much money it is worth (or contains) */
169 /* Note that the last_.. values are sometimes used for non obvious
170 * meanings by some objects, eg, sp penalty, permanent exp.
171 */
172 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 sint16 ACC (RW, level); /* Level of creature or object */
178 uint8 ACC (RW, pick_up); /* See crossfire.doc */
179 sint8 ACC (RW, item_power); /* power rating of the object */
180 sint8 ACC (RW, gen_sp_armour);/* sp regen penalty this object has (was last_heal) */
181 sint8 ACC (RW, glow_radius); /* indicates the glow radius of the object */
182 sint32 ACC (RW, weight); /* Attributes of the object */
183 sint32 ACC (RW, weight_limit);/* Weight-limit of object */
184 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 body_slot slot [NUM_BODY_LOCATIONS];
189 faceidx ACC (RW, face); /* Face with colors */
190 living ACC (RO, stats); /* Str, Con, Dex, etc */
191 /* See the pod/objects.pod for more info about body locations */
192
193 /* Following mostly refers to fields only used for monsters */
194 uint32 ACC (RW, hide); /* The object is hidden, not invisible */
195
196 /* allows different movement patterns for attackers */
197 sint32 ACC (RW, move_status); /* What stage in attack mode */
198 uint16 ACC (RW, attack_movement); /* What kind of attack movement */
199 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 /* races/classes can need less/more exp to gain levels */
202
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 sint16 ACC (RW, duration); /* How long the spell lasts */
208 sint16 ACC (RW, casting_time);/* time left before spell goes off */
209
210 uint16 ACC (RW, start_holding);
211 uint8 ACC (RW, duration_modifier); /* how level modifies duration */
212 uint8 ACC (RW, dam_modifier); /* How going up in level effects damage */
213
214 sint8 ACC (RW, range); /* Range of the spell */
215 uint8 ACC (RW, range_modifier); /* How going up in level effects range */
216 MoveType ACC (RW, move_type); /* Type of movement this object uses */
217 MoveType ACC (RW, move_block);/* What movement types this blocks */
218
219 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
224 float ACC (RW, move_slow_penalty); /* How much this slows down the object */
225
226 char *ACC (RW, spellarg);
227
228 /* Following are values used by any object */
229 /* this objects turns into or what this object creates */
230 treasurelist *ACC (RW, randomitems); /* Items to be generated */
231 flags_t flag; /* various flags */
232 #if FOR_PERL
233 bool ACC (RW, flag[NUM_FLAGS]);
234 #endif
235 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 sint16 ACC (RW, elevation); /* elevation of this terrain - not currently used */
239 uint8 ACC (RW, smoothlevel); /* how to smooth this square around */
240 uint8 ACC (RW, will_apply); /* See crossfire.doc */
241 };
242
243 struct object : zero_initialised, object_copy
244 {
245 // These variables are not changed by ->copy_to
246 maptile_ptr ACC (RW, map); /* Pointer to the map in which this object is present */
247
248 UUID ACC (RW, uuid); // Unique Identifier, survives saves etc.
249 int ACC (RO, count);
250 object_vector_index ACC (RO, index); // index into objects
251 object_vector_index ACC (RO, active); // index into actives
252
253 player_ptr ACC (RW, contr); /* Pointer to the player which control this object */
254
255 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
260 //TODO: container must move into client
261 object_ptr ACC (RW, container); /* Current container being used. I think this
262 * 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 key_value *key_values; /* Fields not explictly known by the loader. */
271
272 bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all
273 void post_load_check (); // do some adjustments after parsing
274 static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go.
275 bool write (object_freezer &f);
276
277 MTH int slottype () const;
278 MTH static object *create ();
279 object &operator =(const object &src);
280 MTH void copy_to (object *dst);
281 MTH object *clone (); // create + copy_to
282 void do_destroy ();
283 void gather_callbacks (AV *&callbacks, event_type event) const;
284 MTH void destroy (bool destroy_inventory = false);
285
286 // recursively destroy all objects in inventory, optionally dropping them to the ground instead
287 MTH void destroy_inv (bool drop_to_ground = false);
288 MTH object *insert (object *item); // insert into inventory
289 void do_remove ();
290 MTH void remove ()
291 {
292 if (!flag [FLAG_REMOVED])
293 do_remove ();
294 }
295
296 static bool can_merge_slow (object *op1, object *op2);
297
298 // this is often used in time-critical code, so optimise
299 MTH static bool can_merge (object *op1, object *op2)
300 {
301 return op1->value == op2->value
302 && op1->name == op2->name
303 && can_merge_slow (op1, op2);
304 }
305
306 MTH void set_owner (object *owner);
307 MTH void set_speed (float speed);
308 MTH bool change_weapon (object *ob);
309 MTH bool change_skill (object *ob);
310
311 MTH void open_container (object *new_container);
312 MTH void close_container ()
313 {
314 open_container (0);
315 }
316
317 // overwrite the attachable should_invoke function with a version that also checks ev_want_type
318 bool should_invoke (event_type event)
319 {
320 return ev_want_event [event] || ev_want_type [type] || cb;
321 }
322
323 MTH void instantiate ();
324
325 // recalculate all stats
326 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
335 // info must hold 256 * 3 bytes currently
336 const char *debug_desc (char *info) const;
337 MTH const char *debug_desc () const; // uses at least 3 round-robin buffers
338 const char *flag_desc (char *desc, int len) const;
339
340 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 const materialtype_t *dominant_material () const;
352
353 // return the volume of this object in cm³
354 uint64 volume () const
355 {
356 return total_weight ()
357 * 1000
358 * (type == CONTAINER ? 1000 : 1)
359 / dominant_material ()->density;
360 }
361
362 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 MTH bool is_range () const { return type == BOW || type == ROD || type == WAND || type == HORN; }
374
375 MTH bool has_active_speed () const { return FABS(speed) >= MIN_ACTIVE_SPEED; }
376
377 // temporary: wether the object can be saved in a map file
378 // contr => is a player
379 // head => only save head of a multitile object
380 // owner => can not reference owner yet
381 MTH bool can_map_save () const { return !contr && !head && !owner && !flag [FLAG_NO_MAP_SAVE]; }
382
383 /* This return true if object has still randomitems which
384 * could be expanded.
385 */
386 MTH bool has_random_items () const { return randomitems && !flag [FLAG_IS_A_TEMPLATE]; }
387
388 // returns the player that has this object in his inventory, or 0
389 MTH object *in_player () const
390 {
391 for (object *op = env; op; op = op->env)
392 if (op->type == PLAYER)
393 return op;
394
395 return 0;
396 }
397
398 // "temporary" helper function
399 MTH object *head_ ()
400 {
401 return head ? head : this;
402 }
403
404 MTH bool is_head ()
405 {
406 return head_ () == this;
407 }
408
409 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 // 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 MTH void expand_tail ();
419
420 MTH void create_treasure (treasurelist *tl, int flags = 0);
421
422 // 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 MTH void activate ();
427 MTH void deactivate ();
428 MTH void activate_recursive ();
429 MTH void deactivate_recursive ();
430
431 // set the givne flag on all objects in the inventory recursively
432 MTH void set_flag_inv (int flag, int value = 1);
433
434 void enter_exit (object *exit);//Perl
435 MTH void enter_map (maptile *newmap, int x, int y);
436
437 // returns the mapspace this object is in
438 mapspace &ms () const;
439
440 // fully recursive iterator
441 struct iterator_base
442 {
443 object *item;
444
445 iterator_base (object *container)
446 : item (container)
447 {
448 }
449
450 operator object *() const { return item; }
451
452 object *operator ->() const { return item; }
453 object &operator * () const { return *item; }
454 };
455
456 MTH unsigned int random_seed () const
457 {
458 return (unsigned int)uuid.seq;
459 }
460
461 // depth-first recursive iterator
462 struct depth_iterator : iterator_base
463 {
464 depth_iterator (object *container);
465 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 return this;
473 }
474
475 object *end ()
476 {
477 return this;
478 }
479
480 /* 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 MTH struct region *region () const;
489
490 protected:
491 void link ();
492 void unlink ();
493
494 object ();
495 ~object ();
496 };
497
498 // 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 typedef struct oblnk
518 { /* Used to link together several objects */
519 object_ptr ob;
520 struct oblnk *next;
521 } objectlink;
522
523 typedef struct oblinkpt
524 { /* Used to link together several object links */
525 struct oblnk *link;
526 long value; /* Used as connected value in buttons/gates */
527 struct oblinkpt *next;
528 } oblinkpt;
529
530 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 /*
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 INTERFACE_CLASS (archetype)
544 struct archetype : object
545 {
546 archetype (const char *name);
547 ~archetype ();
548 void gather_callbacks (AV *&callbacks, event_type event) const;
549
550 static archetype *read (object_thawer &f);
551 static archetype *get (const char *name); // find or create
552 static archetype *find (const char *name);
553
554 void link ();
555 void unlink ();
556
557 object_vector_index ACC (RW, archid); // index in archvector
558 shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */
559 bool ACC (RW, stub); // if true, this is an invalid archetype
560 uint32 ACC (RW, editable); /* editable flags (mainly for editor) */
561
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 };
565
566 inline void
567 object_freezer::put (keyword k, archetype *v)
568 {
569 put (k, v ? &v->archname : (const char *)0);
570 }
571
572 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 /* 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 #define UP_OBJ_FACE 4 /* Only thing that changed was the face */
599
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 #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
634 #define ARCH_DEPLETION "depletion"
635
636 #endif
637