#ifndef _ENEMYCHECK_H_ #define _ENEMYCHECK_H_ #include #include "CreatureStructure.h" // Àû¾Æ±º ½Äº° °ü·Ã (¼­¹ö, Ŭ¶óÀÌ¾ðÆ® °ø¿ëÀ¸·Î »ç¿ë) namespace EnemyCheck { enum EnemyType { // ¸®ÅÏ Å¸ÀÔ EC_ENEMY = 0, // Àû±º EC_NEUTRAL = 1, // Á߸³ EC_FRIEND = 2, // ¾Æ±º EC_ERROR = 3 // ¿¡·¯ }; enum EnemyCheckType { // üũ ŸÀÔ EC_CHECK_ENEMY = 0, // Àû½Äº° EC_CHECK_NEUTRAL_EXCETION = 1, // Á߸³ ¿¹¿Ü ó¸® EC_CHECK_FRIEND = 2, // ¾Æ±º ½Äº° EC_CHECK_FRIEND_2ND = 3, // 2Â÷ ¾Æ±º ½Äº° MAX_CHECK_TYPE = 4 // ½Äº°·ê üũ ·çƾ ¼ö }; enum EnemyCheckRule { RULE_HUNTING = 0, // ÇåÆÃ·ê RULE_GUILD_WAR = 1, // ±æµåÀü·ê RULE_REALM_WAR = 2, // ·¼¸§Àü·ê RULE_STATUE_WAR = 3, // ¼®»óÀü·ê RULE_SIEGE_WAR = 4, // °ø¼ºÀü·ê MAX_RULE_NUM = 5 }; // ------------------------------------------------------------------------- // Siege °ü·Ã ÇÔ¼ö bool IsCamp(unsigned short wObjectType); // ±æµå ¿ä»õ bool IsCastleArms(unsigned short wObjectType); // ¼ö¼º º´±â bool IsSiegeArms(unsigned short wObjectType); // °ø¼º º´±â bool IsStruct(unsigned short wKind); // ½ºÆ®·°ÃÄ bool IsGate(unsigned short wObjectType); // ¼º¹® bool IsEmblem(unsigned short wObjectType); // ¼º »ó¡¹° bool IsCastleNPC(unsigned short wObjectType); // º´±â °ü¸® NPC // ------------------------------------------------------------------------- // ¾ç±¹ üÁ¦ ÀÌÈÄ Ãß°¡µÈ ³»¿ë typedef bool (*FnProcess)(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, BattleInclination::RelationData& relationInfo, unsigned char& cResult); typedef bool (*FnCheck)(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, EnemyCheck::EnemyCheckRule eRule); class CCheckTable : public CSingleton { public: bool Initialize(void); void SetEnemyCheckRule(EnemyCheckRule eRule) { m_eRule = eRule; } EnemyCheckRule GetEnemyCheckRule(void) { return m_eRule; } unsigned long IsEnemyFromStruct(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, BattleInclination::RelationData& relationInfo, unsigned char& cResult); private: CCheckTable(); ~CCheckTable(); unsigned long GetEnemyType(unsigned char cEnemyCheckType) const; // üũ ŸÀÔ¿¡ ÇØ´çÇÏ´Â Àû½Äº° °á°ú ¸®ÅÏ bool m_bInit; // ÃʱâÈ­ ¿©ºÎ EnemyCheckRule m_eRule; // ÇöÀç Àû¿ë ÁßÀÎ ÇǾƽĺ° ·ê FnProcess m_fnIsEnemy[MAX_CHECK_TYPE][MAX_RULE_NUM]; // °¢ »óȲ¿¡ µû¸¥ ÇǾƽĺ° ÇÔ¼öµéÀÇ Å×À̺í FnCheck m_fnCheckSkip[MAX_CHECK_TYPE]; // °¢ »óȲ¿¡ µû¸¥ ÇǾƽĺ°À» ½ºÅµÇØ¾ß ÇÏ´ÂÁö üũÇÏ´Â ÇÔ¼öµéÀÇ Å×À̺í static CCheckTable ms_this; }; class CFunctions { private: // °á°ú°ª¿¡ Àǹ̸¦ µÐ´Ù±âº¸´Ü, ¼ýÀÚ°¡ °ãÄ¡´Â °É ¹æÁöÇϱâ À§ÇØ enumÀ¸·Î ¼³Á¤ enum ResultType { // EC_CHECK_ENEMY ÀÇ °á°ú°ª EN_COMMON_PVP = 1, // ¸í½ÃÀû PvP·Î ¼±¾ðµÈ Àû (µà¾ó) EN_COMMON_STATELESS_MONSTER, // ¹«±¹Àû(Á¦3±¹) ¸ó½ºÅÍ EN_HUNTING_VSPARTY_VSGUILD, // ¸í½ÃÀû ¼±¾ðÀ¸·Î ¼±¾ðµÈ ±×·ì µ¢¾î¸® (ÆÄƼ/±æµå µà¾ó) EN_GUILDWAR_HOSTILITY_GUILD, // ÀڽŰú ´ë»óÀÌ ±æµåÀü¿¡ Âü¿©ÁßÀ̸ç Àû´ë °ü°è À϶§ EN_REALMWAR_ENEMY_PC_MONSTER_NPC, // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ, NPC EN_STATUEWAR_ENEMY_PC_MONSTER_STRUCT, // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ, ½ºÆ®·°Ã³ EN_STATUEWAR_STATELESS_STRUCT, // Á¦ 3±¹Àû ½ºÆ®·°Ã³ EN_SIEGE_ENEMY_PC_MONSTER, // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ EN_SIEGE_ENEMY_GATE_EMBLEM_CASTLE_ARMS, // »ó´ë ±¹ÀûÀÇ ¼º¹®, ¼º »ó¡¹°, ¼ö¼º º´±â EN_SIEGE_ENEMY_SIEGE_ARMS, // »ó´ë ±¹ÀûÀÌ ¼ÒȯÇÑ °ø¼º º´±â. // EC_CHECK_NEUTRAL_EXCETION ÀÇ °á°ú°ª NE_COMMON_GMODE = 21, // »ó´ë°¡ º»ÀÎÀÌ ¾Æ´Ï¸ç G¸ðµåÀÏ °æ¿ì Á߸³ ó¸® NE_COMMON_ENEMY_NPC, // »ó´ë ±¹ÀûÀÇ NPC NE_HUNTING_NON_BATTLER, // ÀüÅõ¿¡ Âü¿©ÇÏÁö ¾ÊÀº ¸ðµç Àοø NE_HUNTING_OTHER_BATTLER, // ÀڽŰú ´Ù¸¥ ÆÀ¹èƲ¿¡ Âü¿©ÁßÀÎ ¸ðµç Àοø NE_HUNTING_BATTLER, // ÆÀ¹èƲ¿¡ Âü¿©ÁßÀÎ ¸ðµç Àοø NE_GUILDWAR_IN_SAFETYZONE, // ³»°¡ ¼¼ÀÌÇÁƼ Á¸¿¡ ÀÖÀ» °æ¿ì ³ª¿Í Àû´ë °ü°èÀÎ ¸ðµç Àοø NE_GUILDWAR_NON_BATTLER, // ±æµåÀü Âü¿©ÁßÀÌÁö ¾ÊÀº ¸ðµç Àοø NE_GUILDWAR_OTHER_BATTLER, // ÀÚ½ÅÀÇ ±æµå°¡ ¾Æ´Ñ ±æµåÀüÀï Âü¿©ÀÚ NE_GUILDWAR_BATTLER, // ±æµåÀü Âü¿©ÁßÀÎ ¸ðµç Àοø NE_GUILDWAR_MYGUILD, // ÀÚ½ÅÀÇ ±æµå¿ø Àü¿ø NE_REALMWAR_ENEMY_STRUCT, // ÀڽŰú ´Ù¸¥ ±¹ÀûÀÇ ¼®»ó ½ºÆ®·°ÃÄ NE_REALMWAR_ENEMY_GATE_EMBLEM_SIEGEOBJECT, // »ó´ë ±¹ÀûÀÇ ¼º³» ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, ¼ÒȯÇÑ °ø¼º º´±â NE_STATUEWAR_ENEMY_GATE_EMBLEM_SIEGEOBJECT, // »ó´ë ±¹ÀûÀÇ ¼º³» ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, ¼ÒȯÇÑ °ø¼º º´±â NE_SIEGE_ENEMY_STRUCT, // ÀڽŰú ´Ù¸¥ ±¹ÀûÀÇ ¼®»ó ½ºÆ®·°ÃÄ // EC_CHECK_FRIEND ÀÇ °á°ú°ª FR_COMMON_MYPARTY = 41, // ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ °°Àº ÆÄƼ FR_COMMON_MYGUILD, // ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ °°Àº ±æµå FR_COMMON_MYSELF, // ÀÚ±â ÀڽŠFR_GUILDWAR_MYGUILD, // ³»°¡ Âü¿©ÇÑ ±æµå ±×·ì FR_REALMWAR_MYNATION_PC_NPC_MONSTER_STRUCT, // ÀÚ±¹ ±¹ÀûÀÇ PC, NPC, ¸ó½ºÅÍ, ¼®»ó FR_REALMWAR_MYNATION_GATE_EMBLEM_SIEGEOBJECT, // ÀÚ±¹ ±¹ÀûÀÇ ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, °ø¼º º´±â. FR_STATUEWAR_MYNATION_PC_NPC_MONSTER_STRUCT, // ÀÚ±¹ ±¹ÀûÀÇ PC, NPC, ¸ó½ºÅÍ, ¼®»ó FR_STATUEWAR_MYNATION_GATE_EMBLEM_SIEGEOBJECT, // ÀÚ±¹ ±¹ÀûÀÇ ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, °ø¼º º´±â. FR_SIEGEWAR_MYNATION_PC_NPC_MONSTER_STRUCT, // ÀÚ±¹ ±¹ÀûÀÇ PC, NPC, ¸ó½ºÅÍ, ¼®»ó FR_SIEGEWAR_MYNATION_SIEGEOBJECT, // ÀÚ±¹ ±¹ÀûÀÇ ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, ¼ö¼ºº´±â, °ø¼º º´±â. // EC_CHECK_FRIEND_2ND ÀÇ °á°ú°ª FR2_COMMON_MYNATION_PC_NPC = 61, // ÀÚ±¹ PC, NPC FR2_COMMON_STATELESS_NPC, // ¹«±¹Àû NPC }; // °ø°Ý °¡´É ¿©ºÎ üũ¸¦ À§ÇÑ Å©¸®ÃÄ Å¸ÀÔ enum AttackableCreatureType { ACT_PC = 0, // PC ACT_MONSTER = 1, // ¸ó½ºÅÍ ACT_EMBLEM = 2, // ¼º »ó¡¹° ACT_GATE = 3, // ¼º¹® ACT_CAMP = 4, // ±æµå ¿ä»õ ACT_GUARD = 5, // °¡µå ACT_SHORT_RANGE_CASTLE_ARMS = 6, // ±Ù°Å¸® ¼ö¼º º´±â ACT_LONG_RANGE_CASTLE_ARMS = 7, // ¿ø°Å¸® ¼ö¼º º´±â ACT_SHORT_RANGE_SIEGE_ARMS = 8, // ±Ù°Å¸® °ø¼º º´±â ACT_LONG_RANGE_SIEGE_ARMS = 9, // ¿ø°Å¸® °ø¼º º´±â ACT_AIRSHIP = 10, // ¼ö¼Û¼± ACT_NONE = 11, // µÞ¹®, NPC, º´±â°ü¸®NPC MAX_ATTACKABLE_CREATURE = 12, // °ø¼º ½Ã°£ ¹× ÀÏ¹Ý ½Ã°£¿¡ °ø°Ý°¡´ÉÇÑ ´ë»ó ¼ö }; // °ø°Ý °¡´É ¿©ºÎ ¸®Åϰª enum ReturnACT { RET_NONE = 0, // °ø°Ý ºÒ°¡´É RET_ALLWAYS = 1, // Ç×»ó °ø°Ý °¡´É RET_DEVELOPING = 2, // °³¹ß ÁßÀ϶§¸¸ °ø°Ý °¡´É }; const static unsigned char ms_AttackableTable[MAX_ATTACKABLE_CREATURE][MAX_ATTACKABLE_CREATURE]; // °¢ Å©¸®ÃÄ Å¸ÀÔ¿¡ µû¸¥ °ø°Ý °¡´É ¿©ºÎ Å×À̺í friend class CCheckTable; // ÇǾƽĺ° ÇÔ¼ö Á¤ÀÇ ¸ÅÅ©·Î #define DECLARE_ENEMY_CKECK(CheckRule) \ static bool CheckRule(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, \ BattleInclination::RelationData& relationInfo, unsigned char& cResult) #define DEFINE_ENEMY_CKECK(CheckRule) \ bool EnemyCheck::CFunctions::##CheckRule( \ BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, \ BattleInclination::RelationData& relationInfo, unsigned char& cResult) #define USE_ENEMY_CKECK(CheckRule) CheckRule(ownerInfo, targetInfo, relationInfo, cResult) // ÇǾƽĺ° ·çƾ ½ºÅµ üũ ÇÔ¼ö Á¤ÀÇ ¸ÅÅ©·Î #define DECLARE_SKIP_CKECK(CheckType) \ static bool CheckType(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, \ EnemyCheck::EnemyCheckRule eRule) #define DEFINE_SKIP_CHECK(CheckType) \ bool EnemyCheck::CFunctions::##CheckType( \ BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, \ EnemyCheck::EnemyCheckRule eRule) // °ø°Ý °¡´É ¿©ºÎ üũ ÇÔ¼ö Á¤ÀÇ ¸ÅÅ©·Î #define DECLARE_ATTACKABLE_CHECK(FuncName) \ static bool FuncName(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo) #define DEFINE_ATTACKABLE_CHECK(FuncName) \ bool EnemyCheck::CFunctions::##FuncName( \ BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo) // °øÅë DECLARE_ENEMY_CKECK(IsEnemyCommon); DECLARE_ENEMY_CKECK(IsNeutralExceptionCommon); DECLARE_ENEMY_CKECK(IsFriendCommon); DECLARE_ENEMY_CKECK(IsFriend2ndCommon); // ÇåÆÃ·ê DECLARE_ENEMY_CKECK(IsEnemyForHunting); DECLARE_ENEMY_CKECK(IsNeutralExceptionForHunting); DECLARE_ENEMY_CKECK(IsFriendForHunting); DECLARE_ENEMY_CKECK(IsFriend2ndForHunting); // ±æµåÀü·ê DECLARE_ENEMY_CKECK(IsEnemyForGuildWar); DECLARE_ENEMY_CKECK(IsNeutralExceptionForGuildWar); DECLARE_ENEMY_CKECK(IsFriendForGuildWar); DECLARE_ENEMY_CKECK(IsFriend2ndForGuildWar); // ·¼¸§Àü·ê DECLARE_ENEMY_CKECK(IsEnemyForRealmWar); DECLARE_ENEMY_CKECK(IsNeutralExceptionForRealmWar); DECLARE_ENEMY_CKECK(IsFriendForRealmWar); DECLARE_ENEMY_CKECK(IsFriend2ndForRealmWar); // ¼®»óÀü·ê DECLARE_ENEMY_CKECK(IsEnemyForStatueWar); DECLARE_ENEMY_CKECK(IsNeutralExceptionForStatueWar); DECLARE_ENEMY_CKECK(IsFriendForStatueWar); DECLARE_ENEMY_CKECK(IsFriend2ndForStatueWar); // °ø¼ºÀü·ê DECLARE_ENEMY_CKECK(IsEnemyForSiegeWar); DECLARE_ENEMY_CKECK(IsNeutralExceptionForSiegeWar); DECLARE_ENEMY_CKECK(IsFriendForSiegeWar); DECLARE_ENEMY_CKECK(IsFriend2ndForSiegeWar); // ÇǾƽĺ° ½ºÅµ üũ DECLARE_SKIP_CKECK(IsEnemySkip); DECLARE_SKIP_CKECK(IsNeutralExceptionSkip); DECLARE_SKIP_CKECK(IsFriendSkip); DECLARE_SKIP_CKECK(IsFriend2ndSkip); // °ø°Ý °¡´É ¿©ºÎ üũ ÇÔ¼ö DECLARE_ATTACKABLE_CHECK(IsAttackable); static unsigned char FindAttackableCreatureType(BattleInclination::CharData& charInfo); }; } #endif