--- deliantra/server/include/object.h 2010/04/04 20:00:05 1.234 +++ deliantra/server/include/object.h 2010/04/13 03:44:21 1.242 @@ -25,8 +25,6 @@ #ifndef OBJECT_H #define OBJECT_H -#include - #include "cfperl.h" #include "shstr.h" @@ -297,13 +295,19 @@ int SP_level_duration_adjust (object *caster, object *spob); int SP_level_range_adjust (object *caster, object *spob); -struct object : zero_initialised, object_copy +struct freelist_item +{ + freelist_item *next; + uint32_t count; +}; + +struct object : object_copy { // These variables are not changed by ->copy_to maptile *ACC (RW, map); /* Pointer to the map in which this object is present */ UUID ACC (RW, uuid); // Unique Identifier, survives saves etc. - int ACC (RO, count); + uint32_t ACC (RO, count); object_vector_index ACC (RO, index); // index into objects object_vector_index ACC (RO, active); // index into actives @@ -325,6 +329,16 @@ object *head; /* Points to the main object of a large body */ // NO ACC, perl semantics are different key_value *key_values; /* Fields not explictly known by the loader. */ + MTH void set_flag (int flagnum) + { + flag [flagnum] = true; + } + + MTH void clr_flag (int flagnum) + { + flag [flagnum] = false; + } + // privates / perl shstr_tmp kv_get (shstr_tmp key) const; void kv_del (shstr_tmp key); @@ -383,6 +397,7 @@ // recursively destroy all objects in inventory, optionally dropping them to the ground instead MTH void destroy_inv (bool drop_to_ground = false); + MTH void destroy_inv_fast (); // like destroy_inv (false), but only works when *this is destroyed, too MTH object *insert (object *item); // insert into inventory MTH void play_sound (faceidx sound) const; MTH void say_msg (const_utf8_string msg) const; @@ -435,7 +450,6 @@ MTH void set_owner (object *owner); MTH void set_speed (float speed); MTH void set_glow_radius (sint8 rad); - MTH bool change_skill (object *ob); // deprecated? MTH void open_container (object *new_container); MTH void close_container () @@ -536,6 +550,8 @@ MTH bool is_dragon () const; + MTH bool is_immunity () const { return invisible && type == SIGN; } + MTH bool has_active_speed () const { return speed >= MIN_ACTIVE_SPEED; } // temporary: wether the object can be saved in a map file @@ -650,6 +666,11 @@ MTH void create_treasure (treasurelist *tl, int flags = 0); + // makes sure the player has the named skill, + // and also makes it innate if can_use is true. + // returns the new skill or 0 if no such skill exists. + MTH object *give_skill (shstr_cmp name, bool can_use = false); + // insert object at same map position as 'where' // handles both inventory and map "positions" MTH object *insert_at (object *where, object *originator = 0, int flags = 0); @@ -731,6 +752,7 @@ void statusmsg (const_utf8_string msg, int color = NDI_BLACK); void failmsg (const_utf8_string msg, int color = NDI_RED); + void failmsgf (const_utf8_string format, ...); // always NDI_RED... const_utf8_string query_inventory (object *who = 0, const_utf8_string indent = ""); @@ -757,10 +779,20 @@ MTH utf8_string as_string (); + // low-level management, statistics, ... + static uint32_t ACC (RW, object_count); + static uint32_t ACC (RW, free_count); + static uint32_t ACC (RW, create_count); + static uint32_t ACC (RW, destroy_count); + static freelist_item *freelist; + MTH static void freelist_free (int count); + protected: void link (); void unlink (); + void do_delete (); + object (); ~object (); @@ -806,7 +838,7 @@ //-GPL INTERFACE_CLASS (archetype) -struct archetype : object +struct archetype : object, zero_initialised { static arch_ptr empty; // the empty_archetype MTH static void gc (); @@ -834,6 +866,9 @@ static archetype *read (object_thawer &f); MTH static void commit_load (); // commit any objects loaded, resolves cyclic dependencies and more static void postpone_arch_ref (arch_ptr &ref, const_utf8_string other_arch); /* postpone other_arch reference */ + +protected: + void do_delete (); }; // returns whether the object is a dragon player, which are often specialcased