private List<Permanent> getAttackers(Game game) { List<UUID> attackersUUID = game.getCombat().getAttackers(); if (attackersUUID.isEmpty()) { return null; } List<Permanent> attackers = new ArrayList<>(); for (UUID attackerId : attackersUUID) { Permanent permanent = game.getPermanent(attackerId); attackers.add(permanent); } return attackers; }
public List<Combat> addBlockers(Game game) { Map<Integer, Combat> engagements = new HashMap<>(); int numGroups = game.getCombat().getGroups().size(); if (numGroups == 0) return new ArrayList<>(); //add a node with no blockers Game sim = game.copy(); engagements.put(sim.getCombat().getValue().hashCode(), sim.getCombat()); sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, playerId, playerId)); List<Permanent> blockers = getAvailableBlockers(game); addBlocker(game, blockers, engagements); return new ArrayList<>(engagements.values()); }
@Override public boolean checkTrigger(GameEvent event, Game game) { for (CombatGroup combatGroup: game.getCombat().getGroups()) { if (!combatGroup.getBlockers().isEmpty()) { return true; } } return false; }
private void removeAttackerIfPossible(Game game, Permanent attacker) { for (Map.Entry entry : game.getContinuousEffects().getApplicableRequirementEffects(attacker, false, game).entrySet()) { RequirementEffect effect = (RequirementEffect) entry.getKey(); if (effect.mustAttack(game)) { if (game.getCombat().getMaxAttackers() >= game.getCombat().getCreaturesForcedToAttack().size() && game.getCombat().getDefenders().size() == 1) { return; // we can't change creatures forced to attack if only one possible defender exists and all forced creatures can attack } } } game.getCombat().removeAttacker(attacker.getId(), game); }
@Override public void resumeBeginStep(Game game, UUID activePlayerId) { super.resumeBeginStep(game, activePlayerId); game.getCombat().resumeSelectAttackers(game); }
@Override public boolean apply(ObjectPlayer<Controllable> input, Game game) { return game.getCombat().getPlayerDefenders(game).contains(input.getObject().getControllerId()); } }
@Override public int calculate(Game game, Ability sourceAbility, Effect effect) { int count = 0; for (CombatGroup combatGroup : game.getCombat().getGroups()) { if (combatGroup.getDefenderId().equals(sourceAbility.getControllerId())) { count += combatGroup.getAttackers().size(); } } return count * 3; }
@Override public boolean checkTrigger(GameEvent event, Game game) { if (game.isActivePlayer(this.controllerId)) { if (game.getCombat().attacksAlone()) { for (Effect effect: this.getEffects()) { effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0))); } return true; } } return false; }
@Override public boolean apply(Permanent input, Game game) { CombatGroup combatGroup = game.getCombat().findGroup(input.getId()); return combatGroup != null && input.isAttacking() && input.getBandedCards().isEmpty() && combatGroup.getDefenderId().equals(defenderId); } }
@Override public int calculate(Game game, Ability sourceAbility, Effect effect) { UUID attackerId = effect.getTargetPointer().getFirst(game, sourceAbility); for (CombatGroup combatGroup : game.getCombat().getGroups()) { if (combatGroup.getAttackers().contains(attackerId)) { return combatGroup.getBlockers().size(); } } return 0; }
@Override public boolean isBlocked(Game game) { for (CombatGroup combatGroup : game.getCombat().getGroups()) { if (combatGroup.getBlocked() && combatGroup.getAttackers().contains(this.getId())) { return true; } } return false; }
public void selectBlockers(Game game) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.DECLARING_BLOCKERS, attackingPlayerId, attackingPlayerId))) { game.getCombat().selectBlockers(null, game); } for (UUID attackingCreatureID : game.getCombat().getAttackers()) { Permanent permanent = game.getPermanent(attackingCreatureID); if (permanent != null && permanent.getBlocking() == 0) { game.fireEvent(GameEvent.getEvent(EventType.UNBLOCKED_ATTACKER, attackingCreatureID, attackingPlayerId)); } } }
private void setPlayer() { if (game.getStep().getStepPart() == StepPart.PRIORITY) { playerId = game.getPriorityPlayerId(); } else { if (game.getStep().getType() == PhaseStep.DECLARE_BLOCKERS) { playerId = game.getCombat().getDefenders().iterator().next(); } else { playerId = game.getActivePlayerId(); } } }
@Override public boolean checkTrigger(GameEvent event, Game game) { if (super.checkTrigger(event, game)) { UUID defenderId = game.getCombat().getDefendingPlayerId(getSourceId(), game); if (defenderId != null) { this.getEffects().setTargetPointer(new FixedTarget(defenderId)); return true; } } return false; }
@Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getSourceId() != null && event.getSourceId().equals(this.getSourceId())) { UUID defender = game.getCombat().getDefendingPlayerId(this.getSourceId(), game); this.getEffects().get(0).setTargetPointer(new FixedTarget(defender)); return true; } return false; }
@Override public boolean checkTrigger(GameEvent event, Game game) { Permanent source = game.getPermanent(event.getSourceId()); if (source != null && source.getId().equals(this.getSourceId())) { UUID defenderId = game.getCombat().getDefenderId(event.getSourceId()); this.getEffects().get(0).setTargetPointer(new FixedTarget(defenderId)); return true; } return false; }
@Override public boolean apply(Game game, Ability source) { Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (enchantment != null && enchantment.getAttachedTo() != null) { Player defender = game.getPlayer(game.getCombat().getDefendingPlayerId(enchantment.getAttachedTo(), game)); if (defender != null) { defender.loseLife(amount.calculate(game, source, this), game, false); } } return true; }