… | |
… | |
377 | // info must hold 256 * 3 bytes currently |
377 | // info must hold 256 * 3 bytes currently |
378 | const char *debug_desc (char *info) const; |
378 | const char *debug_desc (char *info) const; |
379 | MTH const char *debug_desc () const; // uses at least 3 round-robin buffers |
379 | MTH const char *debug_desc () const; // uses at least 3 round-robin buffers |
380 | const char *flag_desc (char *desc, int len) const; |
380 | const char *flag_desc (char *desc, int len) const; |
381 | |
381 | |
382 | int number_of () const |
382 | MTH int number_of () const |
383 | { |
383 | { |
384 | return nrof ? nrof : 1; |
384 | return nrof ? nrof : 1; |
385 | } |
385 | } |
386 | |
386 | |
387 | uint64 total_weight () const |
387 | MTH sint32 total_weight () const |
388 | { |
388 | { |
389 | return weight * number_of (); |
389 | return weight * number_of () + carrying; |
390 | } |
390 | } |
|
|
391 | |
|
|
392 | MTH void update_weight (); |
391 | |
393 | |
392 | // return the dominant material of this item, always return something |
394 | // return the dominant material of this item, always return something |
393 | const materialtype_t *dominant_material () const; |
395 | const materialtype_t *dominant_material () const; |
394 | |
396 | |
395 | // return the volume of this object in cm³ |
397 | // return the volume of this object in cm³ |
396 | uint64 volume () const |
398 | MTH uint64 volume () const |
397 | { |
399 | { |
398 | return total_weight () |
400 | return total_weight () |
399 | * 1000 |
401 | * 1000 |
400 | * (type == CONTAINER ? 1000 : 1) |
402 | * (type == CONTAINER ? 1000 : 1) |
401 | / dominant_material ()->density; |
403 | / dominant_material ()->density; |
… | |
… | |
425 | /* This return true if object has still randomitems which |
427 | /* This return true if object has still randomitems which |
426 | * could be expanded. |
428 | * could be expanded. |
427 | */ |
429 | */ |
428 | MTH bool has_random_items () const { return randomitems && !flag [FLAG_IS_A_TEMPLATE]; } |
430 | MTH bool has_random_items () const { return randomitems && !flag [FLAG_IS_A_TEMPLATE]; } |
429 | |
431 | |
|
|
432 | // returns the outermost environment, never returns 0 |
|
|
433 | MTH object *outer_env () |
|
|
434 | { |
|
|
435 | for (object *op = this; ; op = op->env) |
|
|
436 | if (!op->env) |
|
|
437 | return op; |
|
|
438 | } |
|
|
439 | |
430 | // returns the player that has this object in his inventory, or 0 |
440 | // returns the player that has this object in his inventory, or 0 |
431 | MTH object *in_player () const |
441 | MTH object *in_player () const |
432 | { |
442 | { |
433 | for (object *op = env; op; op = op->env) |
443 | for (object *op = env; op; op = op->env) |
434 | if (op->type == PLAYER) |
444 | if (op->type == PLAYER) |
… | |
… | |
592 | */ |
602 | */ |
593 | |
603 | |
594 | INTERFACE_CLASS (archetype) |
604 | INTERFACE_CLASS (archetype) |
595 | struct archetype : object |
605 | struct archetype : object |
596 | { |
606 | { |
|
|
607 | static arch_ptr empty; // the empty_archetype |
|
|
608 | MTH static void gc (); |
|
|
609 | |
597 | archetype (const char *name); |
610 | archetype (const char *name); |
598 | ~archetype (); |
611 | ~archetype (); |
599 | void gather_callbacks (AV *&callbacks, event_type event) const; |
612 | void gather_callbacks (AV *&callbacks, event_type event) const; |
600 | |
613 | |
601 | static archetype *read (object_thawer &f); |
|
|
602 | |
|
|
603 | MTH static archetype *get (const_utf8_string name); // find or create |
|
|
604 | MTH static archetype *find (const_utf8_string name); |
614 | MTH static archetype *find (const_utf8_string name); |
605 | |
615 | |
606 | MTH void link (); |
616 | MTH void link (); |
607 | MTH void unlink (); |
617 | MTH void unlink (); |
608 | |
618 | |
609 | MTH object *instance (); |
619 | MTH object *instance (); |
610 | |
620 | |
611 | object_vector_index ACC (RW, archid); // index in archvector |
621 | object_vector_index ACC (RW, archid); // index in archvector |
612 | shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */ |
622 | shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */ |
613 | bool ACC (RW, stub); // if true, this is an invalid archetype |
|
|
614 | |
623 | |
615 | sint8 ACC (RW, min_x), ACC (RW, min_y); /* extents, compared to the head (min_x, min_y should be zero, but aren't...) */ |
624 | sint8 ACC (RW, min_x), ACC (RW, min_y); /* extents, compared to the head (min_x, min_y should be zero, but aren't...) */ |
616 | sint8 ACC (RW, max_x), ACC (RW, max_y); |
625 | sint8 ACC (RW, max_x), ACC (RW, max_y); |
|
|
626 | |
|
|
627 | // support for archetype loading |
|
|
628 | static archetype *read (object_thawer &f); |
|
|
629 | MTH static void commit_load (); // commit any objects loaded, resolves cyclic dependencies and more |
|
|
630 | static void postpone_arch_ref (arch_ptr &ref, const_utf8_string other_arch); /* postpone other_arch reference */ |
617 | }; |
631 | }; |
618 | |
632 | |
619 | inline void |
633 | inline void |
620 | object_freezer::put (keyword k, archetype *v) |
634 | object_freezer::put (keyword k, archetype *v) |
621 | { |
635 | { |