示例#1
0
 MoveInfo getFireMove(Vec2 dir) {
   if (dir.x != 0 && dir.y != 0 && abs(dir.x) != abs(dir.y))
     return {0, nullptr};
   if (checkFriendlyFire(dir))
     return {0, nullptr};
   if (creature->canFire(dir.shorten()))
     return {1.0, [this, dir]() {
       EventListener::addCombatEvent(creature);
       creature->globalMessage(creature->getTheName() + " fires an arrow ");
       creature->fire(dir.shorten());
     }};
   return NoMove;
 }
示例#2
0
 MoveInfo getFireMove(Vec2 dir) {
   if (dir.x != 0 && dir.y != 0 && abs(dir.x) != abs(dir.y))
     return NoMove;
   if (checkFriendlyFire(dir))
     return NoMove;
   for (auto effect : getOffensiveEffects())
     if (auto action = tryEffect(effect, dir.shorten()))
       return action;
   if (auto action = creature->fire(dir.shorten()))
     return {1.0, action.append([=](Creature* creature) {
         creature->setInCombat();
     })};
   return NoMove;
 }
示例#3
0
 MoveInfo getThrowMove(Vec2 enemyDir) {
   if (enemyDir.x != 0 && enemyDir.y != 0 && abs(enemyDir.x) != abs(enemyDir.y))
     return NoMove;
   if (checkFriendlyFire(enemyDir))
     return NoMove;
   Vec2 dir = enemyDir.shorten();
   Item* best = nullptr;
   int damage = 0;
   auto items = creature->getEquipment().getItems([this](Item* item) {
       return !creature->getEquipment().isEquiped(item);});
   for (Item* item : items)
     if (getThrowValue(item) > damage) {
       damage = getThrowValue(item);
       best = item;
     }
   if (best)
     if (auto action = creature->throwItem(best, dir)) {
       creature->setInCombat();
       return {1.0, action };
     }
   return NoMove;
 }
示例#4
0
 MoveInfo getThrowMove(Vec2 enemyDir) {
   if (enemyDir.x != 0 && enemyDir.y != 0 && abs(enemyDir.x) != abs(enemyDir.y))
     return {0, nullptr};
   if (checkFriendlyFire(enemyDir))
     return {0, nullptr};
   Vec2 dir = enemyDir.shorten();
   Item* best = nullptr;
   int damage = 0;
   auto items = creature->getEquipment().getItems([this](Item* item) {
       return !creature->getEquipment().isEquiped(item);});
   for (Item* item : items)
     if (getThrowValue(item) > damage) {
       damage = getThrowValue(item);
       best = item;
     }
   if (best && creature->canThrowItem(best))
     return {1.0, [this, dir, best]() {
       EventListener::addCombatEvent(creature);
       creature->globalMessage(creature->getTheName() + " throws " + best->getAName());
       creature->throwItem(best, dir);
     }};
   else
     return NoMove;
 }