From a8538885ab9ec287c06104830cc9094d98795f93 Mon Sep 17 00:00:00 2001 From: Plopman Date: Tue, 23 Jul 2013 18:15:12 +0200 Subject: [PATCH] [Commander]Added alternative lose condition. (21 damages by commander) --- .../src/mage/game/CommanderDuel.java | 28 +++++- .../mage/game/permanent/PermanentCard.java | 4 + .../common/CommanderCombatDamageWatcher.java | 98 +++++++++++++++++++ 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 Mage/src/mage/watchers/common/CommanderCombatDamageWatcher.java diff --git a/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java b/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java index 17c07b6b0f7..1cc25de5954 100644 --- a/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java +++ b/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java @@ -44,6 +44,8 @@ import mage.constants.Zone; import mage.game.match.MatchType; import mage.game.turn.TurnMod; import mage.players.Player; +import mage.watchers.Watcher; +import mage.watchers.common.CommanderCombatDamageWatcher; public class CommanderDuel extends GameImpl { @@ -88,6 +90,7 @@ public class CommanderDuel extends GameImpl { ability.addEffect(new CommanderReplacementEffect(commander.getId())); ability.addEffect(new CommanderCostModification(commander.getId())); getState().setValue(commander + "_castCount", new Integer(0)); + getState().getWatchers().add(new CommanderCombatDamageWatcher(commander.getId())); } } } @@ -97,6 +100,29 @@ public class CommanderDuel extends GameImpl { state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); } + /* 20130711 + *903.14a A player that’s been dealt 21 or more combat damage by the same commander + * over the course of the game loses the game. (This is a state-based action. See rule 704.) + * + */ + @Override + protected boolean checkStateBasedActions() { + for(Watcher watcher : getState().getWatchers().values()){ + if(watcher instanceof CommanderCombatDamageWatcher){ + CommanderCombatDamageWatcher damageWatcher = (CommanderCombatDamageWatcher)watcher; + for(UUID playerUUID : damageWatcher.getDamageToPlayer().keySet()){ + Player player = getPlayer(playerUUID); + if(player != null && damageWatcher.getDamageToPlayer().get(playerUUID) >= 21){ + player.lost(this); + } + } + } + } + return super.checkStateBasedActions(); + } + + + @Override public void quit(UUID playerId) { super.quit(playerId); @@ -115,7 +141,7 @@ public class CommanderDuel extends GameImpl { @Override public void leave(UUID playerId) { - + super.leave(playerId); } @Override diff --git a/Mage/src/mage/game/permanent/PermanentCard.java b/Mage/src/mage/game/permanent/PermanentCard.java index 0e5c9c7adfd..4e28671e04a 100644 --- a/Mage/src/mage/game/permanent/PermanentCard.java +++ b/Mage/src/mage/game/permanent/PermanentCard.java @@ -37,6 +37,7 @@ import mage.game.events.ZoneChangeEvent; import mage.players.Player; import java.util.UUID; +import mage.game.command.Commander; /** @@ -194,6 +195,9 @@ public class PermanentCard extends PermanentImpl { case EXILED: game.getExile().getPermanentExile().add(card); break; + case COMMAND: + game.addCommander(new Commander(card)); + break; case LIBRARY: if (flag) owner.getLibrary().putOnTop(card, game); diff --git a/Mage/src/mage/watchers/common/CommanderCombatDamageWatcher.java b/Mage/src/mage/watchers/common/CommanderCombatDamageWatcher.java new file mode 100644 index 00000000000..bb097df8a34 --- /dev/null +++ b/Mage/src/mage/watchers/common/CommanderCombatDamageWatcher.java @@ -0,0 +1,98 @@ +/* + * 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.watchers.common; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.MageObject; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.DamagedPlayerEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.players.Player; +import mage.watchers.WatcherImpl; + +/* 20130711 + *903.14a A player that’s been dealt 21 or more combat damage by the same commander + * over the course of the game loses the game. (This is a state-based action. See rule 704.) + * + */ + +/** + * + * @author Plopman + */ +public class CommanderCombatDamageWatcher extends WatcherImpl { + + public Map damageToPlayer = new HashMap(); + + public CommanderCombatDamageWatcher(UUID commander) { + super("CommanderCombatDamageWatcher", WatcherScope.CARD); + this.sourceId = commander; + } + + + public CommanderCombatDamageWatcher(final CommanderCombatDamageWatcher watcher) { + super(watcher); + this.damageToPlayer.putAll(watcher.damageToPlayer); + } + + @Override + public CommanderCombatDamageWatcher copy() { + return new CommanderCombatDamageWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == EventType.DAMAGED_PLAYER && event instanceof DamagedPlayerEvent) { + if (sourceId.equals(event.getSourceId())) { + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event; + UUID playerUUID = event.getTargetId(); + Integer damage = damageToPlayer.get(playerUUID); + if(damage == null){ + damage = 0; + } + damage += damageEvent.getAmount(); + damageToPlayer.put(playerUUID, damage); + Player player = game.getPlayer(playerUUID); + MageObject commander = game.getObject(sourceId); + if(player != null && commander != null){ + game.informPlayers(commander.getName() + " did " + damage + "damages to " + player.getName() + " during the game."); + } + } + } + } + + public Map getDamageToPlayer() { + return damageToPlayer; + } + + +}