#ifndef __INC_GAME_MOTION_H__ #define __INC_GAME_MOTION_H__ #include "common/d3dtype.h" enum EMotionMode { MOTION_MODE_GENERAL, MOTION_MODE_ONEHAND_SWORD, MOTION_MODE_TWOHAND_SWORD, MOTION_MODE_DUALHAND_SWORD, MOTION_MODE_BOW, MOTION_MODE_BELL, MOTION_MODE_FAN, MOTION_MODE_HORSE, MOTION_MODE_MAX_NUM }; enum EPublicMotion { MOTION_NONE, // 0 없음 MOTION_WAIT, // 1 대기 (00.msa) MOTION_WALK, // 2 걷기 (02.msa) MOTION_RUN, // 3 뛰기 (03.msa) MOTION_CHANGE_WEAPON, // 4 무기바꾸기 MOTION_DAMAGE, // 5 정면맞기 (30.msa) MOTION_DAMAGE_FLYING, // 6 정면날아가기 (32.msa) MOTION_STAND_UP, // 7 정면일어나기 (33.msa) MOTION_DAMAGE_BACK, // 8 후면맞기 (34.msa) MOTION_DAMAGE_FLYING_BACK, // 9 후면날아가기 (35.msa) MOTION_STAND_UP_BACK, // 10 후면일어나기 (26.msa) MOTION_DEAD, // 11 죽기 (31.msa) MOTION_DEAD_BACK, // 12 후면죽기 (37.msa) MOTION_NORMAL_ATTACK, // 13 기본 공격 MOTION_COMBO_ATTACK_1, // 14 콤보 공격 MOTION_COMBO_ATTACK_2, // 15 콤보 공격 MOTION_COMBO_ATTACK_3, // 16 콤보 공격 MOTION_COMBO_ATTACK_4, // 17 콤보 공격 MOTION_COMBO_ATTACK_5, // 18 콤보 공격 MOTION_COMBO_ATTACK_6, // 19 콤보 공격 MOTION_COMBO_ATTACK_7, // 20 콤보 공격 MOTION_COMBO_ATTACK_8, // 21 콤보 공격 MOTION_INTRO_WAIT, // 22 선택화면 대기 MOTION_INTRO_SELECTED, // 23 선택화면 선택 MOTION_INTRO_NOT_SELECTED, // 24 선택화면 비선택 MOTION_SPAWN, // 25 소환 MOTION_FISHING_THROW, // 26 낚시 던지기 MOTION_FISHING_WAIT, // 27 낚시 대기 MOTION_FISHING_STOP, // 28 낚시 그만두기 MOTION_FISHING_REACT, // 29 낚시 반응 MOTION_FISHING_CATCH, // 30 낚시 잡기 MOTION_FISHING_FAIL, // 31 낚시 실패 MOTION_STOP, // 32 말 멈추기 MOTION_SPECIAL_1, // 33 몬스터 스킬 MOTION_SPECIAL_2, // 34 MOTION_SPECIAL_3, // 35 MOTION_SPECIAL_4, // 36 MOTION_SPECIAL_5, // 37 PUBLIC_MOTION_END, MOTION_MAX_NUM = PUBLIC_MOTION_END, }; class CMob; class CMotion { public: CMotion(); ~CMotion(); bool LoadFromFile(const char * c_pszFileName); bool LoadMobSkillFromFile(const char * c_pszFileName, CMob * pMob, int iSkillIndex); float GetDuration() const; const D3DVECTOR & GetAccumVector() const; bool IsEmpty(); protected: bool m_isEmpty; float m_fDuration; bool m_isAccumulation; D3DVECTOR m_vec3Accumulation; }; typedef DWORD MOTION_KEY; #define MAKE_MOTION_KEY(mode, index) ( ((mode) << 24) | ((index) << 8) | (0) ) #define MAKE_RANDOM_MOTION_KEY(mode, index, type) ( ((mode) << 24) | ((index) << 8) | (type) ) #define GET_MOTION_MODE(key) ((BYTE) ((key >> 24) & 0xFF)) #define GET_MOTION_INDEX(key) ((WORD) ((key >> 8) & 0xFFFF)) #define GET_MOTION_SUB_INDEX(key) ((BYTE) ((key) & 0xFF)) class CMotionSet { public: typedef std::map TContainer; typedef TContainer::iterator iterator; typedef TContainer::const_iterator const_iterator; public: CMotionSet(); ~CMotionSet(); void Insert(DWORD dwKey, CMotion * pkMotion); bool Load(const char * szFileName, int mode, int motion); const CMotion * GetMotion(DWORD dwKey) const; protected: // DWORD = MOTION_KEY TContainer m_map_pkMotion; }; class CMotionManager : public singleton { public: typedef std::map TContainer; typedef TContainer::iterator iterator; CMotionManager(); virtual ~CMotionManager(); bool Build(); const CMotionSet * GetMotionSet(DWORD dwVnum); const CMotion * GetMotion(DWORD dwVnum, DWORD dwKey); float GetMotionDuration(DWORD dwVnum, DWORD dwKey); // POLYMORPH_BUG_FIX float GetNormalAttackDuration(DWORD dwVnum); // END_OF_POLYMORPH_BUG_FIX protected: // DWORD = JOB or MONSTER VNUM TContainer m_map_pkMotionSet; // POLYMORPH_BUG_FIX std::map m_map_normalAttackDuration; // END_OF_POLYMORPH_BUG_FIX }; #endif