mirror of
https://github.com/correl/mage.git
synced 2024-12-25 19:25:41 +00:00
add nullchecks on watchers
This commit is contained in:
parent
5cab28182d
commit
95a31759b5
53 changed files with 134 additions and 85 deletions
|
@ -51,7 +51,10 @@ class AetherfluxReservoirDynamicValue implements DynamicValue {
|
|||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
return watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(sourceAbility.getControllerId());
|
||||
if(watcher != null) {
|
||||
return watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(sourceAbility.getControllerId());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -84,7 +84,7 @@ class ArchfiendOfDespairEffect extends OneShotEffect {
|
|||
for (UUID playerId : game.getOpponents(controller.getId())) {
|
||||
Player opponent = game.getPlayer(playerId);
|
||||
if (opponent != null) {
|
||||
int lifeLost = watcher.getLiveLost(playerId);
|
||||
int lifeLost = watcher.getLifeLost(playerId);
|
||||
if (lifeLost > 0) {
|
||||
opponent.loseLife(lifeLost, game, false);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
package mage.cards.b;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
|
@ -17,15 +16,16 @@ import mage.game.Game;
|
|||
import mage.game.permanent.Permanent;
|
||||
import mage.watchers.common.BloodthirstWatcher;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
* @author North
|
||||
*/
|
||||
public final class BloodcrazedGoblin extends CardImpl {
|
||||
|
||||
public BloodcrazedGoblin(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
|
||||
this.subtype.add(SubType.GOBLIN, SubType.BERSERKER);
|
||||
|
||||
this.power = new MageInt(2);
|
||||
|
@ -70,7 +70,7 @@ class BloodcrazedGoblinEffect extends RestrictionEffect {
|
|||
public boolean applies(Permanent permanent, Ability source, Game game) {
|
||||
if (permanent.getId().equals(source.getSourceId())) {
|
||||
BloodthirstWatcher watcher = (BloodthirstWatcher) game.getState().getWatchers().get(BloodthirstWatcher.class.getSimpleName(), source.getControllerId()); // BloodthirstWatcher
|
||||
return !watcher.conditionMet();
|
||||
return watcher != null && !watcher.conditionMet();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ class BrimstoneVolleyEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
int damage = 3;
|
||||
Watcher watcher = game.getState().getWatchers().get(MorbidWatcher.class.getSimpleName());
|
||||
if (watcher.conditionMet()) {
|
||||
if (watcher != null && watcher.conditionMet()) {
|
||||
damage = 5;
|
||||
}
|
||||
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
|
||||
|
|
|
@ -156,6 +156,9 @@ class BrutalHordechiefChooseBlockersEffect extends ContinuousRuleModifyingEffect
|
|||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
watcher.decrement();
|
||||
if (watcher.copyCountApply > 0) {
|
||||
game.informPlayers(source.getSourceObject(game).getIdName() + " didn't apply");
|
||||
|
|
|
@ -54,7 +54,7 @@ class SourceControllerLostLifeCount implements DynamicValue {
|
|||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
return watcher.getLiveLost(sourceAbility.getControllerId());
|
||||
return watcher.getLifeLost(sourceAbility.getControllerId());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -75,6 +75,9 @@ class NoMoreThanOneCreatureCanAttackEachTurnEffect extends RestrictionEffect {
|
|||
return false;
|
||||
}
|
||||
AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
Set<MageObjectReference> attackedThisTurnCreatures = watcher.getAttackedThisTurnCreatures();
|
||||
return attackedThisTurnCreatures.isEmpty()
|
||||
|| (attackedThisTurnCreatures.size() == 1 && attackedThisTurnCreatures.contains(new MageObjectReference(attacker, game)));
|
||||
|
@ -109,6 +112,9 @@ class NoMoreThanOneCreatureCanBlockEachTurnEffect extends RestrictionEffect {
|
|||
return false;
|
||||
}
|
||||
BlockedThisTurnWatcher watcher = (BlockedThisTurnWatcher) game.getState().getWatchers().get(BlockedThisTurnWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
Set<MageObjectReference> blockedThisTurnCreatures = watcher.getBlockedThisTurnCreatures();
|
||||
MageObjectReference blockerReference = new MageObjectReference(blocker.getId(), blocker.getZoneChangeCounter(game), game);
|
||||
return blockedThisTurnCreatures.isEmpty()
|
||||
|
|
|
@ -57,6 +57,6 @@ class ErgRaidersCondition implements Condition {
|
|||
Permanent raiders = game.getPermanentOrLKIBattlefield(source.getSourceId());
|
||||
AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
|
||||
// wasControlledFromStartOfControllerTurn should be checked during resolution I guess, but shouldn't be relevant
|
||||
return raiders.wasControlledFromStartOfControllerTurn() && !watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(raiders, game));
|
||||
return raiders != null &&raiders.wasControlledFromStartOfControllerTurn() && watcher != null && !watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(raiders, game));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ enum FeastOnTheFallenCondition implements Condition {
|
|||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
|
||||
if (watcher.getLiveLostLastTurn(opponentId) > 0) {
|
||||
if (watcher.getLifeLostLastTurn(opponentId) > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,6 +51,6 @@ class SourceWasBlockedThisTurnCondition implements Condition {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
|
||||
WasBlockedThisTurnWatcher watcher = (WasBlockedThisTurnWatcher) game.getState().getWatchers().get(WasBlockedThisTurnWatcher.class.getSimpleName());
|
||||
return sourcePermanent != null && watcher.getWasBlockedThisTurnCreatures().contains(new MageObjectReference(sourcePermanent, game));
|
||||
return sourcePermanent != null && watcher != null && watcher.getWasBlockedThisTurnCreatures().contains(new MageObjectReference(sourcePermanent, game));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -121,7 +121,7 @@ class GisaAndGeralfCastFromGraveyardEffect extends AsThoughEffectImpl {
|
|||
if (objectId.equals(getTargetPointer().getFirst(game, source))) {
|
||||
if (affectedControllerId.equals(source.getControllerId())) {
|
||||
GisaAndGeralfWatcher watcher = (GisaAndGeralfWatcher) game.getState().getWatchers().get(GisaAndGeralfWatcher.class.getSimpleName(), source.getSourceId());
|
||||
return !watcher.isAbilityUsed();
|
||||
return watcher != null && !watcher.isAbilityUsed();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -145,7 +145,7 @@ class GisaAndGeralfWatcher extends Watcher {
|
|||
public void watch(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getZone() == Zone.GRAVEYARD) {
|
||||
Spell spell = (Spell) game.getObject(event.getTargetId());
|
||||
if (spell.isCreature() && spell.hasSubtype(SubType.ZOMBIE, game)) {
|
||||
if (spell != null && spell.isCreature() && spell.hasSubtype(SubType.ZOMBIE, game)) {
|
||||
abilityUsed = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,6 +68,7 @@ class HeatStrokeEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
BlockedThisTurnWatcher blockedWatcher = (BlockedThisTurnWatcher) game.getState().getWatchers().get(BlockedThisTurnWatcher.class.getSimpleName());
|
||||
WasBlockedThisTurnWatcher wasBlockedThisTurnWatcher = (WasBlockedThisTurnWatcher) game.getState().getWatchers().get(WasBlockedThisTurnWatcher.class.getSimpleName());
|
||||
|
||||
Set<Permanent> inROI = new HashSet<>(game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game));
|
||||
boolean toRet = false;
|
||||
Set<MageObjectReference> toDestroy = new HashSet<>();
|
||||
|
|
|
@ -68,7 +68,7 @@ class HuntDownEffect extends RequirementEffect {
|
|||
Permanent blocker = game.getPermanent(source.getTargets().get(0).getFirstTarget());
|
||||
if (blocker != null
|
||||
&& blocker.canBlock(source.getTargets().get(1).getFirstTarget(), game)) {
|
||||
Permanent attacker = (Permanent) game.getPermanent(source.getTargets().get(1).getFirstTarget());
|
||||
Permanent attacker = game.getPermanent(source.getTargets().get(1).getFirstTarget());
|
||||
if (attacker != null) {
|
||||
BlockedAttackerWatcher blockedAttackerWatcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
|
||||
if (blockedAttackerWatcher != null
|
||||
|
|
|
@ -47,7 +47,7 @@ class ImpatienceCondition implements Condition {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
return watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(game.getActivePlayerId()) == 0;
|
||||
return watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(game.getActivePlayerId()) == 0;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
|
|
|
@ -151,7 +151,7 @@ class KaradorGhostChieftainCastFromGraveyardEffect extends AsThoughEffectImpl {
|
|||
if (objectId.equals(getTargetPointer().getFirst(game, source))) {
|
||||
if (affectedControllerId.equals(source.getControllerId())) {
|
||||
KaradorGhostChieftainWatcher watcher = (KaradorGhostChieftainWatcher) game.getState().getWatchers().get(KaradorGhostChieftainWatcher.class.getSimpleName(), source.getSourceId());
|
||||
return !watcher.isAbilityUsed();
|
||||
return watcher != null && !watcher.isAbilityUsed();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -94,7 +94,7 @@ class KessDissidentMageCastFromGraveyardEffect extends AsThoughEffectImpl {
|
|||
&& game.getState().getZone(objectId).equals(Zone.GRAVEYARD)) {
|
||||
// check if not already a card was cast this turn with this ability
|
||||
KessDissidentMageWatcher watcher = (KessDissidentMageWatcher) game.getState().getWatchers().get(KessDissidentMageWatcher.class.getSimpleName());
|
||||
return !watcher.isAbilityUsed(new MageObjectReference(source.getSourceId(), game));
|
||||
return watcher != null && !watcher.isAbilityUsed(new MageObjectReference(source.getSourceId(), game));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -138,7 +138,7 @@ class KessDissidentMageReplacementEffect extends ReplacementEffectImpl {
|
|||
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
|
||||
if (zEvent.getToZone() == Zone.GRAVEYARD) {
|
||||
KessDissidentMageWatcher watcher = (KessDissidentMageWatcher) game.getState().getWatchers().get(KessDissidentMageWatcher.class.getSimpleName());
|
||||
if (source.getSourceId().equals(watcher.spellCastWasAllowedBy(new MageObjectReference(event.getTargetId(), game)))) {
|
||||
if (watcher != null && source.getSourceId().equals(watcher.spellCastWasAllowedBy(new MageObjectReference(event.getTargetId(), game)))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,22 +116,20 @@ enum KrovikanVampireInterveningIfCondition implements Condition {
|
|||
KrovikanVampireCreaturesDamagedWatcher watcherDamaged = (KrovikanVampireCreaturesDamagedWatcher) game.getState().getWatchers().get(KrovikanVampireCreaturesDamagedWatcher.class.getSimpleName());
|
||||
if (watcherDied != null) {
|
||||
Set<UUID> creaturesThatDiedThisTurn = watcherDied.diedThisTurn;
|
||||
if (creaturesThatDiedThisTurn != null) {
|
||||
for (UUID mor : creaturesThatDiedThisTurn) {
|
||||
if (watcherDamaged != null) {
|
||||
for (UUID mor2 : watcherDamaged.getDamagedBySource()) {
|
||||
if (mor2 != null
|
||||
&& mor == mor2) {
|
||||
creaturesAffected.add(mor);
|
||||
}
|
||||
for (UUID mor : creaturesThatDiedThisTurn) {
|
||||
if (watcherDamaged != null) {
|
||||
for (UUID mor2 : watcherDamaged.getDamagedBySource()) {
|
||||
if (mor2 != null
|
||||
&& mor == mor2) {
|
||||
creaturesAffected.add(mor);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (creaturesAffected != null
|
||||
&& creaturesAffected.size() > 0) {
|
||||
game.getState().setValue(source.getSourceId() + "creatureToGainControl", creaturesAffected);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (creaturesAffected != null
|
||||
&& creaturesAffected.size() > 0) {
|
||||
game.getState().setValue(source.getSourceId() + "creatureToGainControl", creaturesAffected);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -58,7 +58,10 @@ class CardsDrawnThisTurnDynamicValue implements DynamicValue {
|
|||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
KydeleCardsDrawnThisTurnWatcher watcher = (KydeleCardsDrawnThisTurnWatcher) game.getState().getWatchers().get(KydeleCardsDrawnThisTurnWatcher.class.getSimpleName());
|
||||
return watcher.getCardsDrawnThisTurn(sourceAbility.getControllerId());
|
||||
if(watcher != null) {
|
||||
return watcher.getCardsDrawnThisTurn(sourceAbility.getControllerId());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -65,7 +65,7 @@ class LudevicNecroAlchemistCondition implements Condition {
|
|||
currentPlayer = playerList.getNext(game);
|
||||
|
||||
while (watcher != null && currentPlayer != null) {
|
||||
if (!Objects.equals(currentPlayer.getId(), sourcePlayerId) && watcher.getLiveLost(currentPlayer.getId()) > 0) {
|
||||
if (!Objects.equals(currentPlayer.getId(), sourcePlayerId) && watcher.getLifeLost(currentPlayer.getId()) > 0) {
|
||||
return true;
|
||||
}
|
||||
if (Objects.equals(currentPlayer, firstPlayer)) {
|
||||
|
|
|
@ -121,7 +121,7 @@ enum YouLostNoLifeThisTurnCondition implements Condition {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
return (watcher.getLiveLost(source.getControllerId()) == 0);
|
||||
return (watcher.getLifeLost(source.getControllerId()) == 0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -65,11 +65,11 @@ enum MadDogCondition implements Condition {
|
|||
&& madDog != null) {
|
||||
// For some reason, compare did not work when checking the lists. Thus the interation.
|
||||
List<Permanent> permanents = watcher.getThisTurnEnteringPermanents(source.getControllerId());
|
||||
if (!permanents.stream().noneMatch((p) -> (p.getId().equals(madDog.getId())))) {
|
||||
if (permanents.stream().anyMatch((p) -> (p.getId().equals(madDog.getId())))) {
|
||||
return false;
|
||||
}
|
||||
Set<MageObjectReference> mor = watcher2.getAttackedThisTurnCreatures();
|
||||
if (!mor.stream().noneMatch((m) -> (m.getPermanent(game).equals(madDog)))) {
|
||||
if (mor.stream().anyMatch((m) -> (m.getPermanent(game).equals(madDog)))) {
|
||||
return false;
|
||||
}
|
||||
return true; // Mad Dog did not come into play this turn nor did he attack this turn. Sacrifice the hound.
|
||||
|
|
|
@ -79,6 +79,9 @@ class MagusOfTheMindEffect extends OneShotEffect {
|
|||
Player controller = game.getPlayer(source.getControllerId());
|
||||
MageObject sourceObject = source.getSourceObject(game);
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
int stormCount = watcher.getAmountOfSpellsAllPlayersCastOnCurrentTurn() + 1;
|
||||
if (controller != null && sourceObject != null) {
|
||||
controller.shuffleLibrary(source, game);
|
||||
|
|
|
@ -154,6 +154,9 @@ class MasterWarcraftChooseAttackersEffect extends ContinuousRuleModifyingEffectI
|
|||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
MasterWarcraftCastWatcher watcher = (MasterWarcraftCastWatcher) game.getState().getWatchers().get(MasterWarcraftCastWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
watcher.decrement();
|
||||
if (watcher.copyCountApply > 0) {
|
||||
game.informPlayers(source.getSourceObject(game).getIdName() + " didn't apply");
|
||||
|
@ -227,6 +230,9 @@ class MasterWarcraftChooseBlockersEffect extends ContinuousRuleModifyingEffectIm
|
|||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
watcher.decrement();
|
||||
if (watcher.copyCountApply > 0) {
|
||||
game.informPlayers(source.getSourceObject(game).getIdName() + " didn't apply");
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
|
||||
package mage.cards.m;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.DelayedTriggeredAbility;
|
||||
import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
|
||||
|
@ -17,19 +16,21 @@ import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
|
|||
import mage.abilities.effects.common.UntapTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.TurnPhase;
|
||||
import mage.game.Game;
|
||||
import mage.game.combat.CombatGroup;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
import mage.watchers.Watcher;
|
||||
import mage.watchers.common.ChooseBlockersRedundancyWatcher;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author L_J
|
||||
*/
|
||||
public final class Melee extends CardImpl {
|
||||
|
@ -61,17 +62,17 @@ public final class Melee extends CardImpl {
|
|||
public Melee copy() {
|
||||
return new Melee(this);
|
||||
}
|
||||
|
||||
|
||||
private class ChooseBlockersRedundancyWatcherIncrementEffect extends OneShotEffect {
|
||||
|
||||
|
||||
ChooseBlockersRedundancyWatcherIncrementEffect() {
|
||||
super(Outcome.Neutral);
|
||||
}
|
||||
|
||||
|
||||
ChooseBlockersRedundancyWatcherIncrementEffect(final ChooseBlockersRedundancyWatcherIncrementEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
|
||||
|
@ -81,7 +82,7 @@ public final class Melee extends CardImpl {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ChooseBlockersRedundancyWatcherIncrementEffect copy() {
|
||||
return new ChooseBlockersRedundancyWatcherIncrementEffect(this);
|
||||
|
@ -118,6 +119,9 @@ class MeleeChooseBlockersEffect extends ContinuousRuleModifyingEffectImpl {
|
|||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
|
||||
if (watcher == null) {
|
||||
return false;
|
||||
}
|
||||
watcher.decrement();
|
||||
watcher.copyCount--;
|
||||
if (watcher.copyCountApply > 0) {
|
||||
|
|
|
@ -87,7 +87,7 @@ class MoltenPsycheEffect extends OneShotEffect {
|
|||
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
|
||||
if (game.isOpponent(controller, playerId)) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null) {
|
||||
if (player != null && watcher != null) {
|
||||
player.damage(watcher.getDraws(playerId), source.getSourceId(), game, false, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ class MultanisPresenceTriggeredAbility extends TriggeredAbilityImpl {
|
|||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
MultanisPresenceWatcher watcher = (MultanisPresenceWatcher) game.getState().getWatchers().get(MultanisPresenceWatcher.class.getSimpleName());
|
||||
return (watcher.getSpellsCastThisTurn(controllerId).contains(event.getTargetId()));
|
||||
return watcher != null && watcher.getSpellsCastThisTurn(controllerId).contains(event.getTargetId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -131,6 +131,9 @@ class OdricMasterTacticianChooseBlockersEffect extends ContinuousRuleModifyingEf
|
|||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
watcher.decrement();
|
||||
watcher.copyCount--;
|
||||
if (watcher.copyCountApply > 0) {
|
||||
|
|
|
@ -65,9 +65,11 @@ class PowerSurgeDamageEffect extends OneShotEffect {
|
|||
Player player = game.getPlayer(targetPointer.getFirst(game, source));
|
||||
if (player != null) {
|
||||
PowerSurgeWatcher watcher = (PowerSurgeWatcher) game.getState().getWatchers().get(PowerSurgeWatcher.class.getSimpleName());
|
||||
int damage = watcher.getUntappedLandCount();
|
||||
player.damage(damage, source.getSourceId(), game, false, true);
|
||||
return true;
|
||||
if(watcher != null) {
|
||||
int damage = watcher.getUntappedLandCount();
|
||||
player.damage(damage, source.getSourceId(), game, false, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ class ETBSinceYourLastTurnTarget extends TargetCreaturePermanent {
|
|||
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))) {
|
||||
if (watcher != null && watcher.enteredSinceLastTurn(sourceControllerId, new MageObjectReference(permanent.getId(), game))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ class ReaperFromTheAbyssAbility extends TriggeredAbilityImpl {
|
|||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Watcher watcher = game.getState().getWatchers().get(MorbidWatcher.class.getSimpleName());
|
||||
return watcher.conditionMet();
|
||||
return watcher != null && watcher.conditionMet();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -65,7 +65,7 @@ enum LostLifeCondition implements Condition {
|
|||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
UUID player = source.getControllerId();
|
||||
if (watcher != null && player != null) {
|
||||
return watcher.getLiveLost(player) > 0;
|
||||
return watcher.getLifeLost(player) > 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ class RimehornAurochsEffect extends RequirementEffect {
|
|||
Permanent blocker = game.getPermanent(source.getTargets().get(0).getFirstTarget());
|
||||
if (blocker != null
|
||||
&& blocker.canBlock(source.getTargets().get(1).getFirstTarget(), game)) {
|
||||
Permanent attacker = (Permanent) game.getPermanent(source.getTargets().get(1).getFirstTarget());
|
||||
Permanent attacker = game.getPermanent(source.getTargets().get(1).getFirstTarget());
|
||||
if (attacker != null) {
|
||||
BlockedAttackerWatcher blockedAttackerWatcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
|
||||
if (blockedAttackerWatcher != null
|
||||
|
|
|
@ -74,7 +74,7 @@ class PlayerLostLifePredicate implements Predicate<Player> {
|
|||
public boolean apply(Player input, Game game) {
|
||||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
return (0 < watcher.getLiveLost(input.getId()));
|
||||
return (0 < watcher.getLifeLost(input.getId()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ enum ControlledTurnCondition implements Condition {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
RocketLauncherWatcher watcher = (RocketLauncherWatcher) game.getState().getWatchers().get(RocketLauncherWatcher.class.getSimpleName());
|
||||
|
||||
return !watcher.changedControllerOR1stTurn;
|
||||
return watcher != null && !watcher.changedControllerOR1stTurn;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -51,7 +51,7 @@ class SecondSpellPredicate implements Predicate<StackObject> {
|
|||
public boolean apply(StackObject input, Game game) {
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
|
||||
if (watcher.getSpellOrder(new MageObjectReference(input.getId(), game), game) == 2) {
|
||||
if (watcher != null && watcher.getSpellOrder(new MageObjectReference(input.getId(), game), game) == 2) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,10 @@ class SilentChantZuberaDynamicValue implements DynamicValue {
|
|||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
ZuberasDiedWatcher watcher = (ZuberasDiedWatcher) game.getState().getWatchers().get(ZuberasDiedWatcher.class.getSimpleName());
|
||||
return watcher.zuberasDiedThisTurn * 2;
|
||||
if(watcher != null) {
|
||||
return watcher.zuberasDiedThisTurn * 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -62,7 +62,7 @@ class OpponentWasDealtDamageCondition implements Condition {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
BloodthirstWatcher watcher = (BloodthirstWatcher) game.getState().getWatchers().get(BloodthirstWatcher.class.getSimpleName(), source.getControllerId());
|
||||
return watcher.conditionMet();
|
||||
return watcher != null && watcher.conditionMet();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -55,7 +55,10 @@ class OtherSpellsCastThisTurnCount implements DynamicValue {
|
|||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
return watcher.getAmountOfSpellsAllPlayersCastOnCurrentTurn() - 1;
|
||||
if(watcher != null ) {
|
||||
return watcher.getAmountOfSpellsAllPlayersCastOnCurrentTurn() - 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -60,7 +60,7 @@ class AllPlayersLostLifeCount implements DynamicValue {
|
|||
if (watcher != null) {
|
||||
int amountLifeLost = 0;
|
||||
for (UUID playerId : game.getState().getPlayersInRange(controllerId, game)) {
|
||||
amountLifeLost += watcher.getLiveLost(playerId);
|
||||
amountLifeLost += watcher.getLifeLost(playerId);
|
||||
}
|
||||
return amountLifeLost;
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ class EquippedDealtCombatDamageToCreatureCondition implements Condition {
|
|||
if (equipment != null && equipment.getAttachedTo() != null) {
|
||||
CombatDamageToCreatureWatcher watcher =
|
||||
(CombatDamageToCreatureWatcher) game.getState().getWatchers().get(CombatDamageToCreatureWatcher.BASIC_KEY);
|
||||
return watcher.dealtDamage(equipment.getAttachedTo(), equipment.getAttachedToZoneChangeCounter(), game);
|
||||
return watcher != null && watcher.dealtDamage(equipment.getAttachedTo(), equipment.getAttachedToZoneChangeCounter(), game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -98,7 +98,7 @@ class TuvasaTheSunlitTriggeredAbility extends SpellCastControllerTriggeredAbilit
|
|||
TuvasaTheSunlitWatcher watcher = (TuvasaTheSunlitWatcher) game.getState().getWatchers().get(
|
||||
TuvasaTheSunlitWatcher.class.getSimpleName()
|
||||
);
|
||||
return event.getTargetId().equals(watcher.getFirstEnchantmentThisTurn(this.getControllerId()));
|
||||
return watcher != null && event.getTargetId().equals(watcher.getFirstEnchantmentThisTurn(this.getControllerId()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -61,9 +61,9 @@ class UrzasMiterDoIfCostPaid extends DoIfCostPaid {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
UrzasMiterWatcher watcher = (UrzasMiterWatcher) game.getState().getWatchers().get(UrzasMiterWatcher.class.getSimpleName());
|
||||
if(!watcher.cards.contains(source.getFirstTarget()))
|
||||
if(watcher != null && !watcher.cards.contains(source.getFirstTarget())) {
|
||||
return super.apply(game, source);
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -117,7 +117,7 @@ class OpponentWasDealtDamageCondition implements Condition {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
BloodthirstWatcher watcher = (BloodthirstWatcher) game.getState().getWatchers().get(BloodthirstWatcher.class.getSimpleName(), source.getControllerId());
|
||||
return watcher.conditionMet();
|
||||
return watcher != null && watcher.conditionMet();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -62,7 +62,7 @@ class WoundReflectionEffect extends OneShotEffect {
|
|||
for (UUID playerId : game.getOpponents(controller.getId())) {
|
||||
Player opponent = game.getPlayer(playerId);
|
||||
if (opponent != null) {
|
||||
int lifeLost = watcher.getLiveLost(playerId);
|
||||
int lifeLost = watcher.getLifeLost(playerId);
|
||||
if (lifeLost > 0) {
|
||||
opponent.loseLife(lifeLost, game, false);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,6 @@ public enum AttackedThisTurnCondition implements Condition {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
|
||||
return !watcher.getAttackedThisTurnCreatures().isEmpty();
|
||||
return watcher != null && !watcher.getAttackedThisTurnCreatures().isEmpty();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public enum LiveLostLastTurnCondition implements Condition {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
return watcher.getLiveLostLastTurn(source.getControllerId()) > 0;
|
||||
return watcher.getLifeLostLastTurn(source.getControllerId()) > 0;
|
||||
} else {
|
||||
WatcherUtils.logMissingWatcher(game, source, PlayerLostLifeWatcher.class, this.getClass());
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ public enum MorbidCondition implements Condition {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Watcher watcher = game.getState().getWatchers().get(MorbidWatcher.class.getSimpleName());
|
||||
return watcher.conditionMet();
|
||||
return watcher != null && watcher.conditionMet();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -24,6 +24,9 @@ public enum NoSpellsWereCastLastTurnCondition implements Condition {
|
|||
}
|
||||
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
// if any player cast spell, return false
|
||||
for (Integer count : watcher.getAmountOfSpellsCastOnPrevTurn().values()) {
|
||||
if (count > 0) {
|
||||
|
|
|
@ -26,7 +26,7 @@ public class OpponentLostLifeCondition extends IntCompareCondition {
|
|||
PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
|
||||
if (watcher != null) {
|
||||
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
|
||||
int lostLive = watcher.getLiveLost(opponentId);
|
||||
int lostLive = watcher.getLifeLost(opponentId);
|
||||
if (lostLive > maxLostLive) {
|
||||
maxLostLive = lostLive;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,9 @@ public enum TwoOrMoreSpellsWereCastLastTurnCondition implements Condition {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
|
||||
if(watcher == null){
|
||||
return false;
|
||||
}
|
||||
// if any player cast more than two spells, return true
|
||||
for (Integer count : watcher.getAmountOfSpellsCastOnPrevTurn().values()) {
|
||||
if (count >= 2) {
|
||||
|
|
|
@ -14,7 +14,10 @@ public class ZuberasDiedDynamicValue implements DynamicValue {
|
|||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
ZuberasDiedWatcher watcher = (ZuberasDiedWatcher) game.getState().getWatchers().get(ZuberasDiedWatcher.class.getSimpleName());
|
||||
return watcher.zuberasDiedThisTurn;
|
||||
if(watcher == null){
|
||||
return 0;
|
||||
}
|
||||
return watcher.zuberasDiedThisTurn;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -75,19 +75,21 @@ class GravestormEffect extends OneShotEffect {
|
|||
MageObjectReference spellRef = (MageObjectReference) this.getValue("GravestormSpellRef");
|
||||
if (spellRef != null) {
|
||||
GravestormWatcher watcher = (GravestormWatcher) game.getState().getWatchers().get(GravestormWatcher.class.getSimpleName());
|
||||
int gravestormCount = watcher.getGravestormCount();
|
||||
if (gravestormCount > 0) {
|
||||
Spell spell = (Spell) this.getValue("GravestormSpell");
|
||||
if (spell != null) {
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers("Gravestorm: " + spell.getName() + " will be copied " + gravestormCount + " time" + (gravestormCount > 1 ? "s" : ""));
|
||||
}
|
||||
for (int i = 0; i < gravestormCount; i++) {
|
||||
spell.createCopyOnStack(game, source, source.getControllerId(), true);
|
||||
if(watcher != null) {
|
||||
int gravestormCount = watcher.getGravestormCount();
|
||||
if (gravestormCount > 0) {
|
||||
Spell spell = (Spell) this.getValue("GravestormSpell");
|
||||
if (spell != null) {
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers("Gravestorm: " + spell.getName() + " will be copied " + gravestormCount + " time" + (gravestormCount > 1 ? "s" : ""));
|
||||
}
|
||||
for (int i = 0; i < gravestormCount; i++) {
|
||||
spell.createCopyOnStack(game, source, source.getControllerId(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ public class PlayerLostLifeWatcher extends Watcher {
|
|||
}
|
||||
}
|
||||
|
||||
public int getLiveLost(UUID playerId) {
|
||||
public int getLifeLost(UUID playerId) {
|
||||
return amountOfLifeLostThisTurn.getOrDefault(playerId, 0);
|
||||
}
|
||||
|
||||
|
@ -64,7 +64,7 @@ public class PlayerLostLifeWatcher extends Watcher {
|
|||
return amount;
|
||||
}
|
||||
|
||||
public int getLiveLostLastTurn(UUID playerId) {
|
||||
public int getLifeLostLastTurn(UUID playerId) {
|
||||
return amountOfLifeLostLastTurn.getOrDefault(playerId, 0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue