From 73804f3af1b4a407659c30faa7cf437f51707062 Mon Sep 17 00:00:00 2001
From: jeffwadsworth <jeffwadsworth@magefree>
Date: Thu, 24 May 2012 16:29:53 -0500
Subject: [PATCH 1/2] - Added Outwit.  <AVR>

---
 .../src/mage/sets/avacynrestored/Outwit.java  | 180 ++++++++++++++++++
 1 file changed, 180 insertions(+)
 create mode 100644 Mage.Sets/src/mage/sets/avacynrestored/Outwit.java

diff --git a/Mage.Sets/src/mage/sets/avacynrestored/Outwit.java b/Mage.Sets/src/mage/sets/avacynrestored/Outwit.java
new file mode 100644
index 0000000000..ee449389a4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/avacynrestored/Outwit.java
@@ -0,0 +1,180 @@
+/*
+ *  Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without modification, are
+ *  permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice, this list of
+ *        conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *        of conditions and the following disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  The views and conclusions contained in the software and documentation are those of the
+ *  authors and should not be interpreted as representing official policies, either expressed
+ *  or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.avacynrestored;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.Constants;
+import mage.Constants.CardType;
+import mage.Constants.Rarity;
+import mage.abilities.Ability;
+import mage.cards.CardImpl;
+import mage.game.Game;
+import mage.game.stack.StackObject;
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.filter.Filter;
+import mage.filter.FilterSpell;
+import mage.players.Player;
+import mage.game.stack.Spell;
+import mage.target.TargetObject;
+
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class Outwit extends CardImpl<Outwit> {
+    
+    private static FilterSpell filter = new FilterSpell("spell that targets a player");
+
+    public Outwit(UUID ownerId) {
+        super(ownerId, 70, "Outwit", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{U}");
+        this.expansionSetCode = "AVR";
+
+        this.color.setBlue(true);
+
+        // Counter target spell that targets a player.
+        this.getSpellAbility().addEffect(new CounterTargetEffect());
+	this.getSpellAbility().addTarget(new CustomTargetSpell(filter));
+    }
+
+    public Outwit(final Outwit card) {
+        super(card);
+    }
+
+    @Override
+    public Outwit copy() {
+        return new Outwit(this);
+    }
+
+
+    private class CustomTargetSpell extends TargetObject<CustomTargetSpell> {
+
+        protected FilterSpell filter;
+
+	public CustomTargetSpell() {
+            this(1, 1, new FilterSpell());
+	}
+
+	public CustomTargetSpell(FilterSpell filter) {
+            this(1, 1, filter);
+	}
+
+	public CustomTargetSpell(int numTargets, FilterSpell filter) {
+            this(numTargets, numTargets, filter);
+	}
+
+	public CustomTargetSpell(int minNumTargets, int maxNumTargets, FilterSpell filter) {
+            this.minNumberOfTargets = minNumTargets;
+            this.maxNumberOfTargets = maxNumTargets;
+            this.zone = Constants.Zone.STACK;
+            this.filter = filter;
+            this.targetName = filter.getMessage();
+	}
+
+	public CustomTargetSpell(final CustomTargetSpell target) {
+            super(target);
+            this.filter = target.filter.copy();
+	}
+
+	@Override
+	public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
+            return canChoose(sourceControllerId, game);
+	}
+
+	@Override
+	public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
+            return possibleTargets(sourceControllerId, game);
+	}
+
+	@Override
+	public boolean canTarget(UUID id, Ability source, Game game) {
+            if (super.canTarget(id, source, game)) {
+                if (targetsPlayer(id, game)) {
+                    return true;
+		}
+            }
+            return false;
+	}
+
+	@Override
+	public boolean canChoose(UUID sourceControllerId, Game game) {
+            int count = 0;
+            for (StackObject stackObject : game.getStack()) {
+		if (stackObject instanceof Spell && filter.match((Spell) stackObject, game)) {
+                    if (targetsPlayer(stackObject.getId(), game)) {
+                        count++;
+			if (count >= this.minNumberOfTargets)
+                            return true;
+                    }
+		}
+            }
+            return false;
+	}
+
+	@Override
+	public Set<UUID> possibleTargets(UUID sourceControllerId, Game game) {
+            Set<UUID> possibleTargets = new HashSet<UUID>();
+            for (StackObject stackObject : game.getStack()) {
+                if (stackObject instanceof Spell && filter.match((Spell) stackObject, game)) {
+                    if (targetsPlayer(stackObject.getId(), game)) {
+                        possibleTargets.add(stackObject.getId());
+                    }
+		}
+            }
+            return possibleTargets;
+	}
+
+	@Override
+	public Filter getFilter() {
+            return filter;
+	}
+
+	private boolean targetsPlayer(UUID id, Game game) {
+            StackObject spell = game.getStack().getStackObject(id);
+            if (spell != null) {
+		Ability ability = spell.getStackAbility();
+                if (ability != null && !ability.getTargets().isEmpty()) {
+                    for (UUID playerId : ability.getTargets().get(0).getTargets()) {
+                        Player player = game.getPlayer(playerId);
+                        if (player != null) {
+                            return true;
+			}
+                    }
+                }
+            }
+            return false;
+	}
+
+	@Override
+	public CustomTargetSpell copy() {
+            return new CustomTargetSpell(this);
+	}
+    }
+}
\ No newline at end of file

From 5e97b56508db5a2ab6786fc55f261e0325824847 Mon Sep 17 00:00:00 2001
From: magenoxx <magenoxx@gmail>
Date: Fri, 25 May 2012 01:32:17 +0400
Subject: [PATCH 2/2] UI battlefield transparency fix

---
 .../src/main/java/mage/client/game/BattlefieldPanel.java     | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java
index 8689f597b3..01e85f9ba3 100644
--- a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java
@@ -270,15 +270,18 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane {
 	}
 
     private void initComponents() {
-        setOpaque(true);
+        setOpaque(false);
 
         jPanel = new JPanel();
         jPanel.setLayout(null);
+        jPanel.setOpaque(false);
         jScrollPane = new JScrollPane(jPanel);
 
         Border empty = new EmptyBorder(0,0,0,0);
         jScrollPane.setBorder(empty);
         jScrollPane.setViewportBorder(empty);
+        jScrollPane.setOpaque(false);
+        jScrollPane.getViewport().setOpaque(false);
 
         this.add(jScrollPane);
     }