From c83337950dc7d13a256375df269af7c14d151f25 Mon Sep 17 00:00:00 2001 From: moomarc Date: Wed, 11 Jul 2012 14:45:37 +0000 Subject: [PATCH] Added Ember Beast, Jackal Familiar and Mogg Flunkies. Added CARDNAME can't attack or block alone keyword. --- .gitattributes | 3 +++ res/cardsfolder/e/ember_beast.txt | 11 ++++++++++ res/cardsfolder/j/jackal_familiar.txt | 11 ++++++++++ res/cardsfolder/m/mogg_flunkies.txt | 12 +++++++++++ src/main/java/forge/game/phase/Combat.java | 20 ++++++++++++++++++ .../java/forge/game/phase/CombatUtil.java | 10 +++++++++ src/main/java/forge/game/phase/PhaseUtil.java | 21 +++++++++++++++++++ 7 files changed, 88 insertions(+) create mode 100644 res/cardsfolder/e/ember_beast.txt create mode 100644 res/cardsfolder/j/jackal_familiar.txt create mode 100644 res/cardsfolder/m/mogg_flunkies.txt diff --git a/.gitattributes b/.gitattributes index 8216cef9b11..34af56b9c7c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2780,6 +2780,7 @@ res/cardsfolder/e/elvish_visionary.txt svneol=native#text/plain res/cardsfolder/e/elvish_warrior.txt svneol=native#text/plain res/cardsfolder/e/emancipation_angel.txt -text res/cardsfolder/e/embargo.txt svneol=native#text/plain +res/cardsfolder/e/ember_beast.txt -text res/cardsfolder/e/ember_fist_zubera.txt svneol=native#text/plain res/cardsfolder/e/ember_hauler.txt svneol=native#text/plain res/cardsfolder/e/ember_shot.txt svneol=native#text/plain @@ -4767,6 +4768,7 @@ res/cardsfolder/j/jaces_archivist.txt -text res/cardsfolder/j/jaces_erasure.txt svneol=native#text/plain res/cardsfolder/j/jaces_ingenuity.txt svneol=native#text/plain res/cardsfolder/j/jaces_phantasm.txt -text +res/cardsfolder/j/jackal_familiar.txt -text res/cardsfolder/j/jackal_pup.txt svneol=native#text/plain res/cardsfolder/j/jackalope_herd.txt svneol=native#text/plain res/cardsfolder/j/jacques_le_vert.txt svneol=native#text/plain @@ -5992,6 +5994,7 @@ res/cardsfolder/m/mogg_bombers.txt svneol=native#text/plain res/cardsfolder/m/mogg_cannon.txt -text res/cardsfolder/m/mogg_conscripts.txt -text res/cardsfolder/m/mogg_fanatic.txt svneol=native#text/plain +res/cardsfolder/m/mogg_flunkies.txt -text res/cardsfolder/m/mogg_hollows.txt svneol=native#text/plain res/cardsfolder/m/mogg_infestation.txt -text res/cardsfolder/m/mogg_jailer.txt svneol=native#text/plain diff --git a/res/cardsfolder/e/ember_beast.txt b/res/cardsfolder/e/ember_beast.txt new file mode 100644 index 00000000000..973c904414b --- /dev/null +++ b/res/cardsfolder/e/ember_beast.txt @@ -0,0 +1,11 @@ +Name:Ember Beast +ManaCost:2 R +Types:Creature Beast +Text:no text +PT:3/4 +K:CARDNAME can't attack or block alone. +SVar:Rarity:Common +SVar:Picture:http://www.wizards.com/global/images/magic/general/ember_beast.jpg +SetInfo:ODY|Common|http://magiccards.info/scans/en/od/190.jpg +Oracle:Ember Beast can't attack or block alone. +End \ No newline at end of file diff --git a/res/cardsfolder/j/jackal_familiar.txt b/res/cardsfolder/j/jackal_familiar.txt new file mode 100644 index 00000000000..199d87f4ec4 --- /dev/null +++ b/res/cardsfolder/j/jackal_familiar.txt @@ -0,0 +1,11 @@ +Name:Jackal Familiar +ManaCost:R +Types:Creature Hound +Text:no text +PT:2/2 +K:CARDNAME can't attack or block alone. +SVar:Rarity:Common +SVar:Picture:http://www.wizards.com/global/images/magic/general/jackal_familiar.jpg +SetInfo:M10|Common|http://magiccards.info/scans/en/m10/143.jpg +Oracle:Jackal Familiar can't attack or block alone. +End \ No newline at end of file diff --git a/res/cardsfolder/m/mogg_flunkies.txt b/res/cardsfolder/m/mogg_flunkies.txt new file mode 100644 index 00000000000..632cd6776e0 --- /dev/null +++ b/res/cardsfolder/m/mogg_flunkies.txt @@ -0,0 +1,12 @@ +Name:Mogg Flunkies +ManaCost:1 R +Types:Creature Goblin +Text:no text +PT:3/3 +K:CARDNAME can't attack or block alone. +SVar:Rarity:Common +SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_flunkies.jpg +SetInfo:M13|Common|http://magiccards.info/scans/en/m13/143.jpg +SetInfo:STH|Common|http://magiccards.info/scans/en/sh/92.jpg +Oracle:Mogg Flunkies can't attack or block alone. +End \ No newline at end of file diff --git a/src/main/java/forge/game/phase/Combat.java b/src/main/java/forge/game/phase/Combat.java index 075a75fccdf..4e7226a0c9b 100644 --- a/src/main/java/forge/game/phase/Combat.java +++ b/src/main/java/forge/game/phase/Combat.java @@ -588,6 +588,26 @@ public class Combat { } } // removeFromCombat() + /** + *

+ * undoBlockingAssignment. + *

+ * + * @param blocker + * a {@link forge.Card} object. + */ + public final void undoBlockingAssignment(final Card blocker) { + final CardList att = this.getAttackerList(); + for (final Card attacker : att) { + if (this.getBlockers(attacker).contains(blocker)) { + this.getBlockerList(attacker).remove(blocker); + if (this.getBlockers(attacker).size() == 0) { + this.blocked.remove(attacker); + } + } + } + } // undoBlockingAssignment(Card) + /** *

* verifyCreaturesInPlay. diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 8a7708f2221..14fb46679ec 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -99,6 +99,11 @@ public class CombatUtil { } } + final CardList list = AllZoneUtil.getCreaturesInPlay(blocker.getController()); + if (list.size() < 2 && blocker.hasKeyword("CARDNAME can't attack or block alone.")) { + return false; + } + if ((combat.getAllBlockers().size() > 0) && AllZoneUtil.isCardInPlay("Dueling Grounds")) { return false; } @@ -667,6 +672,11 @@ public class CombatUtil { } } + final CardList list = AllZoneUtil.getCreaturesInPlay(c.getController()); + if (list.size() < 2 && c.hasKeyword("CARDNAME can't attack or block alone.")) { + return false; + } + if (cntAttackers > 0 && c.hasKeyword("CARDNAME can only attack alone.")) { return false; } diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index ebe0ca945c0..ccc1f610825 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -284,6 +284,17 @@ public class PhaseUtil { */ public static void handleDeclareAttackers() { PhaseUtil.verifyCombat(); + + // Handles removing cards like Mogg Flunkies from combat if group attack didn't occur + final CardList filterList = AllZone.getCombat().getAttackerList(); + for (Card c : filterList) { + if (c.hasKeyword("CARDNAME can't attack or block alone.") && c.isAttacking()) { + if (AllZone.getCombat().getAttackers().size() < 2) { + AllZone.getCombat().removeFromCombat(c); + } + } + } + final CardList list = AllZone.getCombat().getAttackerList(); // TODO move propaganda to happen as the Attacker is Declared @@ -342,6 +353,16 @@ public class PhaseUtil { public static void handleDeclareBlockers() { PhaseUtil.verifyCombat(); + // Handles removing cards like Mogg Flunkies from combat if group block didn't occur + final CardList filterList = AllZone.getCombat().getAllBlockers(); + for (Card c : filterList) { + if (c.hasKeyword("CARDNAME can't attack or block alone.") && c.isBlocking()) { + if (AllZone.getCombat().getAllBlockers().size() < 2) { + AllZone.getCombat().undoBlockingAssignment(c); + } + } + } + AllZone.getStack().freezeStack(); AllZone.getCombat().setUnblocked();