From 07db858f34b7ee806344a1494063a7aae0bd215e Mon Sep 17 00:00:00 2001 From: JRHerlehy Date: Sat, 28 Feb 2015 16:16:10 -0800 Subject: [PATCH 1/9] Implement Tiny Leaders for XMage Initial implementation of Tiny Leaders for XMage --- .../src/mage/deck/TinyLeaders.java | 202 ++++++++++++++++++ .../Mage.Game.TinyLeadersDuel/pom.xml | 50 +++++ .../src/mage/game/TinyLeadersDuel.java | 64 ++++++ .../src/mage/game/TinyLeadersDuelMatch.java | 58 +++++ .../src/mage/game/TinyLeadersDuelType.java | 58 +++++ .../target/classes/.netbeans_automatic_build | 0 .../classes/mage/game/TinyLeadersDuel.class | Bin 0 -> 1171 bytes .../mage/game/TinyLeadersDuelMatch.class | Bin 0 -> 1305 bytes .../mage/game/TinyLeadersDuelType.class | Bin 0 -> 996 bytes .../target/mage-game-tinyleadersduel.jar | Bin 0 -> 4259 bytes .../target/maven-archiver/pom.properties | 5 + .../test-classes/.netbeans_automatic_build | 0 Mage.Server.Plugins/pom.xml | 11 +- Mage.Server/config/config.xml | 4 +- Mage.Server/pom.xml | 6 + Mage/src/mage/game/GameTinyLeadersImpl.java | 116 ++++++++++ pom.xml | 7 +- 17 files changed, 567 insertions(+), 14 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/.netbeans_automatic_build create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuel.class create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuelMatch.class create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuelType.class create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/mage-game-tinyleadersduel.jar create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/maven-archiver/pom.properties create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/test-classes/.netbeans_automatic_build create mode 100644 Mage/src/mage/game/GameTinyLeadersImpl.java diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java new file mode 100644 index 00000000000..620160c0874 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java @@ -0,0 +1,202 @@ +/* + * 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.abilities.common.CanBeYourCommanderAbility; +import mage.cards.Card; +import mage.cards.decks.Deck; +import mage.cards.decks.DeckValidator; +import mage.constants.CardType; +import mage.filter.FilterMana; +import mage.util.CardUtil; + +/** + * + * @author JRHerlehy + */ +public class TinyLeaders extends DeckValidator { + + protected List banned = new ArrayList<>(); + protected List bannedCommander = new ArrayList<>(); + + public TinyLeaders() { + this("Tiny Leaders"); + //Banned list from tinyleaders.blodspot.ca/p/ban-list.html + //Ban list updated as of 11/08/14 + banned.add("Ancestral Recall"); + banned.add("Balance"); + banned.add("Black Lotus"); + banned.add("Channel"); + banned.add("Counterbalance"); + banned.add("Demonic Tutor"); + banned.add("Earthcraft"); + banned.add("Edric, Spymaster of Trest"); + banned.add("Fastbond"); + banned.add("Goblin Recruiter"); + banned.add("Hermit Druid"); + banned.add("Imperial Seal"); + banned.add("Library of Alexandria"); + banned.add("Karakas"); + banned.add("Mana Crypt"); + banned.add("Mana Drain"); + banned.add("Mana Vault"); + banned.add("metalworker"); + banned.add("Mind Twist"); + banned.add("Mishra's Workshop"); + banned.add("Mox Emerald"); + banned.add("Mox Jet"); + banned.add("Mox Pearl"); + banned.add("Mox Ruby"); + banned.add("Mox Sapphire"); + banned.add("Necropotence"); + banned.add("Painter's Servant"); + banned.add("Shahrazad"); + banned.add("Skullclamp"); + banned.add("Sol Ring"); + banned.add("Strip Mine"); + banned.add("Survival of the Fittest"); + banned.add("Sword of Body and Mind"); + banned.add("Time Vault"); + banned.add("Time Walk"); + banned.add("Timetwister"); + banned.add("Tolarian Academy"); + banned.add("Umezawa's Jitte"); + banned.add("Vampiric Tutor"); + banned.add("Yawgmoth's Will"); + + //Additionally, these Legendary creatures cannot be used as Commanders + bannedCommander.add("Erayo, Soratami Ascendant"); + bannedCommander.add("Rofellos, Llanowar Emissary"); + bannedCommander.add("Derevi, Empyrical Tactician"); + } + + public TinyLeaders(String name) { + super(name); + } + + /** + * + * @param deck + * @return - True if deck is valid + */ + @Override + public boolean validate(Deck deck) { + boolean valid = true; + + if (deck.getCards().size() != 49) { + invalid.put("Deck", "Must contain 49 cards: has " + deck.getCards().size() + " cards"); + valid = false; + } + + List basicLandNames = new ArrayList<>(Arrays.asList("Forest", "Island", "Mountain", "Swamp", "Plains", + "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; + } + } + } + + for (String bannedCard : banned) { + if (counts.containsKey(bannedCard)) { + invalid.put(bannedCard, "Banned"); + valid = false; + } + } + + if (deck.getSideboard().size() == 1) { + Card commander = (Card) deck.getSideboard().toArray()[0]; + + /** + * 905.5b - Each card must have a converted mana cost of three of less. + * Cards with {X} in their mana cost count X as zero. + * Split and double-face cards are legal only if both of their halves would be legal independently. + */ + + if (commander == null || commander.getManaCost().convertedManaCost() > 3) { + invalid.put("Commander", "Commander invalide "); + return false; + } + if ((commander.getCardType().contains(CardType.CREATURE) && commander.getSupertype().contains("Legendary")) + || (commander.getCardType().contains(CardType.PLANESWALKER) && commander.getAbilities().contains(CanBeYourCommanderAbility.getInstance()))) { + if (!bannedCommander.contains(commander.getName())) { + FilterMana color = CardUtil.getColorIdentity(commander); + for (Card card : deck.getCards()) { + if (!cardHasValideColor(color, card)) { + invalid.put(card.getName(), "Invalid color (" + commander.getName() + ")"); + valid = false; + } + + //905.5b - Converted mana cost must be 3 or less + if (card.getManaCost().convertedManaCost() > 3) { + invalid.put(card.getName(), "Invalid cost (" + card.getManaCost().convertedManaCost() + ")"); + valid = false; + } + } + } else { + invalid.put("Commander", "Commander banned (" + commander.getName() + ")"); + valid = false; + } + } else { + invalid.put("Commander", "Commander invalide (" + commander.getName() + ")"); + valid = false; + } + } else { + invalid.put("Commander", "Sideboard must contain only the commander"); + valid = false; + } + + return valid; + } + + /** + * + * @param commander FilterMana object with Color Identity of Commander set + * @param card Card to validate + * @return True if card has a valid color identity + */ + public boolean cardHasValideColor(FilterMana commander, Card card) { + FilterMana cardColor = CardUtil.getColorIdentity(card); + return !(cardColor.isBlack() && !commander.isBlack() + || cardColor.isBlue() && !commander.isBlue() + || cardColor.isGreen() && !commander.isGreen() + || cardColor.isRed() && !commander.isRed() + || cardColor.isWhite() && !commander.isWhite()); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml new file mode 100644 index 00000000000..1d6f0d0a37f --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml @@ -0,0 +1,50 @@ + + + + 4.0.0 + + + org.mage + mage-server-plugins + 1.3.0 + + + mage-game-tinyleadersduel + jar + Mage Game Tiny Leaders Two Player + + + + ${project.groupId} + mage + 1.3.0 + + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + maven-resources-plugin + + UTF-8 + + + + + + mage-game-tinyleadersduel + + + + + diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java new file mode 100644 index 00000000000..b8e05f76073 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java @@ -0,0 +1,64 @@ +/* + * 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.game; + +import mage.constants.MultiplayerAttackOption; +import mage.constants.RangeOfInfluence; +import mage.game.match.MatchType; + +/** + * + * @author JRHerlehy + */ +public class TinyLeadersDuel extends GameTinyLeadersImpl { + + public TinyLeadersDuel(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) { + super(attackOption, range, freeMulligans, startLife); + } + + public TinyLeadersDuel(final TinyLeadersDuel game) { + super(game); + } + + @Override + public MatchType getGameType() { + return new TinyLeadersDuelType(); + } + + @Override + public int getNumPlayers() { + return 2; + } + + @Override + public TinyLeadersDuel copy() { + return new TinyLeadersDuel(this); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java new file mode 100644 index 00000000000..d5b9ada2d5a --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java @@ -0,0 +1,58 @@ +/* + * 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.game; + +import mage.game.match.MatchImpl; +import mage.game.match.MatchOptions; + +/** + * + * @author JRHerlehy + */ +public class TinyLeadersDuelMatch extends MatchImpl { + + public TinyLeadersDuelMatch(MatchOptions options) { + super(options); + } + + @Override + public void startGame() throws GameException { + //Tiny Leaders Play Rule 13: Players begin the game with 25 life. + int startLife = 25; + + TinyLeadersDuel game = new TinyLeadersDuel(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); + game.setStartMessage(this.createGameStartMessage()); + + //"Tucking a Tiny Leader is legal + game.setAlsoLibrary(false); + this.initGame(game); + games.add(game); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java new file mode 100644 index 00000000000..4c8055c8fb7 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java @@ -0,0 +1,58 @@ +/* + * 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.game; + +import mage.game.match.MatchType; + +/** + * + * @author JRHerlehy + */ +class TinyLeadersDuelType extends MatchType { + + public TinyLeadersDuelType() { + this.name = "Tiny Leaders Two Player Duel"; + this.maxPlayers = 2; + this.minPlayers = 2; + this.numTeams = 0; + this.useAttackOption = false; + this.useRange = false; + this.sideboardingAllowed = false; + } + + protected TinyLeadersDuelType(final TinyLeadersDuelType matchType){ + super(matchType); + } + + @Override + public TinyLeadersDuelType copy() { + return new TinyLeadersDuelType(this); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/.netbeans_automatic_build b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/.netbeans_automatic_build new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuel.class b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuel.class new file mode 100644 index 0000000000000000000000000000000000000000..64eb001f6daa7cb2140bea1f19298270dd1030e3 GIT binary patch literal 1171 zcma)5+iuf95Ivj3xwr`}p%)6ICFRoGR7;cxq(G$#1d5cl2%<=RW9x2GgJVaIgOq>b z0bYniB|daj;WfhR<$dTdhVVpf#tU4sN?bAOnDu7X46iw?V8f=O3&gr+)Viw)=1#?jJz)g z%IH|mq^;z+@)b?JT@s%{-=3?LeEo*inp!4bjXuv3FN3Jp5L~5 z#IY6XE;Jcb&L;v(edWKRRcA7!s8p#&Y8y!3yfBV<Kxk^y>!9DHnygewH)XoR zNj&+_#uTrRvnVm@Z{4wHs+SfweKnS}_g;RKdE}t;P$P-p_7~N}1{qWr*!(Mq0ULRg zuyuthsQ>ppwgy96U?b~01ZW+rSfdZZd+W4H1!^0i+5ushGhM4s zk%%kp5x)^AtrN9v6#k|yT_`IpcM(JoFKwx;fC$4`O0U z)Wiqyp^RsC8(NCSCOtEAF5mg)%sKn(_xGOw7V##AIA%25>p>sx$M66Tl}IX)iXnt_ zj104Cmr>%8I?gF)qZf}cuVF#MB11H1IhI^ym`)a|ydsPWuL`5erFmi$mE1d%R?YFU zsY8ayMy)Iu;swhQyY*^GxCgvslV+e$Gr4`pT}z#t%7{F%Jcg+@+yl!wF9=>1uD4ki zwx1x&pw)sT43llne<8up<4Nwy9U{pPPAXD?reGbDhUJN*x&gy@8&XGF${5@FWQriE zh9`91uhm^sY+LF!V;%lJ&AC(lk?TmHpB!41>TuODikljibUekfjukx9@f=wdm(%eA zt2);3QpY-8>Da)gjxB6!*wOJC#C`Igz&?j7ncK>fub$Zqqpe_7pUWFEOtdU*QO%d7 z_pAuHE+scV1S*DfG8L51q^FnMk)Bbk+tNC-`MGf0eW{k+6#kYw6{_6K^*GQ z?YeMGK>-O0*mi{=NZYD#hnj?*lCHno?7{zM?PPZ?OFpl9W5jd?mqL|eU-eBMt8oh2bFh7) zl**r>t_tnw#)$y8E-l+ASe~TpeLka04ONAg%M4d2?3GT1DYK~~Ow%mK>01DrZh}KU z$pJd8(m6zHG(CF(_Qkgkl2l&-AcZcZF+{tOzzf5)Q@^NcUBaLy!!5EYtk0wk)4G-z z%l$y;eflfH4Mc*aD_ElA7to5CbOYTD^km2$OJ^GBC99tKh8rQgYmu0QMsNm!&eH`J uh|Ut`XjT@nOvG1wVpBoNCb2Mb7{>(Bn#Lq<(?5hegb^Xll&@6kt&o01iA}$6?}ZakTe<-lKO}=P4wGsds9~T(QLP3|CN3~ z5>5O8{wU*2yGm`0d^x)_bMBclbMKFzU%vy`$HP44v64eY!yHx_42Cs^b%qUw+YFmb z-O6G+PeGNz%)%1LJa&91IuuA&&6YswNzhdSg@)s+7elYD!lrDylqofWj&xfxbU2Qa zsp!NR2&^_d*;95;ddhA({-~j3SA~P8L*+I{eRUwPUcH3Ey){opofAGmJ~}~vB(PRB zFF7c%@)u{UVL$(^M7{IJ!7%KoXAY0C^bdcvck+YOQ9w~(nd?S8fYCe+j90E4snFnI zbnIYP#~svk*bH|W?qN@-yCAsFP{0H7^xuUrX;H@#$^zvJ=8Sb(f=?Ue)w4m{m444Y zjzY)p@l>AtII%_-AdWcU_0Mj~$uu6$DB(3xr zQVeM;d4>!_mLbQWeI{}OCBiLegxe%oMII)JTDV3lFJl)K+WH1+RI#x@EPc|1>enes z@j_z*hoqLET*lftNB%-RKhEwUO?Sl#ixXC?Kz!UFE!qy>ORTkzB>e%}H_W}Ef%H!l qOw4A+g-26nw24%)P69V$0h_)okhZ?y%Ix9Isl(~mhrq3Ii{)Pf?ZpNF literal 0 HcmV?d00001 diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/mage-game-tinyleadersduel.jar b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/mage-game-tinyleadersduel.jar new file mode 100644 index 0000000000000000000000000000000000000000..a19a3f23a90c4971b742245eaca445506e0af56f GIT binary patch literal 4259 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.Game.CommanderFreeForAll Mage.Game.FreeForAll Mage.Game.TwoPlayerDuel - Mage.Player.AI - Mage.Player.AIMinimax - Mage.Player.AI.MA - Mage.Player.AIMCTS - Mage.Player.AI.DraftBot Mage.Player.Human - Mage.Tournament.BoosterDraft - Mage.Tournament.Constructed - Mage.Tournament.Sealed - + Mage.Game.TinyLeadersDuel + \ No newline at end of file diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index 81bf9f2ea4d..c1aff2d008d 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -41,13 +41,14 @@ - + + @@ -91,6 +92,7 @@ + diff --git a/Mage.Server/pom.xml b/Mage.Server/pom.xml index 461172aaab3..f9f5951f3da 100644 --- a/Mage.Server/pom.xml +++ b/Mage.Server/pom.xml @@ -133,6 +133,12 @@ ${project.version} runtime + + ${project.groupId} + mage-game-tinyleadersduel + ${project.version} + runtime + diff --git a/Mage/src/mage/game/GameTinyLeadersImpl.java b/Mage/src/mage/game/GameTinyLeadersImpl.java new file mode 100644 index 00000000000..8b421f21d7a --- /dev/null +++ b/Mage/src/mage/game/GameTinyLeadersImpl.java @@ -0,0 +1,116 @@ +/* + * 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.game; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EmptyEffect; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continious.CommanderManaReplacementEffect; +import mage.abilities.effects.common.continious.CommanderReplacementEffect; +import mage.abilities.effects.common.cost.CommanderCostModification; +import mage.cards.Card; +import mage.constants.MultiplayerAttackOption; +import mage.constants.PhaseStep; +import mage.constants.RangeOfInfluence; +import mage.constants.Zone; +import mage.game.turn.TurnMod; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author Justin + */ +public abstract class GameTinyLeadersImpl extends GameImpl{ + + protected boolean alsoLibrary; // replace also commander going to library + protected boolean startingPlayerSkipsDraw = true; + + public GameTinyLeadersImpl(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) { + super(attackOption, range, freeMulligans, startLife); + } + + public GameTinyLeadersImpl(final GameTinyLeadersImpl game) { + super(game); + this.alsoLibrary = game.alsoLibrary; + this.startingPlayerSkipsDraw = game.startingPlayerSkipsDraw; + } + + @Override + protected void init(UUID choosingPlayerId, GameOptions gameOptions) { + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new EmptyEffect("Commander effects")); + //Move tiny leader to command zone + for (UUID playerId: state.getPlayerList(startingPlayerId)) { + Player player = getPlayer(playerId); + if (player != null){ + if (player.getSideboard().size() > 0){ + Card commander = getCard((UUID)player.getSideboard().toArray()[0]); + if (commander != null) { + player.setCommanderId(commander.getId()); + commander.moveToZone(Zone.COMMAND, null, this, true); + ability.addEffect(new CommanderReplacementEffect(commander.getId(), alsoLibrary)); + ability.addEffect(new CommanderCostModification(commander.getId())); + ability.addEffect(new CommanderManaReplacementEffect(player.getId(), CardUtil.getColorIdentity(commander))); + getState().setValue(commander.getId() + "_castCount", 0); + } + } + } + + } + this.getState().addAbility(ability, null); + super.init(choosingPlayerId, gameOptions); + if (startingPlayerSkipsDraw) { + state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); + } + } + + @Override + public Set getOpponents(UUID playerId) { + Set opponents = new HashSet<>(); + for (UUID opponentId: this.getPlayer(playerId).getInRange()) { + if (!opponentId.equals(playerId)) { + opponents.add(opponentId); + } + } + return opponents; + } + + @Override + public boolean isOpponent(Player player, UUID playerToCheck) { + return !player.getId().equals(playerToCheck); + } + + public void setAlsoLibrary(boolean alsoLibrary) { + this.alsoLibrary = alsoLibrary; + } + +} diff --git a/pom.xml b/pom.xml index f024001d95b..bc9933a845f 100644 --- a/pom.xml +++ b/pom.xml @@ -50,17 +50,16 @@ - Mage Mage.Common - Mage.Server - Mage.Sets Mage.Client Mage.Plugins + Mage + Mage.Server + Mage.Sets Mage.Server.Plugins Mage.Server.Console Mage.Tests Mage.Updater - Mage.Stats From d87ec679659cb0b843849412e28ac2338293be7a Mon Sep 17 00:00:00 2001 From: Justin Herlehy Date: Sat, 28 Feb 2015 19:55:32 -0800 Subject: [PATCH 2/9] Implementation of Tiny Leaders for XMage Initial Implementation of Tiny Leaders --- .gitignore | 4 +- .../src/mage/deck/TinyLeaders.java | 202 ++++++++++++++++++ .../Mage.Game.TinyLeadersDuel/pom.xml | 50 +++++ .../src/mage/game/TinyLeadersDuel.java | 64 ++++++ .../src/mage/game/TinyLeadersDuelMatch.java | 58 +++++ .../src/mage/game/TinyLeadersDuelType.java | 58 +++++ Mage.Server.Plugins/pom.xml | 11 +- Mage/src/mage/game/GameTinyLeadersImpl.java | 116 ++++++++++ pom.xml | 7 +- 9 files changed, 556 insertions(+), 14 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java create mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java create mode 100644 Mage/src/mage/game/GameTinyLeadersImpl.java diff --git a/.gitignore b/.gitignore index 53ce9bb177c..25ca0b875c2 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ Mage.Server.Plugins/Mage.Deck.Limited/target Mage.Server.Plugins/Mage.Game.CommanderDuel/target Mage.Server.Plugins/Mage.Game.FreeForAll/target Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target +Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target Mage.Server.Plugins/Mage.Player.AI/target Mage.Server.Plugins/Mage.Player.AIMinimax/target Mage.Server.Plugins/Mage.Player.AI.MA/target @@ -82,4 +83,5 @@ Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target /Mage.Server/config/ai.please.cast.this.txt /Mage.Stats/target/ -/Utils/*_unimplemented.txt \ No newline at end of file +/Utils/*_unimplemented.txt +*.netbeans_automatic_build \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java new file mode 100644 index 00000000000..620160c0874 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java @@ -0,0 +1,202 @@ +/* + * 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.abilities.common.CanBeYourCommanderAbility; +import mage.cards.Card; +import mage.cards.decks.Deck; +import mage.cards.decks.DeckValidator; +import mage.constants.CardType; +import mage.filter.FilterMana; +import mage.util.CardUtil; + +/** + * + * @author JRHerlehy + */ +public class TinyLeaders extends DeckValidator { + + protected List banned = new ArrayList<>(); + protected List bannedCommander = new ArrayList<>(); + + public TinyLeaders() { + this("Tiny Leaders"); + //Banned list from tinyleaders.blodspot.ca/p/ban-list.html + //Ban list updated as of 11/08/14 + banned.add("Ancestral Recall"); + banned.add("Balance"); + banned.add("Black Lotus"); + banned.add("Channel"); + banned.add("Counterbalance"); + banned.add("Demonic Tutor"); + banned.add("Earthcraft"); + banned.add("Edric, Spymaster of Trest"); + banned.add("Fastbond"); + banned.add("Goblin Recruiter"); + banned.add("Hermit Druid"); + banned.add("Imperial Seal"); + banned.add("Library of Alexandria"); + banned.add("Karakas"); + banned.add("Mana Crypt"); + banned.add("Mana Drain"); + banned.add("Mana Vault"); + banned.add("metalworker"); + banned.add("Mind Twist"); + banned.add("Mishra's Workshop"); + banned.add("Mox Emerald"); + banned.add("Mox Jet"); + banned.add("Mox Pearl"); + banned.add("Mox Ruby"); + banned.add("Mox Sapphire"); + banned.add("Necropotence"); + banned.add("Painter's Servant"); + banned.add("Shahrazad"); + banned.add("Skullclamp"); + banned.add("Sol Ring"); + banned.add("Strip Mine"); + banned.add("Survival of the Fittest"); + banned.add("Sword of Body and Mind"); + banned.add("Time Vault"); + banned.add("Time Walk"); + banned.add("Timetwister"); + banned.add("Tolarian Academy"); + banned.add("Umezawa's Jitte"); + banned.add("Vampiric Tutor"); + banned.add("Yawgmoth's Will"); + + //Additionally, these Legendary creatures cannot be used as Commanders + bannedCommander.add("Erayo, Soratami Ascendant"); + bannedCommander.add("Rofellos, Llanowar Emissary"); + bannedCommander.add("Derevi, Empyrical Tactician"); + } + + public TinyLeaders(String name) { + super(name); + } + + /** + * + * @param deck + * @return - True if deck is valid + */ + @Override + public boolean validate(Deck deck) { + boolean valid = true; + + if (deck.getCards().size() != 49) { + invalid.put("Deck", "Must contain 49 cards: has " + deck.getCards().size() + " cards"); + valid = false; + } + + List basicLandNames = new ArrayList<>(Arrays.asList("Forest", "Island", "Mountain", "Swamp", "Plains", + "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; + } + } + } + + for (String bannedCard : banned) { + if (counts.containsKey(bannedCard)) { + invalid.put(bannedCard, "Banned"); + valid = false; + } + } + + if (deck.getSideboard().size() == 1) { + Card commander = (Card) deck.getSideboard().toArray()[0]; + + /** + * 905.5b - Each card must have a converted mana cost of three of less. + * Cards with {X} in their mana cost count X as zero. + * Split and double-face cards are legal only if both of their halves would be legal independently. + */ + + if (commander == null || commander.getManaCost().convertedManaCost() > 3) { + invalid.put("Commander", "Commander invalide "); + return false; + } + if ((commander.getCardType().contains(CardType.CREATURE) && commander.getSupertype().contains("Legendary")) + || (commander.getCardType().contains(CardType.PLANESWALKER) && commander.getAbilities().contains(CanBeYourCommanderAbility.getInstance()))) { + if (!bannedCommander.contains(commander.getName())) { + FilterMana color = CardUtil.getColorIdentity(commander); + for (Card card : deck.getCards()) { + if (!cardHasValideColor(color, card)) { + invalid.put(card.getName(), "Invalid color (" + commander.getName() + ")"); + valid = false; + } + + //905.5b - Converted mana cost must be 3 or less + if (card.getManaCost().convertedManaCost() > 3) { + invalid.put(card.getName(), "Invalid cost (" + card.getManaCost().convertedManaCost() + ")"); + valid = false; + } + } + } else { + invalid.put("Commander", "Commander banned (" + commander.getName() + ")"); + valid = false; + } + } else { + invalid.put("Commander", "Commander invalide (" + commander.getName() + ")"); + valid = false; + } + } else { + invalid.put("Commander", "Sideboard must contain only the commander"); + valid = false; + } + + return valid; + } + + /** + * + * @param commander FilterMana object with Color Identity of Commander set + * @param card Card to validate + * @return True if card has a valid color identity + */ + public boolean cardHasValideColor(FilterMana commander, Card card) { + FilterMana cardColor = CardUtil.getColorIdentity(card); + return !(cardColor.isBlack() && !commander.isBlack() + || cardColor.isBlue() && !commander.isBlue() + || cardColor.isGreen() && !commander.isGreen() + || cardColor.isRed() && !commander.isRed() + || cardColor.isWhite() && !commander.isWhite()); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml new file mode 100644 index 00000000000..1d6f0d0a37f --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml @@ -0,0 +1,50 @@ + + + + 4.0.0 + + + org.mage + mage-server-plugins + 1.3.0 + + + mage-game-tinyleadersduel + jar + Mage Game Tiny Leaders Two Player + + + + ${project.groupId} + mage + 1.3.0 + + + + + src + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + maven-resources-plugin + + UTF-8 + + + + + + mage-game-tinyleadersduel + + + + + diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java new file mode 100644 index 00000000000..b8e05f76073 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuel.java @@ -0,0 +1,64 @@ +/* + * 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.game; + +import mage.constants.MultiplayerAttackOption; +import mage.constants.RangeOfInfluence; +import mage.game.match.MatchType; + +/** + * + * @author JRHerlehy + */ +public class TinyLeadersDuel extends GameTinyLeadersImpl { + + public TinyLeadersDuel(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) { + super(attackOption, range, freeMulligans, startLife); + } + + public TinyLeadersDuel(final TinyLeadersDuel game) { + super(game); + } + + @Override + public MatchType getGameType() { + return new TinyLeadersDuelType(); + } + + @Override + public int getNumPlayers() { + return 2; + } + + @Override + public TinyLeadersDuel copy() { + return new TinyLeadersDuel(this); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java new file mode 100644 index 00000000000..d5b9ada2d5a --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java @@ -0,0 +1,58 @@ +/* + * 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.game; + +import mage.game.match.MatchImpl; +import mage.game.match.MatchOptions; + +/** + * + * @author JRHerlehy + */ +public class TinyLeadersDuelMatch extends MatchImpl { + + public TinyLeadersDuelMatch(MatchOptions options) { + super(options); + } + + @Override + public void startGame() throws GameException { + //Tiny Leaders Play Rule 13: Players begin the game with 25 life. + int startLife = 25; + + TinyLeadersDuel game = new TinyLeadersDuel(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); + game.setStartMessage(this.createGameStartMessage()); + + //"Tucking a Tiny Leader is legal + game.setAlsoLibrary(false); + this.initGame(game); + games.add(game); + } + +} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java new file mode 100644 index 00000000000..4c8055c8fb7 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java @@ -0,0 +1,58 @@ +/* + * 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.game; + +import mage.game.match.MatchType; + +/** + * + * @author JRHerlehy + */ +class TinyLeadersDuelType extends MatchType { + + public TinyLeadersDuelType() { + this.name = "Tiny Leaders Two Player Duel"; + this.maxPlayers = 2; + this.minPlayers = 2; + this.numTeams = 0; + this.useAttackOption = false; + this.useRange = false; + this.sideboardingAllowed = false; + } + + protected TinyLeadersDuelType(final TinyLeadersDuelType matchType){ + super(matchType); + } + + @Override + public TinyLeadersDuelType copy() { + return new TinyLeadersDuelType(this); + } + +} diff --git a/Mage.Server.Plugins/pom.xml b/Mage.Server.Plugins/pom.xml index 42835c4d180..eb8c3742aaf 100644 --- a/Mage.Server.Plugins/pom.xml +++ b/Mage.Server.Plugins/pom.xml @@ -21,15 +21,8 @@ Mage.Game.CommanderFreeForAll Mage.Game.FreeForAll Mage.Game.TwoPlayerDuel - Mage.Player.AI - Mage.Player.AIMinimax - Mage.Player.AI.MA - Mage.Player.AIMCTS - Mage.Player.AI.DraftBot Mage.Player.Human - Mage.Tournament.BoosterDraft - Mage.Tournament.Constructed - Mage.Tournament.Sealed - + Mage.Game.TinyLeadersDuel + \ No newline at end of file diff --git a/Mage/src/mage/game/GameTinyLeadersImpl.java b/Mage/src/mage/game/GameTinyLeadersImpl.java new file mode 100644 index 00000000000..8b421f21d7a --- /dev/null +++ b/Mage/src/mage/game/GameTinyLeadersImpl.java @@ -0,0 +1,116 @@ +/* + * 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.game; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EmptyEffect; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continious.CommanderManaReplacementEffect; +import mage.abilities.effects.common.continious.CommanderReplacementEffect; +import mage.abilities.effects.common.cost.CommanderCostModification; +import mage.cards.Card; +import mage.constants.MultiplayerAttackOption; +import mage.constants.PhaseStep; +import mage.constants.RangeOfInfluence; +import mage.constants.Zone; +import mage.game.turn.TurnMod; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author Justin + */ +public abstract class GameTinyLeadersImpl extends GameImpl{ + + protected boolean alsoLibrary; // replace also commander going to library + protected boolean startingPlayerSkipsDraw = true; + + public GameTinyLeadersImpl(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) { + super(attackOption, range, freeMulligans, startLife); + } + + public GameTinyLeadersImpl(final GameTinyLeadersImpl game) { + super(game); + this.alsoLibrary = game.alsoLibrary; + this.startingPlayerSkipsDraw = game.startingPlayerSkipsDraw; + } + + @Override + protected void init(UUID choosingPlayerId, GameOptions gameOptions) { + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new EmptyEffect("Commander effects")); + //Move tiny leader to command zone + for (UUID playerId: state.getPlayerList(startingPlayerId)) { + Player player = getPlayer(playerId); + if (player != null){ + if (player.getSideboard().size() > 0){ + Card commander = getCard((UUID)player.getSideboard().toArray()[0]); + if (commander != null) { + player.setCommanderId(commander.getId()); + commander.moveToZone(Zone.COMMAND, null, this, true); + ability.addEffect(new CommanderReplacementEffect(commander.getId(), alsoLibrary)); + ability.addEffect(new CommanderCostModification(commander.getId())); + ability.addEffect(new CommanderManaReplacementEffect(player.getId(), CardUtil.getColorIdentity(commander))); + getState().setValue(commander.getId() + "_castCount", 0); + } + } + } + + } + this.getState().addAbility(ability, null); + super.init(choosingPlayerId, gameOptions); + if (startingPlayerSkipsDraw) { + state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); + } + } + + @Override + public Set getOpponents(UUID playerId) { + Set opponents = new HashSet<>(); + for (UUID opponentId: this.getPlayer(playerId).getInRange()) { + if (!opponentId.equals(playerId)) { + opponents.add(opponentId); + } + } + return opponents; + } + + @Override + public boolean isOpponent(Player player, UUID playerToCheck) { + return !player.getId().equals(playerToCheck); + } + + public void setAlsoLibrary(boolean alsoLibrary) { + this.alsoLibrary = alsoLibrary; + } + +} diff --git a/pom.xml b/pom.xml index f024001d95b..bc9933a845f 100644 --- a/pom.xml +++ b/pom.xml @@ -50,17 +50,16 @@ - Mage Mage.Common - Mage.Server - Mage.Sets Mage.Client Mage.Plugins + Mage + Mage.Server + Mage.Sets Mage.Server.Plugins Mage.Server.Console Mage.Tests Mage.Updater - Mage.Stats From 3544060ada6d57b726b8aff1a7f4d6f4b68c5730 Mon Sep 17 00:00:00 2001 From: Justin Herlehy Date: Sat, 28 Feb 2015 22:03:14 -0800 Subject: [PATCH 3/9] Server Project file Configuration Changed to the Server pom file to include the Tiny Leaders Duel Format --- Mage.Server/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Mage.Server/pom.xml b/Mage.Server/pom.xml index 461172aaab3..f9f5951f3da 100644 --- a/Mage.Server/pom.xml +++ b/Mage.Server/pom.xml @@ -133,6 +133,12 @@ ${project.version} runtime + + ${project.groupId} + mage-game-tinyleadersduel + ${project.version} + runtime + From 6e95e5ef70895825f799aae31d8e85cfb3f53f24 Mon Sep 17 00:00:00 2001 From: JRHerlehy Date: Sun, 1 Mar 2015 01:32:15 -0800 Subject: [PATCH 4/9] Removed pushed target folder from TinyLeadersDuel --- .../target/classes/.netbeans_automatic_build | 0 .../classes/mage/game/TinyLeadersDuel.class | Bin 1171 -> 0 bytes .../classes/mage/game/TinyLeadersDuelMatch.class | Bin 1305 -> 0 bytes .../classes/mage/game/TinyLeadersDuelType.class | Bin 996 -> 0 bytes .../target/mage-game-tinyleadersduel.jar | Bin 4259 -> 0 bytes .../target/maven-archiver/pom.properties | 5 ----- .../test-classes/.netbeans_automatic_build | 0 7 files changed, 5 deletions(-) delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/.netbeans_automatic_build delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuel.class delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuelMatch.class delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuelType.class delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/mage-game-tinyleadersduel.jar delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/maven-archiver/pom.properties delete mode 100644 Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/test-classes/.netbeans_automatic_build diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/.netbeans_automatic_build b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/.netbeans_automatic_build deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuel.class b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/classes/mage/game/TinyLeadersDuel.class deleted file mode 100644 index 64eb001f6daa7cb2140bea1f19298270dd1030e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 zcma)5+iuf95Ivj3xwr`}p%)6ICFRoGR7;cxq(G$#1d5cl2%<=RW9x2GgJVaIgOq>b z0bYniB|daj;WfhR<$dTdhVVpf#tU4sN?bAOnDu7X46iw?V8f=O3&gr+)Viw)=1#?jJz)g z%IH|mq^;z+@)b?JT@s%{-=3?LeEo*inp!4bjXuv3FN3Jp5L~5 z#IY6XE;Jcb&L;v(edWKRRcA7!s8p#&Y8y!3yfBV<Kxk^y>!9DHnygewH)XoR zNj&+_#uTrRvnVm@Z{4wHs+SfweKnS}_g;RKdE}t;P$P-p_7~N}1{qWr*!(Mq0ULRg zuyuthsQ>ppwgy96U?b~01ZW+rSfdZZd+W4H1!^0i+5ushGhM4s zk%%kp5x)^AtrN9v6#k|yT_`IpcM(JoFKwx;fC$4`O0U z)Wiqyp^RsC8(NCSCOtEAF5mg)%sKn(_xGOw7V##AIA%25>p>sx$M66Tl}IX)iXnt_ zj104Cmr>%8I?gF)qZf}cuVF#MB11H1IhI^ym`)a|ydsPWuL`5erFmi$mE1d%R?YFU zsY8ayMy)Iu;swhQyY*^GxCgvslV+e$Gr4`pT}z#t%7{F%Jcg+@+yl!wF9=>1uD4ki zwx1x&pw)sT43llne<8up<4Nwy9U{pPPAXD?reGbDhUJN*x&gy@8&XGF${5@FWQriE zh9`91uhm^sY+LF!V;%lJ&AC(lk?TmHpB!41>TuODikljibUekfjukx9@f=wdm(%eA zt2);3QpY-8>Da)gjxB6!*wOJC#C`Igz&?j7ncK>fub$Zqqpe_7pUWFEOtdU*QO%d7 z_pAuHE+scV1S*DfG8L51q^FnMk)Bbk+tNC-`MGf0eW{k+6#kYw6{_6K^*GQ z?YeMGK>-O0*mi{=NZYD#hnj?*lCHno?7{zM?PPZ?OFpl9W5jd?mqL|eU-eBMt8oh2bFh7) zl**r>t_tnw#)$y8E-l+ASe~TpeLka04ONAg%M4d2?3GT1DYK~~Ow%mK>01DrZh}KU z$pJd8(m6zHG(CF(_Qkgkl2l&-AcZcZF+{tOzzf5)Q@^NcUBaLy!!5EYtk0wk)4G-z z%l$y;eflfH4Mc*aD_ElA7to5CbOYTD^km2$OJ^GBC99tKh8rQgYmu0QMsNm!&eH`J uh|Ut`XjT@nOvG1wVpBoNCb2Mb7{>(Bn#Lq<(?5hegb^Xll&@6kt&o01iA}$6?}ZakTe<-lKO}=P4wGsds9~T(QLP3|CN3~ z5>5O8{wU*2yGm`0d^x)_bMBclbMKFzU%vy`$HP44v64eY!yHx_42Cs^b%qUw+YFmb z-O6G+PeGNz%)%1LJa&91IuuA&&6YswNzhdSg@)s+7elYD!lrDylqofWj&xfxbU2Qa zsp!NR2&^_d*;95;ddhA({-~j3SA~P8L*+I{eRUwPUcH3Ey){opofAGmJ~}~vB(PRB zFF7c%@)u{UVL$(^M7{IJ!7%KoXAY0C^bdcvck+YOQ9w~(nd?S8fYCe+j90E4snFnI zbnIYP#~svk*bH|W?qN@-yCAsFP{0H7^xuUrX;H@#$^zvJ=8Sb(f=?Ue)w4m{m444Y zjzY)p@l>AtII%_-AdWcU_0Mj~$uu6$DB(3xr zQVeM;d4>!_mLbQWeI{}OCBiLegxe%oMII)JTDV3lFJl)K+WH1+RI#x@EPc|1>enes z@j_z*hoqLET*lftNB%-RKhEwUO?Sl#ixXC?Kz!UFE!qy>ORTkzB>e%}H_W}Ef%H!l qOw4A+g-26nw24%)P69V$0h_)okhZ?y%Ix9Isl(~mhrq3Ii{)Pf?ZpNF diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/mage-game-tinyleadersduel.jar b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target/mage-game-tinyleadersduel.jar deleted file mode 100644 index a19a3f23a90c4971b742245eaca445506e0af56f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4259 zcmbVP2{@GP*SC))Wf_DrWl0)@8CkMt9mY(Sk+Q~wvXAUSmTYC;$u_nuA(WcR8nTmp zNfL!D<+VotnIyj6@?F<^p6i+Co|$vb{hV{3`*;5iQk|5Hnus9DUIxlP20uTj@K3ms zj=X@Hrt(=NUJXb@iNBJ5Qv>c-gUf5GDJyB~2*Q=W!dqK3)CB~)Xw?PIw6}IV(h_p@L`N~gebE+#nP)loB_^&2&oRBZ1rzO+v49Q0DlwS z_s?OGCY;JUw^1rnA+^&| zE03BdJZt$ufoD}}?Sz1928RQ`YqqAVh;Uz6PkYB2_cW4@`-6ux2l7;(c@v{l$Q7e_ zXk{T-;X!oE@xX@rLB`ts97im5%g$iRWx_`x({iXP0YfTy|FUv6Z-1EXN#izJzp=FiXT8zEC)G{7j1vgARHC2jnJZCyyz)DGy8i zexz&=w03A1H4F29swn9VK)WL_5wfHjf!R-03s#~1pR9&@FI&NreY~=JNvIu_5!G?N zrHZ4`d<^|1g)th1Kx>_(z_uE7mNDa313EQjsV^ zT!iqFisfgqP$oZ#wUj;;w%ne|g^}`ILFZh{b2H>)%1KZRmZ2F@TNBMzIktrfS$Dcu zC1lnOiV~W2lBtT9y>rVNVS+76>!6y``8+l$fLGu#;64zy0fK~(xI=2w9azOfU^ zIemcQq8JGgQ8d|3Isdr^xeuyAxT%wweZH%)$PCr;%k!aa#VuU)UjtJ2Gh4MH$4Fq>1Yi6GgRw*W$+ zdK420oeqx~N1s@X%W#~I)Zs**xLqzEs8-Q(dI_1Y{d#bwmP=zcp-Z?RLz>s%B#USm zFO4Yb11h%niLP0^tkAo}EkUQzto!jSZO0V50zGJhy)FO3%Kb#uaY+e-q@nr~wjUE9 zOJrY9F)zNUhnVXcwAW+!lP=Yk1vBAs<@0awY0~{7n1WC-0SD9C=$#D^5M_v9ls_8KvFs5ad-WogI@_n(xu*Cwh=nam*-Sx8 zmJ`nSJh?Ku>?x?t8N6crNr|Vc9yA^<@?ybR2}Jr~kV~fdWrbyhrG<}1%m+c=>xJA5X2bGXowA4HGU~o!6N2xhWK_d?qP@_o*|~FZ@57T}D>~wyB3iaLq>x9* z`&w!EagV2(^E~RcIbHl}E}8Te8a5ei*D*roEMBUX7lSCWN($~vrnoMF!Zxm~8?l|f zs%aA3Ul5!zBzgG3SwjhwX>1!sWvSUX^9+S`+%UgO$&F6Kh!Hg31P5AD44TY*h(D7b zxozik{Wbz^D-9?&{IvSH?zGc4nY7o@pq#FcB=y8B$G(>%7gdbZ)xrZCx{#uos?Kkp zA63*GkKUwZ&D#j^@lOLuO7~Kk4{$lw-Sji-Wz0*MhF0_`$8M+VFGl;0k3|~g4ASwj z5sS`})t<>drFvzMN`zk@EG>VJr$fu6OD0kxfZ@|AXtw}KQs+gkya4cnYAPw1b;-6A2B z+&~X+2`9efCP@$C5J&JO_lp|Ym^!0v4`35V|E+B2Xd(Fja1fCLtO%w81a2bWgy$UA zJDkHD&pGzdwD8|(n#6zdXK!aC=xSqKq+N5bM~LqEG&nQl#)M!f*#iYlFr5|+_+qEg zT}Yd|!(5Yd5-P~s;%aX2FqTGP_(H7I%O#wf8zZ^`g{Zdn%=3pXu!Q&Zffdd?1tfMS zm8q!43N~-W)4D|q_I#*?=mF{g&cl^f9<#0w<6GFjl<0dm)P|fgU{mMuQ##g=3qlo# zoi_q23+R0T4ZZ3=3ea{Ha=-!KvQ*ue+Af1Jop|AQZh+S%CM?C2_;C&!whfT4pRcR! zea6u`2377KmJ$(pq2j~&*ZjAS^9ZM}rbl0f@@S?-j(hSCt+v^94{LVHyoriLsz8Ua zSSIecmMo&nCJtRb36-_J1Beij*WZF?=Er&pWaC`bU({?)gs%bZmR`7iJ{$J9C}e?L znxs#{C_TrA&73&OL8t~v>UpdN!fw1Z(-XJSw7_~{dMedr>7k~(*jY4rQ~F!bH_IoK zFQYEry=LDi3PWuqu(ydgQr%nLjy9%T{wN_%r3bQ1n?EV}XiQ`4Q*DQiE=G8A{;6qk z3SZTGbk^t!yuU5IJjrJxsorj1QW;k)y|5mI6|*kluJi zOALn@kb4_@98Z{NkAzU2PeFKg*3jz+M~+uR`oy4>H-_8Kt)&=U(tCAVQrzxj!`Me< zy>w5_O&2Gx*G3N~S%GLOkb6sj_i5=O16a^>?PT$svyt4^k4`~+^jP{$d;lK!8>voA z0wn!&BS2_@c7%@Tvpiw+YuE3X?X^Vvn-4-uv@2L&Ui|Qv*}ewppos}h%8n2w?#B;* z!o}a;bteLX5y50**W_mlL$KQ;ko&16p^4cQtS={i;rCjfKejacBPX22`%h^C8{HMG zZw?+r|LSZXH~rn?eh?;{?z@8Z&7(NL)ZaH{QpG$- Date: Sun, 1 Mar 2015 01:34:49 -0800 Subject: [PATCH 5/9] Fixed Tiny Leaders Duel Type Fixed missing class access level for TinyLeadersDuelType --- .gitignore | 5 ++++- Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml | 4 ++-- .../src/mage/game/TinyLeadersDuelMatch.java | 2 +- .../src/mage/game/TinyLeadersDuelType.java | 2 +- Mage.Server.Plugins/pom.xml | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 25ca0b875c2..77d9061c6ab 100644 --- a/.gitignore +++ b/.gitignore @@ -84,4 +84,7 @@ Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target /Mage.Server/config/ai.please.cast.this.txt /Mage.Stats/target/ /Utils/*_unimplemented.txt -*.netbeans_automatic_build \ No newline at end of file +*.netbeans_automatic_build +*.txt +Mage.Client/serverlist.txt +Mage.Client/serverlist.txt \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml index 1d6f0d0a37f..ccf6b733a04 100644 --- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-4.0.0.xsd"> 4.0.0 @@ -18,7 +18,7 @@ ${project.groupId} mage - 1.3.0 + ${project.version} diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java index d5b9ada2d5a..6349384e7c1 100644 --- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelMatch.java @@ -49,7 +49,7 @@ public class TinyLeadersDuelMatch extends MatchImpl { TinyLeadersDuel game = new TinyLeadersDuel(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); game.setStartMessage(this.createGameStartMessage()); - //"Tucking a Tiny Leader is legal + //Tucking a Tiny Leader is legal game.setAlsoLibrary(false); this.initGame(game); games.add(game); diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java index 4c8055c8fb7..26d97bde138 100644 --- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java @@ -34,7 +34,7 @@ import mage.game.match.MatchType; * * @author JRHerlehy */ -class TinyLeadersDuelType extends MatchType { +public class TinyLeadersDuelType extends MatchType { public TinyLeadersDuelType() { this.name = "Tiny Leaders Two Player Duel"; diff --git a/Mage.Server.Plugins/pom.xml b/Mage.Server.Plugins/pom.xml index eb8c3742aaf..5235f4a7a17 100644 --- a/Mage.Server.Plugins/pom.xml +++ b/Mage.Server.Plugins/pom.xml @@ -17,7 +17,7 @@ Mage.Deck.Constructed Mage.Deck.Limited - Mage.Game.CommanderDuel + Mage.Game.CommanderDuel Mage.Game.CommanderFreeForAll Mage.Game.FreeForAll Mage.Game.TwoPlayerDuel From b58c5b222667f8b9733fa1ca10bfb50d82b0b118 Mon Sep 17 00:00:00 2001 From: JRHerlehy Date: Sun, 1 Mar 2015 01:39:13 -0800 Subject: [PATCH 6/9] Fix .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 77d9061c6ab..e98869c519f 100644 --- a/.gitignore +++ b/.gitignore @@ -86,5 +86,4 @@ Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target /Utils/*_unimplemented.txt *.netbeans_automatic_build *.txt -Mage.Client/serverlist.txt Mage.Client/serverlist.txt \ No newline at end of file From a3b55d762532029af10b00c6fe9befefaee6fc6b Mon Sep 17 00:00:00 2001 From: JRHerlehy Date: Sun, 1 Mar 2015 01:47:18 -0800 Subject: [PATCH 7/9] Author Credit Fixed author credit to match my GitHub Name --- Mage/src/mage/game/GameTinyLeadersImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/game/GameTinyLeadersImpl.java b/Mage/src/mage/game/GameTinyLeadersImpl.java index 8b421f21d7a..1094ef3cf76 100644 --- a/Mage/src/mage/game/GameTinyLeadersImpl.java +++ b/Mage/src/mage/game/GameTinyLeadersImpl.java @@ -48,7 +48,7 @@ import mage.util.CardUtil; /** * - * @author Justin + * @author JRHerlehy */ public abstract class GameTinyLeadersImpl extends GameImpl{ From 8a6da4abe34f389b91591c05585ce9076081aa02 Mon Sep 17 00:00:00 2001 From: JRHerlehy Date: Sun, 1 Mar 2015 02:31:56 -0800 Subject: [PATCH 8/9] Allowing Sideboarding Tiny Leaders allows sideboarding. Turned on sideboarding option. --- .../src/mage/game/TinyLeadersDuelType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java index 26d97bde138..7936d4e8909 100644 --- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/src/mage/game/TinyLeadersDuelType.java @@ -43,7 +43,7 @@ public class TinyLeadersDuelType extends MatchType { this.numTeams = 0; this.useAttackOption = false; this.useRange = false; - this.sideboardingAllowed = false; + this.sideboardingAllowed = true; } protected TinyLeadersDuelType(final TinyLeadersDuelType matchType){ From 0a0a399259fdd1f9bc8a94fd39dfdef718629b0c Mon Sep 17 00:00:00 2001 From: JRHerlehy Date: Sun, 1 Mar 2015 03:12:25 -0800 Subject: [PATCH 9/9] Add Sideboard Allows a deck to have a sideboard. The player must have saved the deck with the CARDNAME of their commander in the NAME field of the Deck Editor to have it process as valid. --- .../src/mage/deck/TinyLeaders.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java index 620160c0874..1680d0cf4b0 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java @@ -139,8 +139,14 @@ public class TinyLeaders extends DeckValidator { } } - if (deck.getSideboard().size() == 1) { - Card commander = (Card) deck.getSideboard().toArray()[0]; + if (deck.getSideboard().size() <= 11) { + Card commander = null; + + for (Card card : deck.getSideboard()) { + if (card.getName().equalsIgnoreCase(deck.getName())) { + commander = card; + } + } /** * 905.5b - Each card must have a converted mana cost of three of less. @@ -149,7 +155,8 @@ public class TinyLeaders extends DeckValidator { */ if (commander == null || commander.getManaCost().convertedManaCost() > 3) { - invalid.put("Commander", "Commander invalide "); + if (commander == null) invalid.put("Leader", "Please be sure to set your leader in the NAME field in the DECK EDITOR"); + if (commander != null && commander.getManaCost().convertedManaCost() > 3) invalid.put("Leader", "Commander CMC is Greater than 3"); return false; } if ((commander.getCardType().contains(CardType.CREATURE) && commander.getSupertype().contains("Legendary"))