From c0be640c4a571539a5fdb7677502ef05189bd72d Mon Sep 17 00:00:00 2001 From: spjspj Date: Fri, 25 Nov 2016 20:56:24 +1100 Subject: [PATCH] spjspj - Implement Australian 7pt Highlander --- .../src/mage/deck/AusHighlander.java | 179 ++++++++++++++++++ .../src/mage/deck/Commander.java | 3 +- Mage.Server/config/config.xml | 1 + .../src/mage/cards/e/EyeOfSingularity.java | 5 +- 4 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java new file mode 100644 index 00000000000..7aa707894ce --- /dev/null +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java @@ -0,0 +1,179 @@ +/* + * Copyright 2011 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.deck; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import mage.cards.Card; +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.decks.Constructed; +import mage.cards.decks.Deck; +import mage.constants.CardType; +import mage.constants.SetType; +import mage.util.CardUtil; + +/** + * + * @author spjspj + */ +public class AusHighlander extends Constructed { + + public AusHighlander() { + this("Australian Highlander"); + for (ExpansionSet set : Sets.getInstance().values()) { + if (set.getSetType() != SetType.CUSTOM_SET) { + setCodes.add(set.getCode()); + } + } + } + + public AusHighlander(String name) { + super(name); + } + + @Override + public boolean validate(Deck deck) { + boolean valid = true; + + if (deck.getCards().size() != 60) { + invalid.put("Deck", "Must contain 60 singleton cards: has " + (deck.getCards().size()) + " cards"); + valid = false; + } + if (deck.getSideboard().size() > 15) { + invalid.put("Sideboard", "Must contain at most 15 singleton cards: has " + (deck.getSideboard().size()) + " cards"); + valid = false; + } + + List basicLandNames = new ArrayList<>(Arrays.asList("Forest", "Island", "Mountain", "Swamp", "Plains", "Wastes", + "Snow-Covered Forest", "Snow-Covered Island", "Snow-Covered Mountain", "Snow-Covered Swamp", "Snow-Covered Plains")); + Map counts = new HashMap<>(); + countCards(counts, deck.getCards()); + countCards(counts, deck.getSideboard()); + for (Map.Entry entry : counts.entrySet()) { + if (entry.getValue() > 1) { + if (!basicLandNames.contains(entry.getKey()) && !entry.getKey().equals("Relentless Rats") && !entry.getKey().equals("Shadowborn Apostle")) { + invalid.put(entry.getKey(), "Too many: " + entry.getValue()); + valid = false; + } + } + } + + int totalPoints = 0; + for (Map.Entry entry : counts.entrySet()) { + String cn = entry.getKey(); + + if (cn.equals("Balance") + || cn.equals("Birthing Pod") + || cn.equals("Crop Rotation") + || cn.equals("Dark Petition") + || cn.equals("Dig Through Time") + || cn.equals("Enlightened Tutor") + || cn.equals("Fastbond") + || cn.equals("Flash") + || cn.equals("Force of Will") + || cn.equals("Gifts Ungiven") + || cn.equals("Green Sun's Zenith") + || cn.equals("Hermit Druid") + || cn.equals("Intuition") + || cn.equals("Jace, the Mind Sculptor") + || cn.equals("Karakas") + || cn.equals("Lim-Dul's Vault") + || cn.equals("Mana Drain") + || cn.equals("Mana Vault") + || cn.equals("Memory Jar") + || cn.equals("Merchant Scroll") + || cn.equals("Mishra's Workshop") + || cn.equals("Muddle the Mixture") + || cn.equals("Natural Order") + || cn.equals("Oath of Druids") + || cn.equals("Personal Tutor") + || cn.equals("Protean Hulk") + || cn.equals("Snapcaster Mage") + || cn.equals("Steelshaper's Gift") + || cn.equals("Stoneforge Mystic") + || cn.equals("Survival of the Fittest") + || cn.equals("Tainted Pact") + || cn.equals("Time Spiral") + || cn.equals("Timetwister") + || cn.equals("Treasure Cruise") + || cn.equals("True-Name Nemesis") + || cn.equals("Umezawa's Jitte") + || cn.equals("Wasteland") + || cn.equals("Wheel of Fortune") + || cn.equals("Worldly Tutor") + || cn.equals("Yawgmoth's Bargain")) { + totalPoints += 1; + invalid.put(cn, "1 point"); + } + + if (cn.equals("Channel") + || cn.equals("Library of Alexandria") + || cn.equals("Mana Crypt") + || cn.equals("Mind Twist") + || cn.equals("Mox Emerald") + || cn.equals("Mox Jet") + || cn.equals("Mox Pearl") + || cn.equals("Mox Ruby") + || cn.equals("Mox Sapphire") + || cn.equals("Mystical Tutor") + || cn.equals("Skullclamp") + || cn.equals("Strip Mine") + || cn.equals("Tolarian Academy")) { + totalPoints += 2; + invalid.put(cn, "2 points"); + } + + if (cn.equals("Demonic Tutor") + || cn.equals("Imperial Seal") + || cn.equals("Sol Ring") + || cn.equals("Time Vault") + || cn.equals("Time Walk") + || cn.equals("Tinker") + || cn.equals("Vampiric Tutor") + || cn.equals("Yawgmoth's Will")) { + totalPoints += 3; + invalid.put(cn, "3 points"); + } + + if (cn.equals("Ancestral Recall") + || cn.equals("Black Lotus")) { + totalPoints += 4; + invalid.put(cn, "4 points"); + } + } + if (totalPoints > 7) { + invalid.put("Total points too high", "Your calculated point total was " + totalPoints); + valid = false; + } + return valid; + } +} diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java index a99fcf75bd3..261aafb75bb 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java @@ -387,6 +387,7 @@ public class Commander extends Constructed { || cn.equals("bane of progress") || cn.equals("basalt monolith") || cn.equals("blightsteel collossus") + || cn.equals("blood moon") || cn.equals("braids, cabal minion") || cn.equals("cabal coffers") || cn.equals("captain sisay") @@ -451,7 +452,7 @@ public class Commander extends Constructed { || cn.equals("vorinclex, voice of hunger") || cn.equals("winter orb") || cn.equals("zur the enchanter")) { - thisMaxPower = Math.max(thisMaxPower, 4); + thisMaxPower = Math.max(thisMaxPower, 5); } // Parts of infinite combos diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index 3d9c8109005..6f249ddd287 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -130,6 +130,7 @@ + diff --git a/Mage.Sets/src/mage/cards/e/EyeOfSingularity.java b/Mage.Sets/src/mage/cards/e/EyeOfSingularity.java index 1d056e34355..c79782be60d 100644 --- a/Mage.Sets/src/mage/cards/e/EyeOfSingularity.java +++ b/Mage.Sets/src/mage/cards/e/EyeOfSingularity.java @@ -182,9 +182,8 @@ class EyeOfSingularityTriggeredEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { HashMap toDestroy = new HashMap<>(); - Permanent etbPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - UUID targetId = source.getEffects().get(0).getTargetPointer().getFirst(game, source); - + Permanent etbPermanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + if (etbPermanent == null) { return false; }