inline const bool SC_LanguageConfig::removePath(DirVector& vec, const Path& path) { const DirVector::iterator& end = std::remove(vec.begin(), vec.end(), path); const bool removed = end != vec.end(); vec.erase(end, vec.end()); return removed; }
inline const bool SC_LanguageConfig::addPath(DirVector& vec, const Path& path) { if (!findPath(vec, path)) { vec.push_back(path); return true; } else { return false; } }
bool Monster::getRandomStep(const Position& creaturePos, Direction& dir) { DirVector dirVector; dirVector.push_back(NORTH); dirVector.push_back(SOUTH); dirVector.push_back(WEST); dirVector.push_back(EAST); std::random_shuffle(dirVector.begin(), dirVector.end()); for(DirVector::iterator it = dirVector.begin(); it != dirVector.end(); ++it) { if(!canWalkTo(creaturePos, *it)) continue; dir = *it; return true; } return false; }
bool Monster::pushCreature(Creature* creature) { DirVector dirVector; dirVector.push_back(NORTH); dirVector.push_back(SOUTH); dirVector.push_back(WEST); dirVector.push_back(EAST); std::random_shuffle(dirVector.begin(), dirVector.end()); Position monsterPos = creature->getPosition(); Tile* tile = NULL; for(DirVector::iterator it = dirVector.begin(); it != dirVector.end(); ++it) { if((tile = g_game.getTile(Spells::getCasterPosition(creature, (*it)))) && !tile->hasProperty( BLOCKPATH) && g_game.internalMoveCreature(creature, (*it)) == RET_NOERROR) return true; } return false; }
bool Monster::getDanceStep(const Position& creaturePos, Direction& dir, bool keepAttack /*= true*/, bool keepDistance /*= true*/) { assert(attackedCreature); bool canDoAttackNow = canUseAttack(creaturePos, attackedCreature); const Position& centerPos = attackedCreature->getPosition(); uint32_t tmpDist, centerToDist = std::max(std::abs(creaturePos.x - centerPos.x), std::abs(creaturePos.y - centerPos.y)); DirVector dirVector; if(!keepDistance || creaturePos.y - centerPos.y >= 0) { tmpDist = std::max(std::abs((creaturePos.x) - centerPos.x), std::abs((creaturePos.y - 1) - centerPos.y)); if(tmpDist == centerToDist && canWalkTo(creaturePos, NORTH)) { bool result = true; if(keepAttack) result = (!canDoAttackNow || canUseAttack(Position(creaturePos.x, creaturePos.y - 1, creaturePos.z), attackedCreature)); if(result) dirVector.push_back(NORTH); } } if(!keepDistance || creaturePos.y - centerPos.y <= 0) { tmpDist = std::max(std::abs((creaturePos.x) - centerPos.x), std::abs((creaturePos.y + 1) - centerPos.y)); if(tmpDist == centerToDist && canWalkTo(creaturePos, SOUTH)) { bool result = true; if(keepAttack) result = (!canDoAttackNow || canUseAttack(Position(creaturePos.x, creaturePos.y + 1, creaturePos.z), attackedCreature)); if(result) dirVector.push_back(SOUTH); } } if(!keepDistance || creaturePos.x - centerPos.x >= 0) { tmpDist = std::max(std::abs((creaturePos.x + 1) - centerPos.x), std::abs((creaturePos.y) - centerPos.y)); if(tmpDist == centerToDist && canWalkTo(creaturePos, EAST)) { bool result = true; if(keepAttack) result = (!canDoAttackNow || canUseAttack(Position(creaturePos.x + 1, creaturePos.y, creaturePos.z), attackedCreature)); if(result) dirVector.push_back(EAST); } } if(!keepDistance || creaturePos.x - centerPos.x <= 0) { tmpDist = std::max(std::abs((creaturePos.x - 1) - centerPos.x), std::abs((creaturePos.y) - centerPos.y)); if(tmpDist == centerToDist && canWalkTo(creaturePos, WEST)) { bool result = true; if(keepAttack) result = (!canDoAttackNow || canUseAttack(Position(creaturePos.x - 1, creaturePos.y, creaturePos.z), attackedCreature)); if(result) dirVector.push_back(WEST); } } if(dirVector.empty()) return false; std::random_shuffle(dirVector.begin(), dirVector.end()); dir = dirVector[random_range(0, dirVector.size() - 1)]; return true; }
inline const bool SC_LanguageConfig::findPath(const DirVector& vec, const Path& path) { return std::find(vec.begin(), vec.end(), path) != vec.end(); }