mirror of
https://github.com/correl/mage.git
synced 2024-12-25 03:00:15 +00:00
* Jandor's Ring - FIxed possible null pointer exception (discard has to be a cost still lacking).
This commit is contained in:
parent
ee59ec80e2
commit
f67cd391dd
2 changed files with 39 additions and 30 deletions
|
@ -27,6 +27,8 @@
|
|||
*/
|
||||
package mage.cards.j;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.condition.Condition;
|
||||
|
@ -35,6 +37,7 @@ import mage.abilities.costs.mana.ManaCostsImpl;
|
|||
import mage.abilities.decorator.ConditionalActivatedAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
@ -59,7 +62,9 @@ public class JandorsRing extends CardImpl {
|
|||
|
||||
Watcher watcher = new JandorsRingWatcher();
|
||||
// {2}, {tap}, Discard the last card you drew this turn: Draw a card.
|
||||
Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new DiscardAndDrawEffect(), new ManaCostsImpl("{2}"), WatchedCardInHandCondition.instance, "Last drawn card still in hand?");
|
||||
// TODO: discard has to be a cost not a payment during resolution
|
||||
Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
|
||||
new JandorsRingEffect(), new ManaCostsImpl("{2}"), WatchedCardInHandCondition.instance, "Last drawn card still in hand?");
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability, watcher);
|
||||
}
|
||||
|
@ -74,61 +79,60 @@ public class JandorsRing extends CardImpl {
|
|||
}
|
||||
}
|
||||
|
||||
class DiscardAndDrawEffect extends OneShotEffect {
|
||||
class JandorsRingEffect extends OneShotEffect {
|
||||
|
||||
|
||||
public DiscardAndDrawEffect() {
|
||||
public JandorsRingEffect() {
|
||||
super(Outcome.Discard);
|
||||
staticText = "Draw a card";
|
||||
}
|
||||
|
||||
public DiscardAndDrawEffect(final DiscardAndDrawEffect effect) {
|
||||
public JandorsRingEffect(final JandorsRingEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DiscardAndDrawEffect copy() {
|
||||
return new DiscardAndDrawEffect(this);
|
||||
public JandorsRingEffect copy() {
|
||||
return new JandorsRingEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
JandorsRingWatcher watcher = (JandorsRingWatcher) game.getState().getWatchers().get(JandorsRingWatcher.class.getSimpleName());
|
||||
|
||||
FilterCard filter = new FilterCard(game.getCard(watcher.lastDrawnCard).getName());
|
||||
filter.add(new CardIdPredicate(watcher.lastDrawnCard));
|
||||
DiscardCardYouChooseTargetEffect effect = new DiscardCardYouChooseTargetEffect(filter, TargetController.YOU);
|
||||
|
||||
if (effect.apply(game, source)) {//Conditional was already checked, card should be in hand, but if for some weird reason it fails, the card won't be drawn, although the cost will already be paid
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
controller.drawCards(1, game);
|
||||
if (watcher != null) {
|
||||
UUID cardId = watcher.getLastDrewCard(source.getControllerId());
|
||||
Card card = game.getCard(cardId);
|
||||
if (card != null) {
|
||||
FilterCard filter = new FilterCard(card.getName());
|
||||
filter.add(new CardIdPredicate(card.getId()));
|
||||
DiscardCardYouChooseTargetEffect effect = new DiscardCardYouChooseTargetEffect(filter, TargetController.YOU);
|
||||
if (effect.apply(game, source)) {//Conditional was already checked, card should be in hand, but if for some weird reason it fails, the card won't be drawn, although the cost will already be paid
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
controller.drawCards(1, game);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class JandorsRingWatcher extends Watcher {
|
||||
|
||||
UUID lastDrawnCard;
|
||||
Map<UUID, UUID> lastDrawnCards = new HashMap<>();
|
||||
|
||||
public JandorsRingWatcher() {
|
||||
super(JandorsRingWatcher.class.getSimpleName(), WatcherScope.PLAYER);
|
||||
this.lastDrawnCard = null;
|
||||
super(JandorsRingWatcher.class.getSimpleName(), WatcherScope.GAME);
|
||||
}
|
||||
|
||||
public JandorsRingWatcher(final JandorsRingWatcher watcher) {
|
||||
super(watcher);
|
||||
this.lastDrawnCard = watcher.lastDrawnCard;
|
||||
this.lastDrawnCards.putAll(watcher.lastDrawnCards);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void watch(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.DREW_CARD) {
|
||||
lastDrawnCard = event.getTargetId();
|
||||
}
|
||||
if (event.getType() == GameEvent.EventType.CLEANUP_STEP_POST) {
|
||||
lastDrawnCard = null;
|
||||
lastDrawnCards.putIfAbsent(event.getPlayerId(), event.getTargetId());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,7 +144,11 @@ class JandorsRingWatcher extends Watcher {
|
|||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
lastDrawnCard = null;
|
||||
lastDrawnCards.clear();
|
||||
}
|
||||
|
||||
public UUID getLastDrewCard(UUID playerId) {
|
||||
return lastDrawnCards.getOrDefault(null, playerId);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,7 +160,8 @@ enum WatchedCardInHandCondition implements Condition {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
JandorsRingWatcher watcher = (JandorsRingWatcher) game.getState().getWatchers().get(JandorsRingWatcher.class.getSimpleName());
|
||||
|
||||
return watcher.lastDrawnCard != null && game.getPlayer(source.getControllerId()).getHand().contains(watcher.lastDrawnCard);
|
||||
return watcher != null
|
||||
&& watcher.lastDrawnCards != null && game.getPlayer(source.getControllerId()).getHand().contains(watcher.getLastDrewCard(source.getControllerId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -160,5 +169,4 @@ enum WatchedCardInHandCondition implements Condition {
|
|||
return "if last drawn card is still in hand";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import java.util.HashSet;
|
|||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.constants.WatcherScope;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
|
@ -43,7 +42,9 @@ public class CastFromHandWatcher extends Watcher {
|
|||
step = game.getTurn().getStep();
|
||||
}
|
||||
Spell spell = (Spell) game.getObject(event.getTargetId());
|
||||
spellsCastFromHand.add(spell.getSourceId());
|
||||
if (spell != null) {
|
||||
spellsCastFromHand.add(spell.getSourceId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue