/* ========================================================================== * ÆÄ ÀÏ : Monster.h * ¸ñ Àû : ¸ó½ºÅÍ °ü¸® * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2006-10-12 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "BaseObject.h" #include "Monster_Common.h" struct sTextItem; struct sModeImage; class cPlaneObject; class cModeAgent; #define MODEIMAGE_VALID_DISTANCE 3000.0f #define MODEIMAGE_TIME 5000 // 5ÃÊ Áö¼Ó /// ¿ÀºêÁ§Æ® »óÅ °ª enum eMONSTER_ANIMATIONTYPE { M_ANITYPE_IDLE1 = 1, /// ´ë±â M_ANITYPE_IDLE2, /// ´ë±âº¸Á¶ M_ANITYPE_WORK, /// °È±â M_ANITYPE_RUN, /// ´Þ¸®±â M_ANITYPE_ATTACK1, /// °ø°Ý1 M_ANITYPE_ATTACK2, /// °ø°Ý2 M_ANITYPE_ATTACK3, /// ½ºÅ³1 M_ANITYPE_CASTING, /// ij½ºÆÃ M_ANITYPE_SKILL1, /// ½ºÅ³2 M_ANITYPE_SKILL2, /// ½ºÅ³3 M_ANITYPE_DAMAGE1, /// µ¥¹ÌÁö1 M_ANITYPE_DAMAGE2, /// µ¥¹ÌÁö2 M_ANITYPE_DIE1, /// Á×À½1 M_ANITYPE_DIE2, /// Á×À½2 M_ANITYPE_JUMP, /// Á¡ÇÁ M_ANITYPE_MODEANI = 16, M_ANITYPE_MODEANI_STURN = 16, M_ANITYPE_MODEANI_CASTING1 = 21, M_ANITYPE_MODEANI_CASTING2 = 22, M_ANITYPE_MODESKILL_START = 31, M_ANITYPE_MODESKILL_END = 37, }; class cMonster : public cBaseObject { public: cMonster( unsigned char type = eOBJECTTYPE_MONSTER ); virtual ~cMonster(); inline virtual unsigned long GetObjectID() { return mMonsterIdx; } inline unsigned long GetMonsterClassIdx() { return mpMonsterInfo->mMonsterClassIdx; } inline sMonsterScript* GetMonsterScript() { return mpMonsterInfo; } /// °´Ã¼ ó¸® virtual bool Create( sMonsterData* baseInfo, NiPoint3 pos, NiMatrix3 rotate = NiMatrix3::IDENTITY ); virtual void Update( unsigned long deltaTime, unsigned long accumTime ); /// °´Ã¼ ¸µÅ© unsigned int SetLinkdObject( unsigned int num, char* nif ); void UnLinkdObject( unsigned int num ); /// ¹æÇâÀüȯ bool SetDesiredDir(NiPoint3 CurrentPos, NiPoint3 TargetPos, unsigned long delay = 0 ); /// À̵¿ virtual bool Move( float x, float y ); /// ¸ó½ºÅÍÀÇ À̸§À» °¡Á®¿È inline LPTSTR GetName() { return mpMonsterInfo->mName; } inline LPTSTR GetJobName() { return mpMonsterInfo->mJobName; } /// ¸ó½ºÅÍ ·¹º§ unsigned char GetLevel(){ return mpMonsterInfo->mLevel; } /// ¸ó½ºÅÍ ºÐ·ù unsigned char GetKind() { return mpMonsterInfo->mKind; } /// ½ºÅ×ÀÌÅͽº ó¸® unsigned long GetHP() { return mHP; } unsigned long GetMaxHP() { return mMaxHP; } /// ÀÔ·Â ¹ÞÀº µ¥¹ÌÁö ¸¸Å­ hp/mp¸¦ °¨¼Ò virtual void HPChange( unsigned long objectHP, unsigned long objectMaxHP ); virtual void HPChangeDie( unsigned long objectMaxHP, cBaseObject* pAttacker, unsigned char attackType ); virtual void MPChange( unsigned long objectMP, unsigned long objectMaxMP ); /// À̵¿¼Óµµ void SetMoveSpeed( unsigned int moveSpeed, eMOVE_SPEED_TYPE moveSpeedType = eMOVESPEED_STOP ); void SetFixedObjectSizeScale( unsigned short size, bool init ); /// »óÅ ó¸® virtual void SetState( unsigned char state, bool bShowAni = true ); virtual unsigned int GetState() { return mState; } /// ±æÃ£±â ó¸® /// À̵¿½Ã ÃÖÁ¾ °æ·Î ¼ÂÆÃ void SetLastGoto( float x, float y) { mLastGotoX = x; mLastGotoY = y; } /// À̵¿ °æ·Î void SetPathArray( NiPoint2* moveArray, unsigned int count ); /// À̵¿ Á¤Áö void MoveStop( float x, float y ); /// À̵¿ÁÂÇ¥ ÃÖÁ¾ ¸ñÀûÁö±î±â °¡±âÀü Á¤ÁöÀÇ ¹üÀ§ void SetMoveStopRange( float moveStopRange ) { mMoveStopRange = moveStopRange; } /// °ø°Ý ó¸® void MonsterAttack( unsigned long uIdx, unsigned long skillIdx, cBaseObject* pTarget, float attackSpeedFactor ); void MonsterAttack( unsigned long uIdx, unsigned long skillIdx, NiPoint3 fieldPos, float attackSpeedFactor ); virtual void ApplyDamageDrama( int damage, unsigned int damageType, cBaseObject* pAttacker = 0 ); /// ¿ÀºêÁ§Æ®ÀÇ °Å¸® üũ ¼öÁ¤ °Å¸® - Àû¿ë ¹üÀ§ float GetFixedObjectSize() { return mFixedObjectSize; } // ¼±°ø¸ó½ºÅÍÀÎÁö ÆÇ´Ü bool IsPrecedeAttack(); // º¯½Å ÀÎ½Ä ¸ó½ºÅÍ ÆÇ´Ü bool IsChangeMonCheck(); /// °»½Å void UpdateNameCardTextValue(); /// ´ë±âµ¿ÀÛ2 ½ÇÇà void PlayIdle2Ani(); void ActiveChatBubble( sTextItem* text ); virtual bool IsDie() { return (GetState()==eOBJECT_STATE_DIE); } void ChangeMonsterMode( long modeIdx ); virtual cEffectSceneNode* SetLinkdEffect( unsigned int num, const char* nif, NiTransform* trans, bool bLoop=false, bool bFollow=true ); void UpdateTutorialBoard(); void ClearTutorialBoard(); virtual void SetSkillPushPull( float posX, float posY ); void SetPvPTeamType( unsigned long teamType ) { mPvPTeamType = teamType; } unsigned long GetPvPTeamType() { return mPvPTeamType; } // ¿ÀÅä´õ¹Ì¿ë ¸ó½ºÅÍ bool IsAutoDummy() { return (mAutoDummy==1); } protected: /// ¾Ö´Ï¸ÞÀÌ¼Ç °ü°è ¼³Á¤ virtual void Interpret( unsigned long time ); protected: /// monster °íÀ¯¹øÈ£ unsigned long mMonsterIdx; /// ¸ó½ºÅÍ Á¤º¸ sMonsterScript* mpMonsterInfo; cModeAgent* mpModeAgent; /// À̵¿¼Óµµ unsigned int mMoveSpeed; /// HP/MP °ü·Ã unsigned long mHP; unsigned long mMP; unsigned long mMaxHP; unsigned long mMaxMP; /// Å©±â È¿°ú unsigned short mFixedObjectSizePer; /// À̵¿½Ã ¸ñÀûÁö ÁÂÇ¥ float mGotoX; float mGotoY; /// À̵¿½Ã ÃÖÁ¾À§Ä¡ float mLastGotoX; float mLastGotoY; /// À̵¿½Ã ¹æÇâ ¹× NiPoint3 mDesiredDir; /// À̵¿ÁÂÇ¥ ÃÖÁ¾ ¸ñÀûÁö±î±â °¡±âÀü Á¤ÁöÀÇ ¹üÀ§ float mMoveStopRange; unsigned long mMoveOverTime; /// °æ·Î ¸ñÀûÁö±îÁö À̵¿Áß ÇÁ·Î¼¼½º °£°Ý¿¡ÀÇÇØ ³Ñ¾î°£ ½Ã°£ /// ¸ó½ºÅÍÀÇ »óÅ eOBJECTSTATE mState; ///¸ó½ºÅÍ °´Ã¼ »èÁ¦ ½Ã°£ unsigned long mMonsterDieTime; eMOVE_SPEED_TYPE mMoveSpeedType; /// ±æÃ£±â static const unsigned int MAX_PATH_COUNT = 2048; NiPoint2 mPathArray[MAX_PATH_COUNT]; unsigned int mPathIndex; unsigned int mPathCount; /// unsigned long mDelay; float mAngle; float mAccumAngle; NiPoint3 mAxis; /// ¿ÀºêÁ§Æ®ÀÇ °Å¸® üũ ¼öÁ¤ °Å¸® - Àû¿ë ¹üÀ§ float mFixedObjectSize; unsigned int mDamageAfterAnim; typedef tList cModeLoopList; cModeLoopList mModeLoopEffectList; cModeLoopList mModeLoopSoundList; unsigned long mCurrentModeIndex; unsigned long mPvPTeamType; /// ePVPDM_TEAM_TYPE // À̹ÌÁö ¸ðµå Á¤º¸ cPlaneObject* mpImagePlane; sModeImage* mpImageMode; unsigned long mImageStartAccumTime; unsigned long mImageEndAccumTime; // ¿ÀÅä´õ¹Ì ¿©ºÎ (0:¾Æ´Ô,1:¿ÀÅä´õ¹Ì) char mAutoDummy; };