--- deliantra/server/include/object.h 2009/11/09 03:08:24 1.218 +++ deliantra/server/include/object.h 2010/01/30 23:30:26 1.225 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * @@ -167,9 +167,8 @@ bool ACC (RW, flag[NUM_FLAGS]); #endif - shstr ACC (RW, materialname); /* specific material name */ + materialtype_t *material; // What material this object consists of //TODO, make perl-accessible shstr ACC (RW, skill); /* Name of the skill this object uses/grants */ -// materialtype_t *ACC (RW, material); /* What material this object consists of */ object_ptr ACC (RW, owner); /* Pointer to the object which controls this one */ object_ptr ACC (RW, enemy); /* Monster/player to follow even if not closest */ object_ptr ACC (RW, attacked_by); /* This object start to attack us! only player & monster */ @@ -288,10 +287,10 @@ shstr ACC (RW, custom_name); /* Custom name assigned by player */ }; -const char *query_weight (const object *op); -const char *query_short_name (const object *op); -const char *query_name (const object *op); -const char *query_base_name (const object *op, int plural); +const_utf8_string query_weight (const object *op); +const_utf8_string query_short_name (const object *op); +const_utf8_string query_name (const object *op); +const_utf8_string query_base_name (const object *op, int plural); struct object : zero_initialised, object_copy { @@ -382,7 +381,7 @@ MTH void destroy_inv (bool drop_to_ground = false); MTH object *insert (object *item); // insert into inventory MTH void play_sound (faceidx sound) const; - MTH void say_msg (const char *msg) const; + MTH void say_msg (const_utf8_string msg) const; void do_remove (); MTH void remove () @@ -471,9 +470,9 @@ MTH void change_luck (int value); // info must hold 256 * 3 bytes currently - const char *debug_desc (char *info) const; - MTH const char *debug_desc () const; // uses at least 3 round-robin buffers - const char *flag_desc (char *desc, int len) const; + const_utf8_string debug_desc (char *info) const; + MTH const_utf8_string debug_desc () const; // uses at least 3 round-robin buffers + const_utf8_string flag_desc (char *desc, int len) const; MTH bool decrease (sint32 nr = 1); // returns true if anything is left MTH object *split (sint32 nr = 1); // return 0 on failure @@ -491,15 +490,18 @@ MTH void update_weight (); // return the dominant material of this item, always return something - const materialtype_t *dominant_material () const; + const materialtype_t *dominant_material () const + { + return material; + } // return the volume of this object in cm³ MTH uint64 volume () const { return (uint64)total_weight () - * 1000 - * (type == CONTAINER ? 1000 : 1) - / dominant_material ()->density; + * 1024 // 1000 actually + * (type == CONTAINER ? 128 : 1) + / dominant_material ()->density; // ugh, division } MTH bool is_arch () const { return this == (const object *)(const archetype *)arch; } @@ -518,7 +520,9 @@ && (subtype == SP_BULLET || subtype == SP_MAGIC_MISSILE)); } MTH bool is_range () const { return type == BOW || type == ROD || type == WAND || type == HORN; } - MTH bool has_active_speed () const { return fabs (speed) >= MIN_ACTIVE_SPEED; } + MTH bool is_dragon () const; + + MTH bool has_active_speed () const { return speed >= MIN_ACTIVE_SPEED; } // temporary: wether the object can be saved in a map file // contr => is a player @@ -616,10 +620,10 @@ MTH std::string describe_item (object *who = 0); MTH std::string describe (object *who = 0); // long description, without name - MTH const char *query_weight () { return ::query_weight (this); } - MTH const char *query_name () { return ::query_name (this); } - MTH const char *query_short_name () { return ::query_short_name (this); } - MTH const char *query_base_name (bool plural) { return ::query_base_name (this, plural); } + MTH const_utf8_string query_weight () { return ::query_weight (this); } + MTH const_utf8_string query_name () { return ::query_name (this); } + MTH const_utf8_string query_short_name () { return ::query_short_name (this); } + MTH const_utf8_string query_base_name (bool plural) { return ::query_base_name (this, plural); } // If this object has no extra parts but should have them, // add them, effectively expanding heads into multipart @@ -646,7 +650,7 @@ void enter_exit (object *exit);//Perl MTH void enter_map (maptile *newmap, int x, int y); - void player_goto (const char *path, int x, int y); // only for players + void player_goto (const_utf8_string path, int x, int y); // only for players // returns the mapspace this object is in mapspace &ms () const; @@ -707,10 +711,10 @@ MTH struct region *region () const; - void statusmsg (const char *msg, int color = NDI_BLACK); - void failmsg (const char *msg, int color = NDI_RED); + void statusmsg (const_utf8_string msg, int color = NDI_BLACK); + void failmsg (const_utf8_string msg, int color = NDI_RED); - const char *query_inventory (object *who = 0, const char *indent = ""); + const_utf8_string query_inventory (object *who = 0, const_utf8_string indent = ""); MTH const_octet_string ref () const; // creates and returns a consistent persistent object reference static object *deref (const_octet_string ref); // returns the object from the generated refreence, if possible @@ -733,7 +737,7 @@ MTH int anim_frames () const { return anim ().num_animations; } MTH int anim_facings () const { return anim ().facings; } - MTH char *as_string (); + MTH utf8_string as_string (); protected: void link (); @@ -768,7 +772,7 @@ //+GPL -object *find_skill_by_name_fuzzy (object *who, const char *name); +object *find_skill_by_name_fuzzy (object *who, const_utf8_string name); object *find_skill_by_name (object *who, shstr_cmp sh); object *find_skill_by_number (object *who, int skillno); @@ -789,7 +793,7 @@ static arch_ptr empty; // the empty_archetype MTH static void gc (); - archetype (const char *name); + archetype (const_utf8_string name); ~archetype (); void gather_callbacks (AV *&callbacks, event_type event) const; @@ -798,7 +802,7 @@ MTH void link (); MTH void unlink (); - MTH static object *get (const char *name); // (find() || singularity)->instance() + MTH static object *get (const_utf8_string name); // (find() || singularity)->instance() MTH object *instance (); MTH void post_load_check (); // do some adjustments after parsing @@ -815,17 +819,20 @@ static void postpone_arch_ref (arch_ptr &ref, const_utf8_string other_arch); /* postpone other_arch reference */ }; -// compatbiility, remove once replaced by ->instance -inline object * -arch_to_object (archetype *at) +// returns whether the objetc is a dragon player, which are often specialcased +inline bool +object::is_dragon () const { - return at->instance (); + return arch->race == shstr_dragon && is_player (); } inline void -object_freezer::put (keyword k, archetype *v) +object_freezer::put (const keyword_string k, archetype *v) { - put (k, v ? &v->archname : (const char *)0); + if (expect_true (v)) + put (k, v->archname); + else + put (k); } typedef object_vector objectvec;