--- deliantra/server/include/object.h 2010/07/02 19:54:41 1.255 +++ deliantra/server/include/object.h 2016/11/16 22:14:05 1.269 @@ -1,24 +1,24 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001 Mark Wedel & Crossfire Development Team * Copyright (©) 1992 Frank Tore Johansen - * + * * Deliantra is free software: you can redistribute it and/or modify it under * the terms of the Affero GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the Affero GNU General Public License * and the GNU General Public License along with this program. If not, see * . - * + * * The authors can be reached via e-mail to */ @@ -35,36 +35,26 @@ // also see common/item.C enum { - body_skill, - body_combat, - body_range, - body_shield, - body_arm, - body_torso, - body_head, - body_neck, - body_finger, - body_shoulder, - body_foot, - body_hand, - body_wrist, - body_waist, +# define def(name, use, nonuse) body_ ## name, +# include "slotinc.h" +# undef def NUM_BODY_LOCATIONS }; /* See common/item.c */ -typedef struct Body_Locations +struct Body_Locations { - keyword save_name; /* Name used to load/save it to disk */ + const char *name; /* Short name/identifier */ + keyword kw; /* Name used to load/save it to disk */ const char *use_name; /* Name used when describing an item we can use */ const char *nonuse_name; /* Name to describe objects we can't use */ -} Body_Locations; +}; extern Body_Locations body_locations[NUM_BODY_LOCATIONS]; // for each set of directions (1 == up, 2 == right, 4 == down, 8 == left) -// contaisn the wall suffix (0, 1_3, 1_4 and so on). +// contains the wall suffix (0, 1_3, 1_4 and so on). extern const char *wall_suffix[16]; #define NUM_COINS 4 /* number of coin types */ @@ -85,10 +75,59 @@ */ struct key_value : slice_allocated { - key_value *next; + key_value *next; // must be first element shstr key, value; }; +// "crossfires version of a perl hash." +struct key_values +{ + key_value *first; // must be first element + + bool empty() const + { + return !first; + } + + void clear (); + shstr_tmp get (shstr_tmp key) const; + void del (shstr_tmp key); + void set (shstr_tmp key, shstr_tmp value); + + void add (shstr_tmp key, shstr_tmp value); // liek set, but doesn't check for duplicates + void reverse (); // reverses the ordering, to be used after loading an object + key_values &operator =(const key_values &kv); + + // custom extra fields management + struct access_proxy + { + key_values &kv; + shstr_tmp key; + + access_proxy (key_values &kv, shstr_tmp key) + : kv (kv), key (key) + { + } + + const access_proxy &operator =(shstr_tmp value) const + { + kv.set (key, value); + return *this; + } + + operator const shstr_tmp () const { return kv.get (key); } + operator const char *() const { return kv.get (key); } + + private: + void operator =(int); + }; + + const access_proxy operator [](shstr_tmp key) + { + return access_proxy (*this, key); + } +}; + //-GPL struct UUID @@ -257,7 +296,7 @@ //float ACC (RW, expmul) = 1.0; /* needed experience = (calc_exp*expmul) - means some */ // /* races/classes can need less/more exp to gain levels */ - static const float expmul = 1.0;//D + constexpr static const float expmul = 1.0;//D float ACC (RW, move_slow_penalty); /* How much this slows down the object */ /* Following are values used by any object */ @@ -334,7 +373,6 @@ */ object *ACC (RW, more); /* Pointer to the rest of a large body of objects */ 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) { @@ -346,43 +384,11 @@ flag [flagnum] = false; } - // privates / perl - shstr_tmp kv_get (shstr_tmp key) const; - void kv_del (shstr_tmp key); - void kv_set (shstr_tmp key, shstr_tmp value); + // extra key value pairs + key_values kv; //-GPL - // custom extra fields management - struct key_value_access_proxy - { - object &ob; - shstr_tmp key; - - key_value_access_proxy (object &ob, shstr_tmp key) - : ob (ob), key (key) - { - } - - const key_value_access_proxy &operator =(shstr_tmp value) const - { - ob.kv_set (key, value); - return *this; - } - - operator const shstr_tmp () const { return ob.kv_get (key); } - operator const char *() const { return ob.kv_get (key); } - - private: - void operator =(int); - }; - - // operator [] is too annoying to use - const key_value_access_proxy kv (shstr_tmp key) - { - return key_value_access_proxy (*this, key); - } - bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all MTH void post_load_check (); // do some adjustments after parsing static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go. @@ -454,7 +460,7 @@ && can_merge_slow (op1, op2); } - MTH void set_owner (object *owner); + MTH void set_owner (object_ornull *owner); MTH void set_speed (float speed); MTH void set_glow_radius (sint8 rad); @@ -478,6 +484,8 @@ || (!env && flag [FLAG_APPLIED])); } + MTH object *find_spell (const_utf8_string prefix) const; + MTH object *force_find (shstr_tmp name); MTH void force_set_timer (int duration); MTH object *force_add (shstr_tmp name, int duration = 0); @@ -517,9 +525,9 @@ return nrof ? nrof : 1; } - MTH sint32 total_weight () const + MTH weight_t total_weight () const { - return (weight + carrying) * number_of (); + return sint64 (weight + carrying) * number_of (); } MTH void update_weight (); @@ -531,9 +539,9 @@ } // return the volume of this object in cm³ - MTH uint64 volume () const + MTH volume_t volume () const { - return (uint64)total_weight () + return (volume_t)total_weight () * 1024 // 1000 actually * (type == CONTAINER ? 128 : 1) / dominant_material ()->density; // ugh, division @@ -697,6 +705,9 @@ MTH void activate_recursive (); MTH void deactivate_recursive (); + // prefetch and activate the surrounding area + MTH void prefetch_surrounding_maps (); + // set the given flag on all objects in the inventory recursively MTH void set_flag_inv (int flag, int value = 1); @@ -875,7 +886,7 @@ MTH void post_load_check (); // do some adjustments after parsing object_vector_index ACC (RW, archid); // index in archvector - shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */ + shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */ sint8 ACC (RW, max_x); /* extents, compared to the head (min_x, min_y should be zero, but aren't...) */ @@ -917,16 +928,16 @@ #define for_inv_removable(op,var) \ for (object *var, *next_ = (op)->inv; (var = next_), var && (next_ = var->below), var; ) -#define for_all_objects(var) \ - for (unsigned _i = 0; _i < objects.size (); ++_i) \ +#define for_all_objects(var) \ + for (unsigned _i = 0; _i < objects.size (); ++_i) \ statementvar (object *, var, objects [_i]) -#define for_all_actives(var) \ - for (unsigned _i = 0; _i < actives.size (); ++_i) \ +#define for_all_actives(var) \ + for (unsigned _i = 0; _i < actives.size (); ++_i) \ statementvar (object *, var, actives [_i]) -#define for_all_archetypes(var) \ - for (unsigned _i = 0; _i < archetypes.size (); ++_i) \ +#define for_all_archetypes(var) \ + for (unsigned _i = 0; _i < archetypes.size (); ++_i) \ statementvar (archetype *, var, archetypes [_i]) //+GPL @@ -939,7 +950,7 @@ #define UP_OBJ_CHANGE 3 #define UP_OBJ_FACE 4 /* Only thing that changed was the face */ -/* These are flags passed to insert_ob_in_map and +/* These are flags passed to insert_ob_in_map and * insert_ob_in_ob. Note that all flags may not be meaningful * for both functions. * Most are fairly explanatory: