Index: src/character/movement.h =================================================================== --- src/character/movement.h (revision 9176) +++ src/character/movement.h (working copy) @@ -31,16 +31,18 @@ typedef struct _xmlNode xmlNode; +// Position of a member relative to its superior one class member_mvt -{ // Position of a member relative to its superior one +{ + MemberType type; Double angle_rad; // angle in radian public: Point2d pos; Point2d scale; /* SetAngle take radian values */ - inline void SetAngle(Double angle) { angle_rad = RestrictAngle(angle); } + void SetAngle(Double angle) { angle_rad = RestrictAngle(angle); } /* GetAngle returns radian values */ - inline const Double &GetAngle() const { return angle_rad; } + const Double &GetAngle() const { return angle_rad; } Double alpha; int follow_cursor_limit; bool follow_cursor; @@ -48,17 +50,22 @@ bool follow_half_crosshair; bool follow_speed; bool follow_direction; - member_mvt(): angle_rad(0), pos(0.0, 0.0), scale(1.0, 1.0), alpha(1), - follow_cursor_limit(0), follow_cursor(false), - follow_crosshair(false), follow_half_crosshair(false), - follow_speed(false), follow_direction(false) + member_mvt(const std::string& name = DUMMY_MEMBER) + : type(name) + , angle_rad(ZERO), pos(ZERO, ZERO), scale(ONE, ONE), alpha(ONE) + , follow_cursor_limit(0), follow_cursor(false) + , follow_crosshair(false), follow_half_crosshair(false) + , follow_speed(false), follow_direction(false) { }; + operator const MemberType& () const { return type; } + bool operator==(const MemberType& other) const { return type == other; } + bool operator!=(const MemberType& other) const { return type == other; } }; class Movement { public: - typedef std::map member_def; // Describe the position of each member for a given frame + typedef std::vector member_def; // Describe the position of each member for a given frame private: uint ref_count; Index: src/character/member.cpp =================================================================== --- src/character/member.cpp (revision 9182) +++ src/character/member.cpp (working copy) @@ -18,7 +18,6 @@ ****************************************************************************** *****************************************************************************/ -#include #include #include "character/character.h" #include "character/member.h" Index: src/character/member_type.h =================================================================== --- src/character/member_type.h (revision 9182) +++ src/character/member_type.h (working copy) @@ -21,13 +21,15 @@ #ifndef MEMBER_TYPE_H #define MEMBER_TYPE_H +#define DUMMY_MEMBER "dummy" + class MemberType { typedef std::vector Vector; static Vector Map; public: int type; - MemberType(const std::string& name) + MemberType(const std::string& name = DUMMY_MEMBER) { uint count; for (count = 0; count #include #include #include "character/movement.h" @@ -61,19 +60,20 @@ * thr array to be able to get all of them. */ frames.resize(nodes.size()); + uint count=0; for (int frame_number=0; it != end; ++it, frame_number++) { xmlNodeArray members = XmlReader::GetNamedChildren(*it, "member"); xmlNodeArray::const_iterator it2; MSG_DEBUG("body.movement", " Found %i frame members", members.size()); + frames[frame_number].resize(members.size()); for (it2 = members.begin(); it2 != members.end(); ++it2) { - const xmlNode *child = *it2; std::string member_type; XmlReader::ReadStringAttr(child, "type", member_type); - member_mvt mvt; + member_mvt mvt(member_type); int dx = 0, dy = 0, angle_deg = 0; Double scale_x = 1.0, scale_y = 1.0, tmp_alpha = 1.0; @@ -107,7 +107,7 @@ always_moving |= mvt.follow_speed; always_moving |= mvt.follow_direction; - frames[frame_number][member_type] = mvt; + frames[frame_number].push_back(mvt); } } } Index: src/character/body.cpp =================================================================== --- src/character/body.cpp (revision 9176) +++ src/character/body.cpp (working copy) @@ -20,7 +20,7 @@ *****************************************************************************/ #include #include -#include +#include #include #include "character/body.h" #include "character/character.h" @@ -299,7 +299,6 @@ std::vector::iterator member = skel_lst.begin(); bool useCrossHair; - member_mvt mb_mvt; Movement::member_def movMember = mvt->GetFrames()[frame]; Movement::member_def::iterator itMember; @@ -309,12 +308,12 @@ for (; member != skel_lst.end(); ++member) { ASSERT(frame < mvt->GetFrames().size()); - itMember = movMember.find((*member)->member->GetType()); + itMember = std::find(movMember.begin(), movMember.end(), (*member)->member->GetType()); if (itMember != movMember.end()) { // This member needs to be moved : - mb_mvt = itMember->second; + member_mvt& mb_mvt = *itMember; useCrossHair = ActiveTeam().AccessWeapon().UseCrossHair();