/* ===================================================================== * ÆÄ ÀÏ : SkillObject.h , SkillObject.cpp * ¸ñ Àû : »ç¿ëÁßÀÎ ½ºÅ³ °´Ã¼ , »ó¼ÓÀ» ¹Þ¾Æ »ç¿ëÇÑ´Ù. * ÀÛ ¼º ÀÚ : À̹ý¼® * ÀÛ ¼º ÀÏ : 2007³â 7¿ù 13ÀÏ * * Ãß°¡³»¿ë : * Ãß°¡³¯Â¥ ÀÛ¾÷ÀÚ Ãß°¡³»¿ë * * ÁÖÀÇ»çÇ× : . * =======================================================================*/ #pragma once #include "BaseObject_Common.h" #include "DramaturgyInfo.h" #include "Skill_Common.h" struct sTargetDamage; struct sTargetHeal; enum eAPPLYDRAMA_TYPE; class cEffectSceneNode; class cSoundSceneNode; struct sTrailInfo; class cBaseObject; //class cBulletObj; struct sApplyDrama { sObject mTargetObj; cDramaturgyInfo* mpInfo; }; struct sLoopEffect { unsigned long mIdxByManager; cEffectSceneNode* mEffectNode; sLoopEffect() { mIdxByManager = (unsigned long)-1; mEffectNode = 0; } }; struct sLoopSound { unsigned long mIdxByManager; cSoundSceneNode* mSoundNode; sLoopSound() { mIdxByManager = (unsigned long)-1; mSoundNode = 0; } }; /// class cDramaturgyObject { public: virtual ~cDramaturgyObject(); virtual void Process( unsigned long time ) = 0; /// TODO: /// ´ë»ó¿¡°Ô °´Ã¼¸¦ ¸µÅ© Çϸ鼭 /// Á¦°Å ÇÏ´Â ·çƾÀ» ³Ö¾î¾ß ÇÑ´Ù. /// Thread¿¡ °É¸é¼­ Ãß°¡ 󸮵µ ÇÑ´Ù. /// TODO : /// ¿¬Ãâ »óÅ º¯°æ ÇÔ¼ö inline eDRAMASTATE GetDramaState() { return mCurrentState; } inline void SetDramaState( eDRAMASTATE state ) { mCurrentState = state; } inline unsigned long GetManagedKey() { return mManagedKey; } inline unsigned long GetSkillIdx() { return mSkillInfo.skillIdx; } void Removed() { mRemoved = true; } bool IsRemoved() { return mRemoved; } protected: virtual void UpdateDramaObject( sDramaActionBase* pBase, cBaseObject* pChar, const NiPoint3& dir = -NiPoint3::UNIT_Y ); virtual void UpdateChannelingDramaObject( sDramaActionBase* pBase, cBaseObject* pChar, const NiPoint3& fieldPos = -NiPoint3::UNIT_Y ); virtual void UpdateTrailObject( sDramaActionBase* pBase, cBaseObject* pChar ); virtual void AddLoopEffect( cEffectSceneNode* pNode ); virtual void AddLoopSound( cSoundSceneNode* pNode ); virtual void AddLoopTrail( sTrailInfo* pInfo ); void ChangeDramaState( eDRAMASTATE state ); protected: cDramaturgyObject(); /// ¿¬Ãâ »óÅ Á¦¾î ±¸Á¶Ã¼ struct sDramaStateController { sDramaStateController() : pAct(0), startTime(ULONG_MAX) { animationIdx = UINT_MAX; } sDramaActionBase* pAct; unsigned int animationIdx; unsigned long startTime; tPointerList mLoopEffect; tPointerList mLoopSound; tPointerList mLoopTrail; }; /// °´Ã¼ º¸°ü¼Ò¿¡ ´ëÇÑ ÂüÁ¶ Á¤º¸ unsigned long mManagedKey; /// ½ºÅ³ Á¤º¸ sSkillInfo mSkillInfo; /// ¿¬Ãâ Á¤º¸ eDRAMASTATE mCurrentState; cDramaturgyInfo* mpDramaInfo; /// Ÿ°Ù Á¤º¸ sObject mTargetObj; /// Àû¿ë ¿¬Ãâ Á¤º¸ sDramaStateController mApplyController; bool mRemoved; }; ////////////////////////////////////////////////////////////////////////// enum eSPECIAL { eSpecial_None = 0, eSpecial_Field, eSpecial_Blink, eSpecial_MapChange, eSpecial_Vehicle, }; enum { ePRINT_NONE =0, ePRINT_DAMAGE, ePRINT_HEAL, }; /// class cSkillObject : public cDramaturgyObject { public: cSkillObject(); virtual ~cSkillObject(); void* operator new( size_t n ); void operator delete( void* ptr ); enum eVERIFY { eVerify_Faile = 0, eVerify_Wait, eVerify_Success, }; virtual bool Init( unsigned long skillIdx, unsigned char skillStep, cBaseObject* pUser, cBaseObject* pTarget, float speedFactor ); virtual bool InitField( unsigned long skillIdx, unsigned char skillStep, cBaseObject* pUser, NiPoint3 fieldPos, float speedFactor ); virtual bool InitMapChange( unsigned long skillIdx, cBaseObject* pUser ); virtual bool InitVehicle( unsigned long skillIdx, cBaseObject* pUser ); virtual bool InitBlink( unsigned long skillIdx, unsigned char skillStep, cBaseObject* pUser ); virtual bool RevisionInit( unsigned long skillIdx, unsigned char skillStep, unsigned char userType, unsigned long dramaKey, bool transMon ); virtual void Process( unsigned long time ); void SetManagedKey( unsigned long key, bool isDummy ) { mManagedKey = key; mIsDummy = isDummy; } bool IsDummySkill() { return mIsDummy; } bool IsTransMonSkill() { return mTransformMonSkill; } virtual void VerifyFaile( bool setIdle = false ); virtual void VerifySuccess(); void WaitCancel(); unsigned int GetSpecialType() { return mSpecialType; } /// void AddDamageTargetInfo( sTargetDamage* dInfo ); void AddHealTargetInfo( sTargetHeal* dInfo ); void AddTargetInfo( sObject* dInfo, unsigned char type = 0 ); void EndCast(); cBaseObject* GetUser(); void SetBlinkPos( NiPoint3 pos ); bool IsChanneling(){ return mIsChanneling; } protected: /// ij½ºÆÃ ó¸® void ProcessCasting( unsigned long time ); /// ¹ßµ¿ ó¸® virtual void ProcessActivity( unsigned long time ); /// Àû¿ë ó¸® virtual void ProcessApply( unsigned long time ); void ApplyDamage( const sDramaActionBase* pAct ); void ApplyHeal( const sDramaActionBase* pAct ); virtual void AddLoopEffect( cEffectSceneNode* pNode ); virtual void AddLoopSound( cSoundSceneNode* pNode ); virtual void AddLoopTrail( sTrailInfo* pInfo ); void FadeOutAllLoopEffect(); void FadeOutAllSoundEffect(); void RemoveAllTrail(); void ChangeDramaState( eDRAMASTATE state ); /// ¹ß»çü void AddBulletObject( sDramaActionBase* pBase ); void BulletProcess( unsigned long time ); protected: struct sDamageInfo { tArray damageArr; sObject obj; unsigned int viewCnt; sDamageInfo() : viewCnt(0) {} ~sDamageInfo() { if( damageArr.IsEmpty() == false ) { for( unsigned int i = 0, end = damageArr.GetSize(); i < end; ++i ) { delete (sTargetDamageDetail*)damageArr[i]; } damageArr.Clear(); } } }; /// ÀÎÁõ ¿©ºÎ bool mIsDummy; bool mIsNoneStop; eVERIFY mVerifyState; /// ij½ºÆÃ ¿¬Ãâ Á¤º¸ sDramaStateController mCastingController; /// ¹ßµ¿ ¿¬Ãâ Á¤º¸ sDramaStateController mActivityController; /// ½ÃÀüÀÚ Á¤º¸ sObject mUserObj; unsigned char mUserWeapon; bool mTransformMonSkill; /// damage Àû¿ë Ÿ°Ù unsigned char mPrintType; tArray mTargetObjArray; /// ¹ß»çü °ü¸® tPointerList mBulletList; tArray mDelBulletArray; /// Apply Drama °ü¸® tPointerList mApplyDramaList; /// µ¿ÀÛ speed º¯¼ö float mSpeedFactor; unsigned long mCastingTime; bool mUsedAnimation; eSPECIAL mSpecialType; NiPoint3 mFieldPos; bool mIsChanneling; ///ä³Î¸µ ½ºÅ³ÀÎÁö üũ. // bool mUseFieldTarget; }; ////////////////////////////////////////////////////////////////////////// /// class cInfluenceObject : public cDramaturgyObject { public: cInfluenceObject(); virtual ~cInfluenceObject(); void* operator new( size_t n ); void operator delete( void* ptr ); virtual bool Init( unsigned long uniqueIdx, unsigned long influenceIdx, unsigned long skillIdx, bool isbuff, cBaseObject* pTarget, unsigned char deleteType ); void Init_TargetUpdate(); /// Àû¿ë¿¡ ´ëÇÑ Ã³¸®¸¸ Á¸Àç virtual void Process( unsigned long time ); /// ½ÇÁ¦·Î process½ÃÀÛÇϴ ŸÀÌ¹Ö Á¦¾î¿ë void StartProcess( long restTime = -1, bool onlyLoopEffect = false ); enum { eTick_HP, eTick_MP, eTick_HP_NOPRINT, eTick_MP_NOPRINT, }; void SetTickInfo( unsigned char tickType, long value ); inline void SetRestTime( unsigned long restTime ) { mRestTime = restTime; } inline unsigned long GetRestTime() { return mRestTime; } inline void SetRealEndTime( time_t endTime ) { mRealEndTime = endTime; mIsRealTime = true; mRestTime = 0;} inline bool GetIsRealTime() { return mIsRealTime; } inline time_t GetRealTime() { return mRealEndTime; } inline unsigned long GetInfluenceIdx() { return mInfluenceIdx; } /// hero È¿°úÀÎ °æ¿ì 󸮸¦ À§Çؼ­ inline bool IsHeroInfluence() { return mIsHeroInfluce; } inline bool IsAuraType() { return mInfluenceType == eINFLUENCETYPEDETAIL_AURA; } inline bool IsStatic() { return mStaticInfluence; } // /// Ÿ°ÙÀÌ Á×Àº°æ¿ì È¿°ú Á¦°Å À¯¹« unsigned char GetDeleteType() { return mDeleteType; } /// inline unsigned long GetGuardHP() { return mGuardHP; } inline unsigned long GetGuardCnt() { return mGuardCnt; } inline void SetGuardInfo( unsigned long cnt, unsigned long hp ) { mGuardCnt = cnt; mGuardHP = hp; } protected: void ApplyHP( sDramaActionBase* pAct ); void ApplyMP( sDramaActionBase* pAct ); protected: bool mIsBuff; // /// 081014 PKH ij¸¯ÅÍ Á×Àº °æ¿ì È¿°ú »èÁ¦ À¯¹« unsigned char mDeleteType; /// È¿°ú »èÁ¦ Á¶°Ç eDELETETYPE bool mCheckBlink; bool mIsHeroInfluce; bool mOnlyShowLoopEffect; unsigned long mBlinkTime; unsigned long mStartTime; unsigned long mLifeTime; unsigned long mRestTime; bool mIsRealTime; time_t mRealEndTime; bool mStartTimeCheck; unsigned long mInfluenceIdx; bool mStaticInfluence; unsigned long mInfluenceType; /// tickÈ¿°ú ¿¡¼­ »ç¿ëÇÑ´Ù. bool mTickInit; /// ÃÖÃÊ¿¬Ãâ¿¡¼± Á¦¿Ü½Ã۱âÀ§ÇÑ.. bool mTickInfluence; unsigned char mTickType; float mTickValue; unsigned long mGuardCnt; unsigned long mGuardHP; }; class cApplyObject : public cDramaturgyObject { public: cApplyObject(); virtual ~cApplyObject(); void* operator new( size_t n ); void operator delete( void* ptr ); /// apply drama¿¡¼­ Á¤º¸¸¦ ȹµæÇÑ´Ù. virtual bool Init( unsigned long managedKey, sObject* user, sObject* target, unsigned char weaponType, eAPPLYDRAMA_TYPE type ); /// È¿°ú¹øÈ£·Î Apply¸¸À» °¡Á®¿Â´Ù.(item È¿°ú Àû¿ëµî¿¡ »ç¿ë) virtual bool Init( unsigned long managedKey, cBaseObject* pTarget, unsigned long influenceIdx ); /// ¹ßµ¿ È¿°ú¿¡¼­ Á¤º¸¸¦ ȹµæ virtual bool InitAct( unsigned long managedKey, cBaseObject* pTarget, unsigned long actIdx ); virtual void Process( unsigned long time ); protected: virtual void UpdateDramaObject( sDramaActionBase* pBase, cBaseObject* pChar, const NiPoint3& dir = -NiPoint3::UNIT_Y ); private: enum { eINDEX_DRAMA, eINDEX_INFLUENCE, eINDEX_ACTINF, }; sObject mUserObj; unsigned char mUserWeapon; /// drama or influence unsigned char mIndexType; /// unsigned long mApplyIndex; // eAPPLYDRAMA_TYPE mApplyType; // unsigned long mInfluenceIdx; }; class cChannelingSkillObject : public cSkillObject { public: cChannelingSkillObject(); ~cChannelingSkillObject(); void* operator new( size_t n ); void operator delete( void* ptr ); void VerifyFaile( bool setIdle = false ); void VerifySuccess(); bool RevisionInit( unsigned long skillIdx, unsigned char skillStep, unsigned char userType, unsigned long dramaKey, bool transMon, float fieldX, float fieldY, unsigned long playerIdx ); protected: void Process( unsigned long time ); void ProcessActivity( unsigned long time ); void ProcessApply( unsigned long time ); void ClearActivityLoop(); bool InitField( unsigned long skillIdx, unsigned char skillStep, cBaseObject* pUser, NiPoint3 fieldPos, float speedFactor ); private: bool mReadyApplyProcess; bool mChannelingActProcessed; /// ProcessActivity»ó¿¡ ¹Ýº¹ ¿¬Ãâ ¸·±â À§ÇÑ Ç÷¹±×. };