From 7c69bc6f309556d3d6840d367b34a8445808e0fb Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Wed, 2 Nov 2011 21:39:03 -0400 Subject: [PATCH] fixes + optimizations + allow games to be paused and resumed --- .../src/mage/player/ai/ComputerPlayer6.java | 14 +- .../java/mage/player/ai/ComputerPlayer.java | 28 +- .../src/mage/player/ai/ComputerPlayer2.java | 14 +- Mage.Server/plugins/mage-player-ai-ma.jar | Bin 43780 -> 43684 bytes Mage.Server/plugins/mage-player-ai.jar | Bin 53319 -> 53438 bytes Mage.Server/plugins/mage-player-aiminimax.jar | Bin 39808 -> 39761 bytes Mage.Sets/src/mage/sets/Sets.java | 2 +- Mage/src/mage/MageObjectImpl.java | 12 +- .../mage/abilities/ActivatedAbilityImpl.java | 7 +- .../abilities/costs/common/FlashbackCost.java | 2 +- .../effects/ContinuousEffectImpl.java | 4 +- .../abilities/effects/ContinuousEffects.java | 25 +- .../common/PutOnLibraryTargetEffect.java | 2 +- .../common/ReturnToHandSourceEffect.java | 2 +- .../common/ReturnToHandTargetEffect.java | 2 +- Mage/src/mage/cards/CardImpl.java | 15 +- Mage/src/mage/cards/CardsImpl.java | 8 +- Mage/src/mage/choices/ChoiceImpl.java | 4 +- Mage/src/mage/filter/FilterCard.java | 8 +- Mage/src/mage/filter/FilterObject.java | 20 +- Mage/src/mage/filter/FilterPermanent.java | 8 +- Mage/src/mage/filter/FilterPlayer.java | 4 +- Mage/src/mage/filter/FilterStackObject.java | 4 +- Mage/src/mage/game/Game.java | 2 + Mage/src/mage/game/GameImpl.java | 304 ++++++++++-------- Mage/src/mage/game/GameState.java | 28 +- Mage/src/mage/game/combat/Combat.java | 8 +- Mage/src/mage/game/combat/CombatGroup.java | 20 +- .../mage/game/permanent/PermanentCard.java | 6 +- .../mage/game/permanent/PermanentImpl.java | 17 +- Mage/src/mage/game/stack/Spell.java | 20 +- Mage/src/mage/game/stack/SpellStack.java | 15 +- Mage/src/mage/game/turn/EndPhase.java | 6 +- Mage/src/mage/game/turn/Phase.java | 60 +++- Mage/src/mage/game/turn/Step.java | 16 +- Mage/src/mage/game/turn/Turn.java | 45 ++- Mage/src/mage/players/PlayerImpl.java | 12 +- Mage/src/mage/target/TargetImpl.java | 4 +- Mage/src/mage/target/TargetObject.java | 2 +- Mage/src/mage/target/TargetPermanent.java | 3 +- .../mage/target/common/TargetCardInExile.java | 2 +- .../target/common/TargetCardInGraveyard.java | 2 +- .../TargetCardInOpponentsGraveyard.java | 2 +- .../common/TargetCardInYourGraveyard.java | 2 +- 44 files changed, 430 insertions(+), 331 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index d7c923a9417..ec0217fede2 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -95,15 +95,9 @@ public class ComputerPlayer6 extends ComputerPlayer implements this.currentScore = player.currentScore; if (player.combat != null) this.combat = player.combat.copy(); - for (Ability ability: player.actions) { - actions.add(ability); - } - for (UUID targetId: player.targets) { - targets.add(targetId); - } - for (String choice: player.choices) { - choices.add(choice); - } + this.actions.addAll(player.actions); + this.targets.addAll(player.targets); + this.choices.addAll(player.choices); } @Override @@ -773,7 +767,7 @@ public class ComputerPlayer6 extends ComputerPlayer implements Game sim = game.copy(); for (Player copyPlayer: sim.getState().getPlayers().values()) { - Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()); + Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()).copy(); SimulatedPlayer2 newPlayer = new SimulatedPlayer2(copyPlayer.getId(), copyPlayer.getId().equals(playerId), suggested); newPlayer.restore(origPlayer); sim.getState().getPlayers().put(copyPlayer.getId(), newPlayer); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index fa2d05990fd..721e26eddbd 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -180,7 +180,7 @@ public class ComputerPlayer> extends PlayerImpl i } if (target instanceof TargetControlledPermanent) { List targets; - targets = threats(playerId, ((TargetControlledPermanent)target).getFilter(), game); + targets = threats(playerId, ((TargetControlledPermanent)target).getFilter(), game, target.getTargets()); if (!outcome.isGood()) Collections.reverse(targets); for (Permanent permanent: targets) { @@ -193,10 +193,10 @@ public class ComputerPlayer> extends PlayerImpl i if (target instanceof TargetPermanent) { List targets; if (outcome.isGood()) { - targets = threats(playerId, ((TargetPermanent)target).getFilter(), game); + targets = threats(playerId, ((TargetPermanent)target).getFilter(), game, target.getTargets()); } else { - targets = threats(opponentId, ((TargetPermanent)target).getFilter(), game); + targets = threats(opponentId, ((TargetPermanent)target).getFilter(), game, target.getTargets()); } for (Permanent permanent: targets) { if (((TargetPermanent)target).canTarget(playerId, permanent.getId(), null, game) && !target.getTargets().contains(permanent.getId())) { @@ -268,7 +268,7 @@ public class ComputerPlayer> extends PlayerImpl i } if (target instanceof TargetControlledPermanent) { List targets; - targets = threats(playerId, ((TargetControlledPermanent)target).getFilter(), game); + targets = threats(playerId, ((TargetControlledPermanent)target).getFilter(), game, target.getTargets()); if (!outcome.isGood()) Collections.reverse(targets); for (Permanent permanent: targets) { @@ -282,10 +282,10 @@ public class ComputerPlayer> extends PlayerImpl i if (target instanceof TargetPermanent) { List targets; if (outcome.isGood()) { - targets = threats(playerId, ((TargetPermanent)target).getFilter(), game); + targets = threats(playerId, ((TargetPermanent)target).getFilter(), game, target.getTargets()); } else { - targets = threats(opponentId, ((TargetPermanent)target).getFilter(), game); + targets = threats(opponentId, ((TargetPermanent)target).getFilter(), game, target.getTargets()); } for (Permanent permanent: targets) { if (((TargetPermanent)target).canTarget(playerId, permanent.getId(), source, game)) { @@ -299,10 +299,10 @@ public class ComputerPlayer> extends PlayerImpl i List targets; TargetCreatureOrPlayer t = ((TargetCreatureOrPlayer)target); if (outcome.isGood()) { - targets = threats(playerId, ((FilterCreatureOrPlayer)t.getFilter()).getCreatureFilter(), game); + targets = threats(playerId, ((FilterCreatureOrPlayer)t.getFilter()).getCreatureFilter(), game, target.getTargets()); } else { - targets = threats(opponentId, ((FilterCreatureOrPlayer)t.getFilter()).getCreatureFilter(), game); + targets = threats(opponentId, ((FilterCreatureOrPlayer)t.getFilter()).getCreatureFilter(), game, target.getTargets()); } for (Permanent permanent: targets) { List alreadyTargetted = target.getTargets(); @@ -395,10 +395,10 @@ public class ComputerPlayer> extends PlayerImpl i } List targets; if (outcome.isGood()) { - targets = threats(playerId, new FilterCreaturePermanent(), game); + targets = threats(playerId, new FilterCreaturePermanent(), game, target.getTargets()); } else { - targets = threats(opponentId, new FilterCreaturePermanent(), game); + targets = threats(opponentId, new FilterCreaturePermanent(), game, target.getTargets()); } for (Permanent permanent: targets) { if (target.canTarget(permanent.getId(), source, game)) { @@ -1301,8 +1301,14 @@ public class ComputerPlayer> extends PlayerImpl i return worst; } - protected List threats(UUID playerId, FilterPermanent filter, Game game) { + protected List threats(UUID playerId, FilterPermanent filter, Game game, List targets) { List threats = game.getBattlefield().getAllActivePermanents(filter, playerId); + Iterator it = threats.iterator(); + while (it.hasNext()) { // remove permanents already targetted + Permanent test = it.next(); + if (targets.contains(test.getId())) + it.remove(); + } Collections.sort(threats, new PermanentComparator(game)); return threats; } diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java index 080567c5777..4a6205e574f 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java @@ -120,15 +120,9 @@ public class ComputerPlayer2 extends ComputerPlayer implements this.currentScore = player.currentScore; if (player.combat != null) this.combat = player.combat.copy(); - for (Ability ability: player.actions) { - actions.add(ability); - } - for (UUID targetId: player.targets) { - targets.add(targetId); - } - for (String choice: player.choices) { - choices.add(choice); - } + this.actions.addAll(player.actions); + this.targets.addAll(player.targets); + this.choices.addAll(player.choices); } @Override @@ -731,7 +725,7 @@ public class ComputerPlayer2 extends ComputerPlayer implements Game sim = game.copy(); for (Player copyPlayer: sim.getState().getPlayers().values()) { - Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()); + Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()).copy(); SimulatedPlayer newPlayer = new SimulatedPlayer(copyPlayer.getId(), copyPlayer.getId().equals(playerId), maxDepth); newPlayer.restore(origPlayer); sim.getState().getPlayers().put(copyPlayer.getId(), newPlayer); diff --git a/Mage.Server/plugins/mage-player-ai-ma.jar b/Mage.Server/plugins/mage-player-ai-ma.jar index 906117badc13bf66e2f5377ffc0ca103499f57f0..14bdfcf795c33ad3533dbc6af190e4a63add5355 100644 GIT binary patch delta 21909 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 LSP9-D|LFb~wqGDG delta 22054 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 YG4cOls!{mIvH!yqTFMF_EBd4RKf0~vbN~PV diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index 171bdc2d5ea189d8d1943ffdf1000298acf41f04..69a49e78f1e2f352aa833807d4a81537032a3125 100644 GIT binary patch delta 21626 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 delta 21519 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 diff --git a/Mage.Server/plugins/mage-player-aiminimax.jar b/Mage.Server/plugins/mage-player-aiminimax.jar index a88f33c3daeea0cd089a13aa0c417f33fec5fac0..056a4123475cca97ff36323afb66ba0c5ef5f17f 100644 GIT binary patch delta 20042 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 Qhc>`CTlBO>`j46a0qXFmUjP6A delta 20095 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%0DZC?4lgwTy{xC&# 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 x(b0fFNEZwY diff --git a/Mage.Sets/src/mage/sets/Sets.java b/Mage.Sets/src/mage/sets/Sets.java index 6903c9ef431..748221cfd1c 100644 --- a/Mage.Sets/src/mage/sets/Sets.java +++ b/Mage.Sets/src/mage/sets/Sets.java @@ -113,8 +113,8 @@ public class Sets extends HashMap { private void addSet(ExpansionSet set) { this.put(set.getCode(), set); + cards.addAll(set.getCards()); for (Card card: set.getCards()) { - cards.add(card); names.add(card.getName()); if (card.getCardType().contains(CardType.CREATURE)) { for (String type : card.getSubtype()) { diff --git a/Mage/src/mage/MageObjectImpl.java b/Mage/src/mage/MageObjectImpl.java index 702c176aebc..f68e68c43d0 100644 --- a/Mage/src/mage/MageObjectImpl.java +++ b/Mage/src/mage/MageObjectImpl.java @@ -82,15 +82,9 @@ public abstract class MageObjectImpl> implements Mag power = object.power.copy(); toughness = object.toughness.copy(); abilities = object.abilities.copy(); - for (CardType cType: object.cardType) { - cardType.add(cType); - } - for (String subType: object.subtype) { - this.subtype.add(subType); - } - for (String superType: object.supertype) { - this.supertype.add(superType); - } + this.cardType.addAll(object.cardType); + this.subtype.addAll(object.subtype); + this.supertype.addAll(object.supertype); } @Override diff --git a/Mage/src/mage/abilities/ActivatedAbilityImpl.java b/Mage/src/mage/abilities/ActivatedAbilityImpl.java index 3bd30cb41e5..f52f162271b 100644 --- a/Mage/src/mage/abilities/ActivatedAbilityImpl.java +++ b/Mage/src/mage/abilities/ActivatedAbilityImpl.java @@ -34,6 +34,7 @@ import mage.Constants.TimingRule; import mage.Constants.Zone; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; +import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.PhyrexianManaCost; @@ -100,8 +101,8 @@ public abstract class ActivatedAbilityImpl> ex if (cost != null) { if (cost instanceof PhyrexianManaCost) { this.addManaCost((PhyrexianManaCost)cost); - } else if (cost instanceof ManaCostsImpl) { - this.addManaCost((ManaCostsImpl) cost); + } else if (cost instanceof ManaCost) { + this.addManaCost((ManaCost) cost); } else { this.addCost(cost); } @@ -164,7 +165,7 @@ public abstract class ActivatedAbilityImpl> ex return true; else { Card card = (Card)game.getObject(this.sourceId); - if (card != null && game.getZone(this.sourceId) != Zone.BATTLEFIELD) + if (card != null && game.getState().getZone(this.sourceId) != Zone.BATTLEFIELD) return card.getOwnerId().equals(playerId); } return false; diff --git a/Mage/src/mage/abilities/costs/common/FlashbackCost.java b/Mage/src/mage/abilities/costs/common/FlashbackCost.java index 8cafccce15b..b1d13d0fb7f 100644 --- a/Mage/src/mage/abilities/costs/common/FlashbackCost.java +++ b/Mage/src/mage/abilities/costs/common/FlashbackCost.java @@ -53,7 +53,7 @@ public class FlashbackCost extends AlternativeCostImpl { @Override public boolean isAvailable(Game game, Ability source) { - Constants.Zone zone = game.getZone(source.getSourceId()); + Constants.Zone zone = game.getState().getZone(source.getSourceId()); if (zone != null) { return zone.equals(Constants.Zone.GRAVEYARD); } diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java index b97817515cb..24c7a9ac1ea 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java @@ -77,9 +77,7 @@ public abstract class ContinuousEffectImpl> ex this.timestamp = new Date(effect.timestamp.getTime()); this.used = effect.used; this.affectedObjectsSet = effect.affectedObjectsSet; - for (UUID objectId: effect.objects) { - this.objects.add(objectId); - } + this.objects.addAll(effect.objects); } @Override diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index d26ad247977..4e0bae81f2b 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -60,13 +60,13 @@ import mage.players.Player; public class ContinuousEffects implements Serializable { //transient Continuous effects - private final List layeredEffects = new ArrayList(); - private final List replacementEffects = new ArrayList(); - private final List preventionEffects = new ArrayList(); - private final List requirementEffects = new ArrayList(); - private final List restrictionEffects = new ArrayList(); - private final List asThoughEffects = new ArrayList(); - private final List costModificationEffects = new ArrayList(); + private final ArrayList layeredEffects = new ArrayList(); + private final ArrayList replacementEffects = new ArrayList(); + private final ArrayList preventionEffects = new ArrayList(); + private final ArrayList requirementEffects = new ArrayList(); + private final ArrayList restrictionEffects = new ArrayList(); + private final ArrayList asThoughEffects = new ArrayList(); + private final ArrayList costModificationEffects = new ArrayList(); //map Abilities to Continuous effects private final Map abilityMap = new HashMap(); @@ -82,24 +82,31 @@ public class ContinuousEffects implements Serializable { public ContinuousEffects(final ContinuousEffects effect) { this.applyCounters = effect.applyCounters.copy(); this.planeswalkerRedirectionEffect = effect.planeswalkerRedirectionEffect.copy(); + layeredEffects.ensureCapacity(effect.layeredEffects.size()); for (ContinuousEffect entry: effect.layeredEffects) { layeredEffects.add((ContinuousEffect) entry.copy()); } + replacementEffects.ensureCapacity(effect.replacementEffects.size()); for (ReplacementEffect entry: effect.replacementEffects) { replacementEffects.add((ReplacementEffect)entry.copy()); } + preventionEffects.ensureCapacity(effect.preventionEffects.size()); for (PreventionEffect entry: effect.preventionEffects) { preventionEffects.add((PreventionEffect)entry.copy()); } + requirementEffects.ensureCapacity(effect.requirementEffects.size()); for (RequirementEffect entry: effect.requirementEffects) { requirementEffects.add((RequirementEffect)entry.copy()); } + restrictionEffects.ensureCapacity(effect.restrictionEffects.size()); for (RestrictionEffect entry: effect.restrictionEffects) { restrictionEffects.add((RestrictionEffect)entry.copy()); } + asThoughEffects.ensureCapacity(effect.asThoughEffects.size()); for (AsThoughEffect entry: effect.asThoughEffects) { asThoughEffects.add((AsThoughEffect)entry.copy()); } + costModificationEffects.ensureCapacity(effect.costModificationEffects.size()); for ( CostModificationEffect entry : effect.costModificationEffects ) { costModificationEffects.add(entry); } @@ -209,7 +216,7 @@ public class ContinuousEffects implements Serializable { private List getLayeredEffects(Game game) { List layerEffects = new ArrayList(layeredEffects); for (Card card: game.getCards()) { - Zone zone = game.getZone(card.getId()); + Zone zone = game.getState().getZone(card.getId()); if (zone == Zone.HAND || zone == Zone.GRAVEYARD) { for (Entry entry: card.getAbilities().getEffects(zone, EffectType.CONTINUOUS).entrySet()) { layerEffects.add((ContinuousEffect)entry.getKey()); @@ -284,7 +291,7 @@ public class ContinuousEffects implements Serializable { replaceEffects.add(planeswalkerRedirectionEffect); //get all applicable Replacement effects in each players hand and graveyard for (Card card: game.getCards()) { - Zone zone = game.getZone(card.getId()); + Zone zone = game.getState().getZone(card.getId()); if (zone == Zone.HAND || zone == Zone.GRAVEYARD) { for (Entry entry: card.getAbilities().getReplacementEffects(zone).entrySet()) { if (entry.getKey().applies(event, entry.getValue(), game)) { diff --git a/Mage/src/mage/abilities/effects/common/PutOnLibraryTargetEffect.java b/Mage/src/mage/abilities/effects/common/PutOnLibraryTargetEffect.java index 482498776ae..5f74a3235bf 100644 --- a/Mage/src/mage/abilities/effects/common/PutOnLibraryTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/PutOnLibraryTargetEffect.java @@ -66,7 +66,7 @@ public class PutOnLibraryTargetEffect extends OneShotEffect> extends MageObjectImpl @Override public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag) { - Zone fromZone = game.getZone(objectId); + Zone fromZone = game.getState().getZone(objectId); ZoneChangeEvent event = new ZoneChangeEvent(this.objectId, sourceId, ownerId, fromZone, toZone); if (!game.replaceEvent(event)) { if (event.getFromZone() != null) { @@ -243,8 +245,11 @@ public abstract class CardImpl> extends MageObjectImpl case EXILED: game.getExile().removeCard(this, game); break; + case STACK: + break; default: - //logger.warning("moveToZone, not fully implemented: from="+event.getFromZone() + ", to="+event.getToZone()); + logger.fatal("invalid zone for card - " + fromZone); + return false; } game.rememberLKI(objectId, event.getFromZone(), this); } @@ -278,7 +283,7 @@ public abstract class CardImpl> extends MageObjectImpl } game.setZone(objectId, event.getToZone()); game.fireEvent(event); - return game.getZone(objectId) == toZone; + return game.getState().getZone(objectId) == toZone; } return false; } @@ -309,14 +314,14 @@ public abstract class CardImpl> extends MageObjectImpl game.getStack().push(new Spell(this, ability.copy(), controllerId)); game.setZone(objectId, event.getToZone()); game.fireEvent(event); - return game.getZone(objectId) == Zone.STACK; + return game.getState().getZone(objectId) == Zone.STACK; } return false; } @Override public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game) { - Zone fromZone = game.getZone(objectId); + Zone fromZone = game.getState().getZone(objectId); ZoneChangeEvent event = new ZoneChangeEvent(this.objectId, sourceId, ownerId, fromZone, Zone.EXILED); if (!game.replaceEvent(event)) { if (fromZone != null) { diff --git a/Mage/src/mage/cards/CardsImpl.java b/Mage/src/mage/cards/CardsImpl.java index 055109ce10d..eb3ee73433b 100644 --- a/Mage/src/mage/cards/CardsImpl.java +++ b/Mage/src/mage/cards/CardsImpl.java @@ -61,14 +61,12 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl public CardsImpl(Zone zone, List cards) { this(zone); for (Card card: cards) { - add(card); + this.add(card.getId()); } } public CardsImpl(final CardsImpl cards) { - for (UUID cardId: cards) { - this.add(cardId); - } + this.addAll(cards); this.ownerId = cards.ownerId; this.zone = cards.zone; } @@ -163,7 +161,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public void addAll(List cards) { for (Card card: cards) { - add(card); + add(card.getId()); } } diff --git a/Mage/src/mage/choices/ChoiceImpl.java b/Mage/src/mage/choices/ChoiceImpl.java index eb32181e1a0..dcf1413181e 100644 --- a/Mage/src/mage/choices/ChoiceImpl.java +++ b/Mage/src/mage/choices/ChoiceImpl.java @@ -57,9 +57,7 @@ public class ChoiceImpl> implements Choice, Serializable this.chosen = choice.chosen; this.required = choice.required; this.message = choice.message; - for (String c: choice.choices) { - this.choices.add(c); - } + this.choices.addAll(choice.choices); } @Override diff --git a/Mage/src/mage/filter/FilterCard.java b/Mage/src/mage/filter/FilterCard.java index 334b2b03b10..bc204b6faa2 100644 --- a/Mage/src/mage/filter/FilterCard.java +++ b/Mage/src/mage/filter/FilterCard.java @@ -67,13 +67,9 @@ public class FilterCard> extends FilterObject filter) { super(filter); - for (UUID oId: filter.ownerId) { - this.ownerId.add(oId); - } + this.ownerId.addAll(filter.ownerId); this.notOwner = filter.notOwner; - for (String code: filter.expansionSetCode) { - this.expansionSetCode.add(code); - } + this.expansionSetCode.addAll(filter.expansionSetCode); this.notExpansionSetCode = filter.notExpansionSetCode; this.owner = filter.owner; } diff --git a/Mage/src/mage/filter/FilterObject.java b/Mage/src/mage/filter/FilterObject.java index 805cf19153b..14c66db7eda 100644 --- a/Mage/src/mage/filter/FilterObject.java +++ b/Mage/src/mage/filter/FilterObject.java @@ -91,12 +91,8 @@ public class FilterObject> ex super(filter); this.abilities = filter.abilities.copy(); this.notAbilities = filter.notAbilities; - for (CardType cType: (List)filter.cardType) { - this.cardType.add(cType); - } - for (CardType cType: (List)filter.notCardTypeList) { - this.notCardTypeList.add(cType); - } + this.cardType.addAll(filter.cardType); + this.notCardTypeList.addAll(filter.notCardTypeList); this.scopeCardType = filter.scopeCardType; this.notCardType = filter.notCardType; this.notScopeCardType = filter.notScopeCardType; @@ -106,18 +102,12 @@ public class FilterObject> ex this.color = filter.color.copy(); this.scopeColor = filter.scopeColor; this.notColor = filter.notColor; - for (String fName: (List)filter.name) { - this.name.add(fName); - } + this.name.addAll(filter.name); this.notName = filter.notName; - for (String fSubtype: (List)filter.subtype) { - this.subtype.add(fSubtype); - } + this.subtype.addAll(filter.subtype); this.scopeSubtype = filter.scopeSubtype; this.notSubtype = filter.notSubtype; - for (String fSupertype: (List)filter.supertype) { - this.supertype.add(fSupertype); - } + this.supertype.addAll(filter.supertype); this.scopeSupertype = filter.scopeSupertype; this.notSupertype = filter.notSupertype; this.convertedManaCost = filter.convertedManaCost; diff --git a/Mage/src/mage/filter/FilterPermanent.java b/Mage/src/mage/filter/FilterPermanent.java index d1fd737eb4d..ed33c34546a 100644 --- a/Mage/src/mage/filter/FilterPermanent.java +++ b/Mage/src/mage/filter/FilterPermanent.java @@ -61,13 +61,9 @@ public class FilterPermanent> extends FilterObject< public FilterPermanent(final FilterPermanent filter) { super(filter); - for (UUID oId: filter.ownerId) { - this.ownerId.add(oId); - } + this.ownerId = new ArrayList(filter.ownerId); this.notOwner = filter.notOwner; - for (UUID oId: filter.controllerId) { - this.controllerId.add(oId); - } + this.controllerId = new ArrayList(filter.controllerId); this.notController = filter.notController; this.useTapped = filter.useTapped; this.tapped = filter.tapped; diff --git a/Mage/src/mage/filter/FilterPlayer.java b/Mage/src/mage/filter/FilterPlayer.java index 7df285d135e..eed926c93a6 100644 --- a/Mage/src/mage/filter/FilterPlayer.java +++ b/Mage/src/mage/filter/FilterPlayer.java @@ -52,9 +52,7 @@ public class FilterPlayer extends FilterImpl implements Fi public FilterPlayer(FilterPlayer filter) { super(filter); - for (UUID pId: filter.playerId) { - this.playerId.add(pId); - } + this.playerId.addAll(filter.playerId); this.notPlayer = filter.notPlayer; this.playerTarget = filter.playerTarget; } diff --git a/Mage/src/mage/filter/FilterStackObject.java b/Mage/src/mage/filter/FilterStackObject.java index 117a6a2c87c..5e456e87430 100644 --- a/Mage/src/mage/filter/FilterStackObject.java +++ b/Mage/src/mage/filter/FilterStackObject.java @@ -55,9 +55,7 @@ public class FilterStackObject> extends FilterObj public FilterStackObject(final FilterStackObject filter) { super(filter); - for (UUID cId: filter.controllerId) { - this.controllerId.add(cId); - } + this.controllerId.addAll(filter.controllerId); this.notController = filter.notController; this.controller = filter.controller; } diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index 0f80469ae1f..062d188bf16 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -145,6 +145,8 @@ public interface Game extends MageItem, Serializable { public void start(UUID choosingPlayerId); public void start(UUID choosingPlayerId, GameOptions options); public void resume(); + public void pause(); + public boolean isPaused(); public void end(); public void mulligan(UUID playerId); public void quit(UUID playerId); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index de4f196f364..0016bbc62d6 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -77,6 +77,7 @@ public abstract class GameImpl> implements Game, Serializa private final static transient Logger logger = Logger.getLogger(GameImpl.class); private static FilterAura filterAura = new FilterAura(); + private static FilterLegendaryPermanent filterLegendary = new FilterLegendaryPermanent(); private static FilterEquipment filterEquipment = new FilterEquipment(); private static FilterFortification filterFortification = new FilterFortification(); private static Random rnd = new Random(); @@ -125,6 +126,7 @@ public abstract class GameImpl> implements Game, Serializa this.gameCards = game.gameCards; this.simulation = game.simulation; this.gameOptions = game.gameOptions; + this.lki.putAll(game.lki); } @Override @@ -355,27 +357,44 @@ public abstract class GameImpl> implements Game, Serializa @Override public void resume() { - play(state.getActivePlayerId()); - } - - protected void play(UUID nextPlayerId) { - PlayerList players = state.getPlayerList(nextPlayerId); + PlayerList players = state.getPlayerList(state.getActivePlayerId()); Player player = getPlayer(players.get()); - while (!isGameOver()) { - state.setTurnNum(state.getTurnNum() + 1); + state.resume(); + if (!isGameOver()) { if (simulation) logger.info("Turn " + Integer.toString(state.getTurnNum())); fireInformEvent("Turn " + Integer.toString(state.getTurnNum())); if (checkStopOnTurnOption()) return; - state.setActivePlayerId(player.getId()); - state.getTurn().play(this, player.getId()); - if (isGameOver()) - break; - endOfTurn(); - player = players.getNext(this); + state.getTurn().resumePlay(this); + if (!isPaused() && !isGameOver()) { + endOfTurn(); + player = players.getNext(this); + state.setTurnNum(state.getTurnNum() + 1); + } } - - winnerId = findWinnersAndLosers(); + play(player.getId()); + } + + protected void play(UUID nextPlayerId) { + if (!isPaused() && !isGameOver()) { + PlayerList players = state.getPlayerList(nextPlayerId); + Player player = getPlayer(players.get()); + while (!isPaused() && !isGameOver()) { +// if (simulation) +// logger.info("Turn " + Integer.toString(state.getTurnNum())); + fireInformEvent("Turn " + Integer.toString(state.getTurnNum())); + if (checkStopOnTurnOption()) return; + state.setActivePlayerId(player.getId()); + state.getTurn().play(this, player.getId()); + if (isPaused() || isGameOver()) + break; + endOfTurn(); + player = players.getNext(this); + state.setTurnNum(state.getTurnNum() + 1); + } + } + if (isGameOver()) + winnerId = findWinnersAndLosers(); } private boolean checkStopOnTurnOption() { @@ -501,6 +520,16 @@ public abstract class GameImpl> implements Game, Serializa return playerId; } + @Override + public void pause() { + state.pause(); + } + + @Override + public boolean isPaused() { + return state.isPaused(); + } + @Override public void end() { state.endGame(); @@ -547,25 +576,25 @@ public abstract class GameImpl> implements Game, Serializa public void playPriority(UUID activePlayerId) { int bookmark = 0; try { - while (!isGameOver()) { + while (!isPaused() && !isGameOver()) { state.getPlayers().resetPassed(); state.getPlayerList().setCurrent(activePlayerId); Player player; - while (!isGameOver()) { + while (!isPaused() && !isGameOver()) { try { if (bookmark == 0) bookmark = bookmarkState(); player = getPlayer(state.getPlayerList().get()); state.setPriorityPlayerId(player.getId()); - while (!player.isPassed() && !player.hasLost() && !player.hasLeft() && !isGameOver()) { + while (!player.isPassed() && !player.hasLost() && !player.hasLeft() && !isPaused() && !isGameOver()) { checkStateAndTriggered(); - if (isGameOver()) return; + if (isPaused() || isGameOver()) return; // resetPassed should be called if player performs any action player.priority(this); - if (isGameOver()) return; + if (isPaused() || isGameOver()) return; applyEffects(); } - if (isGameOver()) return; + if (isPaused() || isGameOver()) return; if (allPassed()) { if (!state.getStack().isEmpty()) { //20091005 - 115.4 @@ -669,9 +698,9 @@ public abstract class GameImpl> implements Game, Serializa public boolean checkStateAndTriggered() { boolean somethingHappened = false; //20091005 - 115.5 - while (!this.isGameOver()) { + while (!isPaused() && !this.isGameOver()) { if (!checkStateBasedActions() ) { - if (this.isGameOver() || !checkTriggered()) { + if (isPaused() || this.isGameOver() || !checkTriggered()) { break; } } @@ -711,28 +740,127 @@ public abstract class GameImpl> implements Game, Serializa player.lost(this); } } - for (Permanent perm: getBattlefield().getAllActivePermanents(CardType.CREATURE)) { - //20091005 - 704.5f - if (perm.getToughness().getValue() == 0) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; + + List planeswalkers = new ArrayList(); + List legendary = new ArrayList(); + for (Permanent perm: getBattlefield().getAllActivePermanents()) { + if (perm.getCardType().contains(CardType.CREATURE)) { + //20091005 - 704.5f + if (perm.getToughness().getValue() == 0) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) { + somethingHappened = true; + continue; + } + } + //20091005 - 704.5g/704.5h + else if (perm.getToughness().getValue() <= perm.getDamage() || perm.isDeathtouched()) { + if (perm.destroy(null, this, false)) { + somethingHappened = true; + continue; + } + } + } + if (perm.getCardType().contains(CardType.PLANESWALKER)) { + //20091005 - 704.5i + if (perm.getCounters().getCount(CounterType.LOYALTY) == 0) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) { + somethingHappened = true; + continue; + } + } + planeswalkers.add(perm); + } + if (filterAura.match(perm)) { + //20091005 - 704.5n, 702.14c + if (perm.getAttachedTo() == null) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + else { + Target target = perm.getSpellAbility().getTargets().get(0); + if (target instanceof TargetPermanent) { + Permanent attachedTo = getPermanent(perm.getAttachedTo()); + if (attachedTo == null) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + else { + Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); + if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + } + } + else if (target instanceof TargetPlayer) { + Player attachedTo = getPlayer(perm.getAttachedTo()); + if (attachedTo == null) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + else { + Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); + if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + } + } + } + } + if (filterLegendary.match(perm)) + legendary.add(perm); + if (filterEquipment.match(perm)) { + //20091005 - 704.5p, 702.14d + if (perm.getAttachedTo() != null) { + Permanent creature = getPermanent(perm.getAttachedTo()); + if (creature == null) { + perm.attachTo(null, this); + } + else if (!creature.getCardType().contains(CardType.CREATURE) || creature.hasProtectionFrom(perm)) { + if (creature.removeAttachment(perm.getId(), this)) + somethingHappened = true; + } + } + } + if (filterFortification.match(perm)) { + if (perm.getAttachedTo() != null) { + Permanent land = getPermanent(perm.getAttachedTo()); + if (land == null) { + perm.attachTo(null, this); + } + else if (!land.getCardType().contains(CardType.LAND) || land.hasProtectionFrom(perm)) { + if (land.removeAttachment(perm.getId(), this)) + somethingHappened = true; + } + } + } + //20091005 - 704.5q + if (perm.getAttachments().size() > 0) { + for (UUID attachmentId: perm.getAttachments()) { + Permanent attachment = getPermanent(attachmentId); + if (attachment != null && !(attachment.getSubtype().contains("Aura") || + attachment.getSubtype().contains("Equipment") || + attachment.getSubtype().contains("Fortification"))) { + if (perm.removeAttachment(attachment.getId(), this)) + somethingHappened = true; + } + } } - //20091005 - 704.5g/704.5h - else if (perm.getToughness().getValue() <= perm.getDamage() || perm.isDeathtouched()) { - if (perm.destroy(null, this, false)) - somethingHappened = true; + + //20110501 - 704.5r + if (perm.getCounters().containsKey(CounterType.P1P1) && perm.getCounters().containsKey(CounterType.M1M1)) { + int p1p1 = perm.getCounters().getCount(CounterType.P1P1); + int m1m1 = perm.getCounters().getCount(CounterType.M1M1); + int min = Math.min(p1p1, m1m1); + perm.getCounters().removeCounter(CounterType.P1P1, min); + perm.getCounters().removeCounter(CounterType.M1M1, min); } - } - //20091005 - 704.5i - for (Permanent perm: getBattlefield().getAllActivePermanents(CardType.PLANESWALKER)) { - if (perm.getCounters().getCount(CounterType.LOYALTY) == 0) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - return true; - } - } + + } //20091005 - 704.5j, 801.14 - if (getBattlefield().contains(new FilterPlaneswalkerPermanent(), 2)) { //don't bother checking if less than 2 planeswalkers in play - for (Permanent planeswalker: getBattlefield().getAllActivePermanents(CardType.PLANESWALKER)) { + if (planeswalkers.size() > 1) { //don't bother checking if less than 2 planeswalkers in play + for (Permanent planeswalker: planeswalkers) { for (String planeswalkertype: planeswalker.getSubtype()) { FilterPlaneswalkerPermanent filterPlaneswalker = new FilterPlaneswalkerPermanent(); filterPlaneswalker.getSubtype().add(planeswalkertype); @@ -746,48 +874,9 @@ public abstract class GameImpl> implements Game, Serializa } } } - //20091005 - 704.5n, 702.14c - for (Permanent perm: getBattlefield().getAllActivePermanents(filterAura)) { - if (perm.getAttachedTo() == null) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - else { - Target target = perm.getSpellAbility().getTargets().get(0); - if (target instanceof TargetPermanent) { - Permanent attachedTo = getPermanent(perm.getAttachedTo()); - if (attachedTo == null) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - else { - Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); - if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - } - } - else if (target instanceof TargetPlayer) { - Player attachedTo = getPlayer(perm.getAttachedTo()); - if (attachedTo == null) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - else { - Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); - if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - } - } - } - } - FilterLegendaryPermanent filterLegendary = new FilterLegendaryPermanent(); //20091005 - 704.5k, 801.12 - if (getBattlefield().contains(filterLegendary, 2)) { //don't bother checking if less than 2 legends in play - for (Permanent legend: getBattlefield().getAllActivePermanents(filterLegendary)) { + if (legendary.size() > 1) { //don't bother checking if less than 2 legends in play + for (Permanent legend: legendary) { FilterLegendaryPermanent filterLegendName = new FilterLegendaryPermanent(); filterLegendName.getName().add(legend.getName()); if (getBattlefield().contains(filterLegendName, legend.getControllerId(), this, 2)) { @@ -798,55 +887,6 @@ public abstract class GameImpl> implements Game, Serializa } } } - //20091005 - 704.5p, 702.14d - for (Permanent perm: getBattlefield().getAllActivePermanents(filterEquipment)) { - if (perm.getAttachedTo() != null) { - Permanent creature = getPermanent(perm.getAttachedTo()); - if (creature == null) { - perm.attachTo(null, this); - } - else if (!creature.getCardType().contains(CardType.CREATURE) || creature.hasProtectionFrom(perm)) { - if (creature.removeAttachment(perm.getId(), this)) - somethingHappened = true; - } - } - } - for (Permanent perm: getBattlefield().getAllActivePermanents(filterFortification)) { - if (perm.getAttachedTo() != null) { - Permanent land = getPermanent(perm.getAttachedTo()); - if (land == null) { - perm.attachTo(null, this); - } - else if (!land.getCardType().contains(CardType.LAND) || land.hasProtectionFrom(perm)) { - if (land.removeAttachment(perm.getId(), this)) - somethingHappened = true; - } - } - } - //20091005 - 704.5q - for (Permanent perm: getBattlefield().getAllActivePermanents()) { - if (perm.getAttachments().size() > 0) { - for (UUID attachmentId: perm.getAttachments()) { - Permanent attachment = getPermanent(attachmentId); - if (attachment != null && !(attachment.getSubtype().contains("Aura") || - attachment.getSubtype().contains("Equipment") || - attachment.getSubtype().contains("Fortification"))) { - if (perm.removeAttachment(attachment.getId(), this)) - return true; - } - } - } - } - //20110501 - 704.5r - for (Permanent perm: getBattlefield().getAllActivePermanents()) { - if (perm.getCounters().containsKey(CounterType.P1P1) && perm.getCounters().containsKey(CounterType.M1M1)) { - int p1p1 = perm.getCounters().getCount(CounterType.P1P1); - int m1m1 = perm.getCounters().getCount(CounterType.M1M1); - int min = Math.min(p1p1, m1m1); - perm.getCounters().removeCounter(CounterType.P1P1, min); - perm.getCounters().removeCounter(CounterType.M1M1, min); - } - } //TODO: implement the rest diff --git a/Mage/src/mage/game/GameState.java b/Mage/src/mage/game/GameState.java index c7aab310924..47db0a533cc 100644 --- a/Mage/src/mage/game/GameState.java +++ b/Mage/src/mage/game/GameState.java @@ -85,8 +85,9 @@ public class GameState implements Serializable, Copyable { private Revealed revealed; private Map lookedAt = new HashMap(); private Battlefield battlefield; - private int turnNum; + private int turnNum = 1; private boolean gameOver; + private boolean paused; // private List messages = new ArrayList(); private ContinuousEffects effects; private TriggeredAbilities triggers; @@ -128,9 +129,7 @@ public class GameState implements Serializable, Copyable { this.command = state.command.copy(); this.exile = state.exile.copy(); this.revealed = state.revealed.copy(); - for (Map.Entry entry: state.lookedAt.entrySet()) { - lookedAt.put(entry.getKey(), entry.getValue()); - } + this.lookedAt.putAll(state.lookedAt); this.battlefield = state.battlefield.copy(); this.turnNum = state.turnNum; this.gameOver = state.gameOver; @@ -141,13 +140,8 @@ public class GameState implements Serializable, Copyable { this.combat = state.combat.copy(); this.turnMods = state.turnMods.copy(); this.watchers = state.watchers.copy(); - for (Map.Entry entry : state.values.entrySet()) { - values.put(entry.getKey(), entry.getValue()); - //TODO: might have to change value to Copyable - } - for (Map.Entry entry: state.zones.entrySet()) { - zones.put(entry.getKey(), entry.getValue()); - } + this.values.putAll(state.values); + this.zones.putAll(state.zones); for (Map.Entry> entry: state.otherAbilities.entrySet()) { otherAbilities.put(entry.getKey(), entry.getValue().copy()); } @@ -457,4 +451,16 @@ public class GameState implements Serializable, Copyable { zones.clear(); } + public void pause() { + this.paused = true; + } + + public void resume() { + this.paused = false; + } + + public boolean isPaused() { + return this.paused; + } + } diff --git a/Mage/src/mage/game/combat/Combat.java b/Mage/src/mage/game/combat/Combat.java index 76b57344b73..a0604c105e0 100644 --- a/Mage/src/mage/game/combat/Combat.java +++ b/Mage/src/mage/game/combat/Combat.java @@ -66,9 +66,7 @@ public class Combat implements Serializable, Copyable { for (CombatGroup group : combat.groups) { groups.add(group.copy()); } - for (UUID defenderId : combat.defenders) { - defenders.add(defenderId); - } + defenders.addAll(combat.defenders); for (Map.Entry group : combat.blockingGroups.entrySet()) { blockingGroups.put(group.getKey(), group.getValue()); } @@ -128,6 +126,8 @@ public class Combat implements Serializable, Copyable { //20101001 - 508.1d checkAttackRequirements(player, game); player.selectAttackers(game); + if (game.isPaused() || game.isGameOver()) + return; for (CombatGroup group: groups) { for (UUID attacker: group.getAttackers()) { game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ATTACKER_DECLARED, group.defenderId, attacker, attackerId)); @@ -169,6 +169,8 @@ public class Combat implements Serializable, Copyable { checkBlockRequirements(player, game); for (UUID defenderId : getPlayerDefenders(game)) { game.getPlayer(defenderId).selectBlockers(game); + if (game.isPaused() || game.isGameOver()) + return; game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defenderId, defenderId)); } } diff --git a/Mage/src/mage/game/combat/CombatGroup.java b/Mage/src/mage/game/combat/CombatGroup.java index c511cd8697b..bc2dd6c1d9a 100644 --- a/Mage/src/mage/game/combat/CombatGroup.java +++ b/Mage/src/mage/game/combat/CombatGroup.java @@ -67,21 +67,11 @@ public class CombatGroup implements Serializable, Copyable { this.blocked = group.blocked; this.defenderId = group.defenderId; this.defenderIsPlaneswalker = group.defenderIsPlaneswalker; - for (UUID attackerId: group.attackers) { - this.attackers.add(attackerId); - } - for (UUID blockerId: group.blockers) { - this.blockers.add(blockerId); - } - for (UUID orderId: group.blockerOrder) { - this.blockerOrder.add(orderId); - } - for (UUID orderId: group.attackerOrder) { - this.attackerOrder.add(orderId); - } - for (Map.Entry entry : group.players.entrySet()) { - players.put(entry.getKey(), entry.getValue()); - } + this.attackers.addAll(group.attackers); + this.blockers.addAll(group.blockers); + this.blockerOrder.addAll(group.blockerOrder); + this.attackerOrder.addAll(group.attackerOrder); + this.players.putAll(group.players); } protected String getValue(Game game) { diff --git a/Mage/src/mage/game/permanent/PermanentCard.java b/Mage/src/mage/game/permanent/PermanentCard.java index 68de9720162..bc879b207a7 100644 --- a/Mage/src/mage/game/permanent/PermanentCard.java +++ b/Mage/src/mage/game/permanent/PermanentCard.java @@ -157,7 +157,7 @@ public class PermanentCard extends PermanentImpl { @Override public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag) { - Zone fromZone = game.getZone(objectId); + Zone fromZone = game.getState().getZone(objectId); Player controller = game.getPlayer(controllerId); if (controller != null && controller.removeFromBattlefield(this, game)) { ZoneChangeEvent event = new ZoneChangeEvent(this, sourceId, controllerId, fromZone, toZone); @@ -187,7 +187,7 @@ public class PermanentCard extends PermanentImpl { } game.setZone(objectId, event.getToZone()); game.fireEvent(event); - return game.getZone(objectId) == toZone; + return game.getState().getZone(objectId) == toZone; } } } @@ -197,7 +197,7 @@ public class PermanentCard extends PermanentImpl { @Override public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game) { - Zone fromZone = game.getZone(objectId); + Zone fromZone = game.getState().getZone(objectId); Player controller = game.getPlayer(controllerId); if (controller != null && controller.removeFromBattlefield(this, game)) { ZoneChangeEvent event = new ZoneChangeEvent(this, sourceId, ownerId, fromZone, Zone.EXILED); diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 56b52a19f66..cb95e4d4e18 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -112,20 +112,11 @@ public abstract class PermanentImpl> extends CardImpl this.loyaltyUsed = permanent.loyaltyUsed; this.deathtouched = permanent.deathtouched; this.counters = permanent.counters.copy(); - for (UUID attachmentId : permanent.attachments) { - this.attachments.add(attachmentId); - } - for (UUID imprintedId : permanent.imprinted) { - this.imprinted.add(imprintedId); - } - for (UUID connectedCardId : permanent.connectedCards) { - this.connectedCards.add(connectedCardId); - } + this.attachments.addAll(permanent.attachments); + this.imprinted.addAll(permanent.imprinted); + this.connectedCards.addAll(permanent.connectedCards); if (permanent.dealtDamageByThisTurn != null) { - dealtDamageByThisTurn = new ArrayList(); - for (UUID sourceId : permanent.dealtDamageByThisTurn) { - this.dealtDamageByThisTurn.add(sourceId); - } + dealtDamageByThisTurn = new ArrayList(permanent.dealtDamageByThisTurn); if (permanent.markedDamage != null) { markedDamage = new ArrayList(); for (Counter counter : permanent.markedDamage) { diff --git a/Mage/src/mage/game/stack/Spell.java b/Mage/src/mage/game/stack/Spell.java index 7dec2195327..d925e7471fe 100644 --- a/Mage/src/mage/game/stack/Spell.java +++ b/Mage/src/mage/game/stack/Spell.java @@ -135,16 +135,18 @@ public class Spell> implements StackObject, Card { */ private void updateOptionalCosts() { Ability abilityOrig = card.getAbilities().get(ability.getId()); - for (Object object : ability.getOptionalCosts()) { - Cost cost = (Cost) object; - for (Cost costOrig : abilityOrig.getOptionalCosts()) { - if (cost.getId().equals(costOrig.getId())) { - if (cost.isPaid()) { - costOrig.setPaid(); - } else { - costOrig.clearPaid(); + if (abilityOrig != null) { + for (Object object : ability.getOptionalCosts()) { + Cost cost = (Cost) object; + for (Cost costOrig : abilityOrig.getOptionalCosts()) { + if (cost.getId().equals(costOrig.getId())) { + if (cost.isPaid()) { + costOrig.setPaid(); + } else { + costOrig.clearPaid(); + } + break; } - break; } } } diff --git a/Mage/src/mage/game/stack/SpellStack.java b/Mage/src/mage/game/stack/SpellStack.java index d05d6385003..a56c85ffff0 100644 --- a/Mage/src/mage/game/stack/SpellStack.java +++ b/Mage/src/mage/game/stack/SpellStack.java @@ -32,13 +32,12 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Stack; import java.util.UUID; import mage.Constants.Zone; import mage.abilities.Ability; -import mage.abilities.effects.Effect; import mage.abilities.effects.ReplacementEffect; -import mage.cards.Card; import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; @@ -105,15 +104,9 @@ public class SpellStack extends Stack { boolean caught = false; Map rEffects = new LinkedHashMap(); for (StackObject stackObject: this) { - for (Ability ability: stackObject.getAbilities()) { - if (ability.getZone() == Zone.STACK) { - for (Effect effect: ability.getEffects()) { - if (effect instanceof ReplacementEffect) { - if (((ReplacementEffect)effect).applies(event, ability, game)) - rEffects.put((ReplacementEffect) effect, ability); - } - } - } + for (Entry entry: stackObject.getAbilities().getReplacementEffects(Zone.STACK).entrySet()) { + if (entry.getKey().applies(event, entry.getValue(), game)) + rEffects.put(entry.getKey(), entry.getValue()); } } if (rEffects.size() > 0) { diff --git a/Mage/src/mage/game/turn/EndPhase.java b/Mage/src/mage/game/turn/EndPhase.java index 3b4546b4483..3aa441ecd04 100644 --- a/Mage/src/mage/game/turn/EndPhase.java +++ b/Mage/src/mage/game/turn/EndPhase.java @@ -54,16 +54,16 @@ public class EndPhase extends Phase { } @Override - protected void playStep(Game game, UUID activePlayerId) { + protected void playStep(Game game) { if (currentStep.getType() == PhaseStep.CLEANUP) { currentStep.beginStep(game, activePlayerId); if (game.checkStateAndTriggered()) { - playStep(game, activePlayerId); + playStep(game); } currentStep.endStep(game, activePlayerId); } else - super.playStep(game, activePlayerId); + super.playStep(game); } @Override diff --git a/Mage/src/mage/game/turn/Phase.java b/Mage/src/mage/game/turn/Phase.java index eae89258630..6a14c3961e8 100644 --- a/Mage/src/mage/game/turn/Phase.java +++ b/Mage/src/mage/game/turn/Phase.java @@ -30,6 +30,7 @@ package mage.game.turn; import java.io.Serializable; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.UUID; import mage.Constants.PhaseStep; @@ -93,7 +94,7 @@ public abstract class Phase> implements Serializable { } public boolean play(Game game, UUID activePlayerId) { - if (game.isGameOver()) + if (game.isPaused() || game.isGameOver()) return false; this.activePlayerId = activePlayerId; @@ -101,12 +102,14 @@ public abstract class Phase> implements Serializable { if (beginPhase(game, activePlayerId)) { for (Step step: steps) { - if (game.isGameOver()) + if (game.isPaused() || game.isGameOver()) return false; currentStep = step; if (!game.getState().getTurnMods().skipStep(activePlayerId, currentStep.getType())) - playStep(game, activePlayerId); + playStep(game); } + if (game.isPaused() || game.isGameOver()) + return false; count++; endPhase(game, activePlayerId); return true; @@ -114,6 +117,34 @@ public abstract class Phase> implements Serializable { return false; } + public boolean resumePlay(Game game, PhaseStep stepType) { + if (game.isPaused() || game.isGameOver()) + return false; + + this.activePlayerId = game.getActivePlayerId(); + Iterator it = steps.iterator(); + Step step; + do { + step = it.next(); + currentStep = step; + } while (step.getType() != stepType); + resumeStep(game); + while (it.hasNext()) { + step = it.next(); + if (game.isPaused() || game.isGameOver()) + return false; + currentStep = step; + if (!game.getState().getTurnMods().skipStep(activePlayerId, currentStep.getType())) + playStep(game); + } + + if (game.isPaused() || game.isGameOver()) + return false; + count++; + endPhase(game, activePlayerId); + return true; + } + public boolean beginPhase(Game game, UUID activePlayerId) { if (!game.replaceEvent(new GameEvent(event, null, null, activePlayerId))) { game.fireEvent(new GameEvent(preEvent, null, null, activePlayerId)); @@ -138,21 +169,36 @@ public abstract class Phase> implements Serializable { playExtraSteps(game, currentStep.getType()); } - protected void playStep(Game game, UUID activePlayerId) { + protected void playStep(Game game) { if (!currentStep.skipStep(game, activePlayerId)) { prePriority(game, activePlayerId); - currentStep.priority(game, activePlayerId); - postPriority(game, activePlayerId); + if (!game.isPaused() && !game.isGameOver()) + currentStep.priority(game, activePlayerId); + if (!game.isPaused() && !game.isGameOver()) + postPriority(game, activePlayerId); } } + protected void resumeStep(Game game) { + switch (currentStep.getStepPart()) { + case PRE: + prePriority(game, activePlayerId); + case PRIORITY: + if (!game.isPaused() && !game.isGameOver()) + currentStep.priority(game, activePlayerId); + case POST: + if (!game.isPaused() && !game.isGameOver()) + postPriority(game, activePlayerId); + } + } + private void playExtraSteps(Game game, PhaseStep afterStep) { while (true) { Step extraStep = game.getState().getTurnMods().extraStep(activePlayerId, afterStep); if (extraStep == null) return; currentStep = extraStep; - playStep(game, activePlayerId); + playStep(game); } } diff --git a/Mage/src/mage/game/turn/Step.java b/Mage/src/mage/game/turn/Step.java index 62f7fa6ddea..9fb4d12455d 100644 --- a/Mage/src/mage/game/turn/Step.java +++ b/Mage/src/mage/game/turn/Step.java @@ -46,6 +46,11 @@ public abstract class Step> implements Serializable { protected EventType stepEvent; protected EventType preStepEvent; protected EventType postStepEvent; + protected StepPart stepPart; + + public enum StepPart { + PRE, PRIORITY, POST; + } public abstract T copy(); @@ -60,6 +65,7 @@ public abstract class Step> implements Serializable { this.stepEvent = step.stepEvent; this.preStepEvent = step.preStepEvent; this.postStepEvent = step.postStepEvent; + this.stepPart = step.stepPart; } public PhaseStep getType() { @@ -67,15 +73,19 @@ public abstract class Step> implements Serializable { } public void beginStep(Game game, UUID activePlayerId) { + stepPart = StepPart.PRE; game.fireEvent(new GameEvent(preStepEvent, null, null, activePlayerId)); } public void priority(Game game, UUID activePlayerId) { - if (hasPriority) + if (hasPriority) { + stepPart = StepPart.PRIORITY; game.playPriority(activePlayerId); + } } public void endStep(Game game, UUID activePlayerId) { + stepPart = StepPart.POST; game.fireEvent(new GameEvent(postStepEvent, null, null, activePlayerId)); } @@ -87,4 +97,8 @@ public abstract class Step> implements Serializable { return this.hasPriority; } + public StepPart getStepPart() { + return stepPart; + } + } diff --git a/Mage/src/mage/game/turn/Turn.java b/Mage/src/mage/game/turn/Turn.java index 5135d267c97..9702988235c 100644 --- a/Mage/src/mage/game/turn/Turn.java +++ b/Mage/src/mage/game/turn/Turn.java @@ -30,6 +30,7 @@ package mage.game.turn; import java.io.Serializable; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.UUID; import mage.Constants.PhaseStep; @@ -100,8 +101,8 @@ public class Turn implements Serializable { return null; } - public void play(Game game, UUID activePlayerId) { - if (game.isGameOver()) + public void play(Game game, UUID activePlayerId) { + if (game.isPaused() || game.isGameOver()) return; if (game.getState().getTurnMods().skipTurn(activePlayerId)) @@ -113,7 +114,7 @@ public class Turn implements Serializable { resetCounts(); game.getPlayer(activePlayerId).beginTurn(game); for (Phase phase: phases) { - if (game.isGameOver()) + if (game.isPaused() || game.isGameOver()) return; currentPhase = phase; if (!game.getState().getTurnMods().skipPhase(activePlayerId, currentPhase.getType())) { @@ -132,6 +133,44 @@ public class Turn implements Serializable { playExtraTurns(game); } + public void resumePlay(Game game) { + activePlayerId = game.getActivePlayerId(); + UUID priorityPlayerId = game.getPriorityPlayerId(); + TurnPhase phaseType = game.getPhase().getType(); + PhaseStep stepType = game.getStep().getType(); + + Iterator it = phases.iterator(); + Phase phase; + do { + phase = it.next(); + currentPhase = phase; + } while (phase.type != phaseType); + if (phase.resumePlay(game, stepType)) { + //20091005 - 500.4/703.4n + game.emptyManaPools(); + game.saveState(); + //20091005 - 500.8 + playExtraPhases(game, phase.getType()); + } + while (it.hasNext()) { + phase = it.next(); + if (game.isPaused() || game.isGameOver()) + return; + currentPhase = phase; + if (!game.getState().getTurnMods().skipPhase(activePlayerId, currentPhase.getType())) { + if (phase.play(game, activePlayerId)) { + //20091005 - 500.4/703.4n + game.emptyManaPools(); + game.saveState(); + //20091005 - 500.8 + playExtraPhases(game, phase.getType()); + } + } + if (!currentPhase.equals(phase)) // phase was changed from the card + break; + } + } + private void checkTurnIsControlledByOtherPlayer(Game game, UUID activePlayerId) { UUID newControllerId = game.getState().getTurnMods().controlsTurn(activePlayerId); if (newControllerId != null && !newControllerId.equals(activePlayerId)) { diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 43f08988a73..1438d5015b7 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -154,9 +154,8 @@ public abstract class PlayerImpl> implements Player, Ser this.range = player.range; this.canGainLife = player.canGainLife; this.canLoseLife = player.canLoseLife; - for (UUID id: player.inRange) { - this.inRange.add(id); - } + this.attachments.addAll(player.attachments); + this.inRange.addAll(player.inRange); this.userData = player.userData; } @@ -504,7 +503,7 @@ public abstract class PlayerImpl> implements Player, Ser if (card != null) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.CAST_SPELL, ability.getId(), ability.getSourceId(), playerId))) { int bookmark = game.bookmarkState(); - Zone fromZone = game.getZone(card.getId()); + Zone fromZone = game.getState().getZone(card.getId()); card.cast(game, fromZone, ability, playerId); Ability spellAbility = game.getStack().getSpell(ability.getId()).getSpellAbility(); @@ -530,7 +529,7 @@ public abstract class PlayerImpl> implements Player, Ser //20091005 - 305.1 if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), playerId))) { int bookmark = game.bookmarkState(); - Zone zone = game.getZone(card.getId()); + Zone zone = game.getState().getZone(card.getId()); switch (zone) { case HAND: removeFromHand(card, game); @@ -541,6 +540,9 @@ public abstract class PlayerImpl> implements Player, Ser case GRAVEYARD: removeFromGraveyard(card, game); break; + default: + // invalid zone for play land + return false; } if (card.putOntoBattlefield(game, zone, null, playerId)) { diff --git a/Mage/src/mage/target/TargetImpl.java b/Mage/src/mage/target/TargetImpl.java index b662bf23ff3..9b2ddcb4725 100644 --- a/Mage/src/mage/target/TargetImpl.java +++ b/Mage/src/mage/target/TargetImpl.java @@ -76,9 +76,7 @@ public abstract class TargetImpl> implements Target { this.minNumberOfTargets = target.minNumberOfTargets; this.required = target.required; this.chosen = target.chosen; - for (Entry entry: target.targets.entrySet()) { - targets.put(entry.getKey(), entry.getValue()); - } + this.targets.putAll(target.targets); } @Override diff --git a/Mage/src/mage/target/TargetObject.java b/Mage/src/mage/target/TargetObject.java index b7be81f5fc3..38a3d1e2573 100644 --- a/Mage/src/mage/target/TargetObject.java +++ b/Mage/src/mage/target/TargetObject.java @@ -74,7 +74,7 @@ public abstract class TargetObject> extends TargetImpl @Override public boolean canTarget(UUID id, Game game) { MageObject object = game.getObject(id); - if (object != null && game.getZone(id).match(zone)) + if (object != null && game.getState().getZone(id).match(zone)) return getFilter().match(object); return false; } diff --git a/Mage/src/mage/target/TargetPermanent.java b/Mage/src/mage/target/TargetPermanent.java index c98f0a89ca0..aab3c935c2c 100644 --- a/Mage/src/mage/target/TargetPermanent.java +++ b/Mage/src/mage/target/TargetPermanent.java @@ -146,7 +146,8 @@ public class TargetPermanent> extends TargetObject< int remainingTargets = this.minNumberOfTargets - targets.size(); if (remainingTargets == 0) { // if we return true, then AnowonTheRuinSage will hang for AI when no targets in play - return false; + // TODO: retest Anowon the Ruin Sage + return true; } int count = 0; for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, game)) { diff --git a/Mage/src/mage/target/common/TargetCardInExile.java b/Mage/src/mage/target/common/TargetCardInExile.java index e1fa9f04d60..38856ee942f 100644 --- a/Mage/src/mage/target/common/TargetCardInExile.java +++ b/Mage/src/mage/target/common/TargetCardInExile.java @@ -62,7 +62,7 @@ public class TargetCardInExile extends TargetCard { @Override public boolean canTarget(UUID id, Ability source, Game game) { Card card = game.getCard(id); - if (card != null && game.getZone(card.getId()) == Zone.EXILED) { + if (card != null && game.getState().getZone(card.getId()) == Zone.EXILED) { ExileZone exile; if (zoneId != null) { exile = game.getExile().getExileZone(zoneId); diff --git a/Mage/src/mage/target/common/TargetCardInGraveyard.java b/Mage/src/mage/target/common/TargetCardInGraveyard.java index a72bbcfc2b9..866d11d691f 100644 --- a/Mage/src/mage/target/common/TargetCardInGraveyard.java +++ b/Mage/src/mage/target/common/TargetCardInGraveyard.java @@ -66,7 +66,7 @@ public class TargetCardInGraveyard extends TargetCard { @Override public boolean canTarget(UUID id, Ability source, Game game) { Card card = game.getCard(id); - if (card != null && game.getZone(card.getId()) == Zone.GRAVEYARD) + if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) return filter.match(card); return false; } diff --git a/Mage/src/mage/target/common/TargetCardInOpponentsGraveyard.java b/Mage/src/mage/target/common/TargetCardInOpponentsGraveyard.java index 85d1fe2446d..840f844e20e 100644 --- a/Mage/src/mage/target/common/TargetCardInOpponentsGraveyard.java +++ b/Mage/src/mage/target/common/TargetCardInOpponentsGraveyard.java @@ -28,7 +28,7 @@ public class TargetCardInOpponentsGraveyard extends TargetCard