diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 5774af64922..8c8a7a4948c 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -311,7 +311,6 @@ public class MageFrame extends javax.swing.JFrame { String server = prefs.get("serverAddress", ""); int port = Integer.parseInt(prefs.get("serverPort", "")); try { - server = "192.168.121.201"; setCursor(new Cursor(Cursor.WAIT_CURSOR)); if (MageFrame.connect(userName, server, port)) { return true; diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java index 44d03f440f3..5923c208414 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java @@ -317,6 +317,7 @@ public class ComputerPlayer> extends PlayerImpl i break; case DRAW: logState(game); + break; case PRECOMBAT_MAIN: findPlayables(game); if (playableAbilities.size() > 0) { @@ -336,10 +337,14 @@ public class ComputerPlayer> extends PlayerImpl i } break; case DECLARE_BLOCKERS: + findPlayables(game); playRemoval(game.getCombat().getBlockers(), game); playDamage(game.getCombat().getBlockers(), game); + break; case END_COMBAT: + findPlayables(game); playDamage(game.getCombat().getBlockers(), game); + break; case POSTCOMBAT_MAIN: findPlayables(game); if (game.getStack().isEmpty()) { @@ -370,11 +375,16 @@ public class ComputerPlayer> extends PlayerImpl i switch (game.getTurn().getStepType()) { case UPKEEP: findPlayables(game); + break; case DECLARE_ATTACKERS: + findPlayables(game); playRemoval(game.getCombat().getAttackers(), game); playDamage(game.getCombat().getAttackers(), game); + break; case END_COMBAT: + findPlayables(game); playDamage(game.getCombat().getAttackers(), game); + break; } } pass(); diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index c5355da7b5c..e7b4c9190c3 100644 Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ diff --git a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java index a53123d1c4b..b6cf359924f 100644 --- a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java +++ b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java @@ -99,7 +99,7 @@ class QuenchableFireEffect extends OneShotEffect { delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.getTargets().addAll(source.getTargets()); - game.getState().addDelayedTriggeredAbility(delayedAbility); + game.addDelayedTriggeredAbility(delayedAbility); //create special action QuenchableFireSpecialAction newAction = new QuenchableFireSpecialAction(delayedAbility.getId()); delayedAbility.setSpecialActionId(newAction.getId()); diff --git a/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java b/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java index c0f7dae75ed..7efc9681325 100644 --- a/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java +++ b/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java @@ -106,7 +106,7 @@ class MystifyingMazeEffect extends OneShotEffect { MystifyingMazeDelayedTriggeredAbility delayedAbility = new MystifyingMazeDelayedTriggeredAbility(source.getSourceId()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); - game.getState().addDelayedTriggeredAbility(delayedAbility); + game.addDelayedTriggeredAbility(delayedAbility); return true; } } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java index a67f35f2f25..bf8d67c5da4 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java @@ -142,7 +142,7 @@ class GideonJuraEffect extends RequirementAttackEffect { if (player != null) { for (Permanent creature: game.getBattlefield().getAllActivePermanents(new FilterCreatureForCombat(), player.getId())) { if (creature.canAttack(game)) { - game.getCombat().declareAttacker(creature.getId(), source.getControllerId(), game); + game.getCombat().declareAttacker(creature.getId(), source.getSourceId(), game); } } return true; diff --git a/Mage.Sets/src/mage/sets/tenth/Condemn.java b/Mage.Sets/src/mage/sets/tenth/Condemn.java index 74060f6e9a8..8fe5533f6e8 100644 --- a/Mage.Sets/src/mage/sets/tenth/Condemn.java +++ b/Mage.Sets/src/mage/sets/tenth/Condemn.java @@ -52,8 +52,8 @@ public class Condemn extends CardImpl { this.expansionSetCode = "10E"; this.color.setWhite(true); this.getSpellAbility().addTarget(new TargetAttackingCreature()); - this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(false)); this.getSpellAbility().addEffect(new CondemnEffect()); + this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(false)); } diff --git a/Mage.Sets/src/mage/sets/tenth/Pacifism.java b/Mage.Sets/src/mage/sets/tenth/Pacifism.java index 357564338d1..336a37a3830 100644 --- a/Mage.Sets/src/mage/sets/tenth/Pacifism.java +++ b/Mage.Sets/src/mage/sets/tenth/Pacifism.java @@ -110,10 +110,10 @@ class PacifismEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { - Permanent enchantment = game.getPermanent(source.getSourceId()); - if (enchantment != null && enchantment.getAttachedTo() != null) { - if (source.getSourceId().equals(enchantment.getAttachedTo())) { - if (event.getType() == EventType.DECLARE_ATTACKER || event.getType() == EventType.DECLARE_BLOCKER) { + if (event.getType() == EventType.DECLARE_ATTACKER || event.getType() == EventType.DECLARE_BLOCKER) { + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null && enchantment.getAttachedTo() != null) { + if (event.getSourceId().equals(enchantment.getAttachedTo())) { return true; } } diff --git a/Mage/src/mage/abilities/Ability.java b/Mage/src/mage/abilities/Ability.java index 89eb2a9db82..ab37daa5358 100644 --- a/Mage/src/mage/abilities/Ability.java +++ b/Mage/src/mage/abilities/Ability.java @@ -50,6 +50,7 @@ import mage.target.Targets; public interface Ability extends Serializable { public UUID getId(); + public void newId(); public AbilityType getAbilityType(); public UUID getControllerId(); public UUID getSourceId(); diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index 0601203ab3b..c41cadc3a4e 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -116,6 +116,11 @@ public abstract class AbilityImpl> implements Ability { return id; } + @Override + public void newId() { + this.id = UUID.randomUUID(); + } + @Override public AbilityType getAbilityType() { return this.abilityType; diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index 5c7bdd7ab53..34b04ac49d9 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -382,32 +382,24 @@ public class ContinuousEffects implements Serializable { public void addEffect(ContinuousEffect effect, Ability source) { switch (effect.getEffectType()) { case REPLACEMENT: - ReplacementEffect newReplacementEffect = (ReplacementEffect)effect.copy(); - newReplacementEffect.setTimestamp(); - newReplacementEffect.newId(); + ReplacementEffect newReplacementEffect = (ReplacementEffect)effect; replacementEffects.add(newReplacementEffect); - abilityMap.put(newReplacementEffect.getId(), source.copy()); + abilityMap.put(newReplacementEffect.getId(), source); break; case PREVENTION: - PreventionEffect newPreventionEffect = (PreventionEffect)effect.copy(); - newPreventionEffect.setTimestamp(); - newPreventionEffect.newId(); + PreventionEffect newPreventionEffect = (PreventionEffect)effect; preventionEffects.add(newPreventionEffect); - abilityMap.put(newPreventionEffect.getId(), source.copy()); + abilityMap.put(newPreventionEffect.getId(), source); break; case ASTHOUGH: - AsThoughEffect newAsThoughEffect = (AsThoughEffect)effect.copy(); - newAsThoughEffect.setTimestamp(); - newAsThoughEffect.newId(); + AsThoughEffect newAsThoughEffect = (AsThoughEffect)effect; asThoughEffects.add(newAsThoughEffect); - abilityMap.put(newAsThoughEffect.getId(), source.copy()); + abilityMap.put(newAsThoughEffect.getId(), source); break; default: - ContinuousEffect newEffect = (ContinuousEffect)effect.copy(); - newEffect.setTimestamp(); - newEffect.newId(); + ContinuousEffect newEffect = (ContinuousEffect)effect; layeredEffects.add(newEffect); - abilityMap.put(newEffect.getId(), source.copy()); + abilityMap.put(newEffect.getId(), source); break; } } diff --git a/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java b/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java index e8f65229ce4..d2037038311 100644 --- a/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java +++ b/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java @@ -62,7 +62,7 @@ public class CreateDelayedTriggeredAbilityEffect extends OneShotEffect { public FilterAttackingCreature() { - this(""); + this("attacking creature"); } public FilterAttackingCreature(String name) { diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index 024188000b3..952c43e4cca 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -41,6 +41,7 @@ import mage.Constants.Zone; import mage.MageItem; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; +import mage.abilities.DelayedTriggeredAbility; import mage.abilities.TriggeredAbilities; import mage.abilities.TriggeredAbility; import mage.abilities.effects.ContinuousEffect; @@ -138,6 +139,7 @@ public interface Game extends MageItem, Serializable { public void emptyManaPools(); public void addEffect(ContinuousEffect continuousEffect, Ability source); public void addTriggeredAbility(TriggeredAbility ability); + public void addDelayedTriggeredAbility(DelayedTriggeredAbility delayedAbility); public void applyEffects(); public boolean checkStateAndTriggered(); public void playPriority(UUID activePlayerId); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 182107d0d40..245756901c4 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -49,6 +49,7 @@ import mage.Constants.Zone; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; +import mage.abilities.DelayedTriggeredAbility; import mage.abilities.TriggeredAbilities; import mage.abilities.TriggeredAbility; import mage.abilities.effects.ContinuousEffect; @@ -503,15 +504,28 @@ public abstract class GameImpl> implements Game, Serializa @Override public void addEffect(ContinuousEffect continuousEffect, Ability source) { - continuousEffect.init(source, this); - state.addEffect(continuousEffect, source); + ContinuousEffect newEffect = (ContinuousEffect)continuousEffect.copy(); + Ability newAbility = source.copy(); + newEffect.newId(); + newEffect.setTimestamp(); + newEffect.init(newAbility, this); + state.addEffect(newEffect, newAbility); } @Override public void addTriggeredAbility(TriggeredAbility ability) { - state.addTriggeredAbility((TriggeredAbility) ability.copy()); + TriggeredAbility newAbility = (TriggeredAbility) ability.copy(); + newAbility.newId(); + state.addTriggeredAbility(newAbility); } + @Override + public void addDelayedTriggeredAbility(DelayedTriggeredAbility delayedAbility) { + DelayedTriggeredAbility newAbility = (DelayedTriggeredAbility) delayedAbility.copy(); + newAbility.newId(); + state.addDelayedTriggeredAbility(newAbility); + } + @Override public boolean checkStateAndTriggered() { boolean somethingHappened = false; diff --git a/Mage/src/mage/game/stack/StackAbility.java b/Mage/src/mage/game/stack/StackAbility.java index 1f052b115c1..2228a4e878d 100644 --- a/Mage/src/mage/game/stack/StackAbility.java +++ b/Mage/src/mage/game/stack/StackAbility.java @@ -287,4 +287,9 @@ public class StackAbility implements StackObject, Ability { return true; } + @Override + public void newId() { + throw new UnsupportedOperationException("Not supported yet."); + } + } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 128e1f328f1..40dd4e3f137 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -415,6 +415,7 @@ public abstract class PlayerImpl> implements Player, Ser //20091005 - 602.2a if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY, ability.getSourceId(), ability.getId(), playerId))) { game.bookmarkState(); + ability.newId(); game.getStack().push(new StackAbility(ability, playerId)); String message = ability.getActivatedMessage(game); if (ability.activate(game, false)) { diff --git a/Mage/src/mage/target/common/TargetAttackingCreature.java b/Mage/src/mage/target/common/TargetAttackingCreature.java index b52fd31c568..65272109fc5 100644 --- a/Mage/src/mage/target/common/TargetAttackingCreature.java +++ b/Mage/src/mage/target/common/TargetAttackingCreature.java @@ -28,7 +28,6 @@ package mage.target.common; -import mage.Constants.TargetController; import mage.filter.common.FilterAttackingCreature; /**