📄 monster.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : Monster.cpp// Written By : excel96// Description ://////////////////////////////////////////////////////////////////////////////#include "Monster.h"#include "MonsterInfo.h"#include "MonsterManager.h"#include "Slayer.h"#include "Vampire.h"#include "Ousters.h"#include "MonsterAI.h"#include "AbilityBalance.h"#include "Zone.h"#include "MonsterNameManager.h"#include "Effect.h"#include "PrecedenceTable.h"#include "MonsterFunctionObject.h"#include "CreatureUtil.h"#include "VariableManager.h"#include "StringPool.h"#include "Gpackets/GCAddMonster.h"#include "Gpackets/GCMove.h"#include "Gpackets/GCStatusCurrentHP.h"#include "Gpackets/GCSay.h"#include "skill/SkillHandlerManager.h"#include "skill/EffectParalyze.h"#include "skill/EffectDoom.h"#include "skill/EffectTransformToWolf.h"#include "skill/EffectTransformToBat.h"#include "skill/EffectPeace.h"#include "skill/SummonGroundElemental.h"#include "Profile.h"//#define __PROFILE_MONSTER__#ifdef __PROFILE_MONSTER__ #define __BEGIN_PROFILE_MONSTER(name) beginProfileEx(name); #define __END_PROFILE_MONSTER(name) endProfileEx(name);#else #define __BEGIN_PROFILE_MONSTER(name) ((void)0); #define __END_PROFILE_MONSTER(name) ((void)0);#endif//#ifdef __XMAS_EVENT_CODE__ const string SantaSpeech[] = { "捞 赤籍甸, 惑寸茄 瘤侥阑 啊柳 仇甸捞菌焙!!!", "档噶啊磊!!!", "乔狼 己辑狼 弥饶狼 林牢篮 唱促!!!", "钢蹲钢蹲~ O.o o.O", "皋府 农府胶付胶!!", "农府胶付胶俊 背雀绰 救 啊绊 构窍绰 芭具!!!", "郴啊 磷阑 巴 鞍栏衬!!!", "捞繁 肯寒茄 累傈捞 绢痘霸 甸挪 芭瘤???", "风倒橇!!! 辉阑 惶酒辑 傍拜秦儿!!!", "捞 赤籍甸 惑寸茄 角仿阑 啊柳 仇甸捞菌焙!!!", "栏~~~ 馆靛矫 汗荐窍摆促!!!", "酒具~ 酒颇. 弊父 锭妨.", "具 绢叼啊..."};const string RudolfSpeech[] = { "况快~ 况快~", "播惹~", "掺俊~", "农福福~", "隆臂骇~", "港港", "墨坷~", "柄盎~ 柄盎~", "兵醚~ 兵醚~", "钢蹲~ 钢蹲~ O.O",};const int SantaSpeechMax = 13;const int RudolfSpeechMax = 10;//#endif//////////////////////////////////////////////////////////////////////////////// 阁胶磐 利 牢侥 包访 窃荐//////////////////////////////////////////////////////////////////////////////bool Monster::isRealEnemy(Creature* pEnemy) throw (Error){ __BEGIN_TRY Assert(pEnemy != NULL); if ( m_pBrain == NULL ) return false; Zone* pZone = pEnemy->getZone(); // 蜡飞篮 公矫 if (pEnemy->isFlag(Effect::EFFECT_CLASS_GHOST) // 磷篮 仇篮 利栏肺 牢侥窍瘤 臼绰促. || pEnemy->isFlag(Effect::EFFECT_CLASS_COMA) // 傍吝 傍拜阑 给窍搁 冠零 惑怕狼 利篮 利栏肺 牢侥窍瘤 臼绰促. || ( !m_pBrain->canAttackAir() && pEnemy->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT) ) // 胶唱捞俏 葛靛狼 利档 利栏肺 牢侥窍瘤 臼绰促. || !pEnemy->isFlag(Effect::EFFECT_CLASS_PARALYZE) // 籍拳 吧府搁 焊牢促绊 窍磊 && !pZone->isMasterLair() // 付胶磐 饭绢俊辑绰 促 焊牢促. 2002.10.16.by sigi && (!isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE) && pEnemy->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE) // 郴啊 叼郸飘 牢厚啊 绝绰 版快俊 牢厚历喉 惑怕狼 利档 利栏肺 牢侥窍瘤 臼绰促. || !isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) && pEnemy->isFlag(Effect::EFFECT_CLASS_INVISIBILITY)) // 酒付霸捣 吧赴 仇澜 锭府搁 救 等促. 绢瞒乔 救 嘎绰促. 2003. 1. 2. by Sequoia || pEnemy->isFlag(Effect::EFFECT_CLASS_ARMAGEDDON) // 救傈瘤措 郴何甫 给 焊搁 救傈瘤措 郴何俊 乐绰 利档 利栏肺 牢昏窍瘤 臼绰促. || ( !m_pBrain->canSeeSafeZone() && (pZone->getZoneLevel(pEnemy->getX(), pEnemy->getY()) & SAFE_ZONE) ) ) { return false; } return true; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////Monster::Monster (MonsterType_t monsterType) throw () : m_MonsterType(monsterType){ __BEGIN_TRY try { const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(m_MonsterType); // 捞悼 葛靛俊 措茄 汲沥 m_MoveMode = pMonsterInfo->getMoveMode(); // STR, DEX, INT绰 DB俊辑 肺爹窍咯 檬扁拳 矫挪促. m_STR = pMonsterInfo->getSTR(); m_DEX = pMonsterInfo->getDEX(); m_INT = pMonsterInfo->getINT(); m_Exp = pMonsterInfo->getExp(); m_Moral = pMonsterInfo->getMoral(); m_Delay = pMonsterInfo->getDelay(); m_AttackDelay = pMonsterInfo->getAttackDelay(); m_Sight = pMonsterInfo->getSight(); m_MeleeRange = pMonsterInfo->getMeleeRange(); m_MissileRange = pMonsterInfo->getMissileRange(); m_AttackOrder = pMonsterInfo->getAttackOrder(); // by sigi. 2002.9.2 m_bMaster = pMonsterInfo->isMaster(); m_bTreasure = pMonsterInfo->hasTreasure(); m_MonsterSummonStep = 0; Creature::CreatureClass CClass = getCreatureClass(); BASIC_ATTR attr; attr.nSTR = m_STR; attr.nDEX = m_DEX; attr.nINT = m_INT; attr.nLevel = pMonsterInfo->getLevel(); m_HP[ATTR_MAX] = computeHP(CClass, &attr, pMonsterInfo->getEnhanceHP()); m_ToHit = computeToHit(CClass, &attr, pMonsterInfo->getEnhanceToHit()); m_Defense = computeDefense(CClass, &attr, pMonsterInfo->getEnhanceDefense()); m_Protection = computeProtection(CClass, &attr, pMonsterInfo->getEnhanceProtection()); m_Damage[ATTR_CURRENT] = computeMinDamage(CClass, &attr, pMonsterInfo->getEnhanceMinDamage()); m_Damage[ATTR_MAX] = computeMaxDamage(CClass, &attr, pMonsterInfo->getEnhanceMaxDamage()); // InitAllStat捞尔 咯扁波尔 绢蠢霸 曼老鳖? - 2002.5.14 全芒 if (monsterType == 358 || monsterType == 359 || monsterType == 360 || monsterType == 361) m_HP[ATTR_MAX] = m_HP[ATTR_MAX] * 10; if(monsterType>=371 && monsterType <= 375) { m_HP[ATTR_MAX] = 500; // 5000栏肺 棱囚 乐促. 抛胶飘甫 困秦辑 临牢 巴 m_Defense = 50; m_Protection = 20; } m_HP[ATTR_CURRENT] = m_HP[ATTR_MAX]; m_SilverDamage = 0; // 促澜 贸府罐阑 畔阑 瘤沥茄促. getCurrentTime(m_NextTurn); m_NextTurn.tv_sec += rand() % 3; m_NextTurn.tv_usec += rand() % 1000000; if (m_NextTurn.tv_usec >= 1000000) m_NextTurn.tv_sec ++; clearAccuDelay(); // AI 努贰胶甫 积己茄促. uint aitype = pMonsterInfo->getAIType(); m_pBrain = new MonsterAI(this, aitype); // Monster啊 粮俊 唱鸥唱绰 规过 switch (pMonsterInfo->selectRegenType()) { case REGENTYPE_HIDE : setFlag( Effect::EFFECT_CLASS_HIDE ); m_MoveMode = MOVE_MODE_BURROWING; break; case REGENTYPE_PORTAL : // by sigi. 2002.9.6 setFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL); break; case REGENTYPE_INVISIBLE : setFlag( Effect::EFFECT_CLASS_INVISIBILITY ); break; case REGENTYPE_BAT : setFlag( Effect::EFFECT_CLASS_TRANSFORM_TO_BAT ); m_MoveMode = MOVE_MODE_FLYING; break; default : break; } // 捞抚阑 汲沥茄促. if (m_bMaster) m_Name = pMonsterInfo->getHName(); else m_Name = g_pMonsterNameManager->getRandomName(this); getCurrentTime(m_LastSpeechTime); switch (monsterType) { case 358: case 359: m_Name = g_pStringPool->getString( STRID_EVENT_SANTA_NAME ); break; case 360: case 361: m_Name = g_pStringPool->getString( STRID_EVENT_WOLF_NAME ); break; case 371: case 372: m_Name = g_pStringPool->getString( STRID_SLAYER_RELIC_SHRINE ); break; case 374: case 375: m_Name = g_pStringPool->getString( STRID_VAMPIRE_RELIC_SHRINE ); break; default: break; } if ( monsterType >= 660 && monsterType <= 669 ) m_Name = g_pStringPool->getString(STRID_ORE); // 努罚 鸥涝阑 技泼茄促. // by sigi. 2002.10.8 m_ClanType = pMonsterInfo->getClanType();//CLAN_VAMPIRE_MONSTER; m_OwnerObjectID = 0; m_HostName = ""; m_HostPartyID = 0; // InitAllStat 窃荐俊 乐绰 何盒捞瘤父, // InitAllStat 窃荐绰 公芭款 窃荐咯辑 // 埃窜洒 咯扁辑 官肺 历亲仿阑 技泼秦 霖促. if(monsterType>=371 && monsterType<=375) { m_Resist[MAGIC_DOMAIN_NO_DOMAIN] = 0; m_Resist[MAGIC_DOMAIN_POISON] = 70; m_Resist[MAGIC_DOMAIN_ACID] = 60; m_Resist[MAGIC_DOMAIN_CURSE] = 100; m_Resist[MAGIC_DOMAIN_BLOOD] = 50; } else { m_Resist[MAGIC_DOMAIN_NO_DOMAIN] = 0; m_Resist[MAGIC_DOMAIN_POISON] = 50; m_Resist[MAGIC_DOMAIN_ACID] = 0; m_Resist[MAGIC_DOMAIN_CURSE] = 0; m_Resist[MAGIC_DOMAIN_BLOOD] = 0; } // 扁夯 effect甸阑 汲沥茄促. by sigi. 2002.9.13 pMonsterInfo->addDefaultEffects( this ); m_LastHitCreatureClass = CREATURE_CLASS_MAX; m_isEventMonster = false; // 绝绰霸 -1捞促. m_RelicIndex = -1; // 措面 给 框流捞绰 各篮 傲 RelicIndex甫 持绢啊瘤绊 给 框流捞霸 茄促. if ( monsterType >= 660 && monsterType <= 669 ) { m_RelicIndex = monsterType; } m_bScanEnemy = false; m_NextScanTurn.tv_sec = 0; m_NextScanTurn.tv_usec = 0; m_pOldEnemy = NULL; m_bEnemyLimit = false; // 2002.10.14 if (pMonsterInfo->isNormalRegen()) { m_EventMonsterIndex = 0xFFFF; } else { // 角力 index绰 寇何俊辑 汲沥秦具登瘤父, // 家券等 阁胶磐牢 版快绰 咯扁辑 荤官荤官~ 老窜 汲沥秦敌促. m_EventMonsterIndex = 0xF000 + rand()%0x0FFF; } setChief( pMonsterInfo->isChief() ); } catch (Throwable& t) { filelog("monsterCreateBug.txt", "%s", t.toString().c_str()); throw; } m_pQuestItem = NULL;#ifdef __UNDERWORLD__ m_bUnderWorld = false;#endif m_LastKiller = 0; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////Monster::~Monster() throw (Error){ __BEGIN_TRY SAFE_DELETE(m_pBrain); __END_CATCH}SpriteType_t Monster::getSpriteType () const throw () { __BEGIN_TRY return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getSpriteType(); __END_CATCH}Level_t Monster::getLevel () const throw () { __BEGIN_TRY return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getLevel(); __END_CATCH}uint Monster::getBodySize () const throw () { __BEGIN_TRY return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getBodySize(); __END_CATCH}Color_t Monster::getMainColor () const throw () { __BEGIN_TRY return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getMainColor(); __END_CATCH}Color_t Monster::getSubColor () const throw () { __BEGIN_TRY return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getSubColor(); __END_CATCH}MAlignment Monster::getAlignment () const throw () { __BEGIN_TRY return g_pMonsterInfoManager->getMonsterInfo(m_MonsterType)->getAlignment(); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// registerObject //////////////////////////////////////////////////////////////////////////////void Monster::registerObject () throw (Error){ __BEGIN_TRY Assert(getZone() != NULL); ObjectRegistry & OR = getZone()->getObjectRegistry(); __ENTER_CRITICAL_SECTION(OR) OR.registerObject_NOLOCKED(this); __LEAVE_CRITICAL_SECTION(OR) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 阁胶磐 AI 啊 角青登绰 皋筋靛捞促. Zone::processZone () 俊辑 粮俊 粮犁// 窍绰 葛电 阁胶磐甫 iterating 秦啊搁辑 Monster::act() 皋筋靛甫 龋免茄促.//////////////////////////////////////////////////////////////////////////////void Monster::act(const Timeval& currentTime) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG // 泅犁 矫埃捞 促澜 畔焊促 累促搁, 酒流 粱 歹 扁促妨具 茄促. // 弊犯瘤 臼栏搁, 咀记阑 秒茄促. if (currentTime < m_NextTurn) return; // 阶咯乐绰 掉饭捞啊 乐促搁 力芭秦具 茄促. if (m_AccuDelay.tv_sec != 0 || m_AccuDelay.tv_usec != 0) { m_NextTurn.tv_sec += m_AccuDelay.tv_sec; m_NextTurn.tv_usec += m_AccuDelay.tv_usec; clearAccuDelay(); return; } __BEGIN_PROFILE_MONSTER("M_VERIFY_ENEMIES"); // 弊悼救 肺弊酒眶窍芭唱 救傈瘤措 救栏肺 // 甸绢埃 PC啊 乐栏搁 利 府胶飘俊辑 昏力甫 茄促. verifyEnemies(); __END_PROFILE_MONSTER("M_VERIFY_ENEMIES"); // AI啊 绝促搁... if (m_pBrain==NULL) { // delay汲沥 Timeval delay; delay.tv_sec = 1; delay.tv_usec = 500000; addAccuDelay(delay); return; } // Paralyze俊 吧妨乐促搁 框流老 荐啊 绝促. if (isFlag(Effect::EFFECT_CLASS_PARALYZE) || isFlag(Effect::EFFECT_CLASS_COMA) || isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS) || isFlag(Effect::EFFECT_CLASS_SLEEP) || isFlag(Effect::EFFECT_CLASS_ARMAGEDDON) || isFlag(Effect::EFFECT_CLASS_TRAPPED) || isFlag(Effect::EFFECT_CLASS_EXPLOSION_WATER) ) { m_pBrain->setDelay(currentTime); return; }/*//#ifdef __XMAS_EVENT_CODE__ if (m_LastSpeechTime < currentTime && isEventMonster(this)) { GCSay gcSay; gcSay.setObjectID(getObjectID()); if (m_MonsterType == 358 || m_MonsterType == 359) { gcSay.setMessage(SantaSpeech[rand()%SantaSpeechMax]); } else if (m_MonsterType == 360 || m_MonsterType == 361) { gcSay.setMessage(RudolfSpeech[rand()%RudolfSpeechMax]); } else { Assert(false); } m_pZone->broadcastPacket(m_X, m_Y, &gcSay); m_LastSpeechTime.tv_sec = currentTime.tv_sec + 30; m_LastSpeechTime.tv_usec = currentTime.tv_usec; }//#endif*/ // 利捞 乐促搁 利俊 蝶扼, 老访狼 青悼阑 秒茄促. if (hasEnemy()) { Creature* pEnemy = getPrimaryEnemy(); if (pEnemy!=NULL) { __BEGIN_PROFILE_MONSTER("M_AI_DEAL"); m_pBrain->deal(pEnemy, currentTime); __END_PROFILE_MONSTER("M_AI_DEAL"); } } else { // 见绢乐绰 版快 眉农 if (isFlag(Effect::EFFECT_CLASS_HIDE)) { __BEGIN_PROFILE_MONSTER("M_UNBURROW"); const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(m_MonsterType); if ((rand() & 0x0000007F) < pMonsterInfo->getUnburrowChance()) { SkillHandler* pSkillHandler = g_pSkillHandlerManager->getSkillHandler(SKILL_UN_BURROW); Assert(pSkillHandler != NULL); pSkillHandler->execute(this); // delay汲沥 Timeval delay; delay.tv_sec = 1; delay.tv_usec = 500000; addAccuDelay(delay); } else { // 见绢乐绰 悼救档 眉农 delay甫 敌促. m_pBrain->setDelay(currentTime);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -