@Override public List<Permanent> getAvailableAttackers(UUID defenderId, Game game) { FilterCreatureForCombat filter = new FilterCreatureForCombat(); List<Permanent> attackers = game.getBattlefield().getAllActivePermanents(filter, playerId, game); attackers.removeIf(entry -> !entry.canAttack(defenderId, game)); return attackers; }
@Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); TargetOpponent targetDefender = new TargetOpponent(); if (controller != null) { game.getBattlefield().getAllActivePermanents(CardType.CREATURE).stream().filter((permanent) -> (filter.match(permanent, source.getSourceId(), source.getControllerId(), game))).forEachOrdered((permanent) -> { if (game.getOpponents(controller.getId()).size() > 1) { controller.choose(outcome.Benefit, targetDefender, source.getSourceId(), game); } else { targetDefender.add(game.getOpponents(controller.getId()).iterator().next(), game); } if (permanent.canAttack(targetDefender.getFirstTarget(), game)) { controller.declareAttacker(permanent.getId(), targetDefender.getFirstTarget(), game, false); } }); } return false; }
@Override public void declareAttacker(UUID attackerId, UUID defenderId, Game game, boolean allowUndo) { if (allowUndo) { setStoredBookmark(game.bookmarkState()); // makes it possible to UNDO a declared attacker with costs from e.g. Propaganda } Permanent attacker = game.getPermanent(attackerId); if (attacker != null && attacker.canAttack(defenderId, game) && attacker.isControlledBy(playerId)) { if (!game.getCombat().declareAttacker(attackerId, defenderId, playerId, game)) { game.undo(playerId); } } }
@Override public boolean apply(Game game, Ability source) { Player opponent = game.getPlayer(game.getPermanent(getTargetPointer().getFirst(game, source)).getControllerId()); if (opponent != null) { filterOpponentCreatures.add(new ControllerIdPredicate(opponent.getId())); game.getBattlefield().getAllActivePermanents(CardType.CREATURE).stream().filter((permanent) -> (filterOpponentCreatures.match(permanent, source.getSourceId(), source.getControllerId(), game))).forEachOrdered((permanent) -> { //TODO: allow the player to choose between a planeswalker and player if (permanent.canAttack(source.getControllerId(), game)) { opponent.declareAttacker(permanent.getId(), source.getControllerId(), game, false); } }); return true; } return false; }
public int evaluate(Permanent creature, Game game) { if (!values.containsKey(creature.getId())) { int value = 0; if (creature.canAttack(null, game)) { value += 2; } value += creature.getPower().getValue(); value += creature.getToughness().getValue(); value += creature.getAbilities().getEvasionAbilities().size(); value += creature.getAbilities().getProtectionAbilities().size(); value += creature.getAbilities().containsKey(FirstStrikeAbility.getInstance().getId()) ? 1 : 0; value += creature.getAbilities().containsKey(DoubleStrikeAbility.getInstance().getId()) ? 2 : 0; value += creature.getAbilities().containsKey(TrampleAbility.getInstance().getId()) ? 1 : 0; values.put(creature.getId(), value); } return values.get(creature.getId()); }
public int evaluate(Permanent creature, Game game) { if (!values.containsKey(creature.getId())) { int value = 0; if (creature.canAttack(null, game)) { value += 2; } value += creature.getPower().getValue(); value += creature.getToughness().getValue(); value += creature.getAbilities().getEvasionAbilities().size(); value += creature.getAbilities().getProtectionAbilities().size(); value += creature.getAbilities().containsKey(FirstStrikeAbility.getInstance().getId()) ? 1 : 0; value += creature.getAbilities().containsKey(DoubleStrikeAbility.getInstance().getId()) ? 2 : 0; value += creature.getAbilities().containsKey(TrampleAbility.getInstance().getId()) ? 1 : 0; values.put(creature.getId(), value); } return values.get(creature.getId()); }
@Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.DECLARE_ATTACKERS_STEP_PRE) { Player activePlayer = game.getPlayer(game.getActivePlayerId()); if(activePlayer == null){ return; } for (Permanent permanent : game.getBattlefield().getAllActivePermanents(activePlayer.getId())) { if (permanent.isCreature()) { for (UUID defender : game.getCombat().getDefenders()) { if (!defender.equals(activePlayer.getId())) { if (permanent.canAttack(defender, game)) { // exclude Propaganda style effects if (!game.getContinuousEffects().checkIfThereArePayCostToAttackBlockEffects( GameEvent.getEvent(GameEvent.EventType.DECLARE_ATTACKER, defender, permanent.getId(), permanent.getControllerId()), game)) { this.couldAttackThisTurnCreatures.add(new MageObjectReference(permanent.getId(), game)); break; } } } } } } } }
protected int combatPotential(Permanent creature, Game game) { log.debug("combatPotential"); if (!creature.canAttack(null, game)) { return 0; } int potential = creature.getPower().getValue(); potential += creature.getAbilities().getEvasionAbilities().size(); potential += creature.getAbilities().getProtectionAbilities().size(); potential += creature.getAbilities().containsKey(FirstStrikeAbility.getInstance().getId()) ? 1 : 0; potential += creature.getAbilities().containsKey(DoubleStrikeAbility.getInstance().getId()) ? 2 : 0; potential += creature.getAbilities().containsKey(TrampleAbility.getInstance().getId()) ? 1 : 0; return potential; }
if (possibleAttacker.canAttack(null, game)) { possibleAttackers.add(possibleAttacker.getId());
if (!permanent.canAttack(null, game)) { score -= 100;