📄 monsterai.cpp
字号:
HP_t CurHP = pMonster->getHP(ATTR_CURRENT); HP_t MaxHP = pMonster->getHP(ATTR_MAX); if (CurHP*4 < MaxHP) return true; return false;}bool checkImDamaged(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); return pMonster->getBrain()->getDamaged();}bool checkImHiding(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); return pMonster->isFlag(Effect::EFFECT_CLASS_HIDE);}bool checkImWolf(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); return pMonster->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF);}bool checkImBat(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); return pMonster->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT);}bool checkImInvisible(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); return pMonster->isFlag(Effect::EFFECT_CLASS_INVISIBILITY);}bool checkImWalkingWall(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); MonsterAI* pAI = pMonster->getBrain(); Assert(pAI != NULL); if (pAI->getWallCount() > 3 && (pAI->getMoveRule()==MOVE_RULE_LEFTWALL || pAI->getMoveRule()==MOVE_RULE_RIGHTWALL)) { return true; } return false;}bool checkTimingBloodDrain(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); // 阁胶磐啊 slayer啊 酒聪扼档 软趋窍霸 荐沥. by sigi. 2002.9.14 if (pEnemy == NULL // Slayer啊 酒聪搁 软趋窍瘤 臼绰促. || pEnemy->isNPC() // 捞固 软趋寸沁栏搁 软趋窍瘤 臼绰促. || pEnemy->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN) // 公利. 软趋 搁开. by sigi. 2002.9.14 || pEnemy->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) || pEnemy->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN)) { return false; } // 软趋芭府啊 登绰瘤 犬牢茄促. Distance_t dist = pMonster->getDistance(pEnemy->getX(), pEnemy->getY()); if (dist > pMonster->getMeleeRange()) return false; HP_t EnemyCurHP = 0; HP_t EnemyMaxHP = 0; if (pEnemy->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pEnemy); EnemyCurHP = pSlayer->getHP(ATTR_CURRENT); EnemyMaxHP = pSlayer->getHP(ATTR_MAX); } else if (pEnemy->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pEnemy); EnemyCurHP = pVampire->getHP(ATTR_CURRENT); EnemyMaxHP = pVampire->getHP(ATTR_MAX); } else if (pEnemy->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pEnemy); EnemyCurHP = pOusters->getHP(ATTR_CURRENT); EnemyMaxHP = pOusters->getHP(ATTR_MAX); } else if (pEnemy->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pEnemy); EnemyCurHP = pMonster->getHP(ATTR_CURRENT); EnemyMaxHP = pMonster->getHP(ATTR_MAX); } // HP啊 1/5捞惑 巢疽栏搁 软趋窍瘤 臼绰促. if (EnemyCurHP*5 >= EnemyMaxHP) return false; // 付魔郴... 软趋茄促~ return true;}bool checkTimingMasterBloodDrain(Monster* pMonster, Creature* pEnemy){ // 20% 眉农 // 拌魂 磊眉啊 糊矫骨肺.. //if (rand()%100 > 10) // return false; Assert(pMonster != NULL); if ((!pMonster->isMaster()#ifdef __UNDERWORLD__ && pMonster->getMonsterType() != 599#endif ) || pEnemy == NULL) { return false; } int masterHPPercent = pMonster->getHP(ATTR_CURRENT)*100/pMonster->getHP(ATTR_MAX); // 软趋 犬伏 //int startHPPercent = 70, startBDPercent = 10; //int endHPPercent = 30, endBDPercent = 30; int startHPPercent = g_pVariableManager->getMasterBloodDrainStartHP(); int startBDPercent = g_pVariableManager->getMasterBloodDrainStartBD(); int endHPPercent = g_pVariableManager->getMasterBloodDrainEndHP(); int endBDPercent = g_pVariableManager->getMasterBloodDrainEndBD(); // HP啊 70% 捞惑捞搁 软趋窍瘤 臼绰促. if (masterHPPercent >= startHPPercent) return false; int ratio = rand()%100; // HP啊 30% 捞窍捞搁.. 30%狼 犬伏肺 软趋茄促. if (masterHPPercent <= endHPPercent) { return ratio < endBDPercent; } // HP啊 30~70%捞搁 10~30%狼 犬伏肺 软趋茄促. int maxBDPercent = max( startBDPercent, endBDPercent ); int gapHPPercent = startHPPercent - endHPPercent; int gapBDPercent = abs( endBDPercent - startBDPercent ); //int permitRatio = maxBDPercent - (masterHPPercent-endHPPercent)/2; int permitRatio = maxBDPercent - gapBDPercent * (masterHPPercent-endHPPercent) / gapHPPercent; return ratio < permitRatio; /* if (masterHPPercent < 3 || masterHPPercent > 70) { return false; } */ // 酒公唱 软趋且 荐 乐栏骨肺.. - -; //return true; /* int x = pEnemy->getX(); int y = pEnemy->getY(); int Splash = 30; // 弊成 30付府父 眉农茄促. int range = 3; // 7x7 //5; // 11x11 list<Creature*> creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); list<Creature*>::iterator itr = creatureList.begin(); for (; itr != creatureList.end(); itr++) { Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); if (pMonster!=pTargetCreature && pTargetCreature->isNPC() // 捞固 软趋寸沁栏搁 软趋窍瘤 臼绰促. 付胶磐啊 捞繁芭 蝶瘤摆唱 酵绢辑 化促. //&& pTargetCreature->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN) // 公利. 软趋 搁开. by sigi. 2002.9.14 && pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) && pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN)) { HP_t EnemyCurHP = 0; HP_t EnemyMaxHP = 0; if (pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pTargetCreature); EnemyCurHP = pSlayer->getHP(ATTR_CURRENT); EnemyMaxHP = pSlayer->getHP(ATTR_MAX); } else if (pTargetCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pTargetCreature); EnemyCurHP = pVampire->getHP(ATTR_CURRENT); EnemyMaxHP = pVampire->getHP(ATTR_MAX); } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); EnemyCurHP = pMonster->getHP(ATTR_CURRENT); EnemyMaxHP = pMonster->getHP(ATTR_MAX); } // 眉仿 50% 固父篮 软趋寸茄促 if (EnemyCurHP*2 < EnemyMaxHP) return true; } } */ return true;}//----------------------------------------------------------------------//// bool checkMasterSummonTiming(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 家券 扁贱阑 静霸 且妨绊 窍绰单..// 泅犁 粮捞 付胶磐 饭绢捞绊.. // 促弗 各捞 绝绢具 茄促.//----------------------------------------------------------------------bool checkMasterSummonTiming(Monster* pMonster, Creature* pEnemy){ //cout << "checkMasterSummonTiming: "; Assert(pMonster != NULL); // 付胶磐啊 酒聪搁 家侩绝促. if (!pMonster->isMaster()) //|| !pMonster->hasNextMonsterSummonInfo()) { //cout << "not Master" << endl; return false; } // 付胶磐啊 乐绰 粮捞 付胶磐饭绢牢瘤 犬牢茄促. Zone* pZone = pMonster->getZone(); Assert(pZone!=NULL); // 付胶磐 饭绢啊 酒聪搁 狼固绝促. if (!pZone->isMasterLair()) { //cout << "not MasterLair" << endl; return false; } MasterLairManager* pMasterLairManager = pZone->getMasterLairManager(); Assert(pMasterLairManager!=NULL); // 酒流 付胶磐啊 轿快绰 惑怕啊 酒聪绊 // 粮俊 付胶磐 捞寇狼 阁胶磐啊 绝绰 版快 家券且 荐 乐促. bool bSummonTiming = !pMasterLairManager->isMasterReady() && pZone->getMonsterManager()->getSize() <= 1; /* if (bSummonTiming) cout << "Master Not Ready" << endl; else cout << "Master Ready" << endl; */ return bSummonTiming;}//----------------------------------------------------------------------//// bool checkMasterNotReady(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------bool checkMasterNotReady(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); // 付胶磐啊 酒聪搁 家侩绝促. if (!pMonster->isMaster()) { return false; } // 付胶磐啊 乐绰 粮捞 付胶磐饭绢牢瘤 犬牢茄促. Zone* pZone = pMonster->getZone(); Assert(pZone!=NULL); // 付胶磐 饭绢啊 酒聪搁 狼固绝促. if (!pZone->isMasterLair()) { return false; } MasterLairManager* pMasterLairManager = pZone->getMasterLairManager(); Assert(pMasterLairManager!=NULL); // 酒流 付胶磐啊 轿快绰 惑怕啊 酒聪绊 // 粮俊 付胶磐 捞寇狼 阁胶磐啊 绝绰 版快 家券且 荐 乐促. return !pMasterLairManager->isMasterReady();}//----------------------------------------------------------------------//// bool checkImInBadPosition(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 泅犁 困摹啊 救 亮篮 镑牢啊?//// pMonster啊 乐绰 鸥老俊 AcidSwamp捞 谎妨廉 乐绰 版快//----------------------------------------------------------------------bool checkImInBadPosition(Monster* pMonster, Creature* pEnemy){ Assert(pMonster!=NULL); Zone* pZone = pMonster->getZone(); Assert(pZone!=NULL); Tile& rTile = pZone->getTile( pMonster->getX(), pMonster->getY() ); // 公利 惑怕啊 酒聪绊 if (!pMonster->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // Acid 搁开捞 酒聪绊 官蹿俊 AcidSwap捞 彬妨乐促搁 救 亮瘤. - -; && (!pMonster->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_ACID) && rTile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP)!=NULL || rTile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL)!=NULL || rTile.getEffect(Effect::EFFECT_CLASS_GROUND_ATTACK)!=NULL) ) { return true; } return false;}//----------------------------------------------------------------------//// bool checkFindWeakEnemy(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 歹 距茄 利阑 茫阑 荐 乐唱?//// pEnemy狼 HP啊 100捞惑捞绊 HP percentage啊 60% 捞惑捞扼搁 // 促弗 距茄 利阑 窃 茫酒夯促.//----------------------------------------------------------------------bool checkFindWeakEnemy(Monster* pMonster, Creature* pEnemy){ // 老窜 //return false; try { if (pEnemy==NULL) return false; Assert(pMonster!=NULL); Zone* pZone = pMonster->getZone(); Assert(pZone!=NULL); int strongValue = getStrongValue(pEnemy); if (strongValue==0) return false; // 泅犁 利篮 粱 疥促..扼绊 魄窜阑 窍绊. --; // 货肺款 距茄 利阑 茫绰促. Creature* pWeakestCreature = NULL; // 林困 八祸 ZoneCoord_t cx = pMonster->getX(); ZoneCoord_t cy = pMonster->getY();; ZoneCoord_t ix = 0; ZoneCoord_t iy = 0; ZoneCoord_t endx = 0; ZoneCoord_t endy = 0; // 阁胶磐 矫具 裹困俊辑 茫绰促. Sight_t sight = pMonster->getSight(); endx = min(pZone->getWidth() - 1, cx + sight + 1); endy = min(pZone->getHeight() - 1, cy + sight + 1); for (ix = max(0, cx - sight - 1); ix <= endx ; ix++) { for (iy = max(0, cy - sight - 1); iy <= endy ; iy++) { Tile& rTile = pZone->getTile(ix, iy); // 鸥老俊 农府贸啊 乐绰 版快俊父 if (rTile.hasCreature()) { const slist<Object*> & objectList = rTile.getObjectList(); for (slist<Object*>::const_iterator itr = objectList.begin() ; itr != objectList.end() && (*itr)->getObjectPriority() <= OBJECT_PRIORITY_BURROWING_CREATURE; itr++) { Creature* pCreature = dynamic_cast<Creature*>(*itr); Assert(pCreature != NULL); // pMonster, pEnemy啊 酒聪扼搁.. // Player扼搁 傍拜窍霸 等促. if (pCreature != pMonster && pCreature != pEnemy && pCreature->isPC() && pMonster->isRealEnemy(pCreature)) { int checkStrongValue = getStrongValue( pCreature ); // 歹 距茄逞阑 pWeakestCreature肺 烙疙~茄促 if (checkStrongValue < strongValue) { pWeakestCreature = pCreature; strongValue = checkStrongValue; } } } } } } // 俩 距茄逞阑 茫篮 版快.. if (pWeakestCreature!=NULL) { pMonster->deleteAllEnemy(); pMonster->addEnemy( pWeakestCreature ); return true; } else { } } catch (Throwable& t) { // 葛电 exception阑 公矫茄促. filelog("monsterAIBug.txt", "%s", t.toString().c_str()); } return false;}bool checkEnemyNotHallucination(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); if (pEnemy == NULL) return false; if (!pEnemy->isFlag(Effect::EFFECT_CLASS_HALLUCINATION)) return true; return false;}bool checkTimingDuplicateSelf(Monster* pMonster, Creature* pEnemy){ Assert(pMonster != NULL); // 付胶磐啊 酒聪搁 家侩绝促. if (!pMonster->isMaster()) { return false; } // 付胶磐啊 乐绰 粮捞 付胶磐饭绢牢瘤 犬牢茄促. Zone* pZone = pMonster->getZone(); Assert(pZone!=NULL); /* // 付胶磐 饭绢啊 酒聪搁 狼固绝促. if (!pZone->isMasterLair()) { return false; } */ HP_t currentHP = pMonster->getHP(ATTR_CURRENT); HP_t maxHP = pMonster->getHP(ATTR_MAX); // HP啊 70%啊 逞栏搁 荤侩救茄促. if (currentHP*100/maxHP > 70) { return false; } // 12付府 捞惑捞搁 歹 家券 救茄促. if (pZone->getMonsterManager()->getSize() > 12) { return false; } return true;}//----------------------------------------------------------------------//// bool checkPossibleSummonMonsters(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 家券 扁贱阑 静霸 且妨绊 窍绰单..//----------------------------------------------------------------------bool checkPossibleSummonMonsters(Monster* pMonster, Creature* pEnemy){ //cout << "checkMasterSummonTiming: "; Assert(pMonster != NULL); return pMonster->hasNextMonsterSummonInfo();}bool checkEnemyTileNotAcidSwamp(Monster* pMonster, Creature* pEnemy){ Zone* pZone = pEnemy->getZone(); Assert( pZone != NULL ); Tile& rTile = pZone->getTile( pEnemy->getX(), pEnemy->getY() ); if ( rTile.getEffect( Effect::EFFECT_CLASS_ACID_SWAMP ) == NULL ) return true; return false;}bool checkEnemyOnAir(Monster* pMonster, Creature* pEnemy){ if ( pEnemy == NULL ) return false; if ( pEnemy->getMoveMode() == Creature::MOVE_MODE_FLYING ) return true; return false;}bool checkEnemyOnSafeZone(Monster* pMonster, Creature* pEnemy){ if ( pEnemy==NULL ) return false; return ( ( pEnemy->getZone()->getZoneLevel( pEnemy->getX(), pEnemy->getY() ) & SAFE_ZONE ) != 0 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -