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

# Content
1 /*
2 * 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
25 #ifndef OBJECT_H
26 #define OBJECT_H
27
28 #include <bitset>
29
30 #include "cfperl.h"
31 #include "shstr.h"
32
33 typedef int tag_t;
34 #define NUM_BODY_LOCATIONS 12
35 #define BODY_ARMS 1
36
37 /* See common/item.c */
38
39 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 } 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 struct key_value
59 {
60 key_value *next;
61 shstr key, value;
62 };
63
64 struct UUID
65 {
66 uint64 seq;
67
68 UUID () { }
69 UUID (uint64 seq) : seq(seq) { }
70 operator uint64() { return seq; }
71 void operator =(uint64 seq) { this->seq = seq; }
72 };
73
74 extern void init_uuid ();
75 extern UUID gen_uuid ();
76 extern const uint64 UUID_SKIP;
77
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 #define WILL_APPLY_HANDLE 0x01
84 #define WILL_APPLY_TREASURE 0x02
85 #define WILL_APPLY_EARTHWALL 0x04
86 #define WILL_APPLY_DOOR 0x08
87 #define WILL_APPLY_FOOD 0x10
88
89 /* 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 * e.g. ->copy_to ()
92 */
93
94 INTERFACE_CLASS (object)
95 // these are being copied
96 struct object_copy : attachable
97 {
98 typedef bitset<NUM_FLAGS> flags_t;
99
100 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 shstr ACC (RW, name); /* The name of the object, obviously... */
104 shstr ACC (RW, name_pl); /* The plural name of the object */
105 shstr ACC (RW, title); /* Of foo, etc */
106 shstr ACC (RW, race); /* human, goblin, dragon, etc */
107 shstr ACC (RW, slaying); /* Which race to do double damage to */
108 /* If this is an exit, this is the filename */
109 shstr ACC (RW, skill); /* Name of the skill this object uses/grants */
110 shstr ACC (RW, msg); /* If this is a book/sign/magic mouth/etc */
111 shstr ACC (RW, lore); /* Obscure information about this object, */
112 /* To get put into books and the like. */
113 shstr ACC (RW, materialname); /* specific material name */
114 shstr ACC (RW, custom_name); /* Custom name assigned by player */
115 // materialtype_t *ACC (RW, material); /* What material this object consists of */
116 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 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
126 float ACC (RW, speed); /* The overall speed of this object */
127 float ACC (RW, speed_left); /* How much speed is left to spend this round */
128 uint32 ACC (RW, nrof); /* How many of the objects */
129
130 /* This next big block are basically used for monsters and equipment */
131 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 sint16 ACC (RW, resist[NROFATTACKS]); /* Resistance adjustments for attacks */
135 uint32 ACC (RW, attacktype); /* Bitmask of attacks this object does */
136 uint32 ACC (RW, path_attuned);/* Paths the object is attuned to */
137 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 uint16 ACC (RW, materials); /* What materials this object consists of */
140 sint8 ACC (RW, magic); /* Any magical bonuses to this item */
141 uint8 ACC (RW, state); /* How the object was last drawn (animation) */
142 sint32 ACC (RW, value); /* How much money it is worth (or contains) */
143 /* Note that the last_.. values are sometimes used for non obvious
144 * meanings by some objects, eg, sp penalty, permanent exp.
145 */
146 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 sint16 ACC (RW, level); /* Level of creature or object */
152 uint8 ACC (RW, pick_up); /* See crossfire.doc */
153 sint8 ACC (RW, item_power); /* power rating of the object */
154 sint8 ACC (RW, gen_sp_armour);/* sp regen penalty this object has (was last_heal) */
155 sint8 ACC (RW, glow_radius); /* indicates the glow radius of the object */
156 sint32 ACC (RW, weight); /* Attributes of the object */
157 sint32 ACC (RW, weight_limit);/* Weight-limit of object */
158 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 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 faceidx ACC (RW, face); /* Face with colors */
165 living ACC (RO, stats); /* Str, Con, Dex, etc */
166 /* See the pod/objects.pod for more info about body locations */
167
168 /* Following mostly refers to fields only used for monsters */
169 uint32 ACC (RW, hide); /* The object is hidden, not invisible */
170
171 /* allows different movement patterns for attackers */
172 sint32 ACC (RW, move_status); /* What stage in attack mode */
173 uint16 ACC (RW, attack_movement); /* What kind of attack movement */
174 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 /* races/classes can need less/more exp to gain levels */
177
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 sint16 ACC (RW, duration); /* How long the spell lasts */
183 sint16 ACC (RW, casting_time);/* time left before spell goes off */
184 uint16 ACC (RW, start_holding);
185 uint8 ACC (RW, duration_modifier); /* how level modifies duration */
186 uint8 ACC (RW, dam_modifier); /* How going up in level effects damage */
187 sint8 ACC (RW, range); /* Range of the spell */
188 uint8 ACC (RW, range_modifier); /* How going up in level effects range */
189
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 char *ACC (RW, spellarg);
199
200 /* Following are values used by any object */
201 /* this objects turns into or what this object creates */
202 treasurelist *ACC (RW, randomitems); /* Items to be generated */
203 key_value *key_values; /* Fields not explictly known by the loader. */
204 flags_t flag; /* various flags */
205 #if FOR_PERL
206 bool ACC (RW, flag[NUM_FLAGS]);
207 #endif
208 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 sint16 ACC (RW, elevation); /* elevation of this terrain - not currently used */
212 uint8 ACC (RW, smoothlevel); /* how to smooth this square around */
213 uint8 ACC (RW, will_apply); /* See crossfire.doc */
214 };
215
216 struct object : zero_initialised, object_copy
217 {
218 // These variables are not changed by ->copy_to
219 maptile_ptr ACC (RW, map); /* Pointer to the map in which this object is present */
220
221 UUID ACC (RW, uuid); // Unique Identifier, survives saves etc.
222 int ACC (RO, count);
223 int ACC (RO, index); // index into objects
224 int ACC (RO, active); // index into actives
225
226 player_ptr ACC (RW, contr); /* Pointer to the player which control this object */
227
228 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
233 //TODO: container must move into client
234 object_ptr ACC (RW, container); /* Current container being used. I think this
235 * 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 bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all
245 static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go.
246 bool write (object_freezer &f);
247
248 MTH static object *create ();
249 MTH void copy_to (object *dst);
250 MTH object *clone (); // create + copy_to
251 void do_destroy ();
252 void gather_callbacks (AV *&callbacks, event_type event) const;
253 MTH void destroy (bool destroy_inventory = false);
254
255 // recursively destroy all objects in inventory, optionally dropping them to the ground instead
256 MTH void destroy_inv (bool drop_to_ground = false);
257 MTH object *insert (object *item); // insert into inventory
258 void do_remove ();
259 MTH void remove ()
260 {
261 if (!flag [FLAG_REMOVED])
262 do_remove ();
263 }
264
265 static bool can_merge_slow (object *op1, object *op2);
266
267 // this is often used in time-critical code, so optimise
268 MTH static bool can_merge (object *op1, object *op2)
269 {
270 return op1->value == op2->value
271 && op1->name == op2->name
272 && can_merge_slow (op1, op2);
273 }
274
275 MTH void set_owner (object *owner);
276 MTH void set_speed (float speed);
277
278 MTH void open_container (object *new_container);
279 MTH void close_container ()
280 {
281 open_container (0);
282 }
283
284 MTH void instantiate ();
285
286 // recalculate all stats
287 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
296 // info must hold 256 * 3 bytes currently
297 const char *debug_desc (char *info) const;
298 MTH const char *debug_desc () const;
299 const char *debug_desc2 () const; // another debug_desc, pure convinience function
300 const char *flag_desc (char *desc, int len) const;
301
302 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 const materialtype_t *dominant_material () const;
314
315 // return the volume of this object in cm³
316 uint64 volume () const
317 {
318 return total_weight ()
319 * 1000
320 * (type == CONTAINER ? 1000 : 1)
321 / dominant_material ()->density;
322 }
323
324 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
336 MTH bool has_active_speed () const { return FABS(speed) >= MIN_ACTIVE_SPEED; }
337
338 // temporary: wether the object can be saved in a map file
339 // contr => is a player
340 // head => only save head of a multitile object
341 // owner => can not reference owner yet
342 MTH bool can_map_save () const { return !contr && !head && !owner && !flag [FLAG_NO_MAP_SAVE]; }
343
344 /* This return true if object has still randomitems which
345 * could be expanded.
346 */
347 MTH bool has_random_items () const { return randomitems && !flag [FLAG_IS_A_TEMPLATE]; }
348
349 // returns the player that has this object in his inventory, or 0
350 MTH object *in_player () const
351 {
352 for (object *op = env; op; op = op->env)
353 if (op->type == PLAYER)
354 return op;
355
356 return 0;
357 }
358
359 // "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 MTH void activate ();
370 MTH void deactivate ();
371 MTH void activate_recursive ();
372 MTH void deactivate_recursive ();
373
374 // set the givne flag on all objects in the inventory recursively
375 MTH void set_flag_inv (int flag, int value = 1);
376
377 void enter_exit (object *exit);//PERL
378 MTH void enter_map (maptile *newmap, int x, int y);
379
380 // returns the mapspace this object is in
381 mapspace &ms () const;
382
383 // fully recursive iterator
384 struct iterator_base
385 {
386 object *item;
387
388 iterator_base (object *container)
389 : item (container)
390 {
391 }
392
393 operator object *() const { return item; }
394
395 object *operator ->() const { return item; }
396 object &operator * () const { return *item; }
397 };
398
399 MTH unsigned int random_seed () const
400 {
401 return (unsigned int)uuid.seq;
402 }
403
404 // depth-first recursive iterator
405 struct depth_iterator : iterator_base
406 {
407 depth_iterator (object *container);
408 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 return this;
416 }
417
418 object *end ()
419 {
420 return this;
421 }
422
423 /* 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 MTH struct region *region () const;
432
433 protected:
434 friend struct archetype;
435
436 void link ();
437 void unlink ();
438
439 object ();
440 ~object ();
441 };
442
443 typedef object_vector<object, &object::index > objectvec;
444 typedef object_vector<object, &object::active> activevec;
445
446 extern objectvec objects;
447 extern activevec actives;
448
449 #define for_all_objects(var) \
450 for (unsigned _i = 0; _i < objects.size (); ++_i) \
451 declvar (object *, var, objects [_i])
452
453 #define for_all_actives(var) \
454 for (unsigned _i = 0; _i < actives.size (); ++_i) \
455 declvar (object *, var, actives [_i])
456
457 typedef struct oblnk
458 { /* Used to link together several objects */
459 object_ptr ob;
460 struct oblnk *next;
461 } objectlink;
462
463 typedef struct oblinkpt
464 { /* Used to link together several object links */
465 struct oblnk *link;
466 long value; /* Used as connected value in buttons/gates */
467 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 INTERFACE_CLASS (archetype)
480 struct archetype : zero_initialised, attachable
481 {
482 archetype ();
483 ~archetype ();
484 void gather_callbacks (AV *&callbacks, event_type event) const;
485
486 static archetype *read (object_thawer &f);
487 static archetype *find (const char *name);
488
489 void hash_add (); // add to hashtable
490 void hash_del (); // remove from hashtable
491
492 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 object ACC (RO, clone); /* An object from which to do ->copy_to () */
497 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 };
502
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 #define UP_OBJ_FACE 4 /* Only thing that changed was the face */
510
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 #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
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