mirror of
https://github.com/correl/mage.git
synced 2024-11-15 11:09:30 +00:00
add nullchecks for game.getObject
This commit is contained in:
parent
09dd9d5a26
commit
da3c861344
80 changed files with 408 additions and 354 deletions
|
@ -78,6 +78,9 @@ class AbeyanceEffect extends ContinuousRuleModifyingEffectImpl {
|
|||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
if (source.getFirstTarget() != null && source.getFirstTarget().equals(event.getPlayerId())) {
|
||||
MageObject object = game.getObject(event.getSourceId());
|
||||
if(object == null){
|
||||
return false;
|
||||
}
|
||||
if (event.getType() == GameEvent.EventType.CAST_SPELL) {
|
||||
if (object.isInstant() || object.isSorcery()) {
|
||||
return true;
|
||||
|
|
|
@ -98,19 +98,19 @@ class AcolytesRewardEffect extends PreventionEffectImpl {
|
|||
result = true;
|
||||
}
|
||||
if (toPrevent > 0) {
|
||||
game.informPlayers(new StringBuilder("Acolyte's Reward ").append("prevented ").append(toPrevent).append(" to ").append(targetCreature.getName()).toString());
|
||||
game.informPlayers("Acolyte's Reward prevented " + toPrevent + " to " + targetCreature.getName());
|
||||
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE,
|
||||
source.getControllerId(), source.getSourceId(), source.getControllerId(), toPrevent));
|
||||
|
||||
Player targetPlayer = game.getPlayer(source.getTargets().get(1).getFirstTarget());
|
||||
if (targetPlayer != null) {
|
||||
targetPlayer.damage(toPrevent, source.getSourceId(), game, false, true);
|
||||
game.informPlayers(new StringBuilder("Acolyte's Reward ").append("deals ").append(toPrevent).append(" damage to ").append(targetPlayer.getLogName()).toString());
|
||||
game.informPlayers("Acolyte's Reward deals " + toPrevent + " damage to " + targetPlayer.getLogName());
|
||||
} else {
|
||||
Permanent targetDamageCreature = game.getPermanent(source.getTargets().get(1).getFirstTarget());
|
||||
if (targetDamageCreature != null) {
|
||||
targetDamageCreature.damage(toPrevent, source.getSourceId(), game, false, true);
|
||||
game.informPlayers(new StringBuilder("Acolyte's Reward ").append("deals ").append(toPrevent).append(" damage to ").append(targetDamageCreature.getName()).toString());
|
||||
game.informPlayers("Acolyte's Reward deals " + toPrevent + " damage to " + targetDamageCreature.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ class AdviceFromTheFaeEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if (controller != null) {
|
||||
if (controller != null && mageObject != null) {
|
||||
Set<Card> topCards = controller.getLibrary().getTopCards(game, 5);
|
||||
Cards cardsFromLibrary = new CardsImpl();
|
||||
for (Card card : topCards) {
|
||||
|
|
|
@ -100,7 +100,7 @@ class AllianceOfArmsEffect extends OneShotEffect {
|
|||
payed = true;
|
||||
}
|
||||
}
|
||||
game.informPlayers(new StringBuilder(player.getLogName()).append(" pays {").append(xValue).append("}.").toString());
|
||||
game.informPlayers(player.getLogName() + " pays {" + xValue + "}.");
|
||||
return xValue;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -91,9 +91,7 @@ class AvenEffect extends ContinuousEffectImpl {
|
|||
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("If you do, that creature has base power and toughness 3/1 and has flying for as long as it has a feather counter on it");
|
||||
return sb.toString();
|
||||
return "If you do, that creature has base power and toughness 3/1 and has flying for as long as it has a feather counter on it";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ class AvenShrineTriggeredAbility extends TriggeredAbilityImpl {
|
|||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
||||
MageObject mageObject = game.getObject(sourceId);
|
||||
if (spell != null) {
|
||||
if (spell != null && mageObject != null) {
|
||||
game.getState().setValue("avenShrine" + mageObject, spell);
|
||||
return true;
|
||||
}
|
||||
|
@ -91,6 +91,7 @@ class AvenShrineEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
int count = 0;
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if(mageObject != null) {
|
||||
Spell spell = (Spell) game.getState().getValue("avenShrine" + mageObject);
|
||||
if (spell != null) {
|
||||
Player controller = game.getPlayer(spell.getControllerId());
|
||||
|
@ -108,6 +109,7 @@ class AvenShrineEffect extends OneShotEffect {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ class BalaGedThiefEffect extends OneShotEffect {
|
|||
Card card = revealedCards.get(targetInHand.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
targetPlayer.discard(card, source, game);
|
||||
game.informPlayers(new StringBuilder("Bala Ged Thief: ").append(targetPlayer.getLogName()).append(" discarded ").append(card.getName()).toString());
|
||||
game.informPlayers("Bala Ged Thief: " + targetPlayer.getLogName() + " discarded " + card.getName());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -112,7 +112,7 @@ class BaneAlleyBrokerDrawExileEffect extends OneShotEffect {
|
|||
Card card = game.getCard(target.getFirstTarget());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (card != null && sourceObject != null) {
|
||||
if (card.moveToExile(CardUtil.getCardExileZoneId(game, source), new StringBuilder(sourceObject.getName()).toString(), source.getSourceId(), game)) {
|
||||
if (card.moveToExile(CardUtil.getCardExileZoneId(game, source), sourceObject.getName(), source.getSourceId(), game)) {
|
||||
card.setFaceDown(true, game);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -105,6 +105,6 @@ class BlazeCommandoTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return new StringBuilder("Whenever an instant or sorcery spell you control deals damage, ").append(super.getRule()).toString();
|
||||
return "Whenever an instant or sorcery spell you control deals damage, " + super.getRule();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -75,6 +75,7 @@ class BlazingHopeTarget extends TargetCreaturePermanent {
|
|||
int count = 0;
|
||||
Player controller = game.getPlayer(sourceControllerId);
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId())) {
|
||||
if (notTarget || permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
|
@ -87,6 +88,7 @@ class BlazingHopeTarget extends TargetCreaturePermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ class BloodlineShamanEffect extends OneShotEffect {
|
|||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
Choice typeChoice = new ChoiceCreatureType(sourceObject);
|
||||
if (controller != null && controller.choose(outcome, typeChoice, game)) {
|
||||
if (controller != null && sourceObject != null && controller.choose(outcome, typeChoice, game)) {
|
||||
game.informPlayers(sourceObject.getLogName() + " chosen type: " + typeChoice.getChoice());
|
||||
FilterCard filterSubtype = new FilterCard();
|
||||
filterSubtype.add(new SubtypePredicate(SubType.byDescription(typeChoice.getChoice())));
|
||||
|
|
|
@ -178,7 +178,7 @@ class BombSquadBeginningEffect extends OneShotEffect {
|
|||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) {
|
||||
permanent.addCounters(CounterType.FUSE.createInstance(), source, game);
|
||||
|
||||
game.informPlayers(new StringBuilder(card.getName()).append(" puts a fuse counter on ").append(permanent.getName()).toString());
|
||||
game.informPlayers(card.getName() + " puts a fuse counter on " + permanent.getName());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ class BraceForImpactPreventDamageTargetEffect extends PreventionEffectImpl {
|
|||
Permanent targetPermanent = game.getPermanent(source.getTargets().getFirstTarget());
|
||||
if (targetPermanent != null) {
|
||||
targetPermanent.addCounters(CounterType.P1P1.createInstance(prevented), source, game);
|
||||
game.informPlayers(new StringBuilder("Brace for Impact: Prevented ").append(prevented).append(" damage ").toString());
|
||||
game.informPlayers("Brace for Impact: Prevented " + prevented + " damage ");
|
||||
game.informPlayers("Brace for Impact: Adding " + prevented + " +1/+1 counters to " + targetPermanent.getName());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ class BrandedBrawlersCantBlockEffect extends RestrictionEffect {
|
|||
public BrandedBrawlersCantBlockEffect(FilterPermanent filter) {
|
||||
super(Duration.WhileOnBattlefield);
|
||||
this.filter = filter;
|
||||
staticText = new StringBuilder("{this} can't attack if you control ").append(filter.getMessage()).toString();
|
||||
staticText = "{this} can't attack if you control " + filter.getMessage();
|
||||
}
|
||||
|
||||
public BrandedBrawlersCantBlockEffect(final BrandedBrawlersCantBlockEffect effect) {
|
||||
|
|
|
@ -67,7 +67,7 @@ class CabalShrineTriggeredAbility extends TriggeredAbilityImpl {
|
|||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
||||
MageObject mageObject = game.getObject(sourceId);
|
||||
if (spell != null) {
|
||||
if (spell != null && mageObject != null) {
|
||||
game.getState().setValue("cabalShrine" + mageObject, spell);
|
||||
return true;
|
||||
}
|
||||
|
@ -91,6 +91,7 @@ class CabalShrineEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
int count = 0;
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if(mageObject != null) {
|
||||
Spell spell = (Spell) game.getState().getValue("cabalShrine" + mageObject);
|
||||
if (spell != null) {
|
||||
Player controller = game.getPlayer(spell.getControllerId());
|
||||
|
@ -108,6 +109,7 @@ class CabalShrineEffect extends OneShotEffect {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -92,8 +92,8 @@ class CandlesGlowPreventDamageTargetEffect extends PreventionEffectImpl {
|
|||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller != null) {
|
||||
controller.gainLife(prevented, game, source);
|
||||
game.informPlayers(new StringBuilder("Candles' Glow: Prevented ").append(prevented).append(" damage ").toString());
|
||||
game.informPlayers(new StringBuilder("Candles' Glow: ").append(controller.getLogName()).append(" gained ").append(prevented).append("life").toString());
|
||||
game.informPlayers("Candles' Glow: Prevented " + prevented + " damage ");
|
||||
game.informPlayers("Candles' Glow: " + controller.getLogName() + " gained " + prevented + "life");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -98,8 +98,7 @@ class CarpetOfFlowersTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
StringBuilder sb = new StringBuilder("At the beginning of each of your main phases, if you haven't added mana with this ability this turn, ");
|
||||
return sb.append(super.getRule()).toString();
|
||||
return "At the beginning of each of your main phases, if you haven't added mana with this ability this turn, " + super.getRule();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -111,7 +111,7 @@ class CavernOfSoulsManaCondition extends CreatureCastManaCondition {
|
|||
if (super.apply(game, source)) {
|
||||
// check: ... of the chosen type
|
||||
MageObject object = game.getObject(source.getSourceId());
|
||||
if (creatureType != null && object.hasSubtype(creatureType, game)) {
|
||||
if (creatureType != null && object != null && object.hasSubtype(creatureType, game)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@ class CephalidShrineTriggeredAbility extends TriggeredAbilityImpl {
|
|||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
||||
MageObject mageObject = game.getObject(sourceId);
|
||||
if (spell != null) {
|
||||
if (spell != null && mageObject != null) {
|
||||
game.getState().setValue("cephalidShrine" + mageObject, spell);
|
||||
return true;
|
||||
}
|
||||
|
@ -93,6 +93,7 @@ class CephalidShrineEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
int count = 0;
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if(mageObject != null) {
|
||||
Spell spell = (Spell) game.getState().getValue("cephalidShrine" + mageObject);
|
||||
if (spell != null) {
|
||||
Player controller = game.getPlayer(spell.getControllerId());
|
||||
|
@ -121,6 +122,7 @@ class CephalidShrineEffect extends OneShotEffect {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ class CharmbreakerDevilsEffect extends OneShotEffect {
|
|||
if (cards.length > 0) {
|
||||
Card card = cards[RandomUtil.nextInt(cards.length)];
|
||||
card.moveToZone(Zone.HAND, source.getSourceId(), game, true);
|
||||
game.informPlayers(new StringBuilder("Charmbreaker Devils: ").append(card.getName()).append(" returned to the hand of ").append(player.getLogName()).toString());
|
||||
game.informPlayers("Charmbreaker Devils: " + card.getName() + " returned to the hand of " + player.getLogName());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,7 +110,7 @@ class CollectiveVoyageEffect extends OneShotEffect {
|
|||
game.removeBookmark(bookmark);
|
||||
}
|
||||
}
|
||||
game.informPlayers(new StringBuilder(player.getLogName()).append(" pays {").append(xValue).append("}.").toString());
|
||||
game.informPlayers(player.getLogName() + " pays {" + xValue + "}.");
|
||||
return xValue;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -89,7 +89,7 @@ class ColossalWhaleAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return new StringBuilder("Whenever {this} attacks, ").append(super.getRule()).toString();
|
||||
return "Whenever {this} attacks, " + super.getRule();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
|
@ -27,7 +28,6 @@ import mage.target.Target;
|
|||
import mage.target.TargetPermanent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author spjspj
|
||||
*/
|
||||
public final class CrownOfTheAges extends CardImpl {
|
||||
|
@ -107,7 +107,7 @@ class CrownOfTheAgesEffect extends OneShotEffect {
|
|||
}
|
||||
// Check for protection
|
||||
MageObject auraObject = game.getObject(aura.getId());
|
||||
if (creatureToAttachAura.cantBeAttachedBy(auraObject, game)) {
|
||||
if (auraObject != null && creatureToAttachAura.cantBeAttachedBy(auraObject, game)) {
|
||||
passed = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -77,7 +77,7 @@ class CrushUnderfootEffect extends OneShotEffect {
|
|||
&& controller.chooseTarget(outcome, target, source, game)) {
|
||||
Permanent giant = game.getPermanent(target.getFirstTarget());
|
||||
if (giant != null) {
|
||||
game.informPlayers(new StringBuilder("Crush Underfoot: Choosen Giant is").append(giant.getName()).toString());
|
||||
game.informPlayers("Crush Underfoot: Chosen Giant is " + giant.getName());
|
||||
Permanent targetCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source));
|
||||
if (targetCreature != null) {
|
||||
targetCreature.damage(giant.getPower().getValue(), source.getSourceId(), game, false, true);
|
||||
|
|
|
@ -85,7 +85,7 @@ class CurseOfChaosTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return new StringBuilder("Whenever a player attacks enchanted player with one or more creatures, ").append(super.getRule()).toString();
|
||||
return "Whenever a player attacks enchanted player with one or more creatures, " + super.getRule();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -5,6 +5,7 @@ import java.util.EnumSet;
|
|||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
|
@ -27,7 +28,6 @@ import mage.target.TargetPermanent;
|
|||
import mage.target.common.TargetControlledPermanent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class DaringThief extends CardImpl {
|
||||
|
@ -91,6 +91,7 @@ class TargetControlledPermanentSharingOpponentPermanentCardType extends TargetCo
|
|||
Set<CardType> cardTypes = getOpponentPermanentCardTypes(sourceId, sourceControllerId, game);
|
||||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if (targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
for (CardType type : permanent.getCardType()) {
|
||||
|
@ -101,6 +102,7 @@ class TargetControlledPermanentSharingOpponentPermanentCardType extends TargetCo
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
@ -158,6 +160,7 @@ class DaringThiefSecondTarget extends TargetPermanent {
|
|||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
if (firstTarget != null) {
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if (targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
if (permanent.shareTypes(firstTarget)) {
|
||||
|
@ -166,6 +169,7 @@ class DaringThiefSecondTarget extends TargetPermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ class DaxosOfMeletisEffect extends OneShotEffect {
|
|||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
UUID exileId = CardUtil.getCardExileZoneId(game, source);
|
||||
Card card = damagedPlayer.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card != null && sourceObject != null) {
|
||||
// move card to exile
|
||||
controller.moveCardsToExile(card, source, game, true, exileId, sourceObject.getIdName());
|
||||
// player gains life
|
||||
|
|
|
@ -75,7 +75,7 @@ class DeadbridgeChantEffect extends OneShotEffect {
|
|||
text = " put onto battlefield for ";
|
||||
}
|
||||
card.moveToZone(targetZone, source.getSourceId(), game, false);
|
||||
game.informPlayers(new StringBuilder("Deadbridge Chant: ").append(card.getName()).append(text).append(player.getLogName()).toString());
|
||||
game.informPlayers("Deadbridge Chant: " + card.getName() + text + player.getLogName());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ public final class DeathDenied extends CardImpl {
|
|||
if (ability instanceof SpellAbility) {
|
||||
ability.getTargets().clear();
|
||||
int xValue = ability.getManaCostsToPay().getX();
|
||||
Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard(new StringBuilder(xValue).append(xValue != 1 ? " creature cards" : "creature card").append(" from your graveyard").toString()));
|
||||
Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard((xValue != 1 ? " creature cards" : "creature card") + " from your graveyard"));
|
||||
ability.addTarget(target);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -119,7 +119,7 @@ class DecayingSoilTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return new StringBuilder("Whenever a ").append(filter.getMessage()).append(" is put into your graveyard from the battlefield, ").append(super.getRule()).toString();
|
||||
return "Whenever a " + filter.getMessage() + " is put into your graveyard from the battlefield, " + super.getRule();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ class DiscipleOfDeceitEffect extends OneShotEffect {
|
|||
if (card == null) {
|
||||
return false;
|
||||
}
|
||||
String targetName = new StringBuilder("card with converted mana cost of ").append(card.getConvertedManaCost()).toString();
|
||||
String targetName = "card with converted mana cost of " + card.getConvertedManaCost();
|
||||
FilterCard filter = new FilterCard(targetName);
|
||||
filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, card.getConvertedManaCost()));
|
||||
return new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true).apply(game, source);
|
||||
|
|
|
@ -96,7 +96,7 @@ class DropOfHoneyEffect extends OneShotEffect {
|
|||
}
|
||||
}
|
||||
if (permanentToDestroy != null) {
|
||||
game.informPlayers(new StringBuilder(sourcePermanent.getName()).append(" chosen creature: ").append(permanentToDestroy.getName()).toString());
|
||||
game.informPlayers(sourcePermanent.getName() + " chosen creature: " + permanentToDestroy.getName());
|
||||
return permanentToDestroy.destroy(source.getSourceId(), game, true);
|
||||
}
|
||||
return true;
|
||||
|
@ -128,6 +128,6 @@ class DropOfHoneyStateTriggeredAbility extends StateTriggeredAbility {
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return new StringBuilder("When there are no creatures on the battlefield, ").append(super.getRule()).toString() ;
|
||||
return "When there are no creatures on the battlefield, " + super.getRule();
|
||||
}
|
||||
}
|
|
@ -119,10 +119,10 @@ public final class DustOfMoments extends CardImpl {
|
|||
card.addCounters(counter, source, game);
|
||||
}
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
|
||||
.append(controller.getLogName()).append(getActionStr()).append('s')
|
||||
.append(counter.getCount()).append(' ').append(counterName.toLowerCase(Locale.ENGLISH))
|
||||
.append(" counter on ").append(card.getName()).toString());
|
||||
game.informPlayers(sourceObject.getName() + ": " +
|
||||
controller.getLogName() + getActionStr() + 's' +
|
||||
counter.getCount() + ' ' + counterName.toLowerCase(Locale.ENGLISH) +
|
||||
" counter on " + card.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -144,10 +144,10 @@ public final class DustOfMoments extends CardImpl {
|
|||
card.addCounters(counter, source, game);
|
||||
}
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
|
||||
.append(controller.getLogName()).append(getActionStr()).append("s ")
|
||||
.append(counter.getCount()).append(' ').append(counterName.toLowerCase(Locale.ENGLISH))
|
||||
.append(" counter on ").append(card.getName()).toString());
|
||||
game.informPlayers(sourceObject.getName() + ": " +
|
||||
controller.getLogName() + getActionStr() + "s " +
|
||||
counter.getCount() + ' ' + counterName.toLowerCase(Locale.ENGLISH) +
|
||||
" counter on " + card.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ class DwarvenShrineTriggeredAbility extends TriggeredAbilityImpl {
|
|||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
||||
MageObject mageObject = game.getObject(sourceId);
|
||||
if (spell != null) {
|
||||
if (spell != null && mageObject != null) {
|
||||
game.getState().setValue("dwarvenShrine" + mageObject, spell);
|
||||
return true;
|
||||
}
|
||||
|
@ -90,6 +90,7 @@ class DwarvenShrineEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
int count = 0;
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if(mageObject != null) {
|
||||
Spell spell = (Spell) game.getState().getValue("dwarvenShrine" + mageObject);
|
||||
if (spell != null) {
|
||||
Player controller = game.getPlayer(spell.getControllerId());
|
||||
|
@ -107,6 +108,7 @@ class DwarvenShrineEffect extends OneShotEffect {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ class ElbrusTheBindingBladeEffect extends OneShotEffect {
|
|||
if (attachedTo != null) {
|
||||
attachedTo.removeAttachment(equipment.getId(), game);
|
||||
equipment.transform(game);
|
||||
game.informPlayers(new StringBuilder(equipment.getName()).append(" transforms into ").append(equipment.getSecondCardFace().getName()).toString());
|
||||
game.informPlayers(equipment.getName() + " transforms into " + equipment.getSecondCardFace().getName());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
package mage.cards.e;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
|
@ -22,7 +23,6 @@ import mage.game.Game;
|
|||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class ElvishSoultiller extends CardImpl {
|
||||
|
@ -69,8 +69,9 @@ class ElvishSoultillerEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if (controller != null && mageObject != null) {
|
||||
Choice typeChoice = new ChoiceCreatureType(mageObject);
|
||||
if (controller != null && mageObject != null && controller.choose(outcome, typeChoice, game)) {
|
||||
if (controller.choose(outcome, typeChoice, game)) {
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers(mageObject.getName() + ": " + controller.getLogName() + " has chosen " + typeChoice.getChoice());
|
||||
}
|
||||
|
@ -82,6 +83,7 @@ class ElvishSoultillerEffect extends OneShotEffect {
|
|||
controller.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,7 +74,7 @@ class TargetCreaturePermanentThatDealtDamageThisTurn extends TargetPermanent {
|
|||
int count = 0;
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get(SourceDidDamageWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
if (watcher != null && targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && watcher.damageSources.contains(permanent.getId())) {
|
||||
if (!notTarget || permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
|
|
|
@ -56,8 +56,10 @@ class ExtinctionEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (player != null && sourceObject != null) {
|
||||
Choice typeChoice = new ChoiceCreatureType(sourceObject);
|
||||
if (player != null && player.choose(outcome, typeChoice, game)) {
|
||||
|
||||
if (player.choose(outcome, typeChoice, game)) {
|
||||
game.informPlayers(sourceObject.getLogName() + " chosen type: " + typeChoice.getChoice());
|
||||
FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent();
|
||||
filterCreaturePermanent.add(new SubtypePredicate(SubType.byDescription(typeChoice.getChoice())));
|
||||
|
@ -66,6 +68,7 @@ class ExtinctionEffect extends OneShotEffect {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
|
||||
package mage.cards.g;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
|
@ -13,11 +9,7 @@ import mage.abilities.costs.mana.ManaCostsImpl;
|
|||
import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.TargetController;
|
||||
import mage.constants.Zone;
|
||||
import mage.constants.*;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.CardTypePredicate;
|
||||
import mage.filter.predicate.permanent.ControllerPredicate;
|
||||
|
@ -27,8 +19,12 @@ import mage.players.Player;
|
|||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetControlledPermanent;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2 & L_J
|
||||
*/
|
||||
public final class GauntletsOfChaos extends CardImpl {
|
||||
|
@ -94,6 +90,7 @@ class GauntletsOfChaosFirstTarget extends TargetControlledPermanent {
|
|||
Set<CardType> cardTypes = getOpponentPermanentCardTypes(sourceId, sourceControllerId, game);
|
||||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if (targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
for (CardType type : permanent.getCardType()) {
|
||||
|
@ -104,6 +101,7 @@ class GauntletsOfChaosFirstTarget extends TargetControlledPermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
@ -161,6 +159,7 @@ class GauntletsOfChaosSecondTarget extends TargetPermanent {
|
|||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
if (firstTarget != null) {
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if (targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
if (permanent.shareTypes(firstTarget)) {
|
||||
|
@ -169,6 +168,7 @@ class GauntletsOfChaosSecondTarget extends TargetPermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
|
|
@ -117,11 +117,13 @@ class GlamerSpinnersEffect extends OneShotEffect {
|
|||
}
|
||||
// Check for protection
|
||||
MageObject auraObject = game.getObject(auraId);
|
||||
if(auraObject != null) {
|
||||
if (permanentToAttachAuras.cantBeAttachedBy(auraObject, game)) {
|
||||
passed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (passed) {
|
||||
LinkedList<UUID> aurasToAttach = new LinkedList<>();
|
||||
aurasToAttach.addAll(auras);
|
||||
|
|
|
@ -92,7 +92,7 @@ class GnarlrootTrapperManaCondition extends CreatureCastManaCondition {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
if (super.apply(game, source)) {
|
||||
MageObject object = game.getObject(source.getSourceId());
|
||||
if (object.hasSubtype(SubType.ELF, game)
|
||||
if (object != null && object.hasSubtype(SubType.ELF, game)
|
||||
&& object.isCreature()) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ class GrenzoHavocRaiserEffect extends OneShotEffect {
|
|||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
UUID exileId = CardUtil.getCardExileZoneId(game, source);
|
||||
Card card = damagedPlayer.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card != null && sourceObject != null) {
|
||||
// move card to exile
|
||||
controller.moveCardToExileWithInfo(card, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true);
|
||||
// Add effects only if the card has a spellAbility (e.g. not for lands).
|
||||
|
|
|
@ -68,7 +68,7 @@ class GridMonitorEffect extends ContinuousRuleModifyingEffectImpl {
|
|||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.CAST_SPELL && event.getPlayerId().equals(source.getControllerId())) {
|
||||
MageObject object = game.getObject(event.getSourceId());
|
||||
if (object.isCreature()) {
|
||||
if (object != null && object.isCreature()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,7 +132,7 @@ class GrimReminderWatcher extends Watcher {
|
|||
MageObject spell = game.getObject(event.getTargetId());
|
||||
UUID playerId = event.getPlayerId();
|
||||
if (playerId != null && spell != null) {
|
||||
playersCastSpell.putIfAbsent(spell.getName(), new HashSet());
|
||||
playersCastSpell.putIfAbsent(spell.getName(), new HashSet<>());
|
||||
playersCastSpell.get(spell.getName()).add(playerId);
|
||||
}
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ class GrimReminderWatcher extends Watcher {
|
|||
}
|
||||
|
||||
public Set<UUID> getPlayersCastSpell(String spellName) {
|
||||
return playersCastSpell.getOrDefault(spellName, new HashSet());
|
||||
return playersCastSpell.getOrDefault(spellName, new HashSet<>());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -172,7 +172,7 @@ class GrimoireThiefCounterspellEffect extends OneShotEffect {
|
|||
Cards cards = new CardsImpl();
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
Set<UUID> exileZones = (Set<UUID>) game.getState().getValue(GrimoireThief.VALUE_PREFIX + source.getSourceId().toString());
|
||||
if (exileZones != null) {
|
||||
if (exileZones != null && sourceObject != null) {
|
||||
for (ExileZone exileZone : game.getExile().getExileZones()) {
|
||||
if (!exileZone.isEmpty()) {
|
||||
cards.addAll(exileZone.getCards(game));
|
||||
|
|
|
@ -79,7 +79,7 @@ class GrinningTotemSearchAndExileEffect extends OneShotEffect {
|
|||
Player you = game.getPlayer(source.getControllerId());
|
||||
Player targetOpponent = game.getPlayer(source.getFirstTarget());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (you != null && targetOpponent != null) {
|
||||
if (you != null && targetOpponent != null && sourceObject != null) {
|
||||
if (targetOpponent.getLibrary().hasCards()) {
|
||||
TargetCardInLibrary targetCard = new TargetCardInLibrary();
|
||||
if (you.searchLibrary(targetCard, game, targetOpponent.getId())) {
|
||||
|
|
|
@ -72,7 +72,7 @@ class HandToHandEffect extends ContinuousRuleModifyingEffectImpl {
|
|||
if (game.getPhase().getType() == TurnPhase.COMBAT) {
|
||||
MageObject object = game.getObject(event.getSourceId());
|
||||
if (event.getType() == GameEvent.EventType.CAST_SPELL) {
|
||||
if (object.isInstant()) {
|
||||
if (object != null && object.isInstant()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ class HavenOfTheSpiritManaCondition extends CreatureCastManaCondition {
|
|||
public boolean apply(Game game, Ability source, UUID manaProducer, Cost costToPay) {
|
||||
if (super.apply(game, source)) {
|
||||
MageObject object = game.getObject(source.getSourceId());
|
||||
if (object.hasSubtype(SubType.DRAGON, game)
|
||||
if (object != null && object.hasSubtype(SubType.DRAGON, game)
|
||||
&& object.isCreature()) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ class HeraldsHornEffect extends OneShotEffect {
|
|||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
|
||||
// Look at the top card of your library.
|
||||
if (controller != null && controller.getLibrary().hasCards()) {
|
||||
if (controller != null && controller.getLibrary().hasCards() && sourceObject != null) {
|
||||
Card card = controller.getLibrary().getFromTop(game);
|
||||
Cards cards = new CardsImpl(card);
|
||||
controller.lookAtCards(sourceObject.getIdName(), cards, game);
|
||||
|
|
|
@ -79,7 +79,7 @@ class JadeMonolithRedirectionEffect extends ReplacementEffectImpl {
|
|||
Permanent targetCreature = game.getPermanent(source.getFirstTarget());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
DamageEvent damageEvent = (DamageEvent) event;
|
||||
if (controller != null && targetCreature != null) {
|
||||
if (controller != null && targetCreature != null && sourceObject != null) {
|
||||
controller.damage(damageEvent.getAmount(), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), damageEvent.getAppliedEffects());
|
||||
StringBuilder sb = new StringBuilder(sourceObject != null ? sourceObject.getLogName() : "");
|
||||
sb.append(": ").append(damageEvent.getAmount()).append(" damage redirected from ").append(targetCreature.getLogName());
|
||||
|
|
|
@ -76,7 +76,7 @@ class JusticeTriggeredAbility extends TriggeredAbilityImpl {
|
|||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
MageObject sourceObject = game.getObject(event.getSourceId());
|
||||
if (sourceObject.getColor(game).isRed()) {
|
||||
if (sourceObject != null && sourceObject.getColor(game).isRed()) {
|
||||
if (sourceObject instanceof Permanent && sourceObject.isCreature()
|
||||
|| sourceObject instanceof Spell) {
|
||||
this.getEffects().get(0).setValue("damageAmount", event.getAmount());
|
||||
|
|
|
@ -84,7 +84,7 @@ class KeeperOfTheBeastsTarget extends TargetPlayer {
|
|||
int count = 0;
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
Player controller = game.getPlayer(sourceControllerId);
|
||||
if (controller != null) {
|
||||
if (controller != null && targetSource != null) {
|
||||
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null
|
||||
|
|
|
@ -88,7 +88,7 @@ class KeeperOfTheLightTarget extends TargetPlayer {
|
|||
int count = 0;
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
Player controller = game.getPlayer(sourceControllerId);
|
||||
if (controller != null) {
|
||||
if (controller != null && targetSource != null) {
|
||||
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null
|
||||
|
|
|
@ -80,8 +80,8 @@ class ChooseLetterEffect extends OneShotEffect {
|
|||
ChoiceImpl choice = new ChoiceImpl(true);
|
||||
choice.setMessage("Choose letter");
|
||||
Set<String> choices = new HashSet<>();
|
||||
for (Character letter = 'A'; letter <= 'Z'; letter++) {
|
||||
choices.add(letter.toString());
|
||||
for (char letter = 'A'; letter <= 'Z'; letter++) {
|
||||
choices.add(Character.toString(letter));
|
||||
}
|
||||
choice.setChoices(choices);
|
||||
|
||||
|
@ -122,8 +122,8 @@ class MonkeyMonkeyMonkeyCount implements DynamicValue {
|
|||
if (permanent != null && game.getState().getValue(mageObject.getId() + "_letter") != null) {
|
||||
int letters = 0;
|
||||
for (Permanent p : game.getBattlefield().getActivePermanents(new FilterNonlandPermanent(), sourceAbility.getControllerId(), sourceAbility.getSourceId(), game)) {
|
||||
Character initial = Character.toUpperCase(p.getName().charAt(0));
|
||||
if (initial.toString().equals(game.getState().getValue(mageObject.getId() + "_letter"))) {
|
||||
char initial = Character.toUpperCase(p.getName().charAt(0));
|
||||
if (Character.toString(initial).equals(game.getState().getValue(mageObject.getId() + "_letter"))) {
|
||||
letters++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,7 +62,7 @@ class PatriarchsBiddingEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (controller != null) {
|
||||
if (controller != null && sourceObject != null) {
|
||||
Set<String> chosenTypes = new HashSet<>();
|
||||
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
|
|
|
@ -97,7 +97,7 @@ class PillarOfOriginsManaCondition extends CreatureCastManaCondition {
|
|||
if (super.apply(game, source)) {
|
||||
// check: ... of the chosen type
|
||||
MageObject object = game.getObject(source.getSourceId());
|
||||
if (creatureType != null && object.hasSubtype(creatureType, game)) {
|
||||
if (creatureType != null && object != null && object.hasSubtype(creatureType, game)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,6 +80,7 @@ class ETBSinceYourLastTurnTarget extends TargetCreaturePermanent {
|
|||
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
ETBSinceYourLastTurnWatcher watcher = (ETBSinceYourLastTurnWatcher) game.getState().getWatchers().get(ETBSinceYourLastTurnWatcher.class.getSimpleName());
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
if (watcher.enteredSinceLastTurn(sourceControllerId, new MageObjectReference(permanent.getId(), game))) {
|
||||
|
@ -87,6 +88,7 @@ class ETBSinceYourLastTurnTarget extends TargetCreaturePermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -73,11 +73,13 @@ class TargetControlledPermanentWithCMCGreaterOrLessThanOpponentPermanent extends
|
|||
public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
|
||||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
possibleTargets.add(permanent.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
@ -121,6 +123,7 @@ class PucasMischiefSecondTarget extends TargetPermanent {
|
|||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
if (firstTarget != null) {
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if (targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
if (firstTarget.getConvertedManaCost() >= permanent.getConvertedManaCost()) {
|
||||
|
@ -129,6 +132,7 @@ class PucasMischiefSecondTarget extends TargetPermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@ class ReciprocateTarget extends TargetPermanent {
|
|||
}
|
||||
int count = 0;
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), sourceControllerId);
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
|
||||
|
@ -92,6 +93,7 @@ class ReciprocateTarget extends TargetPermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -119,6 +119,7 @@ class RemembranceEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if(mageObject != null) {
|
||||
cardName = (String) game.getState().getValue(mageObject + "nameOfPermanent");
|
||||
if (controller != null
|
||||
&& cardName != null) {
|
||||
|
@ -126,6 +127,7 @@ class RemembranceEffect extends OneShotEffect {
|
|||
filterCard.add(new NamePredicate(cardName));
|
||||
return new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filterCard), true, true).apply(game, source);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -66,8 +66,9 @@ class RiptideChronologistEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (player != null && sourceObject != null) {
|
||||
Choice typeChoice = new ChoiceCreatureType(sourceObject);
|
||||
if (player != null && player.choose(outcome, typeChoice, game)) {
|
||||
if (player.choose(outcome, typeChoice, game)) {
|
||||
game.informPlayers(sourceObject.getLogName() + " chosen type: " + typeChoice.getChoice());
|
||||
FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent();
|
||||
filterCreaturePermanent.add(new SubtypePredicate(SubType.byDescription(typeChoice.getChoice())));
|
||||
|
@ -76,6 +77,7 @@ class RiptideChronologistEffect extends OneShotEffect {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ class SamiteMinistrationEffect extends PreventionEffectImpl {
|
|||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||
PreventionEffectData preventionData = preventDamageAction(event, source, game);
|
||||
MageObject sourceObject = game.getObject(event.getSourceId());
|
||||
if (sourceObject.getColor(game).isBlack() || sourceObject.getColor(game).isRed()) {
|
||||
if (sourceObject != null && (sourceObject.getColor(game).isBlack() || sourceObject.getColor(game).isRed())) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player != null) {
|
||||
player.gainLife(preventionData.getPreventedDamage(), game, source);
|
||||
|
|
|
@ -4,6 +4,7 @@ package mage.cards.s;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
|
@ -28,7 +29,6 @@ import mage.target.common.TargetCreaturePermanent;
|
|||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class SatyrFiredancer extends CardImpl {
|
||||
|
@ -100,7 +100,7 @@ class SatyrFiredancerTriggeredAbility extends TriggeredAbilityImpl {
|
|||
if (damageSource != null) {
|
||||
if (game.getOpponents(getControllerId()).contains(event.getTargetId())) {
|
||||
MageObject object = game.getObject(event.getSourceId());
|
||||
if (object.isInstant() || object.isSorcery()) {
|
||||
if (object != null && (object.isInstant() || object.isSorcery())) {
|
||||
if (!(damageSource instanceof StackObject) || !handledStackObjects.contains(damageSource.getId())) {
|
||||
if (damageSource instanceof StackObject) {
|
||||
handledStackObjects.add(damageSource.getId());
|
||||
|
|
|
@ -72,6 +72,7 @@ class TargetPermanentsThatShareCardType extends TargetPermanent {
|
|||
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
|
||||
Set<CardType> cardTypes = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
for (CardType cardType : permanent.getCardType()) {
|
||||
|
@ -82,6 +83,7 @@ class TargetPermanentsThatShareCardType extends TargetPermanent {
|
|||
cardTypes.addAll(permanent.getCardType());
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ class ShiningShoalRedirectDamageTargetEffect extends RedirectDamageFromSourceToT
|
|||
return false;
|
||||
}
|
||||
// do the 2 objects match?
|
||||
if (!sourceObject.getId().equals(chosenSourceObject.getId())) {
|
||||
if (chosenSourceObject == null || !sourceObject.getId().equals(chosenSourceObject.getId())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -78,11 +78,13 @@ class TargetControlledCreatureWithPowerGreaterOrLessThanOpponentPermanent extend
|
|||
public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
|
||||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
possibleTargets.add(permanent.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
@ -126,6 +128,7 @@ class SpawnbrokerSecondTarget extends TargetPermanent {
|
|||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
if (firstTarget != null) {
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
if (firstTarget.getPower().getValue() >= permanent.getPower().getValue()) {
|
||||
|
@ -134,6 +137,7 @@ class SpawnbrokerSecondTarget extends TargetPermanent {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTargets;
|
||||
}
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ class SphinxsDecreeCantCastEffect extends ContinuousRuleModifyingEffectImpl {
|
|||
if (opponentId.equals(event.getPlayerId())) {
|
||||
MageObject object = game.getObject(event.getSourceId());
|
||||
if (event.getType() == GameEvent.EventType.CAST_SPELL) {
|
||||
if (object.isInstant() || object.isSorcery()) {
|
||||
if (object != null && (object.isInstant() || object.isSorcery())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -129,7 +129,7 @@ class StaffOfTheLetterMagusEffect extends OneShotEffect {
|
|||
int lifegainValue = 0;
|
||||
String spellName = spell.getName();
|
||||
for (int i = 0; i < spellName.length(); i++) {
|
||||
Character letter = spellName.charAt(i);
|
||||
char letter = spellName.charAt(i);
|
||||
String chosenLetter = (String) game.getState().getValue(mageObject.getId() + "_letter");
|
||||
if (Character.isLetter(letter) && Character.toUpperCase(letter) == chosenLetter.charAt(0)) {
|
||||
lifegainValue++;
|
||||
|
|
|
@ -85,7 +85,7 @@ class StolenStrategyEffect extends OneShotEffect {
|
|||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
UUID exileId = CardUtil.getCardExileZoneId(game, source);
|
||||
Card card = damagedPlayer.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card != null && sourceObject != null) {
|
||||
// move card to exile
|
||||
controller.moveCardToExileWithInfo(card, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true);
|
||||
// Add effects only if the card has a spellAbility (e.g. not for lands).
|
||||
|
|
|
@ -85,14 +85,13 @@ class TariffEffect extends OneShotEffect {
|
|||
|
||||
Permanent creatureToPayFor = chooseOnePermanent(game, player, creatures);
|
||||
|
||||
if (creatureToPayFor != null) {
|
||||
if (creatureToPayFor != null && sourceObject != null) {
|
||||
ManaCosts manaCost = ManaCosts.removeVariableManaCost(creatureToPayFor.getManaCost());
|
||||
String message = new StringBuilder("Pay ").append(manaCost.getText()).append(" (otherwise sacrifice ")
|
||||
.append(creatureToPayFor.getName()).append(")?").toString();
|
||||
String message = "Pay " + manaCost.getText() + " (otherwise sacrifice " +
|
||||
creatureToPayFor.getName() + ")?";
|
||||
if (player.chooseUse(Outcome.Benefit, message, source, game)) {
|
||||
if (manaCost.pay(source, game, source.getSourceId(), player.getId(), false, null)) {
|
||||
game.informPlayers(new StringBuilder(sourceObject != null ? sourceObject.getName() : "")
|
||||
.append(": ").append(player.getLogName()).append(" has paid").toString());
|
||||
game.informPlayers(sourceObject.getName() + ": " + player.getLogName() + " has paid");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ class TargetCreatureWithPowerLessThanNumberOfCardsInYourGraveyard extends Target
|
|||
@Override
|
||||
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource != null) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
|
||||
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
|
||||
if (permanent.getPower().getValue() < game.getPlayer(sourceControllerId).getGraveyard().size()) {
|
||||
|
@ -85,6 +86,7 @@ class TargetCreatureWithPowerLessThanNumberOfCardsInYourGraveyard extends Target
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ class TobiasBeckettEffect extends OneShotEffect {
|
|||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
UUID exileId = CardUtil.getCardExileZoneId(game, source);
|
||||
Card card = opponent.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card != null && sourceObject != null) {
|
||||
// move card to exile
|
||||
controller.moveCardToExileWithInfo(card, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true);
|
||||
// Add effects only if the card has a spellAbility (e.g. not for lands).
|
||||
|
|
|
@ -72,6 +72,9 @@ class ToppleTargetCreature extends TargetCreaturePermanent {
|
|||
List<Permanent> activePermanents = game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game);
|
||||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource == null){
|
||||
return possibleTargets;
|
||||
}
|
||||
for (Permanent permanent : activePermanents) {
|
||||
if (permanent.getPower().getValue() > maxPower) {
|
||||
maxPower = permanent.getPower().getValue();
|
||||
|
|
|
@ -107,6 +107,9 @@ class TriumphOfGerrardTargetCreature extends TargetControlledCreaturePermanent {
|
|||
List<Permanent> activePermanents = game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game);
|
||||
Set<UUID> possibleTargets = new HashSet<>();
|
||||
MageObject targetSource = game.getObject(sourceId);
|
||||
if(targetSource == null){
|
||||
return possibleTargets;
|
||||
}
|
||||
for (Permanent permanent : activePermanents) {
|
||||
if (permanent.getPower().getValue() > maxPower) {
|
||||
maxPower = permanent.getPower().getValue();
|
||||
|
|
|
@ -64,6 +64,7 @@ class TsabosDecreeEffect extends OneShotEffect {
|
|||
Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (player != null) {
|
||||
if(sourceObject != null) {
|
||||
Choice typeChoice = new ChoiceCreatureType(sourceObject);
|
||||
if (!player.choose(outcome, typeChoice, game)) {
|
||||
return false;
|
||||
|
@ -90,6 +91,7 @@ class TsabosDecreeEffect extends OneShotEffect {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ class UnclaimedTerritoryManaCondition extends CreatureCastManaCondition {
|
|||
if (super.apply(game, source)) {
|
||||
// check: ... of the chosen type
|
||||
MageObject object = game.getObject(source.getSourceId());
|
||||
if (creatureType != null && object.hasSubtype(creatureType, game)) {
|
||||
if (creatureType != null && object != null && object.hasSubtype(creatureType, game)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -72,13 +72,13 @@ class LookAtRandomCardEffect extends OneShotEffect {
|
|||
Player you = game.getPlayer(source.getControllerId());
|
||||
Player targetPlayer = game.getPlayer(source.getFirstTarget());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (you != null && targetPlayer != null) {
|
||||
if (you != null && targetPlayer != null && sourceObject != null) {
|
||||
if(!targetPlayer.getHand().isEmpty())
|
||||
{
|
||||
Cards randomCard = new CardsImpl();
|
||||
Card card = targetPlayer.getHand().getRandom(game);
|
||||
randomCard.add(card);
|
||||
you.lookAtCards(sourceObject != null ? sourceObject.getName() : null, randomCard, game);
|
||||
you.lookAtCards(sourceObject.getName(), randomCard, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -84,7 +84,7 @@ class VerdantSuccessionTriggeredAbility extends TriggeredAbilityImpl {
|
|||
&& ((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) {
|
||||
Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
|
||||
MageObject mageObject = game.getObject(sourceId);
|
||||
if (permanent != null
|
||||
if (permanent != null && mageObject != null
|
||||
&& filter.match(permanent, game)) {
|
||||
game.getState().setValue("verdantSuccession" + mageObject, permanent);
|
||||
return true;
|
||||
|
@ -119,6 +119,7 @@ class VerdantSuccessionEffect extends OneShotEffect {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if(mageObject != null) {
|
||||
permanent = (Permanent) game.getState().getValue("verdantSuccession" + mageObject);
|
||||
if (permanent != null) {
|
||||
Player controller = game.getPlayer(permanent.getControllerId());
|
||||
|
@ -137,6 +138,7 @@ class VerdantSuccessionEffect extends OneShotEffect {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ class VillainousWealthEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject mageObject = game.getObject(source.getSourceId());
|
||||
if (controller != null) {
|
||||
if (controller != null && mageObject != null) {
|
||||
Player player = game.getPlayer(targetPointer.getFirst(game, source));
|
||||
FilterCard filter = new FilterNonlandCard();
|
||||
filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1));
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
package mage.cards.w;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
|
@ -22,7 +23,6 @@ import mage.game.Game;
|
|||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class WalkingDesecration extends CardImpl {
|
||||
|
@ -64,8 +64,10 @@ class WalkingDesecrationEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (player != null) {
|
||||
if (sourceObject != null) {
|
||||
Choice typeChoice = new ChoiceCreatureType(sourceObject);
|
||||
if (player != null && player.choose(outcome, typeChoice, game)) {
|
||||
if (player.choose(outcome, typeChoice, game)) {
|
||||
game.informPlayers(sourceObject.getLogName() + " chosen type: " + typeChoice.getChoice());
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent();
|
||||
filter.add(new SubtypePredicate(SubType.byDescription(typeChoice.getChoice())));
|
||||
|
@ -73,6 +75,8 @@ class WalkingDesecrationEffect extends OneShotEffect {
|
|||
game.addEffect(effect, source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue