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; }
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; }
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; }
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; }