#pragma once //------------------------------------------------------------------------------ /** Æê Ŭ·¡½º @author ±¤¼ö @since 08.03.06 @remarks 09.08.11(¼Ò½ºÁ¤¸®) - */ #include "Character.h" struct sPet_Script_Info; class uiPetGauge; #define C_PET_MAX_GAUGE 100 enum ePET_NAME_STATE { NAME_DEFAULT =0, //ÆêÀ̸§(±âº») NAME_DRAW, //ÆêÀ̸§ÁöÁ¤ NAME_UNDRAW, //ÆêÀ̸§¾È±×¸² }; typedef struct _PET_EFFECT_PARAM { HANDLE hEffect; //·çÇÁÀÌÆåÆ®(Æ÷¸¸°¨Ç϶ô.Ä£¹Ðµµ¸Æ½º)ÇÚµé ePET_EFFECT eEffectType; }PET_EFFECT_PARAM; // PET DATA struct PET_DATA { DWORD dwIndex; //ÆêÀ妽º BOOL bEffect; //·çÇÁÀÌÆåÆ®È°¼ºÈ­ ePET_NAME_STATE ePetName; //Æê³×ÀÓ»óÅÂ(Ȱ¼º.ºñȰ¼º) BOOL bHeroPet; //ÁÖÀΰøÆêÀ̳Ä? BOOL bFlyOnHead; //¸Ó¸®À§¶°´Ù´Ï´ÂÆê BYTE byFullness; //ÆêÆ÷¸¸°¨¼öÄ¡ BYTE byIntimacy; //ÆêÄ£¹Ðµµ¼öÄ¡ BOOL bPetLock; //Æê°­Á¦¸ØÃã»óÅ BOOL bCharacterScene; //ij¸¯Å;ÀÀ̳Ä? HANDLE hInstanceEffect; //ÀνºÅϽºÀÌÆåÆ®(´Ü¹ßÀÌÆåÆ®Áö¸¸ ÀÌÆåÆ®°¡±æ¾î¼­ À§Ä¡º¸Á¤À§ÇØÇڵ麸À¯) //emoticon°ü·Ãº¯¼ö BOOL bMaxIntimacyFlag; //Ä£¹Ðµµ¸Æ½ºÀÌÆåÆ®¹ßµ¿flag BOOL bLowFullnessFlag; //Æ÷¸¸°¨ºÎÁ·ÀÌÆåÆ®¹ßµ¿flag DWORD dwMaxIntimacyTime; //Ä£¹ÐµµÀÌÆå·£´ý¹ßµ¿Å¸ÀÓ1 DWORD dwMaxIntimacyOldTime; //Ä£¹ÐµµÀÌÆå·£´ý¹ßµ¿Å¸ÀÓ2 DWORD dwLowFullnessTime; //Æ÷¸¸°¨ÀÌÆå·£´ý¹ßµ¿Å¸ÀÓ1 DWORD dwLowFullnessOldTime; //Æ÷¸¸°¨ÀÌÆå·£´ý¹ßµ¿Å¸ÀÓ2 BOOL bPetNameHide; //ÀÌÆåÆ®¾È±×¸®±âflag ePET_EFFECT eOldEffectType; //-º¸Á¤:ÀÌÀüÀνºÅϽºÀÌÆåÆ®°¡ ¾î¶²Å¸ÀÔÀ̳Ä?(¿¬¼Ó»ý¼º¹æÁöÀ§ÇØ) DWORD dwPetBoringCnt; //Æê5ºÐ´ë±âŸÀÓ WzVector vOldPosition; //ÆêÀÌÀüÀ§Ä¡ PET_EFFECT_PARAM PetEffectParam; //Æê·çÇÁÀÌÆåÆ®±¸Á¶Ã¼ DWORD dwIdlePetTime; //ÁÖÀΰø ´ë±âŸÀÓ DWORD dwIdlePetOldTime; //ÁÖÀΰø ´ë±âÄ«¿îÆ® DWORD dwMasterObjKey; //ÆêÁÖÀÎÀÇ ¿ÀºêÁ§Æ®Å°°ª BYTE byMoveGaugeUI; //°íÁ¤petui BYTE byHideState; //ÆêÇÏÀ̵å»óÅÂÀÎÁö BASE_NPCINFO m_NPCInfo; sPet_Script_Info* pet_script_ptr_; }; class Pet : public Character { public: Pet( void ); virtual ~Pet( void ); virtual BOOL Create( DWORD dwObjectKey, DWORD dwID = 0 ); virtual void Destroy( void ); virtual BOOL Process( DWORD dwTick ); void RenderInfo(); virtual BOOL Render(); virtual void AnimateUnit(); void SetFullness(BYTE byValue){m_Pet.byFullness=byValue;} void SetIntimacy(BYTE byValue){m_Pet.byIntimacy=byValue;} void RefreshPetName(); void RenderPetName(); virtual void StartExtraEffect(); void SetStatePetHide(BYTE byHide); HANDLE CreateInstanceEffect(ePET_EFFECT eType,WzVector vPos); void CreateInstanceEffect(ePET_EFFECT eType); BASE_NPCINFO * GetMonsterInfo(){return &m_Pet.m_NPCInfo;} virtual WzID GetCurrentMoveAnimation(); virtual WzID GetCurrentIdleAnimation(); void UpdateMeshHeight(); //¼ø¼ö°¡»óÇÕ¼öÀçÁ¤ÀÇ:pet¿¡¼­´Â ¾È¾¸ virtual WzID GetCurrentAttackAnimation(){return 0;} virtual WzID GetCurrentDeathAnimation(){return 0;} virtual WzID GetCurrentDamageAnimation(BOOL bRight,BOOL bCritical){return 0;} virtual void SetExp(EXPTYPE dwExp){} virtual EXPTYPE GetExp(){return 0;} virtual EXPTYPE GetNextExp(){return 0;} virtual void SetLevel(LEVELTYPE LV){} virtual LEVELTYPE GetLevel(){return 0;} virtual DWORD GetMaxHP(){return 0;} virtual DWORD GetMaxMP(){return 0;} private: //process void ProcessEmoticon(DWORD dwTick); WzID GetPetEffectCode(ePET_EFFECT eType); void AddMotionEffect(ePET_EFFECT eType,float fScaleSize=0.7f); void UpdatePetEffectPos(); void DestroyEffect(); //À§Ä¡°ü·Ã WzVector GetPetBoundingVolume(); float GetWarpDistance(); float GetFollowDistance(); float GetStopPositon(); float GetDistanceMaster(WzVector vPos); WzVector GetBasePostion(); //Çൿ.°ÔÀÌÁö void ProcessPetUnit(DWORD dwTick); void RenderPetGauge(); //¾×¼Ç void FollowAction(); void BaseAction(DWORD dwTick); void WrapAction(); public: //¿ÜºÎÀÎÅÍÆäÀ̽º Player* GetMasterObject(); void UpdatePetAttributes(BOOL bHero = TRUE); inline void DestroyPetEffect(){CreateInstanceEffect(E_DESTORY,GetPosition());} void PetEatAction(); void InitPetMonster(DWORD dwMaserKey,WORD wPetIndex); void RefreshEffect(); void SetModifyPosition(float fAngle,float fDistance); void SetPetLock(BOOL bLock); void SetSubType(BYTE subtype); bool RefreshApperPet(Player* master_ptr); PET_DATA* GetPet() { return &m_Pet; } private: PET_DATA m_Pet; uiPetGauge* pet_dialog() { return pet_dialog_; } uiPetGauge* pet_dialog_; }; //------------------------------------------------------------------------------ /** */ inline float Pet::GetWarpDistance() { return 15.f; } //------------------------------------------------------------------------------ /** */ inline float Pet::GetFollowDistance() { return ((m_Pet.bFlyOnHead) ? (1.3f):(2.5f)); } //------------------------------------------------------------------------------ /** */ inline float Pet::GetStopPositon() { return (m_Pet.bFlyOnHead ? 0.0f:1.3f); } //------------------------------------------------------------------------------ /** */ inline WzID Pet::GetCurrentIdleAnimation() { WzID animationID = StrToWzID("N001"); return animationID; } //------------------------------------------------------------------------------ /** */ inline WzID Pet::GetCurrentMoveAnimation() { WzID animationID = StrToWzID("N004"); return animationID; } //------------------------------------------------------------------------------ /** */ inline WzID Pet::GetPetEffectCode(ePET_EFFECT eType) { switch(eType) { case E_BORING: return StrToWzID("R025"); //5ºÐ´ë±â case E_OWNER_LVUP: return StrToWzID("R035"); //ÁÖÀη¦¾÷ case E_OWNER_DEATH: return StrToWzID("R040"); //ÁÖÀÎÁ×À½ case E_DECREASE_INTIMACY: return StrToWzID("R045"); //Ä£¹ÐµµÇ϶ô case E_AUTO_PICK_ITEM: return StrToWzID("R050"); //¾ÆÀÌÅÛÀÚµ¿Áݱâ case E_EAT: return StrToWzID("R015"); //¸ÔÀ̼·Ãë case E_WARP: return StrToWzID("k470"); //¿öÇÁÀÌÆåÆ® case E_DESTORY: return StrToWzID("R006"); //¼ÒÈ¯ÇØÁ¦ case E_MIN_FULLNESS: return StrToWzID("R000"); //Æ÷¸¸°¨ min case E_MAX_INTIMACY: return StrToWzID("R002"); //Ä£¹Ðµµ max default:return 0; } }