@Override public SpellStack getStack() { return state.getStack(); }
@Override public Spell getSpell(UUID spellId) { return state.getStack().getSpell(spellId); }
@Override public Spell getSpellOrLKIStack(UUID spellId) { Spell spell = state.getStack().getSpell(spellId); if (spell == null) { spell = (Spell) this.getLastKnownInformation(spellId, Zone.STACK); } return spell; }
/** * Checks if the current object has damaged the player during the current * turn. * * @param objectId * @param playerId * @return */ public boolean playerGotCombatDamage(UUID objectId, UUID playerId, Game game) { StackObject stackObject = game.getState().getStack().getStackObject(objectId); MageObjectReference mor; if (stackObject instanceof StackAbility) { // This is neccessary because the source object was sacrificed as cost and the correct zone change counter for target calid check can only be get from stack mor = new MageObjectReference(objectId, ((StackAbility) stackObject).getSourceObjectZoneChangeCounter(), game); } else { mor = new MageObjectReference(objectId, game); } if (combatDamagedPlayers.containsKey(mor)) { return combatDamagedPlayers.get(mor).contains(playerId); } return false; }
sb.append(state.getSpecialActions()); sb.append("<br>getStack: "); sb.append(state.getStack()); sb.append("<br>getStepNum: "); sb.append(state.getStepNum());
@Override public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set<UUID> availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game); Set<UUID> possibleTargets = new HashSet<>(); MageObject object = game.getObject(sourceId); for (StackObject item : game.getState().getStack()) { if (item.getId().equals(sourceId)) { object = item; } if (item.getSourceId().equals(sourceId)) { object = item; } } if (object instanceof StackObject) { UUID playerId = ((StackObject) object).getStackAbility().getFirstTarget(); for (UUID targetId : availablePossibleTargets) { Permanent permanent = game.getPermanent(targetId); if (permanent != null && nonblackCreaturefilter.match(permanent, game) && permanent.isControlledBy(playerId)) { possibleTargets.add(targetId); } } } return possibleTargets; }
@Override public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set<UUID> availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game); Set<UUID> possibleTargets = new HashSet<>(); MageObject object = game.getObject(sourceId); for (StackObject item : game.getState().getStack()) { if (item.getId().equals(sourceId)) { object = item; } if (item.getSourceId().equals(sourceId)) { object = item; } } if (object instanceof StackObject) { UUID playerId = ((StackObject) object).getStackAbility().getFirstTarget(); Player player = game.getPlayerOrPlaneswalkerController(playerId); if (player != null) { for (UUID targetId : availablePossibleTargets) { Permanent permanent = game.getPermanent(targetId); if (permanent != null && permanent.isControlledBy(player.getId())) { possibleTargets.add(targetId); } } } } return possibleTargets; }
@Override public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set<UUID> availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game); Set<UUID> possibleTargets = new HashSet<>(); MageObject object = game.getObject(sourceId); for (StackObject item : game.getState().getStack()) { if (item.getId().equals(sourceId)) { object = item; } if (item.getSourceId().equals(sourceId)) { object = item; } } if (object instanceof StackObject) { UUID playerId = ((StackObject) object).getStackAbility().getFirstTarget(); Player player = game.getPlayerOrPlaneswalkerController(playerId); if (player != null) { for (UUID targetId : availablePossibleTargets) { Permanent permanent = game.getPermanent(targetId); if (permanent != null && permanent.isControlledBy(player.getId())) { possibleTargets.add(targetId); } } } } return possibleTargets; }
@Override public boolean applies(GameEvent event, Ability source, Game game) { Card card = game.getCard(event.getSourceId()); if (card != null) { Spell spell = game.getState().getStack().getSpell(event.getSourceId()); if (spell != null && spell.isFaceDown(game)) { return false; // Face Down cast spell (Morph creature) has no name } return CardUtil.haveSameNames(card.getName(), creatureName) && Objects.equals(ownerId, card.getOwnerId()); } return false; }
@Override public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set<UUID> availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game); Set<UUID> possibleTargets = new HashSet<>(); MageObject object = game.getObject(sourceId); for (StackObject item : game.getState().getStack()) { if (item.getId().equals(sourceId)) { object = item; } if (item.getSourceId().equals(sourceId)) { object = item; } } if (object instanceof StackObject) { UUID playerId = ((StackObject) object).getStackAbility().getFirstTarget(); Player player = game.getPlayerOrPlaneswalkerController(playerId); if (player != null) { for (UUID targetId : availablePossibleTargets) { Permanent permanent = game.getPermanent(targetId); if (permanent != null && permanent.isControlledBy(player.getId())) { possibleTargets.add(targetId); } } } } return possibleTargets; }
return getPermanentEntering(objectId); for (StackObject item : state.getStack()) { if (item.getId().equals(objectId)) {
protected void resolve() { StackObject top = null; try { top = state.getStack().peek(); top.resolve(this); resetControlAfterSpellResolve(top.getId()); } finally { if (top != null) { state.getStack().remove(top, this); // seems partly redundant because move card from stack to grave is already done and the stack removed rememberLKI(top.getSourceId(), Zone.STACK, top); checkInfiniteLoop(top.getSourceId()); if (!getTurn().isEndTurnRequested()) { while (state.hasSimultaneousEvents()) { state.handleSimultaneousEvent(this); } } } } }
@Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.SPELL_CAST) { // targetId is the unique ID of the spell Spell spell = game.getState().getStack().getSpell(event.getTargetId()); // revealed a Dragon card or controlled a Dragon as you cast the spell if (spell != null) { boolean revealedOrOnBattlefield = false; for (Cost cost : spell.getSpellAbility().getCosts()) { if (cost instanceof RevealTargetFromHandCost) { revealedOrOnBattlefield = ((RevealTargetFromHandCost) cost).getNumberRevealedCards() > 0; break; } } if (!revealedOrOnBattlefield) { revealedOrOnBattlefield = game.getBattlefield().countAll(filter, spell.getControllerId(), game) > 0; } if (revealedOrOnBattlefield){ castWithDragonOnTheBattlefield.add(spell.getId()); } } } }
@Override public boolean apply(Controllable input, Game game) { StackObject stackObject = game.getState().getStack().getStackObject(input.getId()); if (stackObject != null) { int numberOfTargets = 0; for (UUID modeId : stackObject.getStackAbility().getModes().getSelectedModes()) { Mode mode = stackObject.getStackAbility().getModes().get(modeId); for (Target target : mode.getTargets()) { numberOfTargets += target.getTargets().size(); } } if (numberOfTargets == targets) { return true; } } // Spell spell = game.getStack().getSpell(input.getId()); // if (spell != null) { // int numberOfTargets = 0; // for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) { // for (Target target : mode.getTargets()) { // numberOfTargets += target.getTargets().size(); // } // } // if (numberOfTargets == targets) { // return true; // } // } return false; }
for (StackObject stackObject : game.getState().getStack()) { for (ActivatedAbility ability : stackObject.getAbilities().getActivatedAbilities(Zone.STACK)) { if (ability != null && canPlay(ability, availableMana, game.getObject(ability.getSourceId()), game)) {
@Override public boolean checkTrigger(GameEvent event, Game game) { if (super.checkTrigger(event, game)) { CastFromHandWatcher watcher = game.getState().getWatcher(CastFromHandWatcher.class); if (watcher != null && watcher.spellWasCastFromHand(event.getSourceId())) { Spell spell = game.getState().getStack().getSpell(event.getSourceId()); if (spell != null) { FilterCard filterCard = new FilterCard("a card named " + spell.getName() + " in your graveyard"); filterCard.add(new NamePredicate(spell.getName())); this.getTargets().clear(); this.getTargets().add(new TargetCardInYourGraveyard(filterCard)); return true; } } } return false; }
for (StackObject stackObject : state.getStack()) { if (stackObject instanceof Spell) {