@Override public boolean apply(Game game, Ability source) { return game.getPlayerList().size() >= 3; }
@Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.UPKEEP_STEP_POST) { blockedOrBeenBlockedCreatures.put(event.getPlayerId(), new HashSet<>()); // clear the watcher after upkeep } else if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED) { MageObjectReference morBlocker = new MageObjectReference(event.getSourceId(), game); // store blocker MageObjectReference morAttackerBlocked = new MageObjectReference(event.getTargetId(), game); // store attacker blocked for (UUID player : game.getPlayerList()) { if (!blockedOrBeenBlockedCreatures.containsKey(player)) { blockedOrBeenBlockedCreatures.put(player, new HashSet<>()); } blockedOrBeenBlockedCreatures.get(player).add(morBlocker); blockedOrBeenBlockedCreatures.get(player).add(morAttackerBlocked); } } }
@Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.UPKEEP_STEP_POST){ //Clear attackedOrBlockedCreatures.put(event.getPlayerId(), new HashSet<>()); } else if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.BLOCKER_DECLARED) { MageObjectReference mor = new MageObjectReference(event.getSourceId(), game); for (UUID player : game.getPlayerList()){ if (!attackedOrBlockedCreatures.containsKey(player)) { attackedOrBlockedCreatures.put(player, new HashSet<>()); } attackedOrBlockedCreatures.get(player).add(mor); } } }
@Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.END_TURN_STEP_POST){ System.out.println("End of turn for "+game.getPlayer(event.getPlayerId()).getName()); playerToETBMap.put(event.getPlayerId(), new HashSet<>()); } else if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD){ Permanent etbPermanent = game.getPermanent(event.getTargetId()); if (etbPermanent != null){ System.out.println("nonnull permanent entered: "+etbPermanent.getIdName()); for (UUID player : game.getPlayerList()){ if (!playerToETBMap.containsKey(player)){ playerToETBMap.put(player, new HashSet<>()); } playerToETBMap.get(player).add(new MageObjectReference(etbPermanent.getBasicMageObject(game), game)); } } } }
@Override public boolean apply(Game game, Ability source) { Map<UUID, Integer> playerCrtCount = new HashMap<>(); for (Iterator<Permanent> it = game.getBattlefield().getActivePermanents(source.getControllerId(), game).iterator(); it.hasNext();) { Permanent perm = it.next(); if (perm != null && perm.isCreature() && perm.getColor(game).isWhite() && perm.moveToExile(null, null, source.getSourceId(), game)) { playerCrtCount.putIfAbsent(perm.getControllerId(), 0); playerCrtCount.compute(perm.getControllerId(), (p, amount) -> amount + 1); } } for (UUID playerId : game.getPlayerList().toList()) { Player player = game.getPlayer(playerId); if (player != null) { player.drawCards(playerCrtCount.getOrDefault(playerId, 0), game); } } return true; } }
@Override public boolean apply(Game game, Ability source) { Player activePlayer = game.getPlayer(game.getActivePlayerId()); if (activePlayer == null) { return false; } int landCount = game.getBattlefield().getAllActivePermanents(filter, activePlayer.getId(), game).size(); if (landCount == 0) { return false; } for (UUID playerId : game.getPlayerList()) { if (!playerId.equals(activePlayer.getId())) { if (game.getBattlefield().getAllActivePermanents(filter, playerId, game).size() >= landCount) { return false; } } } return true; }
@Override public int calculate(Game game, Ability sourceAbility, Effect effect) { int amount = 0; PlayerList playerList = game.getPlayerList(); for (UUID playerUUID : playerList) { Player player = game.getPlayer(playerUUID); if (player != null) { amount += player.getGraveyard().count(filter, sourceAbility.getSourceId(), sourceAbility.getControllerId(), game); } } return amount + 2; }
public MageObjectReference(UUID sourceId, Game game) { this.sourceId = sourceId; MageObject mageObject = game.getObject(sourceId); if (mageObject != null) { this.zoneChangeCounter = mageObject.getZoneChangeCounter(game); } else { if (game.getPlayerList().contains(sourceId)) { this.zoneChangeCounter = 0; } else { logger.error("The provided sourceId is not connected to an object in the game id: " + sourceId); for (StackObject stackObject : game.getStack()) { logger.error("StackObject: " + stackObject.getId() + " sourceId " + stackObject.getSourceId() + " name " + stackObject.getName()); } mageObject = game.getLastKnownInformation(sourceId, Zone.STACK); if (mageObject != null) { this.zoneChangeCounter = mageObject.getZoneChangeCounter(game); logger.error("SourceId found in LKI"); } else { logger.error("SourceId NOT found in LKI"); this.zoneChangeCounter = 0; } } } }
@Override public boolean apply(Permanent input, Game game) { int power = input.getPower().getValue(); for (UUID playerId : game.getPlayerList()) { Player player = game.getPlayer(playerId); if (player != null) { for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, playerId, game)) { if (permanent.getPower().getValue() >= power && !permanent.equals(input)) { return false; //we found something with equal/more power } } } } return true; }
@Override public boolean apply(Game game, Ability source) { PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId()); do { processPlayer(game, source, player); player = playerList.getNext(game); } while (!player.getId().equals(game.getActivePlayerId())); return true; }
@Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.MANA_PAID) { if (event.getData() != null && event.getData().equals(originalId)) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null) { Card card = spell.getCard(); if (card != null) { for (UUID playerId : game.getPlayerList()) { Player player = game.getPlayer(playerId); if (player != null) { if (player.getCommandersIds().contains(card.getId())) { commanderId.add(card.getId()); break; } } } } } } } }
@Override protected int getInputValue(Game game, Ability source) { int gainedLife = 0; PlayerGainedLifeWatcher watcher = game.getState().getWatcher(PlayerGainedLifeWatcher.class); if (watcher != null) { for (UUID playerId : game.getPlayerList()) { Player player = game.getPlayer(playerId); if (player != null && !player.hasOpponent(source.getControllerId(), game)) { gainedLife = watcher.getLifeGained(playerId); if (gainedLife > 0) { break; } } } } return gainedLife; } }
@Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller == null) { return false; } GrothamaAllDevouringWatcher watcher = game.getState().getWatcher(GrothamaAllDevouringWatcher.class); if (watcher == null) { return false; } Map<UUID, Integer> damageMap = watcher.getDamageMap(new MageObjectReference(source.getSourceId(), source.getSourceObjectZoneChangeCounter() - 1, game)); for (UUID playerId : game.getPlayerList()) { Player player = game.getPlayer(playerId); if (player != null) { int toDraw = damageMap.getOrDefault(player.getId(), 0); if (toDraw > 0) { player.drawCards(toDraw, game); } } } return true; } }
@Override public boolean apply(Game game, Ability source) { List<Permanent> permanents = new ArrayList<>(); Target target = new TargetNonlandPermanent(); target.setNotTarget(false); PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId()); do { target.clearChosen(); if (player != null && player.chooseTarget(outcome, target, source, game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { permanents.add(permanent); game.informPlayers(player.getLogName() + " chooses " + permanent.getName()); } } player = playerList.getNext(game); } while (!player.getId().equals(game.getActivePlayerId())); for (Permanent permanent: permanents) { permanent.addCounters(CounterType.DOOM.createInstance(), source, game); } return true; } }
protected void resolve(SimulationNode node, Game game) { StackObject ability = game.getStack().pop(); if (ability instanceof StackAbility) { SearchEffect effect = getSearchEffect((StackAbility) ability); if (effect != null && ability.getControllerId().equals(playerId)) { Target target = effect.getTarget(); if (!target.doneChosing()) { for (UUID targetId: target.possibleTargets(ability.getSourceId(), ability.getControllerId(), game)) { Game sim = game.copy(); StackAbility newAbility = (StackAbility) ability.copy(); SearchEffect newEffect = getSearchEffect((StackAbility) newAbility); newEffect.getTarget().addTarget(targetId, newAbility, sim); sim.getStack().push(newAbility); SimulationNode newNode = new SimulationNode(node, sim, ability.getControllerId()); node.children.add(newNode); newNode.getTargets().add(targetId); logger.debug(indent(node.depth) + "simulating search -- node#: " + SimulationNode.getCount() + "for player: " + sim.getPlayer(ability.getControllerId()).getName()); } return; } } } logger.debug(indent(node.depth) + "simulating resolve "); ability.resolve(game); game.applyEffects(); game.getPlayers().resetPassed(); game.getPlayerList().setCurrent(game.getActivePlayerId()); }
game.getPlayerList().setCurrent(game.getActivePlayerId());
PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId());
@Override public boolean apply(Game game, Ability source) { game.getPlayerList(); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) {
Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(controller.getId()); Player winner = game.getPlayer(controller.getId());
if (controller != null && targetCreature != null) { PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId());