📄 monster.cpp
字号:
Assert(pCreature != NULL); // 磊脚捞 酒聪搁.. by sigi. 2002.9.7 if (this==pCreature || !isRealEnemy(pCreature)) return; // 且风 吧妨乐栏搁 努罚鸥涝 备盒 给 茄促. if (!isFlag( Effect::EFFECT_CLASS_HALLUCINATION ) && pCreature->getClanType() == m_ClanType) return; // peace俊 吧妨乐促搁.. if (isFlag(Effect::EFFECT_CLASS_PEACE)) {// Effect* pEffect = pMonster->getEffectManager()->findEffect(EFFECT_CLASS_PEACE); Effect* pEffect = m_pEffectManager->findEffect( Effect::EFFECT_CLASS_PEACE ); EffectPeace* pEffectPeace = dynamic_cast<EffectPeace*>(pEffect); // peace牢 局绰 救 持绰促. if (pCreature->getObjectID()==pEffectPeace->getPeaceCreatureID()) { return; } } // 泅犁 利 府胶飘俊 粮犁窍瘤 臼绰促搁, 利栏肺辑 牢侥窍绊 歹茄促. list<ObjectID_t>::iterator itr = find(m_Enemies.begin(), m_Enemies.end(), pCreature->getObjectID()); if (itr == m_Enemies.end() && m_Enemies.size() < getMaxEnemies()) { m_Enemies.push_back(pCreature->getObjectID()); // 犁固伙酒 -_-; 2002.7.22 by sigi // 傈眉狼 利栏肺 牢侥矫难滚赴促. // 何窍啊 缴秦辑 老窜 猾促. // m_pZone->getMonsterManager()->addPotentialEnemy(this, pCreature); } __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 漂沥 农府贸甫 利 府胶飘俊辑 昏力茄促.//////////////////////////////////////////////////////////////////////////////void Monster::deleteEnemy (ObjectID_t enemyID) throw (NoSuchElementException , Error){ __BEGIN_TRY list<ObjectID_t>::iterator itr = find(m_Enemies.begin(), m_Enemies.end() , enemyID); if (itr == m_Enemies.end()) { //cerr << "Monster::deleteEnemy() : NoSuchElementException" << endl; //throw NoSuchElementException(); // exception 公矫. by sigi. 2002.10.7 return; } m_Enemies.erase(itr); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// Enemy 吝俊辑 肺弊酒眶茄 PC 甫 昏力茄促.//////////////////////////////////////////////////////////////////////////////void Monster::verifyEnemies () throw (Error){ __BEGIN_TRY list<ObjectID_t>::iterator before = m_Enemies.end(); list<ObjectID_t>::iterator current = m_Enemies.begin(); Creature* pEnemy = NULL; while (current != m_Enemies.end()) { // 农府贸啊 粮犁窍绰瘤 眉农茄促. pEnemy = m_pZone->getCreature(*current); if (pEnemy!=NULL) { if (!isRealEnemy(pEnemy)) { m_Enemies.erase(current); if (before == m_Enemies.end()) // first enemy { current = m_Enemies.begin(); } else // !first enemy { current = before; current ++; } } else { // 粮犁窍搁 促澜 畴靛肺 逞绢埃促. before = current ++; } } else { // 粮犁窍瘤 臼栏骨肺 昏力秦具 茄促. m_Enemies.erase(current); if (before == m_Enemies.end()) // first enemy { current = m_Enemies.begin(); } else // !first enemy { current = before; current ++; } } } __END_CATCH}//////////////////////////////////////////////////////////////////////////////// PRIMARY ENEMY 甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////Creature* Monster::getPrimaryEnemy () const throw (Error){ __BEGIN_TRY __BEGIN_DEBUG // by sigi. 2002.10.7 if (m_Enemies.empty()) return NULL; Creature* pEnemy = NULL; Distance_t dist = 255; Creature* pCreature = NULL; Distance_t newDist = 255; list<ObjectID_t>::const_iterator itr; switch (getAttackOrder()) { // 促澜 4 啊瘤 傍拜 鉴辑绰 捞固 利 府胶飘啊 // 鉴辑措肺 沥纺登绢 乐栏骨肺 // 府胶飘狼 front 俊 困摹窍绰 ENEMY 甫 府畔窍搁 等促. case ATTACK_FIRST: case ATTACK_LAST: case ATTACK_STRONGEST: case ATTACK_WEAKEST: /* try { pEnemy = m_pZone->getCreature(m_Enemies.front()); } catch (NoSuchElementException& nsee) { //cerr << nsee.toString() << endl; pEnemy = NULL; } */ // NoSuch.. 力芭. by sigi. 2002.5.2 pEnemy = m_pZone->getCreature(m_Enemies.front()); break; // 促澜 2 啊瘤 傍拜 鉴辑绰, 芭府啊 拌加 官差扁 锭巩俊 // 亲惑 拌魂阑 秦拎具 茄促. case ATTACK_CLOSEST : dist = 255; for (itr = m_Enemies.begin() ; itr != m_Enemies.end() ; itr ++) { /* try { pCreature = m_pZone->getCreature(*itr); } catch (NoSuchElementException& nsee) { //cerr << nsee.toString() << endl; pCreature = NULL; } */ // NoSuch.. 力芭. by sigi. 2002.5.2 pCreature = m_pZone->getCreature(*itr); if (pCreature != NULL) { newDist = pCreature->getDistance(m_X , m_Y); if (newDist < dist) // 芭府啊 歹 啊鳖匡 版快 { dist = newDist; pEnemy = pCreature; } } } break; case ATTACK_FAREST : dist = 0; for (itr = m_Enemies.begin() ; itr != m_Enemies.end() ; itr ++) { /* try { pCreature = m_pZone->getCreature(*itr); } catch (NoSuchElementException& nsee) { //cerr << nsee.toString() << endl; pCreature = NULL; } */ // NoSuch.. 力芭. by sigi. 2002.5.2 pCreature = m_pZone->getCreature(*itr); if (pCreature != NULL) { newDist = pCreature->getDistance(m_X , m_Y); if (newDist > dist) // 芭府啊 歹 钢 版快 { dist = newDist; pEnemy = pCreature; } } } break; case ATTACK_FIGHTER : case ATTACK_PRIEST : case ATTACK_GUNNER : default : throw Error("invalid attack order"); } if (pEnemy == NULL) { //cerr << "<ENEMY NULL ERROR>" << endl; //cerr << "Monster's AttackOrder : " << AttackOrder2String[getAttackOrder()] << endl; //cerr << "Enemy's ObjectID : " << m_Enemies.front(); } return pEnemy; __END_DEBUG __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 利 府胶飘狼 漂沥 困摹狼 农府贸狼 酒捞叼甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////ObjectID_t Monster::getEnemy (EnemyPriority enemyPriority) const throw (NoSuchElementException , Error){ __BEGIN_TRY EnemyPriority ep = ENEMY_PRIMARY; list<ObjectID_t>::const_iterator itr = m_Enemies.begin(); for (; itr != m_Enemies.end(); itr++) { if (enemyPriority == ep) return *itr; ep = EnemyPriority(ep+1); } cerr << "Monster::getEnemy() : NoSuchElementException" << endl; throw NoSuchElementException(); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 茄 阁胶磐啊 扁撅且 荐 乐绰 弥措 阁胶磐狼 俺荐//// *CAUTION*//// 轨颇捞绢狼 瓷仿摹狼 弥措蔼篮 255 捞促. 捞 弥措蔼阑 官帕栏肺 扁撅樊阑// 魂沥秦焊搁...//// 0 - 30 : ENEMY_PRIORITY// 30 - 60 : ENEMY_SECONDARY// 60 - 90 : ENEMY_THIRD// 90 - 120 : ENEMY_FOURTH// 120 - 150 : ENEMY_FIFTH// 150 - 180 : ENEMY_SIXTH// 180 - 210 : ENEMY_SEVENTH// 210 - maxAttr : ENEMY_EIGHTH//////////////////////////////////////////////////////////////////////////////uint Monster::getMaxEnemies () const throw (){ return (m_INT < 210) ? (m_INT / 30 + 1) : 8 ;}//////////////////////////////////////////////////////////////////////////////// get debug string//////////////////////////////////////////////////////////////////////////////string Monster::toString () const throw (){ __BEGIN_TRY StringStream msg; __BEGIN_DEBUG msg << "Monster(" << "ObjectID:" << (int)getObjectID() << ",MonsterType:" << (int)m_MonsterType << ",SpriteType:" << (int)getSpriteType() << ",Name:" << getName() << ",Level:" << (int)getLevel() << ",STR:" << (int)m_STR << ",DEX:" << (int)m_DEX << ",INT:" << (int)m_INT << ",HP:" << (int)m_HP[ATTR_CURRENT] << "/" << (int)m_HP[ATTR_MAX] << ",MainColor:" << (int)getMainColor() << ",SubColor:" << (int)getSubColor() << ",Alignment:" << MAlignment2String[getAlignment()] << ",AttackOrder:" << AttackOrder2String[getAttackOrder()] << ",Moral:" << (int)m_Moral << ",Delay:" << (int)m_Delay << ",Enemies("; for (list<ObjectID_t>::const_iterator itr = m_Enemies.begin() ; itr != m_Enemies.end() ; itr ++) msg << (int)(*itr) << " "; msg << ")" << ",X:" << (int)m_X << ",Y:" << (int)m_Y << ",Sight :" << (int)m_Sight << ")"; __END_DEBUG return msg.toString(); __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Monster::setDamaged(bool value) throw(){ __BEGIN_TRY // AI啊 乐促搁.. if (m_pBrain!=NULL) { m_pBrain->setDamaged(value); } __END_CATCH}void Monster::addPrecedence(const string & Name, int PartyID, int damage){ m_PrecedenceTable.addPrecedence(Name, PartyID, damage);}int Monster::getOustersExp( Ousters* pOusters ){ int total = computeCreatureExp( this, 100 ); double percent = m_PrecedenceTable.getDamagePercent( pOusters->getName(), pOusters->getPartyID() );// return (int)((double)total * percent) * 1.4; return (int)((double)total * percent);}/*void Monster::addPrecedence(Creature* pCreature, int damage){ Assert(pCreature != NULL); m_PrecedenceTable.addPrecedence(pCreature, damage);}*/void Monster::clearEnemyLimitTime() throw() { getCurrentTime(m_EnemyLimitTime); m_EnemyLimitTime.tv_sec += g_pVariableManager->getEnemyLimitTime(); m_EnemyLimitTime.tv_usec=0; }bool Monster::hasNextMonsterSummonInfo() throw (Error){ __BEGIN_TRY const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( m_MonsterType ); Assert(pMonsterInfo!=NULL); if (pMonsterInfo->hasNextMonsterSummonInfo( m_MonsterSummonStep )) { return true; } __END_CATCH return false;}bool Monster::getMonsterSummonInfo(SUMMON_INFO2& summonInfo) throw (Error){ __BEGIN_TRY const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( m_MonsterType ); Assert(pMonsterInfo!=NULL); if (pMonsterInfo->getMonsterSummonInfo( m_MonsterSummonStep, summonInfo )) { // 促澜 窜拌狼 家券阑 霖厚茄促. m_MonsterSummonStep ++; return true; } __END_CATCH return false;}////////////////////////////////////////////////////////////////////////////////// isEnemyToAttack////////////////////////////////////////////////////////////////////////////////// 捞 阁胶磐俊霸 乐绢辑 利牢啊 酒囱啊甫 魄窜窍绰 窃荐//// 颇萍/辨靛/悼辆练牢 版快绰 傍拜窍瘤 臼绰促.////////////////////////////////////////////////////////////////////////////////bool Monster::isEnemyToAttack(Creature* pCreature) const{ if (pCreature->isFlag(Effect::EFFECT_CLASS_GHOST)) return false; if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION)) return true; if (pCreature->isDead() || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) return false; if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); return isEnemyToAttack( pSlayer ); } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); return isEnemyToAttack( pVampire ); } else if (pCreature->isOusters()) { // 老窜篮 货肺 窃荐 眠啊 救窍绊 弊成 埃促. return true; } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pCreature); return isEnemyToAttack( pMonster ); } return false;}// 捞 阁胶磐啊 pSlayer甫 傍拜秦档 登绰啊?bool Monster::isEnemyToAttack(Slayer* pSlayer) const{ if (pSlayer->isFlag(Effect::EFFECT_CLASS_GHOST)) return false; if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION)) return true; if (pSlayer->isDead() || pSlayer->isFlag(Effect::EFFECT_CLASS_COMA)) return false; // 瘤陛篮 公炼扒 浇饭捞绢绰 傍拜秦档 等促. return true; }// 捞 阁胶磐啊 pVampire甫 傍拜秦档 登绰啊?bool Monster::isEnemyToAttack(Vampire* pVampire) const{ if (pVampire->isFlag(Effect::EFFECT_CLASS_GHOST)) return false; if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION)) return true; if (pVampire->isDead() || pVampire->isFlag(Effect::EFFECT_CLASS_COMA)) return false; // 瘤陛篮 公炼扒 轨颇捞绢绰 傍拜秦档 等促. return true; }// 捞 阁胶磐啊 pMonster甫 傍拜秦档 登绰啊?bool Monster::isEnemyToAttack(Monster* pMonster) const{ if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION)) return true; // 鞍篮 clan 家加 阁胶磐搁 傍拜窍瘤 臼绰促. // 唱吝俊绰.. 穿焙啊狼 疙飞?俊 狼秦辑 傍拜罐阑 荐档 乐栏骨肺 // m_Ememies甫 八祸秦辑 眉农秦具瞪 淀. -_-; // 傲 且风 吧赴仇篮 嘎酒档 轿促~ 盔贰绰 m_Enemies 八祸秦具 登绰 巴 鞍篮单 蠢妨辑 盔 -_- if (pMonster->isDead() || pMonster->isFlag(Effect::EFFECT_CLASS_COMA) || (!pMonster->isFlag(Effect::EFFECT_CLASS_HALLUCINATION) && pMonster->m_ClanType==m_ClanType) ) return false; return true;}bool Monster::canMove(ZoneCoord_t nx, ZoneCoord_t ny) const throw(Error){ return (Creature::canMove(nx, ny) && !(m_pZone->getZoneLevel(nx, ny) & SAFE_ZONE));}void Monster::setBrain(MonsterAI* pBrain){ removeBrain(); m_pBrain = pBrain; }void Monster::removeBrain(){ SAFE_DELETE(m_pBrain); }void Monster::deleteAllEnemy() throw(Error){ m_Enemies.clear();}Race_t Monster::getRace() const{ // 唱吝俊.. 阁胶磐 辆幅俊 蝶扼辑 促福霸 秦具摆瘤 return RACE_VAMPIRE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -