/* ========================================================================== * ÆÄ ÀÏ : AIManager.h * ¸ñ Àû : ai°ü¸®ÀÚ * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2007-11-13 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "BaseObject_Common.h" #include "Monster_Common.h" #include "Gathering_Common.h" #include "IndexGenerator.h" const int AI_REGEN_PROCESS_DELAY = 100; class cNaviField; class cPathFinder; class cMonster; class cGathering; class cNaviField; class cPathFinder; struct sRegenGroupScript; enum eACTION_ID; enum eACTION_CHANGE; enum ePathfindresult; enum eACTION_GAT_ID; enum eACTION_GAT_CHANGE; struct sRegenMonster { unsigned long mObjectIdx; unsigned long mRegenIdx; unsigned long mRegenTime; bool mDie; }; struct sRegenGroup { /// ½ºÅ©¸³Æ® Âü°í¿ë Æ÷ÀÎÅÍ sRegenGroupScript* mpRegenGroup; /// ¸®Á¨¿©ºÎ¸¦ üũÇÏ´ÂÇ׸ñ - Á¶°Ç¿¡ ÇØ´çÇÏ´Â ¸ó½ºÅͼö°¡ µÇ¸é ÀÌÇ÷¹±×·Î ¸®Á¨¿©ºÎ¸¦ ÆÇ´Ü bool mUse; /// ±×·ì¹ö³õ unsigned long mGroupIdx; /// ¸®Á¨ ÆÛ¼¾Å×Áö¸¦ ¸¸Á· ÇÒ °æ¿ì ¸®Á¨ Ä«¿îÆ®¸¦ ½ÃÀÛÇ϶ó´Â Ç÷¡±× bool mIsRegen; /// ¸®Á¨ ¼öÇà ½Ã°£ unsigned long mRegenTime; /// ±×·ì¿¡ ÇØ´çÇÏ´Â ¸ó½ºÅÍ »ì¾Æ ÀÖ´Â ¼ö unsigned long mMonsterAliveCnt; tArray mMonsterList; }; struct sSwichGroup { unsigned long mSwitchGroup; /// ¸®Á¨ ¼±ÅÃµÈ ±×·ìÀ妽º unsigned long mGroupIdx; /// ´ÙÀ½ ¸®Á¨ ½Ã°£ unsigned long mRegenTime; /// ¸®Á¨ ÇÏÁö ¾ÊÀ½ bool mRegenStop; /// ¸®Á¨ µ¿±âÈ­ ´ë±âÁß bool mRegenSyncWait; /// üũ ½Ã°£ unsigned long mCheckTime; tArray* mpGroupIdxAry; }; struct sRegenGather { unsigned long mRegenIdx; /// ¸®Á¨ ¼öÇà ½Ã°£ unsigned long mRegenTime; /// ¸®Á¨ Áغñ »óÅ bool mRegenReady; }; struct sMapPathInfo { cNaviField* mNaviField; /// ³×ºñÇʵå cPathFinder* mPathFinder; /// ±æÃ£±â float mMapSize; }; class cAIManager { public: static cAIManager* mpAIManager; public: /// »ý¼º¼Ò¸ê cAIManager(); ~cAIManager(); /// ÀÚ¿ø°ü¸® bool Init( int serverType ); bool LoadMapPathData( unsigned short mapNum, unsigned char modeNum ); bool InitMonsterRegen( unsigned char levelMode, tPointerHashMap* pRegenGroupMap, tPointerHashMap* pFamilyMap, tPointerHashMap* pRegenSwitchMap ); void Release(); void Process( unsigned long elapsedTime, unsigned long accumTime ); ////////////////////////////////////////////////////////////////////////// /// ¸ó½ºÅÍ /// ¸ó½ºÅÍ ¸®Á¨ ÇÁ·Î¼¼½º void ProcessMonRegen( unsigned char levelMode, tPointerHashMap* pRegenGroupMap, tPointerHashMap* pRegenSwitchMap, tPointerHashMap* pFamilyMap, tHashMap* pRegenSearch, unsigned long /*elapsedTime*/, unsigned long accumTime, unsigned short mapNumber, bool* pServerOnRegen ); void ProcessMonPatternMove( tPointerHashMap* pFamilyMap, tHashMap* pRegenSearch, unsigned long elapsedTime, unsigned long accumTime ); void BossSummonMonRegen( cMonster* pBoss, unsigned short mapNumber, float x , float y, unsigned long genRangeMin, unsigned long genRangeMax, unsigned long genCnt, unsigned long monsterClassIdx, bool isRand = true ); void CheatSummonMonRegen( unsigned short mapNumber, float x , float y, unsigned long monsterClassIdx, unsigned long genCnt ); unsigned long QuestSummonMonRegen( unsigned short mapNumber, float x , float y, unsigned long monsterClassIdx, unsigned long destroyTime ); cMonster* StoneSummonMonRegen( unsigned short mapNumber, float x , float y, unsigned long monsterClassIdx, unsigned long teamType ); bool AutoDetectSummonMonRegen( unsigned short mapNumber, float x , float y ); /// Á׾ ¸®Á¨ ´ë±â·Î ³Ñ¾î°¡´Â ¸ó½ºÅÍ µî·Ï void InsertReadyMonster( unsigned long monsterIdx, unsigned long regenIdx, unsigned long groupIdx ); void SwitchRegen( unsigned short levelMode, unsigned short chennelNum, unsigned long switchGroupIdx ); ////////////////////////////////////////////////////////////////////////// /// äÁý /// äÁý ¸®Á¨ ÇÁ·Î¼¼½º void ProcessGatRegen( unsigned char levelMode, unsigned long elapsedTime, unsigned long accumTime ); void ProcessGetRegen( unsigned long accumTime, unsigned char levelMode, unsigned short mapNumber, tPointerHashMap* pRegenGroupMap, tHashSet* pGatheringSet ); /// Á׾ ¸®Á¨ ´ë±â·Î ³Ñ¾î°¡´Â äÁý µî·Ï void InsertReadyGathering( unsigned long gatheringIdx, unsigned long mapNumber, unsigned long regenIdx ); ////////////////////////////////////////////////////////////////////////// /// ±æÃ£±â /// ¸Ê »çÀÌÁî float GetPathMaxSideSize( unsigned int mapNum ); /// ÇöÀç À§Ä¡ ³ôÀ̰ª bool CalcHeight( unsigned short mapNumber, float* height, float x, float y ) const; /// À̵¿ °¡´ÉÁö¿ª üũ bool IsPossible( unsigned short mapNumber, float x, float y, sObject object ) const; bool IsPossible( unsigned short mapNumber, NiPoint2 start, NiPoint2 goal, sObject object ) const; /// À̵¿ °æ·Î °Ù¼ö »êÃâ unsigned long CalcPathCnt( unsigned short mapNumber, NiPoint2 start, NiPoint2 goal ); bool SetPathFinder( cMonster* pMonster, unsigned short mapNum, unsigned char levelMode ); ////////////////////////////////////////////////////////////////////////// /// ±×·ì Çൿ (µ¿Á·) void FamilyAttack( unsigned long mainMonIdx, unsigned long groupIdx, sObject attacker ); bool FamilyNextPattern( unsigned short mapNum, unsigned long groupIdx, long* pPatternPos, char* pPatternDir ); bool FamilyFar( unsigned short mapNum, unsigned long familyNum, NiPoint2 pos ); private: void RegenMonster( unsigned char levelMode, tPointerHashMap* pRegenGroupMap, tPointerHashMap* pFamilyMap, tHashMap* pRegenSearch, unsigned long groupIdx, sRegenMonster* pRM, unsigned short mapNumber ); private: typedef tPointerHashMap cPointHashMap; typedef tHashSet cHashSet; typedef tHashMap cHashMap; typedef tArray cArray; typedef tArray cVoidAry; /// ¸®Á¨±×·ìÀ» ±âÁØÀ¸·Î °ü¸®ÇØ¾ß ÇÏ´Â ¸ó½ºÅÍ ¸ñ·Ï Àüü º¸À¯ /// typedef tPointerHashMap cPointerHashMap; cPointHashMap* mpRegenGroupMap; /// µ¿Á·±×·ì /// cPointHashMap* mpFamilyMap; cPointHashMap* mpRegenSwitchMap; /// typedef tPointerHashMap cPointerHashMap; cPointHashMap* mpRegenGatherGroupMap; /// ¸®Á¨ À妽º·Î ¸ó½ºÅÍ °íÀ¯¹øÈ£ ã±â cHashMap mRegenSearch; /// À妽º »ý¼º±â cIndexGenerator mMonsterIdxGen; /// cIndexGenerator mGatheringIdxGen; /// ¼­¹öºÎÆÃÈÄ ¹Ù·Î ¸®Á¨ bool mServerOnRegen; /// ¸®Á¨ ÇÁ·Î¼¼½º ºÎÇÏ ¹æÁö unsigned long mNextCheckTime; /// äÁý cArray mReadyGatheringAry; /// ÀϹÝä³Î / Àδø ±¸ºÐ int mServerType; /// ±æÃ£±â °ü·Ã ¸ÊÁ¤º¸ /// cPointHashMap mMapPathMap; NiPoint2 mTempPathAry[MAX_PATH_COUNT]; }; #define AIMANAGER cAIManager::mpAIManager