From 5fe4ba8fc1cc80f27a339a075f530cf23a46cdcb Mon Sep 17 00:00:00 2001 From: Loki Date: Sat, 19 Feb 2011 19:57:58 +0200 Subject: [PATCH 1/8] fix repository path for jspf --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b259abec65..c387f129bb 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ mage.googlecode.com - http://mage.googlecode.com/svn/trunk/repository + https://mage.googlecode.com/hg/repository/ jetlang.googlecode.com From 580dfadbef75f2ca82a87df589cfa0b0f5cebf39 Mon Sep 17 00:00:00 2001 From: Loki Date: Sat, 19 Feb 2011 23:19:54 +0200 Subject: [PATCH 2/8] MBS (sorry for strange username, works from wife's notebook) --- .../mirrodinbesieged/AccorderPaladin.java | 66 +++++++++++++++++ .../sets/mirrodinbesieged/ArdentRecruit.java | 74 +++++++++++++++++++ .../mirrodinbesieged/GoblinWardriver.java | 66 +++++++++++++++++ .../mirrodinbesieged/LoxodonPartisan.java | 66 +++++++++++++++++ .../abilities/keyword/BattleCryAbility.java | 26 +++++++ 5 files changed, 298 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/AccorderPaladin.java create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/ArdentRecruit.java create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/GoblinWardriver.java create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/LoxodonPartisan.java create mode 100644 Mage/src/mage/abilities/keyword/BattleCryAbility.java diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/AccorderPaladin.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/AccorderPaladin.java new file mode 100644 index 0000000000..bcccaf8bdb --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/AccorderPaladin.java @@ -0,0 +1,66 @@ +/* + * 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.mirrodinbesieged; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.keyword.BattleCryAbility; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class AccorderPaladin extends CardImpl { + + public AccorderPaladin (UUID ownerId) { + super(ownerId, 1, "Accorder Paladin", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Human"); + this.subtype.add("Knight"); + this.color.setWhite(true); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + this.addAbility(new BattleCryAbility()); + } + + public AccorderPaladin (final AccorderPaladin card) { + super(card); + } + + @Override + public AccorderPaladin copy() { + return new AccorderPaladin(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/ArdentRecruit.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/ArdentRecruit.java new file mode 100644 index 0000000000..d4dbba3450 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/ArdentRecruit.java @@ -0,0 +1,74 @@ +/* + * 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.mirrodinbesieged; + +import java.util.UUID; + +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.Metalcraft; +import mage.abilities.decorator.ConditionalContinousEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.common.continious.BoostSourceEffect; +import mage.cards.CardImpl; + +/** + * @author Loki + */ +public class ArdentRecruit extends CardImpl { + + private final String myText = "Metalcraft - Ardent Recruit gets +2/+2 as long as you control three or more artifacts"; + + public ArdentRecruit(UUID ownerId) { + super(ownerId, 2, "Ardent Recruit", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.color.setWhite(true); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + ContinuousEffect boostSource = new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield); + ConditionalContinousEffect effect = new ConditionalContinousEffect(boostSource, Metalcraft.getInstance(), myText); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + } + + public ArdentRecruit(final ArdentRecruit card) { + super(card); + } + + @Override + public ArdentRecruit copy() { + return new ArdentRecruit(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/GoblinWardriver.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/GoblinWardriver.java new file mode 100644 index 0000000000..af579fe061 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/GoblinWardriver.java @@ -0,0 +1,66 @@ +/* + * 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.mirrodinbesieged; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.keyword.BattleCryAbility; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class GoblinWardriver extends CardImpl { + + public GoblinWardriver (UUID ownerId) { + super(ownerId, 64, "Goblin Wardriver", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}{R}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Goblin"); + this.subtype.add("Warrior"); + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + this.addAbility(new BattleCryAbility()); + } + + public GoblinWardriver (final GoblinWardriver card) { + super(card); + } + + @Override + public GoblinWardriver copy() { + return new GoblinWardriver(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/LoxodonPartisan.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/LoxodonPartisan.java new file mode 100644 index 0000000000..d02632fbca --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/LoxodonPartisan.java @@ -0,0 +1,66 @@ +/* + * 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.mirrodinbesieged; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.keyword.BattleCryAbility; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class LoxodonPartisan extends CardImpl { + + public LoxodonPartisan (UUID ownerId) { + super(ownerId, 12, "Loxodon Partisan", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{W}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Elephant"); + this.subtype.add("Soldier"); + this.color.setWhite(true); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + this.addAbility(new BattleCryAbility()); + } + + public LoxodonPartisan (final LoxodonPartisan card) { + super(card); + } + + @Override + public LoxodonPartisan copy() { + return new LoxodonPartisan(this); + } + +} diff --git a/Mage/src/mage/abilities/keyword/BattleCryAbility.java b/Mage/src/mage/abilities/keyword/BattleCryAbility.java new file mode 100644 index 0000000000..e3a8d2e960 --- /dev/null +++ b/Mage/src/mage/abilities/keyword/BattleCryAbility.java @@ -0,0 +1,26 @@ +package mage.abilities.keyword; + +import mage.Constants; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continious.BoostControlledEffect; +import mage.filter.common.FilterAttackingCreature; + +public class BattleCryAbility extends AttacksTriggeredAbility { + public BattleCryAbility() { + super(new BoostControlledEffect(1, 0, Constants.Duration.EndOfTurn, new FilterAttackingCreature(), true), false); + } + + public BattleCryAbility(final BattleCryAbility ability) { + super(ability); + } + + @Override + public String getRule() { + return "Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.)"; + } + + @Override + public BattleCryAbility copy() { + return new BattleCryAbility(this); + } +} From 85e1f68554411f69c9031313e7b9617fa1d55115 Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Mon, 21 Feb 2011 00:20:36 -0500 Subject: [PATCH 3/8] another AI fix --- .../src/mage/player/ai/ComputerPlayer3.java | 18 ++++++++++-------- .../mage/player/ai/GameStateEvaluator.java | 2 +- Mage.Server/plugins/mage-player-aiminimax.jar | Bin 36861 -> 36881 bytes Mage.Tests/plugins/mage-player-aiminimax.jar | Bin 36885 -> 36881 bytes 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java index 5400751b70..67ec0288cb 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java @@ -160,6 +160,7 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { logger.debug("simulating pre combat actions -----------------------------------------------------------------------------------------"); addActionsTimed(new FilterAbility()); +// addActions(root, new FilterAbility(), maxDepth, Integer.MIN_VALUE, Integer.MAX_VALUE); if (root.children.size() > 0) { root = root.children.get(0); actions = new LinkedList(root.abilities); @@ -176,6 +177,7 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { root = new SimulationNode(null, sim, maxDepth, playerId); logger.debug("simulating post combat actions ----------------------------------------------------------------------------------------"); addActionsTimed(new FilterAbility()); +// addActions(root, new FilterAbility(), maxDepth, Integer.MIN_VALUE, Integer.MAX_VALUE); if (root.children.size() > 0) { root = root.children.get(0); actions = new LinkedList(root.abilities); @@ -296,8 +298,8 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { } else if (!counter) { finishCombat(game); - val = GameStateEvaluator.evaluate(playerId, game); -// val = simulateCounterAttack(game, node, depth, alpha, beta); +// val = GameStateEvaluator.evaluate(playerId, game); + val = simulateCounterAttack(game, node, depth, alpha, beta); } } if (val == null) @@ -326,16 +328,16 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { break; } Game sim = game.copy(); - UUID defenderId = game.getOpponents(playerId).iterator().next(); + UUID defenderId = game.getOpponents(attackerId).iterator().next(); for (CombatGroup group: engagement.getGroups()) { for (UUID attackId: group.getAttackers()) { sim.getPlayer(attackerId).declareAttacker(attackId, defenderId, sim); } } - sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_ATTACKERS, playerId, playerId)); + sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_ATTACKERS, attackerId, attackerId)); SimulationNode newNode = new SimulationNode(node, sim, depth, attackerId); if (logger.isDebugEnabled()) - logger.debug("simulating attack for player:" + game.getPlayer(newNode.getPlayerId()).getName()); + logger.debug("simulating attack for player:" + game.getPlayer(attackerId).getName()); sim.checkStateAndTriggered(); while (!sim.getStack().isEmpty()) { sim.getStack().resolve(sim); @@ -399,10 +401,10 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { } } } - sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, playerId, playerId)); + sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defenderId, defenderId)); SimulationNode newNode = new SimulationNode(node, sim, depth, defenderId); if (logger.isDebugEnabled()) - logger.debug("simulating block for player:" + game.getPlayer(newNode.getPlayerId()).getName()); + logger.debug("simulating block for player:" + game.getPlayer(defenderId).getName()); sim.checkStateAndTriggered(); while (!sim.getStack().isEmpty()) { sim.getStack().resolve(sim); @@ -455,9 +457,9 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { } Integer val = null; if (!game.isGameOver()) { - logger.debug("simulating -- counter attack"); simulateToEnd(game); game.getState().setActivePlayerId(game.getState().getPlayerList(game.getActivePlayerId()).getNext()); + logger.debug("simulating -- counter attack for player " + game.getPlayer(game.getActivePlayerId()).getName()); game.getTurn().setPhase(new BeginningPhase()); if (game.getPhase().beginPhase(game, game.getActivePlayerId())) { simulateStep(game, new UntapStep()); diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java index 90a8b0ec58..5e02552540 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java @@ -59,7 +59,7 @@ public class GameStateEvaluator { int score = lifeScore + permanentScore + handScore; if (logger.isDebugEnabled()) - logger.debug("game state evaluated to- lifeScore:" + lifeScore + " permanentScore:" + permanentScore + " handScore:" + handScore + " total:" + score); + logger.debug("game state for player " + player.getName() + " evaluated to- lifeScore:" + lifeScore + " permanentScore:" + permanentScore + " handScore:" + handScore + " total:" + score); return score; } diff --git a/Mage.Server/plugins/mage-player-aiminimax.jar b/Mage.Server/plugins/mage-player-aiminimax.jar index 72624ad402916fa991961c0a67da6ce64f3235f6..cbb118befec148ce23c66d3192360d7c1fee8a83 100644 GIT binary patch delta 11140 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 vrhtG`$l$vFjgtRYWdGhO-Y-e Date: Mon, 21 Feb 2011 00:21:20 -0500 Subject: [PATCH 4/8] allowing sorting by piles in deck editor --- .../main/java/mage/client/cards/CardGrid.java | 59 ++++++++++--- .../java/mage/client/cards/CardsList.form | 21 +++-- .../java/mage/client/cards/CardsList.java | 86 ++++++++++++++++--- .../mage/client/deckeditor/CardSelector.form | 11 +++ .../mage/client/deckeditor/CardSelector.java | 30 +++++-- .../java/mage/client/draft/DraftPanel.java | 4 +- 6 files changed, 174 insertions(+), 37 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java index a602188b04..7a5b34b0f5 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java @@ -75,7 +75,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener setOpaque(false); } - public void loadCards(CardsView showCards, SortBy sortBy, BigCard bigCard, UUID gameId) { + public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId) { this.bigCard = bigCard; this.gameId = gameId; for (CardView card: showCards.values()) { @@ -90,7 +90,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener i.remove(); } } - drawCards(sortBy); + drawCards(sortBy, piles); this.setVisible(true); } @@ -106,7 +106,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener cards.put(card.getId(), cardImg); } - public void drawCards(SortBy sortBy) { + public void drawCards(SortBy sortBy, boolean piles) { int maxWidth = this.getParent().getWidth(); int numColumns = maxWidth / Config.dimensions.frameWidth; int curColumn = 0; @@ -128,15 +128,54 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener Collections.sort(sortedCards, new CardCostComparator()); break; } + MageCard lastCard = null; for (MageCard cardImg: sortedCards) { - rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20); - cardImg.setBounds(rectangle); - cardImg.setCardBounds(rectangle.x, rectangle.y, Config.dimensions.frameWidth, Config.dimensions.frameHeight); - moveToFront(cardImg); - curColumn++; - if (curColumn == numColumns) { - curColumn = 0; + if (piles) { + if (lastCard == null) + lastCard = cardImg; + switch (sortBy) { + case NAME: + if (!cardImg.getOriginal().getName().equals(lastCard.getOriginal().getName())) { + curColumn++; + curRow = 0; + } + break; + case RARITY: + if (!cardImg.getOriginal().getRarity().equals(lastCard.getOriginal().getRarity())) { + curColumn++; + curRow = 0; + } + break; + case COLOR: + if (cardImg.getOriginal().getColor().compareTo(lastCard.getOriginal().getColor()) != 0) { + curColumn++; + curRow = 0; + } + break; + case CASTING_COST: + if (cardImg.getOriginal().getConvertedManaCost() != lastCard.getOriginal().getConvertedManaCost()) { + curColumn++; + curRow = 0; + } + break; + } + rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20); + cardImg.setBounds(rectangle); + cardImg.setCardBounds(rectangle.x, rectangle.y, Config.dimensions.frameWidth, Config.dimensions.frameHeight); + moveToFront(cardImg); curRow++; + lastCard = cardImg; + } + else { + rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20); + cardImg.setBounds(rectangle); + cardImg.setCardBounds(rectangle.x, rectangle.y, Config.dimensions.frameWidth, Config.dimensions.frameHeight); + moveToFront(cardImg); + curColumn++; + if (curColumn == numColumns) { + curColumn = 0; + curRow++; + } } } } diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.form b/Mage.Client/src/main/java/mage/client/cards/CardsList.form index 85696ffe74..3046438e2e 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.form +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.form @@ -27,7 +27,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -58,12 +58,14 @@ - + - - + + + + @@ -74,6 +76,7 @@ + @@ -109,6 +112,14 @@ + + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.java b/Mage.Client/src/main/java/mage/client/cards/CardsList.java index 413b1b5201..2d003a03ee 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.UUID; import javax.swing.DefaultComboBoxModel; import mage.Constants.CardType; +import mage.ObjectColor; import mage.cards.MageCard; import mage.client.constants.Constants.SortBy; @@ -115,17 +116,58 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { Collections.sort(sortedCards, new CardViewCostComparator()); break; } + CardView lastCard = null; for (CardView card: sortedCards) { - rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20); - addCard(card, bigCard, gameId, rectangle); - if (card.getCardTypes().contains(CardType.LAND)) - landCount++; - if (card.getCardTypes().contains(CardType.CREATURE)) - creatureCount++; - curColumn++; - if (curColumn == numColumns) { - curColumn = 0; + if (chkPiles.isSelected()) { + if (lastCard == null) + lastCard = card; + switch (sortBy) { + case NAME: + if (!card.getName().equals(lastCard.getName())) { + curColumn++; + curRow = 0; + } + break; + case RARITY: + if (!card.getRarity().equals(lastCard.getRarity())) { + curColumn++; + curRow = 0; + } + break; + case COLOR: + if (card.getColor().compareTo(lastCard.getColor()) != 0) { + curColumn++; + curRow = 0; + } + break; + case CASTING_COST: + if (card.getConvertedManaCost() != lastCard.getConvertedManaCost()) { + curColumn++; + curRow = 0; + } + break; + } + rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20); + addCard(card, bigCard, gameId, rectangle); + if (card.getCardTypes().contains(CardType.LAND)) + landCount++; + if (card.getCardTypes().contains(CardType.CREATURE)) + creatureCount++; curRow++; + lastCard = card; + } + else { + rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20); + addCard(card, bigCard, gameId, rectangle); + if (card.getCardTypes().contains(CardType.LAND)) + landCount++; + if (card.getCardTypes().contains(CardType.CREATURE)) + creatureCount++; + curColumn++; + if (curColumn == numColumns) { + curColumn = 0; + curRow++; + } } } } @@ -176,6 +218,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { lblCount = new javax.swing.JLabel(); lblCreatureCount = new javax.swing.JLabel(); lblLandCount = new javax.swing.JLabel(); + chkPiles = new javax.swing.JCheckBox(); setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); setPreferredSize((!Beans.isDesignTime())?(new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight)):(new Dimension(100, 100))); @@ -195,6 +238,13 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { lblLandCount.setText("Land Count"); + chkPiles.setText("Piles"); + chkPiles.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + chkPilesActionPerformed(evt); + } + }); + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -205,8 +255,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { .addComponent(lblCreatureCount, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(lblLandCount, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(cbSortBy, 0, 353, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(chkPiles) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbSortBy, 0, 300, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -214,7 +266,8 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { .addComponent(cbSortBy, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblCount) .addComponent(lblCreatureCount) - .addComponent(lblLandCount)) + .addComponent(lblLandCount) + .addComponent(chkPiles)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -222,14 +275,14 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 639, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 625, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 397, Short.MAX_VALUE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 258, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -237,10 +290,15 @@ public class CardsList extends javax.swing.JPanel implements MouseListener { drawCards((SortBy) cbSortBy.getSelectedItem()); }//GEN-LAST:event_cbSortByActionPerformed + private void chkPilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkPilesActionPerformed + drawCards((SortBy) cbSortBy.getSelectedItem()); + }//GEN-LAST:event_chkPilesActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLayeredPane cardArea; private javax.swing.JComboBox cbSortBy; + private javax.swing.JCheckBox chkPiles; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel lblCount; diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form index a317ec55e0..64253dc584 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form @@ -255,6 +255,17 @@ + + + + + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index 7ad58865f3..760f1c9b61 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -142,7 +142,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene filteredCards.add(card); } } - this.cardGrid.loadCards(new CardsView(filteredCards), (SortBy) cbSortBy.getSelectedItem(), bigCard, null); + this.cardGrid.loadCards(new CardsView(filteredCards), (SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected(), bigCard, null); } finally { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); @@ -198,6 +198,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene rdoInstants = new javax.swing.JRadioButton(); rdoSorceries = new javax.swing.JRadioButton(); rdoPlaneswalkers = new javax.swing.JRadioButton(); + chkPiles = new javax.swing.JCheckBox(); cbSortBy = new javax.swing.JComboBox(); tbColor.setFloatable(false); @@ -394,6 +395,17 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene }); tbTypes.add(rdoPlaneswalkers); + chkPiles.setText("Piles"); + chkPiles.setFocusable(false); + chkPiles.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); + chkPiles.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + chkPiles.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + chkPilesActionPerformed(evt); + } + }); + tbTypes.add(chkPiles); + cbSortBy.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); cbSortBy.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -530,9 +542,14 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private void cbSortByActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbSortByActionPerformed if (cbSortBy.getSelectedItem() instanceof SortBy) - this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem()); + this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected()); }//GEN-LAST:event_cbSortByActionPerformed + private void chkPilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkPilesActionPerformed + if (cbSortBy.getSelectedItem() instanceof SortBy) + this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected()); + }//GEN-LAST:event_chkPilesActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnBooster; @@ -540,6 +557,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private mage.client.cards.CardGrid cardGrid; private javax.swing.JComboBox cbExpansionSet; private javax.swing.JComboBox cbSortBy; + private javax.swing.JCheckBox chkPiles; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JRadioButton rdoArtifacts; private javax.swing.JRadioButton rdoBlack; @@ -561,25 +579,25 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene @Override public void componentResized(ComponentEvent e) { if (cbSortBy.getSelectedItem() instanceof SortBy) - this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem()); + this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected()); } @Override public void componentMoved(ComponentEvent e) { if (cbSortBy.getSelectedItem() instanceof SortBy) - this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem()); + this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected()); } @Override public void componentShown(ComponentEvent e) { if (cbSortBy.getSelectedItem() instanceof SortBy) - this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem()); + this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected()); } @Override public void componentHidden(ComponentEvent e) { if (cbSortBy.getSelectedItem() instanceof SortBy) - this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem()); + this.cardGrid.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected()); } } diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java index 9bd5c9d9df..4d3c3e775d 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java @@ -98,7 +98,7 @@ public class DraftPanel extends javax.swing.JPanel { public void loadBooster(DraftPickView draftPickView) { draftBooster.loadBooster(draftPickView.getBooster(), bigCard); - draftPicks.loadCards(draftPickView.getPicks(), SortBy.NAME, bigCard, null); + draftPicks.loadCards(draftPickView.getPicks(), SortBy.NAME, false, bigCard, null); this.draftBooster.clearCardEventListeners(); this.draftBooster.addCardEventListener( new Listener () { @@ -108,7 +108,7 @@ public class DraftPanel extends javax.swing.JPanel { DraftPickView view = session.sendCardPick(draftId, (UUID)event.getSource()); if (view != null) { draftBooster.loadBooster(view.getBooster(), bigCard); - draftPicks.loadCards(view.getPicks(), SortBy.NAME, bigCard, null); + draftPicks.loadCards(view.getPicks(), SortBy.NAME, false, bigCard, null); setMessage("Waiting for other players"); } } From 3121de07bcc3c160fa1fcff7126704544a8ba492 Mon Sep 17 00:00:00 2001 From: Loki Date: Tue, 22 Feb 2011 10:08:23 +0200 Subject: [PATCH 5/8] MBS --- .../sets/mirrodinbesieged/Flensermite.java | 67 ++++++++++++++++++ .../sets/mirrodinbesieged/GustSkimmer.java | 67 ++++++++++++++++++ .../sets/mirrodinbesieged/ViridianClaw.java | 68 +++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/Flensermite.java create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/GustSkimmer.java create mode 100644 Mage.Sets/src/mage/sets/mirrodinbesieged/ViridianClaw.java diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/Flensermite.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/Flensermite.java new file mode 100644 index 0000000000..1d93cbd14a --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/Flensermite.java @@ -0,0 +1,67 @@ +/* + * 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.mirrodinbesieged; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.keyword.InfectAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class Flensermite extends CardImpl { + + public Flensermite (UUID ownerId) { + super(ownerId, 41, "Flensermite", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Gremlin"); + this.color.setBlack(true); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + this.addAbility(InfectAbility.getInstance()); + this.addAbility(LifelinkAbility.getInstance()); + } + + public Flensermite (final Flensermite card) { + super(card); + } + + @Override + public Flensermite copy() { + return new Flensermite(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/GustSkimmer.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/GustSkimmer.java new file mode 100644 index 0000000000..ed2e057b54 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/GustSkimmer.java @@ -0,0 +1,67 @@ +/* + * 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.mirrodinbesieged; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continious.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class GustSkimmer extends CardImpl { + + public GustSkimmer (UUID ownerId) { + super(ownerId, 108, "Gust-Skimmer", Rarity.COMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Insect"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{U}"))); + } + + public GustSkimmer (final GustSkimmer card) { + super(card); + } + + @Override + public GustSkimmer copy() { + return new GustSkimmer(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/ViridianClaw.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/ViridianClaw.java new file mode 100644 index 0000000000..8355c2f35b --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/ViridianClaw.java @@ -0,0 +1,68 @@ +/* + * 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 P N 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.mirrodinbesieged; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continious.BoostEquippedEffect; +import mage.abilities.effects.common.continious.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class ViridianClaw extends CardImpl { + + public ViridianClaw (UUID ownerId) { + super(ownerId, 143, "Viridian Claw", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "MBS"; + this.subtype.add("Equipment"); + this.addAbility(new EquipAbility(Constants.Outcome.AddAbility, new GenericManaCost(3))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), Constants.AttachmentType.EQUIPMENT))); + } + + public ViridianClaw (final ViridianClaw card) { + super(card); + } + + @Override + public ViridianClaw copy() { + return new ViridianClaw(this); + } + +} From 4bb22e0138816b8f15712c32cf4f514889854a83 Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Tue, 22 Feb 2011 21:38:17 -0500 Subject: [PATCH 6/8] fixed problem with consecutive games in a match --- Mage/src/mage/game/GameImpl.java | 5 ++++- Mage/src/mage/players/PlayerImpl.java | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 5833e957d9..e02ccec4ed 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -325,6 +325,9 @@ public abstract class GameImpl> implements Game, Serializa for (Player player: state.getPlayers().values()) { player.init(this, testMode); } + for (Player player: state.getPlayers().values()) { + player.beginTurn(this); + } fireInformEvent("game has started"); saveState(); @@ -344,7 +347,7 @@ public abstract class GameImpl> implements Game, Serializa else { choosingPlayer = this.getPlayer(choosingPlayerId); } - if (choosingPlayer.chooseTarget(Outcome.Benefit, targetPlayer, null, this)) { + if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, this)) { startingPlayerId = ((List)targetPlayer.getTargets()).get(0); fireInformEvent(state.getPlayer(startingPlayerId).getName() + " will start"); } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index f1b12a0adb..2138df47df 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -168,7 +168,6 @@ public abstract class PlayerImpl> implements Player, Ser this.left = false; this.passed = false; this.passedTurn = false; - findRange(game); } @Override From 47e1a7dd876faa0acc1a754245df12822a83354a Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Tue, 22 Feb 2011 21:39:24 -0500 Subject: [PATCH 7/8] fixed issue with X costs --- .../java/mage/server/game/GameController.java | 24 +++++++++---------- .../src/mage/sets/conflux/MartialCoup.java | 4 ++-- .../src/mage/sets/magic2010/Earthquake.java | 2 +- .../src/mage/sets/magic2010/Fireball.java | 2 +- .../src/mage/sets/magic2010/MindSpring.java | 2 +- .../src/mage/sets/magic2010/ProteanHydra.java | 2 +- .../mage/sets/magic2011/VengefulArchon.java | 4 ++-- .../sets/scarsofmirrodin/Exsanguinate.java | 2 +- .../shardsofalara/SigilofDistinction.java | 2 +- 9 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 1b596b3549..849d5fc582 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -36,8 +36,6 @@ import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.logging.Level; -import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -56,11 +54,11 @@ import mage.players.Player; import mage.server.ChatManager; import mage.server.util.ThreadExecutor; import mage.sets.Sets; -import mage.util.Logging; import mage.view.AbilityPickerView; import mage.view.CardsView; import mage.view.GameView; import mage.view.ChatMessage.MessageColor; +import org.apache.log4j.Logger; /** * @@ -69,7 +67,7 @@ import mage.view.ChatMessage.MessageColor; public class GameController implements GameCallback { private static ExecutorService gameExecutor = ThreadExecutor.getInstance().getGameExecutor(); - private final static Logger logger = Logging.getLogger(GameController.class.getName()); + private final static Logger logger = Logger.getLogger(GameController.class); public static final String INIT_FILE_PATH = "config" + File.separator + "init.txt"; private ConcurrentHashMap gameSessions = new ConcurrentHashMap(); @@ -104,7 +102,7 @@ public class GameController implements GameCallback { break; case INFO: ChatManager.getInstance().broadcast(chatId, "", event.getMessage(), MessageColor.BLACK); - logger.finest(game.getId() + " " + event.getMessage()); + logger.debug(game.getId() + " " + event.getMessage()); break; case REVEAL: revealCards(event.getMessage(), event.getCards()); @@ -178,7 +176,7 @@ public class GameController implements GameCallback { if (gameFuture == null) { for (final Entry entry: gameSessions.entrySet()) { if (!entry.getValue().init(getGameView(entry.getKey()))) { - logger.severe("Unable to initialize client"); + logger.fatal("Unable to initialize client"); //TODO: generate client error message return; } @@ -238,7 +236,7 @@ public class GameController implements GameCallback { card.putOntoBattlefield(game, Zone.OUTSIDE, null, playerId); } } catch (GameException ex) { - logger.warning(ex.getMessage()); + logger.warn(ex.getMessage()); } addCardsForTesting(game); updateGame(); @@ -434,7 +432,7 @@ public class GameController implements GameCallback { File f = new File(INIT_FILE_PATH); Pattern pattern = Pattern.compile("([a-zA-Z]*):([\\w]*):([a-zA-Z ,\\-.!'\\d]*):([\\d]*)"); if (!f.exists()) { - logger.warning("Couldn't find init file: " + INIT_FILE_PATH); + logger.warn("Couldn't find init file: " + INIT_FILE_PATH); return; } @@ -444,7 +442,7 @@ public class GameController implements GameCallback { try { while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); - if (line.startsWith("#")) continue; + if (line.trim().length() == 0 || line.startsWith("#")) continue; Matcher m = pattern.matcher(line); if (m.matches()) { @@ -476,14 +474,14 @@ public class GameController implements GameCallback { game.loadCards(cards, player.getId()); swapWithAnyCard(game, player, card, gameZone); } else { - logger.severe("Couldn't find a card: " + cardName); + logger.fatal("Couldn't find a card: " + cardName); } } } else { - logger.warning("Was skipped: " + line); + logger.warn("Was skipped: " + line); } } else { - logger.warning("Init string wasn't parsed: " + line); + logger.warn("Init string wasn't parsed: " + line); } } } @@ -491,7 +489,7 @@ public class GameController implements GameCallback { scanner.close(); } } catch (Exception e) { - logger.log(Level.SEVERE, "", e); + logger.fatal("", e); } } diff --git a/Mage.Sets/src/mage/sets/conflux/MartialCoup.java b/Mage.Sets/src/mage/sets/conflux/MartialCoup.java index c34dd17e61..25fe18615e 100644 --- a/Mage.Sets/src/mage/sets/conflux/MartialCoup.java +++ b/Mage.Sets/src/mage/sets/conflux/MartialCoup.java @@ -90,8 +90,8 @@ class MartialCoupEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int amount = 0; - if (source.getManaCosts().getVariableCosts().size() > 0) { - amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); + if (source.getManaCostsToPay().getVariableCosts().size() > 0) { + amount = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); } if (amount > 4) { diff --git a/Mage.Sets/src/mage/sets/magic2010/Earthquake.java b/Mage.Sets/src/mage/sets/magic2010/Earthquake.java index 81423c5d42..e361e1a1a0 100644 --- a/Mage.Sets/src/mage/sets/magic2010/Earthquake.java +++ b/Mage.Sets/src/mage/sets/magic2010/Earthquake.java @@ -93,7 +93,7 @@ class EarthquakeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); + int amount = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { permanent.damage(amount, source.getId(), game, true, false); diff --git a/Mage.Sets/src/mage/sets/magic2010/Fireball.java b/Mage.Sets/src/mage/sets/magic2010/Fireball.java index 3b6f8ab590..fe6e07fa27 100644 --- a/Mage.Sets/src/mage/sets/magic2010/Fireball.java +++ b/Mage.Sets/src/mage/sets/magic2010/Fireball.java @@ -91,7 +91,7 @@ class FireballEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int numTargets = source.getTargets().get(0).getTargets().size(); - int damage = source.getManaCosts().getVariableCosts().get(0).getAmount(); + int damage = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); if (numTargets > 0) { int damagePer = damage/numTargets; if (damagePer > 0) { diff --git a/Mage.Sets/src/mage/sets/magic2010/MindSpring.java b/Mage.Sets/src/mage/sets/magic2010/MindSpring.java index b63406a77e..17d3d4d541 100644 --- a/Mage.Sets/src/mage/sets/magic2010/MindSpring.java +++ b/Mage.Sets/src/mage/sets/magic2010/MindSpring.java @@ -84,7 +84,7 @@ class MindSpringEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); + int amount = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); Player player = game.getPlayer(source.getControllerId()); if (player != null) { player.drawCards(amount, game); diff --git a/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java b/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java index 3577003801..c6765dacbc 100644 --- a/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java +++ b/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java @@ -99,7 +99,7 @@ public class ProteanHydra extends CardImpl { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - int amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); + int amount = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); permanent.addCounters(new PlusOneCounter(amount)); } return true; diff --git a/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java b/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java index c2474954af..facf503bf0 100644 --- a/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java +++ b/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java @@ -102,8 +102,8 @@ class VengefulArchonEffect extends PreventionEffectImpl { @Override public void init(Ability source, Game game) { super.init(source, game); - if (source.getManaCosts().getVariableCosts().size() > 0) - amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); + if (source.getManaCostsToPay().getVariableCosts().size() > 0) + amount = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); } @Override diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/Exsanguinate.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/Exsanguinate.java index 5332ac3aaa..b60d402655 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/Exsanguinate.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/Exsanguinate.java @@ -76,7 +76,7 @@ class ExsanguinateEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int loseLife = 0; - int damage = source.getManaCosts().getVariableCosts().get(0).getAmount(); + int damage = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); for (UUID opponentId : game.getOpponents(source.getControllerId())) { loseLife += game.getPlayer(opponentId).loseLife(damage, game); } diff --git a/Mage.Sets/src/mage/sets/shardsofalara/SigilofDistinction.java b/Mage.Sets/src/mage/sets/shardsofalara/SigilofDistinction.java index 2d524a64d0..98e3cac478 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/SigilofDistinction.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/SigilofDistinction.java @@ -85,7 +85,7 @@ class SigilofDistinctionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); + int amount = source.getManaCostsToPay().getVariableCosts().get(0).getAmount(); Permanent p = game.getPermanent(source.getSourceId()); if (p != null) { p.addCounters(CounterType.CHARGE.createInstance(amount)); From 17f87daf5ae6181cc49936540157b84c286b449b Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Tue, 22 Feb 2011 21:40:25 -0500 Subject: [PATCH 8/8] fixed issue with default AI playing unplayable spells --- .../java/mage/player/ai/ComputerPlayer.java | 24 ++++++++++++------ Mage.Server/plugins/mage-player-ai.jar | Bin 41978 -> 42156 bytes 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 850465316f..3e9706d336 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -44,6 +44,7 @@ import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; +import mage.abilities.SpellAbility; import mage.abilities.TriggeredAbilities; import mage.abilities.TriggeredAbility; import mage.abilities.costs.mana.ColoredManaCost; @@ -225,7 +226,8 @@ public class ComputerPlayer> extends PlayerImpl i return true; } } - return false; + if (!target.isRequired()) + return false; } if (target instanceof TargetDiscard) { findPlayables(game); @@ -243,7 +245,8 @@ public class ComputerPlayer> extends PlayerImpl i return true; } } - return false; + if (!target.isRequired()) + return false; } if (target instanceof TargetControlledPermanent) { List targets; @@ -271,7 +274,8 @@ public class ComputerPlayer> extends PlayerImpl i return true; } } - return false; + if (!target.isRequired()) + return false; } if (target instanceof TargetCreatureOrPlayer) { List targets; @@ -300,7 +304,8 @@ public class ComputerPlayer> extends PlayerImpl i return true; } } - return false; + if (!target.isRequired()) + return false; } throw new IllegalStateException("Target wasn't handled. class:" + target.getClass().toString()); } @@ -484,10 +489,13 @@ public class ComputerPlayer> extends PlayerImpl i for (Mana mana: options) { for (Mana avail: available) { if (mana.enough(avail)) { - if (card.getCardType().contains(CardType.INSTANT)) - playableInstant.add(card); - else - playableNonInstant.add(card); + SpellAbility ability = card.getSpellAbility(); + if (ability != null && ability.canActivate(playerId, game)) { + if (card.getCardType().contains(CardType.INSTANT)) + playableInstant.add(card); + else + playableNonInstant.add(card); + } } else { if (!playableInstant.contains(card) && !playableNonInstant.contains(card)) diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index 45016d50142a1ea95973ba00bed3f59f6e2a8ac7..1e7af9d1addff832763f9cb8818825aa5cd92ead 100644 GIT binary patch delta 21152 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 delta 20967 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 fdcu