diff --git a/.gitattributes b/.gitattributes
index 98520d19818..72ee03e3744 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2757,6 +2757,7 @@ forge-gui/res/cardsfolder/d/deaths_head_buzzard.txt svneol=native#text/plain
forge-gui/res/cardsfolder/d/deaths_presence.txt -text
forge-gui/res/cardsfolder/d/deaths_shadow.txt svneol=native#text/plain
forge-gui/res/cardsfolder/d/deathspore_thallid.txt svneol=native#text/plain
+forge-gui/res/cardsfolder/d/debt_of_loyalty.txt -text
forge-gui/res/cardsfolder/d/debt_to_the_deathless.txt -text
forge-gui/res/cardsfolder/d/debtors_knell.txt svneol=native#text/plain
forge-gui/res/cardsfolder/d/debtors_pulpit.txt -text
@@ -7064,6 +7065,7 @@ forge-gui/res/cardsfolder/m/masters_call.txt svneol=native#text/plain
forge-gui/res/cardsfolder/m/masticore.txt svneol=native#text/plain
forge-gui/res/cardsfolder/m/masumaro_first_to_live.txt svneol=native#text/plain
forge-gui/res/cardsfolder/m/matca_rioters.txt svneol=native#text/plain
+forge-gui/res/cardsfolder/m/matopi_golem.txt -text
forge-gui/res/cardsfolder/m/matsu_tribe_birdstalker.txt svneol=native#text/plain
forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt -text
forge-gui/res/cardsfolder/m/matsu_tribe_sniper.txt svneol=native#text/plain
@@ -10505,6 +10507,7 @@ forge-gui/res/cardsfolder/s/skeletal_scrying.txt -text
forge-gui/res/cardsfolder/s/skeletal_snake.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/skeletal_vampire.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/skeletal_wurm.txt svneol=native#text/plain
+forge-gui/res/cardsfolder/s/skeleton_scavengers.txt -text
forge-gui/res/cardsfolder/s/skeleton_shard.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/skeleton_ship.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/skeletonize.txt -text
@@ -10738,6 +10741,7 @@ forge-gui/res/cardsfolder/s/soldevi_golem.txt -text svneol=unset#text/plain
forge-gui/res/cardsfolder/s/soldevi_heretic.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/soldevi_machinist.txt -text
forge-gui/res/cardsfolder/s/soldevi_sage.txt svneol=native#text/plain
+forge-gui/res/cardsfolder/s/soldevi_sentry.txt -text
forge-gui/res/cardsfolder/s/soldevi_simulacrum.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/soldevi_steam_beast.txt svneol=native#text/plain
forge-gui/res/cardsfolder/s/soldier_of_fortune.txt svneol=native#text/plain
@@ -14987,6 +14991,7 @@ forge-gui/src/main/java/forge/game/card/CardKeywords.java svneol=native#text/pla
forge-gui/src/main/java/forge/game/card/CardLists.java svneol=native#text/plain
forge-gui/src/main/java/forge/game/card/CardPowerToughness.java svneol=native#text/plain
forge-gui/src/main/java/forge/game/card/CardPredicates.java svneol=native#text/plain
+forge-gui/src/main/java/forge/game/card/CardShields.java -text
forge-gui/src/main/java/forge/game/card/CardType.java svneol=native#text/plain
forge-gui/src/main/java/forge/game/card/CardUtil.java svneol=native#text/plain
forge-gui/src/main/java/forge/game/card/CounterType.java svneol=native#text/plain
diff --git a/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt b/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt
new file mode 100644
index 00000000000..f21d080afae
--- /dev/null
+++ b/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt
@@ -0,0 +1,8 @@
+Name:Debt of Loyalty
+ManaCost:1 W W
+Types:Instant
+A:SP$ Regenerate | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | RegenerationTrigger$ TrigGainControl | ReplaceCardUID$ Targeted | SpellDescription$ Regenerate target creature. You gain control of that creature if it regenerates this way.
+SVar:TrigGainControl:ST$ GainControl | Cost$ 0 | Defined$ CardUID_Targeted | NewController$ You | SpellDescription$ Source controller gains control of CARDNAME if it regenerates this way.
+SVar:RemAIDeck:True
+SVar:Picture:http://www.wizards.com/global/images/magic/general/debt_of_loyalty.jpg
+Oracle:Regenerate target creature. You gain control of that creature if it regenerates this way.
diff --git a/forge-gui/res/cardsfolder/m/matopi_golem.txt b/forge-gui/res/cardsfolder/m/matopi_golem.txt
new file mode 100644
index 00000000000..d3ff0664821
--- /dev/null
+++ b/forge-gui/res/cardsfolder/m/matopi_golem.txt
@@ -0,0 +1,8 @@
+Name:Matopi Golem
+ManaCost:5
+Types:Artifact Creature Golem
+PT:3/3
+A:AB$ Regenerate | Cost$ 1 | RegenerationTrigger$ TrigPutCounter | SpellDescription$ Regenerate CARDNAME. When it regenerates this way, put a -1/-1 counter on it.
+SVar:TrigPutCounter:DB$ PutCounter | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ When it regenerates this way, put a -1/-1 counter on it.
+SVar:Picture:http://www.wizards.com/global/images/magic/general/matopi_golem.jpg
+Oracle:{1}: Regenerate Matopi Golem. When it regenerates this way, put a -1/-1 counter on it.
diff --git a/forge-gui/res/cardsfolder/s/skeleton_scavengers.txt b/forge-gui/res/cardsfolder/s/skeleton_scavengers.txt
new file mode 100644
index 00000000000..9fcf46c7e24
--- /dev/null
+++ b/forge-gui/res/cardsfolder/s/skeleton_scavengers.txt
@@ -0,0 +1,10 @@
+Name:Skeleton Scavengers
+ManaCost:2 B
+Types:Creature Skeleton
+PT:0/0
+K:etbCounter:P1P1:1
+A:AB$ Regenerate | Cost$ X | CostDesc$ Pay {1} for each +1/+1 counter on CARDNAME: | References$ X | RegenerationTrigger$ TrigPutCounter | SpellDescription$ Regenerate CARDNAME. When it regenerates this way, put a +1/+1 counter on it.
+SVar:X:Count$CardCounters.P1P1
+SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ When it regenerates this way, put a +1/+1 counter on it.
+SVar:Picture:http://www.wizards.com/global/images/magic/general/skeleton_scavengers.jpg
+Oracle:Skeleton Scavengers enters the battlefield with a +1/+1 counter on it.\nPay {1} for each +1/+1 counter on Skeleton Scavengers: Regenerate Skeleton Scavengers. When it regenerates this way, put a +1/+1 counter on it.
diff --git a/forge-gui/res/cardsfolder/s/soldevi_sentry.txt b/forge-gui/res/cardsfolder/s/soldevi_sentry.txt
new file mode 100644
index 00000000000..813565ef4fc
--- /dev/null
+++ b/forge-gui/res/cardsfolder/s/soldevi_sentry.txt
@@ -0,0 +1,8 @@
+Name:Soldevi Sentry
+ManaCost:1
+Types:Artifact Creature Soldier
+PT:1/1
+A:AB$ Regenerate | Cost$ 1 | ValidTgts$ Opponent | Defined$ Self | RegenerationTrigger$ TrigDraw | ReplacePlayerName$ Targeted | SpellDescription$ Choose target opponent. Regenerate CARDNAME. When it regenerates this way, that player may draw a card.
+SVar:TrigDraw:DB$ Draw | Defined$ PlayerNamed_Targeted | NumCards$ 1 | OptionalDecider$ True | SpellDescription$ When it regenerates this way, that player may draw a card.
+SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_sentry.jpg
+Oracle:{1}: Choose target opponent. Regenerate Soldevi Sentry. When it regenerates this way, that player may draw a card.
diff --git a/forge-gui/src/main/java/forge/ai/ComputerUtil.java b/forge-gui/src/main/java/forge/ai/ComputerUtil.java
index 77d0609be41..006e9506f4d 100644
--- a/forge-gui/src/main/java/forge/ai/ComputerUtil.java
+++ b/forge-gui/src/main/java/forge/ai/ComputerUtil.java
@@ -1359,7 +1359,7 @@ public class ComputerUtil {
}
// already regenerated
- if (c.getShield() > 0) {
+ if (!c.getShield().isEmpty()) {
continue;
}
@@ -1411,7 +1411,7 @@ public class ComputerUtil {
}
// already regenerated
- if (c.getShield() > 0) {
+ if (!c.getShield().isEmpty()) {
continue;
}
diff --git a/forge-gui/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-gui/src/main/java/forge/ai/ComputerUtilCombat.java
index 792f382e9f8..1acd501486c 100644
--- a/forge-gui/src/main/java/forge/ai/ComputerUtilCombat.java
+++ b/forge-gui/src/main/java/forge/ai/ComputerUtilCombat.java
@@ -1884,7 +1884,7 @@ public class ComputerUtilCombat {
final boolean noPrevention) {
final int killDamage = ComputerUtilCombat.getDamageToKill(c);
- if (c.hasKeyword("Indestructible") || (c.getShield() > 0)) {
+ if (c.hasKeyword("Indestructible") || !c.getShield().isEmpty()) {
if (!(source.hasKeyword("Wither") || source.hasKeyword("Infect"))) {
return maxDamage + 1;
}
diff --git a/forge-gui/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-gui/src/main/java/forge/ai/ability/ChangeZoneAi.java
index 14b7f67ff84..2f5e63a6320 100644
--- a/forge-gui/src/main/java/forge/ai/ability/ChangeZoneAi.java
+++ b/forge-gui/src/main/java/forge/ai/ability/ChangeZoneAi.java
@@ -765,7 +765,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
CardLists.sortByEvaluateCreature(combatants);
for (final Card c : combatants) {
- if (c.getShield() == 0 && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat) && c.getOwner() == ai && !c.isToken()) {
+ if (c.getShield().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat) && c.getOwner() == ai && !c.isToken()) {
sa.getTargets().add(c);
return true;
}
diff --git a/forge-gui/src/main/java/forge/ai/ability/DestroyAi.java b/forge-gui/src/main/java/forge/ai/ability/DestroyAi.java
index 8ce088360b1..a6a4a4876f8 100644
--- a/forge-gui/src/main/java/forge/ai/ability/DestroyAi.java
+++ b/forge-gui/src/main/java/forge/ai/ability/DestroyAi.java
@@ -104,7 +104,7 @@ public class DestroyAi extends SpellAbilityAi {
list = CardLists.filter(list, new Predicate() {
@Override
public boolean apply(final Card c) {
- return ((c.getShield() == 0) && !ComputerUtil.canRegenerate(ai, c));
+ return (c.getShield().isEmpty() && !ComputerUtil.canRegenerate(ai, c));
}
});
}
@@ -201,7 +201,7 @@ public class DestroyAi extends SpellAbilityAi {
preferred = CardLists.filter(preferred, new Predicate() {
@Override
public boolean apply(final Card c) {
- return c.getShield() == 0;
+ return c.getShield().isEmpty();
}
});
}
diff --git a/forge-gui/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-gui/src/main/java/forge/ai/ability/PumpAiBase.java
index f396b8be1f9..bb58f852b94 100644
--- a/forge-gui/src/main/java/forge/ai/ability/PumpAiBase.java
+++ b/forge-gui/src/main/java/forge/ai/ability/PumpAiBase.java
@@ -132,7 +132,7 @@ public abstract class PumpAiBase extends SpellAbilityAi {
return false;
}
} else if (keyword.endsWith("CARDNAME can't be regenerated.")) {
- if (card.getShield() > 0) {
+ if (!card.getShield().isEmpty()) {
return true;
}
if (card.hasKeyword("If CARDNAME would be destroyed, regenerate it.") && combat != null
diff --git a/forge-gui/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-gui/src/main/java/forge/ai/ability/RegenerateAi.java
index e2ea3cb125b..aad710b6365 100644
--- a/forge-gui/src/main/java/forge/ai/ability/RegenerateAi.java
+++ b/forge-gui/src/main/java/forge/ai/ability/RegenerateAi.java
@@ -103,7 +103,7 @@ public class RegenerateAi extends SpellAbilityAi {
boolean flag = false;
for (final Card c : list) {
- if (c.getShield() == 0) {
+ if (c.getShield().isEmpty()) {
flag |= ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat);
}
}
@@ -132,7 +132,7 @@ public class RegenerateAi extends SpellAbilityAi {
final List threatenedTargets = new ArrayList();
for (final Card c : targetables) {
- if (objects.contains(c) && (c.getShield() == 0)) {
+ if (objects.contains(c) && c.getShield().isEmpty()) {
threatenedTargets.add(c);
}
}
@@ -148,7 +148,7 @@ public class RegenerateAi extends SpellAbilityAi {
CardLists.sortByEvaluateCreature(combatants);
for (final Card c : combatants) {
- if ((c.getShield() == 0) && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
+ if (c.getShield().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
sa.getTargets().add(c);
chance = true;
break;
@@ -204,7 +204,7 @@ public class RegenerateAi extends SpellAbilityAi {
if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
Combat combat = game.getCombat();
for (final Card c : combatants) {
- if ((c.getShield() == 0) && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
+ if (c.getShield().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
sa.getTargets().add(c);
return true;
}
@@ -217,7 +217,7 @@ public class RegenerateAi extends SpellAbilityAi {
// choose my best X without regen
if (CardLists.getNotType(compTargetables, "Creature").isEmpty()) {
for (final Card c : combatants) {
- if (c.getShield() == 0) {
+ if (c.getShield().isEmpty()) {
sa.getTargets().add(c);
return true;
}
@@ -227,7 +227,7 @@ public class RegenerateAi extends SpellAbilityAi {
} else {
CardLists.sortByCmcDesc(compTargetables);
for (final Card c : compTargetables) {
- if (c.getShield() == 0) {
+ if (c.getShield().isEmpty()) {
sa.getTargets().add(c);
return true;
}
diff --git a/forge-gui/src/main/java/forge/ai/ability/RegenerateAllAi.java b/forge-gui/src/main/java/forge/ai/ability/RegenerateAllAi.java
index 11ee969a464..f960d0f302c 100644
--- a/forge-gui/src/main/java/forge/ai/ability/RegenerateAllAi.java
+++ b/forge-gui/src/main/java/forge/ai/ability/RegenerateAllAi.java
@@ -61,7 +61,7 @@ public class RegenerateAllAi extends SpellAbilityAi {
final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
for (final Card c : list) {
- if (objects.contains(c) && c.getShield() == 0) {
+ if (objects.contains(c) && c.getShield().isEmpty()) {
numSaved++;
}
}
@@ -70,7 +70,7 @@ public class RegenerateAllAi extends SpellAbilityAi {
final List combatants = CardLists.filter(list, CardPredicates.Presets.CREATURES);
final Combat combat = game.getCombat();
for (final Card c : combatants) {
- if (c.getShield() == 0 && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
+ if (c.getShield().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
numSaved++;
}
}
diff --git a/forge-gui/src/main/java/forge/game/GameAction.java b/forge-gui/src/main/java/forge/game/GameAction.java
index f4d75f5a47c..0cc5488bbb5 100644
--- a/forge-gui/src/main/java/forge/game/GameAction.java
+++ b/forge-gui/src/main/java/forge/game/GameAction.java
@@ -1244,8 +1244,8 @@ public class GameAction {
}
if (c.canBeShielded() && (!c.isCreature() || c.getNetDefense() > 0)
- && (c.getShield() > 0 || c.hasKeyword("If CARDNAME would be destroyed, regenerate it."))) {
- c.subtractShield();
+ && (!c.getShield().isEmpty() || c.hasKeyword("If CARDNAME would be destroyed, regenerate it."))) {
+ c.subtractShield(c.getController().getController().chooseRegenerationShield(c));
c.setDamage(0);
c.tap();
c.addRegeneratedThisTurn();
diff --git a/forge-gui/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java b/forge-gui/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java
index d38e661cc43..c9d60beb673 100644
--- a/forge-gui/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java
+++ b/forge-gui/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java
@@ -7,6 +7,7 @@ import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardLists;
+import forge.game.card.CardShields;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
@@ -41,7 +42,7 @@ public class RegenerateAllEffect extends SpellAbilityEffect {
};
if (c.isInPlay()) {
- c.addShield();
+ c.addShield(new CardShields(sa, null));
game.getEndOfTurn().addUntil(untilEOT);
}
}
diff --git a/forge-gui/src/main/java/forge/game/ability/effects/RegenerateEffect.java b/forge-gui/src/main/java/forge/game/ability/effects/RegenerateEffect.java
index 3b761a79b9b..40846bd1344 100644
--- a/forge-gui/src/main/java/forge/game/ability/effects/RegenerateEffect.java
+++ b/forge-gui/src/main/java/forge/game/ability/effects/RegenerateEffect.java
@@ -5,8 +5,12 @@ import java.util.List;
import forge.Command;
import forge.game.Game;
+import forge.game.ability.AbilityFactory;
+import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
+import forge.game.card.CardShields;
+import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
@@ -46,6 +50,7 @@ public class RegenerateEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Game game = sa.getActivatingPlayer().getGame();
+ final Card sourceCard = sa.getSourceCard();
for (final Card tgtC : getTargetCards(sa)) {
final Command untilEOT = new Command() {
@@ -57,8 +62,26 @@ public class RegenerateEffect extends SpellAbilityEffect {
}
};
- if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) {
- tgtC.addShield();
+ if (tgtC.isInPlay() && (tgt == null || tgt.canTgtPlayer() || tgtC.canBeTargetedBy(sa))) {
+ SpellAbility triggerSA = null;
+ if (sa.hasParam("RegenerationTrigger")) {
+ String abString = sa.getSourceCard().getSVar(sa.getParam("RegenerationTrigger"));
+ if (sa.hasParam("ReplacePlayerName")) { // Soldevi Sentry
+ String def = sa.getParam("ReplacePlayerName");
+ List replaced = AbilityUtils.getDefinedPlayers(sourceCard, def, sa);
+ abString = abString.replace(def, replaced.isEmpty() ? "" : replaced.get(0).getName());
+ } else if (sa.hasParam("ReplaceCardUID")) { // Debt of Loyalty
+ String def = sa.getParam("ReplaceCardUID");
+ List replaced = AbilityUtils.getDefinedCards(sourceCard, def, sa);
+ abString = abString.replace(def, replaced.isEmpty() ? "" : Integer.toString(replaced.get(0).getUniqueNumber()));
+ }
+ triggerSA = AbilityFactory.getAbility(abString, sourceCard);
+ triggerSA.setActivatingPlayer(sa.getActivatingPlayer());
+ triggerSA.setTrigger(true);
+ triggerSA.setSourceCard(sourceCard);
+ }
+ CardShields shield = new CardShields(sa, triggerSA);
+ tgtC.addShield(shield);
game.getEndOfTurn().addUntil(untilEOT);
}
}
diff --git a/forge-gui/src/main/java/forge/game/card/Card.java b/forge-gui/src/main/java/forge/game/card/Card.java
index 6c66d446d2c..ab0229f4c0a 100644
--- a/forge-gui/src/main/java/forge/game/card/Card.java
+++ b/forge-gui/src/main/java/forge/game/card/Card.java
@@ -198,7 +198,7 @@ public class Card extends GameEntity implements Comparable {
private int damage;
// regeneration
- private int nShield;
+ private List nShield = new ArrayList();
private int regeneratedThisTurn = 0;
private int turnInZone;
@@ -2686,7 +2686,7 @@ public class Card extends GameEntity implements Comparable {
*
* @return a int.
*/
- public final int getShield() {
+ public final List getShield() {
return this.nShield;
}
@@ -2695,8 +2695,8 @@ public class Card extends GameEntity implements Comparable {
* addShield.
*
*/
- public final void addShield() {
- this.nShield++;
+ public final void addShield(final CardShields shield) {
+ this.nShield.add(shield);
}
/**
@@ -2704,8 +2704,11 @@ public class Card extends GameEntity implements Comparable {
* subtractShield.
*
*/
- public final void subtractShield() {
- this.nShield--;
+ public final void subtractShield(CardShields shield) {
+ if (shield != null && shield.hasTrigger()) {
+ this.getGame().getStack().addSimultaneousStackEntry(shield.getTriggerSA());
+ }
+ this.nShield.remove(shield);
}
/**
@@ -2740,7 +2743,7 @@ public class Card extends GameEntity implements Comparable {
*
*/
public final void resetShield() {
- this.nShield = 0;
+ this.nShield.clear();;
}
/**
diff --git a/forge-gui/src/main/java/forge/game/card/CardShields.java b/forge-gui/src/main/java/forge/game/card/CardShields.java
new file mode 100644
index 00000000000..96b814bd380
--- /dev/null
+++ b/forge-gui/src/main/java/forge/game/card/CardShields.java
@@ -0,0 +1,79 @@
+/*
+ * Forge: Play Magic: the Gathering.
+ * Copyright (C) 2011 Forge Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package forge.game.card;
+
+import forge.game.spellability.SpellAbility;
+
+/**
+ *
+ * Card_Shields class.
+ *
+ *
+ * @author Forge
+ * @version $Id: CardShields.java 23786 2013-11-24 06:59:42Z Max mtg $
+ */
+public class CardShields {
+ // restore the regeneration shields
+ private final SpellAbility sourceSA;
+ private final SpellAbility triggerSA;
+
+ /**
+ * Instantiates a new CardShields.
+ *
+ * @param sourceSA
+ * a SpellAbility
+ */
+ public CardShields(final SpellAbility sourceSA, final SpellAbility triggerSA) {
+ this.sourceSA = sourceSA;
+ this.triggerSA = triggerSA;
+ }
+
+ /**
+ *
+ * getSourceSA.
+ *
+ * @return sourceSA
+ */
+ public final SpellAbility getSourceSA() {
+ return this.sourceSA;
+ }
+
+ /**
+ *
+ * getTriggerSA.
+ *
+ * @return triggerSA
+ */
+ public final SpellAbility getTriggerSA() {
+ return this.triggerSA;
+ }
+
+ public final boolean hasTrigger() {
+ return this.triggerSA != null;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ String suffix = this.triggerSA != null ? " - " + triggerSA.getDescription() : "";
+ return this.sourceSA.getSourceCard().getName() + suffix;
+ }
+}
diff --git a/forge-gui/src/main/java/forge/game/player/PlayerController.java b/forge-gui/src/main/java/forge/game/player/PlayerController.java
index 948459f7442..369e69b81fb 100644
--- a/forge-gui/src/main/java/forge/game/player/PlayerController.java
+++ b/forge-gui/src/main/java/forge/game/player/PlayerController.java
@@ -19,6 +19,7 @@ import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.GameType;
import forge.game.card.Card;
+import forge.game.card.CardShields;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.cost.Cost;
@@ -195,7 +196,8 @@ public abstract class PlayerController {
public abstract boolean confirmPayment(CostPart costPart, String string);
public abstract ReplacementEffect chooseSingleReplacementEffect(String prompt, List possibleReplacers, HashMap runParams);
public abstract String chooseProtectionType(String string, SpellAbility sa, List choices);
-
+ public abstract CardShields chooseRegenerationShield(Card c);
+
// these 4 need some refining.
public abstract boolean payCostToPreventEffect(Cost cost, SpellAbility sa, boolean alreadyPaid, List allPayers);
public abstract void orderAndPlaySimultaneousSa(List activePlayerSAs);
@@ -210,4 +212,6 @@ public abstract class PlayerController {
// These 2 are for AI
public List cheatShuffle(List list) { return list; }
public Collection extends PaperCard> complainCardsCantPlayWell(Deck myDeck) { return null; }
+
+
}
diff --git a/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java b/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java
index b14be303105..b2a68311e88 100644
--- a/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java
+++ b/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java
@@ -38,6 +38,7 @@ import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
+import forge.game.card.CardShields;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.cost.Cost;
@@ -688,4 +689,9 @@ public class PlayerControllerAi extends PlayerController {
return brains.cheatShuffle(list);
}
+ @Override
+ public CardShields chooseRegenerationShield(Card c) {
+ return Iterables.getFirst(c.getShield(), null);
+ }
+
}
diff --git a/forge-gui/src/main/java/forge/gui/CardDetailPanel.java b/forge-gui/src/main/java/forge/gui/CardDetailPanel.java
index ac944fff26f..2e7c31f9239 100644
--- a/forge-gui/src/main/java/forge/gui/CardDetailPanel.java
+++ b/forge-gui/src/main/java/forge/gui/CardDetailPanel.java
@@ -393,7 +393,7 @@ public class CardDetailPanel extends FPanel {
}
// Regeneration Shields
- final int regenShields = card.getShield();
+ final int regenShields = card.getShield().size();
if (regenShields > 0) {
if (area.length() != 0) {
area.append("\n");
diff --git a/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java
index ba181cfdad3..293e5a50866 100644
--- a/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java
+++ b/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java
@@ -8,6 +8,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
@@ -38,6 +39,7 @@ import forge.game.GameObject;
import forge.game.GameType;
import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card;
+import forge.game.card.CardShields;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.cost.Cost;
@@ -1066,4 +1068,12 @@ public class PlayerControllerHuman extends PlayerController {
GuiChoose.one(message, anteedThings);
}
+
+ @Override
+ public CardShields chooseRegenerationShield(Card c) {
+ if (c.getShield().size() < 2) {
+ return Iterables.getFirst(c.getShield(), null);
+ }
+ return GuiChoose.one("Choose a regeneration shield:", c.getShield());
+ }
}
diff --git a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java
index b6b1d535457..e793b550cfc 100644
--- a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java
+++ b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java
@@ -28,6 +28,7 @@ import forge.game.GameObject;
import forge.game.GameType;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
+import forge.game.card.CardShields;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
@@ -544,4 +545,9 @@ public class PlayerControllerForTests extends PlayerController {
public void revealAnte(String message, Multimap removedAnteCards) {
// test this!
}
+
+ @Override
+ public CardShields chooseRegenerationShield(Card c) {
+ return Iterables.getFirst(c.getShield(), null);
+ }
}