#ifndef _PATTERN_MONSTER_H_ #define _PATTERN_MONSTER_H_ #include "Monster.h" // ------------------------------------------------------------------------------------- // ¼Òȯ¼ö class CSummonMonster : public CMonster { public: CSummonMonster(); CSummonMonster(MonsterCreateInfo& MonsterCreate, CCharacter* lpMaster); virtual ~CSummonMonster(); void NormalBehavior(unsigned long dwTick); void AttackBehavior(unsigned long dwTick); void ReturnBehavior(unsigned long dwTick); void DeadBehavior(unsigned long dwTick); void GuardMe(CAggresiveCreature* lpTarget, unsigned short wThreat); void AttackCmd(CAggresiveCreature* lpTarget, unsigned short wThreat); void Attacked(void); bool Attack(AtType attackType, unsigned char cDefenderNum, CAggresiveCreature** ppDefenders, unsigned char* cDefenserJudges, unsigned short* wDefenserMPHeal); bool Dead(CAggresiveCreature* pOffencer); EnemyCheck::EnemyType IsEnemy(CCreature* lpTarget); bool GetMotion(unsigned long MotionID, MotionInfo &Motion); void SetGuard(bool bGuard) { m_bGuard = bGuard; } CCharacter* GetMaster(void) { return m_lpMaster; } unsigned char GetNation() const { if (NULL == m_lpMaster) { return Creature::STATELESS; } return m_lpMaster->GetNation(); } protected: enum { SUPPORT_DISTANCE = 3, SUMMON_TIME = 4 * FPS }; CCharacter* m_lpMaster; bool m_bGuard; bool m_bPadding[3]; }; // ------------------------------------------------------------------------------------- // ¸í¿¹ÀÇ ¼®»ó class CStatue : public CMonster { public: enum { MAX_HP_UPDATE_COUNT = 10, // 10¹ø¿¡ Çѹø HP ¾÷µ¥ÀÌÆ® STATUE_ATTACKED_TIME = 3000, // °ø°Ý ´çÇßÀ»¶§ 3ÃÊ´ç 1¹ø¾¿ ÆÐŶ Àü¼Û STATUE_LOADING_TIME = 300000, // ¼®»ó ¼Òȯ ½Ã°£(5ºÐ) BG_STATUE_LOADING_TIME = 120000, // ¹èƲ ±×¶ó¿îµå ¼­¹ö±º ¼®»ó ¼Òȯ ½Ã°£ (2ºÐ) UPDATE_INFO_CYCLE = 150, // ¼®»ó Á¤º¸ ¾÷µ¥ÀÌÆ® ÁÖ±â(5ÃÊ) BONUS_DISTANCE = 100, // °øÇå¸Þ´Þ º¸³Ê½º¸¦ ¹ÞÀ» ¼ö ÀÖ´Â °Å¸® BONUS_MILEAGE = 100, // Çѹø¿¡ ¾ò´Â °øÇå¸Þ´Þ º¸³Ê½ºÀÇ ¾ç BONUS_TIME = 12 // °øÇå¸Þ´Þ º¸³Ê½º¸¦ ¾ò´Â ÁÖ±â(1ºÐ) }; CStatue(); CStatue(MonsterCreateInfo& MonsterCreate, CStatue* lpParent); virtual ~CStatue(); void NormalBehavior(unsigned long dwTick); void AttackBehavior(unsigned long dwTick); void ReturnBehavior(unsigned long dwTick); void DeadBehavior(unsigned long dwTick); void GiveMileage(char cGiveType); virtual bool RegenHPAndMP(unsigned short usAdditionalHP, unsigned short usAdditionalMP, bool bAddDefaultRegenValue); bool Dead(CAggresiveCreature* pOffencer); bool Rest(void); // ¹èƲ ±×¶ó¿îµå¿¡ ¼®»óÀÌ Çϳªµµ ³ª¿ÀÁö ¾Êµµ·Ï ½¬°ÔÇϴ ó¸® // Dead ¿Í µ¿ÀÏÇϳª ´ÙÀ½ ¼®»óÀ» ¼ÒȯÇÏÁö ¾Ê´Â´Ù. EnemyCheck::EnemyType IsEnemy(CCreature* lpTarget); bool CreateLinkStatue(unsigned short wKind); CStatue* GetLinkStatue(unsigned short wKind); Item::CItem* SellToCharacter(CCharacter *lpCustomer, unsigned short wKindItem, TakeType takeType, Item::CItem* lpRequestItem, unsigned long &dwPrice, unsigned short wCouponID, unsigned short &usError); Position& GetOriginalPos() { return m_OriginalPosition; } // ±¹°¡Àü ¼®»ó ÀÎæƮ È¿°ú Á¾·ù unsigned char GetRealmStatueEnchantType() const { return m_MonsterInfo.m_cStatueEffectType; } // ±¹°¡Àü ¼®»ó ÀÎæƮ È¿°ú ÆÛ¼¾Æ® unsigned char GetRealmStatueEnchantPercent() const { return m_MonsterInfo.m_cStatueEffectPercent; } // ±¹°¡Àü ¼®»ó ¸®½ºÆù °¡´É ¿©ºÎ bool EnableRespawn() const { return m_MonsterInfo.m_bStatueRespawnEnable; } // DBAgentServer ·Î KID, HP ¾÷µ¥ÀÌÆ® ÆÐŶ º¸³»´Â ÇÔ¼ö bool SendKIDUpdate(); bool SendHPUpdate(bool bForce=false); // Client ·Î Attacked Á¤º¸ º¸³»±â void SendAttacked(); protected: unsigned long m_dwDuration; unsigned short m_wBonusTurn; unsigned char m_cHPUpdateCount; unsigned long m_dwLastAttackedTime; CStatue* m_lpParent; // ¼®»óÀÇ Ãʱ⠻óÅ (¸í¿¹ÀÇ ¼®»óÀº 5°¡Áö ¼®»óÀÌ ÇÑ ¼¼Æ®·Î ¸µÅ©µÇ¾î ÀÖ´Ù.) CNPC* m_lpLinkNPC; // ¸Þ´Þ »óÁ¡ ¿ªÇÒÀ» À§ÇØ ¸µÅ©µÈ NPC }; class CStatueInfo { public: CStatueInfo(CStatue* lpStatue, bool bBonusTurn, char cGiveType); bool operator () (CCharacter* lpCharacter); private: CStatue* m_lpStatue; bool m_bBonusTurn; char m_cGiveType; }; // ------------------------------------------------------------------------------------- // GMÀÇ Ãູ // edith 2010.01.16 GMÀÇ ÃູÀÇ ¸Þ´Þ ±â´É ±¸Çö 1ºÐ¿¡ 1~5°³¾¿ ¸Þ´Þ ºÎ¿© // StatueInfo ¿Í °°Àº ¿ªÈ°À» Çϱ⠶§¹®¿¡ À̰÷¿¡ ±¸ÇöÇÔ. class CBlessMileageInfo { public: CBlessMileageInfo(char cBlessType); bool operator () (CCharacter* lpCharacter); private: char m_cBlessType; char m_cAddMileage; }; // ------------------------------------------------------------------------------------- // ¼öÁý ¸ó½ºÅÍ class CGatherMonster : public CMonster { public: CGatherMonster(); CGatherMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CGatherMonster(); virtual void NormalBehavior(unsigned long dwTick); virtual void AttackBehavior(unsigned long dwTick); virtual void ReturnBehavior(unsigned long dwTick); }; // ------------------------------------------------------------------------------------- // ¿ÀºêÁ§Æ® ¸ó½ºÅÍ (²É, ³ª¹«, ¹ö¼¸·ù) class CObjectMonster : public CMonster { public: CObjectMonster(); CObjectMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CObjectMonster(); virtual void NormalBehavior(unsigned long dwTick); virtual void AttackBehavior(unsigned long dwTick); virtual void ReturnBehavior(unsigned long dwTick); }; // ------------------------------------------------------------------------------------- // ÆÐÅÏ ¸ó½ºÅÍ class CSkillMonster : public CMonster { public: virtual ~CSkillMonster(); char GetConsumeMPCount(void) { return m_cConsumeMPCount; } bool Attack(AtType attackType, unsigned char cDefenderNum, CAggresiveCreature** ppDefenders, unsigned char* cDefenderJudges, unsigned short* wDefenderMPHeal); virtual void NormalBehavior(unsigned long dwTick); virtual void AttackBehavior(unsigned long dwTick); // Action °ü·Ã ó¸® void CastingAttackAction(); void SkillAttackAction(); enum SkillPattern { A_SKILL = 0, B_SKILL = 1, C_SKILL = 2, D_SKILL = 3, BOSS_CHANT_SKILL = 4, MAX_SKILL_PATTERN = 5 }; enum EnemyFindType { TYPE_LV = 0, TYPE_HP = 1, TYPE_HIGHEST = 0, TYPE_LOWEST = 1 }; enum Const { USE_SKILL_MIN_LEVEL = 4, USE_SKILL_LEVEL = 5 // 4·¹º§ ½ºÅ³º¸´Ù ³·Àº ½ºÅ³À» °¡Áø ¸ó½ºÅͰ¡ »ç¿ëÇÏ´Â °íÁ¤ ½ºÅ³ ·¹º§ // (1´Ü°è ½ºÅ³À» »ç¿ëÇÏ´Â ¸ó½ºÅÍ´Â Á¦¿Ü) }; public: virtual LONG SendMove(unsigned short nAniNum); protected: CSkillMonster(); CSkillMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); bool Dead(CAggresiveCreature* pOffencer); // Á×¾úÀ» ¶§ È£ÃâµÇ´Â ÇÔ¼ö // ÀÚ½ÅÀÇ ÁÖº¯¿¡¼­ ¼¿Å©±â(32m) ¹Ý°æ³»¿¡ ÀÖ´Â ¾Æ±º ÆÄƼ¿øÁß¿¡ °¡Àå ·¹º§ÀÌ ³ôÀº ¸ó½ºÅ͸¦ ¸®ÅÏ CAggresiveCreature* FindHighestLVMember(); // ÇØ´ç ½ºÅ³ÀÇ ¹üÀ§ ¾È¿¡ ÀÖ´Â ³à¼®µé Áß // ÀÎæƮ ºÎ¿© ½ºÅ³ÀÌ °É¸®Áö ¾ÊÀº °¡Àå ·¹º§ÀÌ ³ôÀº ¸ó½ºÅ͸¦ ã¾Æ¼­ ¸®ÅÏÇØÁÖ´Â ÇÔ¼ö CAggresiveCreature* FindHighestLVMember(const AtType& attackType); // ÆÄƼ¿ø Áß¿¡¼­ HP °¡ fRemain ÆÛ¼¾Æ® ÀÌÇÏ·Î ³²¾ÆÀÖ´Â ÆÄƼ¿øÀÌ ÀÖ´ÂÁö °Ë»ö // bRegin ÀÌ TRUE À̸é ÇØ´ç °ø°ÝÀÇ ¹üÀ§ ¾È¿¡ ÀÖ´Â ÆÄƼ¿ø Áß¿¡¼­ ã´Â´Ù. CAggresiveCreature* FindLowestHPMember(const AtType& attackType, bool bRegin, float fRemainHP = 0.5f); // ÆÐÅÏ¿¡ ¸Â´Â ÀûÀ» ã´Â ÇÔ¼ö // Type1 : LV, HP // Type2 : Highest, Lowest CAggresiveCreature* FindEnemy(const AtType& attackType, unsigned char cType1, unsigned char cType2); float CalculateDistance(CAggresiveCreature* pTarget); virtual bool SkillAttack(void) { return false; } // ÀϹÝÀûÀÎ ½ºÅ³ »ç¿ë ÇÔ¼ö bool UseSkill(AtType attackType, CAggresiveCreature** ppDefenders, char cSkillPattern); // ij½ºÆÃ ¾×¼ÇÀÌ ³¡³­ÈÄ ³ª°¡´Â ½ºÅ³ »ç¿ë ÇÔ¼ö bool UseCastedSkill(void); unsigned long m_lastCastTime[MAX_SKILL_PATTERN]; // ¸¶Áö¸·À¸·Î ½ºÅ³À» »ç¿ëÇÑ ½Ã°£ char m_cConsumeMPCount; // MP ¼Ò¸ð±îÁö ³²Àº Ä«¿îÆ® ¼ö ÀúÀå // Casting bool m_bCasting; // ¸¶¹ý ij½ºÆÃ ÁßÀΰ¡? int m_nCastingCount; // ij½ºÆÃ µ¿ÀÛ È½¼ö AtType m_attackType; // ij½ºÆÃÀÌ ³¡³­ÈÄ ³ª°¥ ½ºÅ³ unsigned long m_dwTargetCID; // ½ºÅ³ÀÇ ´ë»ó CID (Áװųª ³ª°¡¹ö¸±¼ö Àֱ⶧¹®¿¡ CID·Î üũ) char m_cSkillPattern; // m_lastCastTime À» °»½ÅÇϱâ À§ÇØ »ç¿ëÇÑ ½ºÅ³ÀÇ type index (m_skillID ÀÇ Index ÀÌ´Ù.) }; class CDefenderMonster : public CSkillMonster { public: CDefenderMonster(); CDefenderMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CDefenderMonster(); protected: bool SkillAttack(void); }; class CWarriorMonster : public CSkillMonster { public: CWarriorMonster(); CWarriorMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CWarriorMonster(); protected: bool SkillAttack(void); }; class CAcolyteMonster : public CSkillMonster { public: enum Distance { NEAR_DIST_TO_TARGET = 10, FAR_DIST_TO_TARGET = 15 }; CAcolyteMonster(); CAcolyteMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CAcolyteMonster(); void AttackBehavior(unsigned long dwTick); protected: bool SkillAttack(void); }; class CMageMonster : public CSkillMonster { public: enum Distance { NEAR_DIST_TO_TARGET = 10, FAR_DIST_TO_TARGET = 15 }; CMageMonster(); CMageMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CMageMonster(); void AttackBehavior(unsigned long dwTick); protected: bool SkillAttack(void); }; class CBossMonster : public CSkillMonster { public: CBossMonster(); CBossMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CBossMonster(); protected: bool SkillAttack(void); }; class CChiefMonster : public CSkillMonster { public: CChiefMonster(); CChiefMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CChiefMonster(); protected: bool SkillAttack(void); }; class CNamedMonster : public CSkillMonster { public: CNamedMonster(); CNamedMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CNamedMonster(); void Respawn(unsigned long dwTick); protected: bool SkillAttack(void); Position m_RespawnPosition; // ¸®½ºÆù Á᫐ ÁÂÇ¥ }; class CGuardMonster : public CSkillMonster { public: CGuardMonster(); CGuardMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false); virtual ~CGuardMonster(); void SearchPlayer(); protected: bool SkillAttack(void); }; #endif