From: <js...@us...> - 2005-08-10 04:54:20
|
Update of /cvsroot/exult/exult In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5675 Modified Files: actors.cc actors.h Log Message: Starting support for NPC 'attributes' Index: actors.cc =================================================================== RCS file: /cvsroot/exult/exult/actors.cc,v retrieving revision 1.616 retrieving revision 1.617 diff -u -d -r1.616 -r1.617 --- actors.cc 24 Jul 2005 22:47:36 -0000 1.616 +++ actors.cc 10 Aug 2005 04:54:11 -0000 1.617 @@ -29,6 +29,8 @@ # include <cstring> #endif #include <algorithm> /* swap. */ +#include <set> +#include <map> #include "Astar.h" #include "Audio.h" #include "Gump_manager.h" @@ -78,6 +80,8 @@ using std::rand; using std::string; using std::swap; +using std::set; +using std::map; #endif Actor *Actor::editing = 0; @@ -182,6 +186,40 @@ { return ((((i&16)/8) - ((i&32)/32)) + 4)%4; } /* + * Provide attribute/value pairs. + */ +class Actor_attributes + { + static set<string> *strings; // So names get shared. + typedef map<const char *,int> Att_map; + Att_map map; +public: + Actor_attributes() + { + if (!strings) + strings = new std::set<string>; + } + void set(const char *nm, int val) + { + std::set<string>::iterator siter = strings->find(nm); + if (siter == strings->end()) + siter = strings->insert(nm).first; + nm = (*siter).c_str(); + map[nm] = val; + } + int get(const char *nm) // Returns 0 if not set. + { + std::set<string>::const_iterator siter = strings->find(nm); + if (siter == strings->end()) + return 0; + nm = (*siter).c_str(); + Att_map::const_iterator it = map.find(nm); + return it == map.end() ? 0 : (*it).second; + } + }; +set<string> *Actor_attributes::strings = 0; + +/* * Get/create timers. */ @@ -541,7 +579,8 @@ siflags(0), type_flags(0), ident(0), skin_color(-1), action(0), frame_time(0), step_index(0), timers(0), - weapon_rect(0, 0, 0, 0), rest_time(0), casting_mode(false) + weapon_rect(0, 0, 0, 0), rest_time(0), casting_mode(false), + atts(0) { set_shape(shapenum, 0); init(); @@ -559,6 +598,7 @@ delete schedule; delete action; delete timers; + delete atts; } /* @@ -2335,6 +2375,33 @@ } /* + * For mods and new games: Set generic attribute keyed by a name. + */ + +void Actor::set_attribute + ( + const char *nm, + int val + ) + { + if (!atts) + atts = new Actor_attributes; + atts->set(nm, val); + } + +/* + * Get generic attribute. Returns 0 if not set. + */ + +int Actor::get_attribute + ( + const char *nm + ) + { + return atts ? atts->get(nm) : 0; + } + +/* * Set flag. */ Index: actors.h =================================================================== RCS file: /cvsroot/exult/exult/actors.h,v retrieving revision 1.262 retrieving revision 1.263 diff -u -d -r1.262 -r1.263 --- actors.h 21 Jul 2005 06:33:42 -0000 1.262 +++ actors.h 10 Aug 2005 04:54:11 -0000 1.263 @@ -39,6 +39,7 @@ class Npc_timer_list; class Frames_sequence; class Animator; +class Actor_attributes; // The range of actors' rect. gumps: const int ACTOR_FIRST_GUMP = 57, ACTOR_LAST_GUMP = 68; @@ -58,6 +59,7 @@ short face_num; // Which shape for conversations. short party_id; // Index in party, or -1. int properties[12]; // Properties set/used in 'usecode'. + Actor_attributes *atts; // Generic atts. (for new games/mods). unsigned char temperature; // Measure of coldness (0-63). short shape_save; // Our old shape, or -1. short oppressor; // NPC ID (>= 0) of oppressor, or -1. @@ -394,6 +396,9 @@ -(properties[(int) strength]/3); } int get_level() const // Get experience level. { return 1 + Log2(get_property(exp)/50); } + // Get/set generic attribute. + void set_attribute(const char *nm, int val); + int get_attribute(const char *nm); Npc_timer_list *need_timers(); // Set/clear/get actor flag. virtual void set_flag(int flag); |