From afcad4e67218f0e127f2e1e5b95d082fe72a1119 Mon Sep 17 00:00:00 2001
From: drdev
Date: Mon, 6 Oct 2014 04:06:42 +0000
Subject: [PATCH] Commit stage 1 of large game view refactoring
---
.gitattributes | 11 +
.../src/main/java/forge/ai/AiController.java | 14 +-
.../main/java/forge/ai/AiCostDecision.java | 2 +-
.../src/main/java/forge/ai/ComputerUtil.java | 10 +-
.../main/java/forge/ai/ComputerUtilCard.java | 6 +-
.../java/forge/ai/ComputerUtilCombat.java | 2 +-
.../main/java/forge/ai/ComputerUtilMana.java | 2 +-
.../java/forge/ai/PlayerControllerAi.java | 4 +-
.../main/java/forge/ai/ability/AnimateAi.java | 2 +-
.../main/java/forge/ai/ability/AttachAi.java | 16 +-
.../java/forge/ai/ability/ChangeZoneAi.java | 4 +-
.../java/forge/ai/ability/ChooseSourceAi.java | 2 +-
.../java/forge/ai/ability/DamageDealAi.java | 2 +-
.../main/java/forge/ai/ability/DestroyAi.java | 4 +-
.../main/java/forge/ai/ability/EffectAi.java | 9 +-
.../main/java/forge/ai/ability/FightAi.java | 2 +-
.../java/forge/ai/ability/PumpAiBase.java | 2 +-
.../java/forge/ai/ability/RegenerateAi.java | 12 +-
.../forge/ai/ability/RegenerateAllAi.java | 4 +-
.../main/java/forge/ai/ability/TokenAi.java | 2 +-
.../java/forge/ai/ability/UnattachAllAi.java | 2 +-
forge-game/src/main/java/forge/game/Game.java | 6 +
.../src/main/java/forge/game/GameAction.java | 19 +-
.../src/main/java/forge/game/GameEntity.java | 1 +
.../main/java/forge/game/GameEntityView.java | 22 +
.../src/main/java/forge/game/GameView.java | 50 +
.../main/java/forge/game/StaticEffects.java | 4 +-
.../java/forge/game/ability/AbilityUtils.java | 61 +-
.../ability/effects/AnimateAllEffect.java | 2 +-
.../game/ability/effects/AnimateEffect.java | 2 +-
.../ability/effects/ChangeTargetsEffect.java | 31 +-
.../ability/effects/ChangeZoneEffect.java | 8 +-
.../ability/effects/ChooseColorEffect.java | 2 +-
.../ability/effects/ChooseSourceEffect.java | 14 +-
.../game/ability/effects/CloneEffect.java | 6 +-
.../ability/effects/ControlGainEffect.java | 2 +-
.../game/ability/effects/CounterEffect.java | 4 +-
.../ability/effects/DamagePreventEffect.java | 4 +-
.../game/ability/effects/DestroyEffect.java | 2 +-
.../game/ability/effects/EffectEffect.java | 4 +-
.../effects/PlayLandVariantEffect.java | 2 +-
.../ability/effects/ProtectAllEffect.java | 2 +-
.../game/ability/effects/ProtectEffect.java | 2 +-
.../game/ability/effects/PumpEffect.java | 2 +-
.../ability/effects/RegenerateEffect.java | 2 +-
.../game/ability/effects/SetStateEffect.java | 2 +-
.../game/ability/effects/TokenEffect.java | 2 +-
.../ability/effects/UnattachAllEffect.java | 4 +-
.../game/ability/effects/UnattachEffect.java | 4 +-
.../src/main/java/forge/game/card/Card.java | 4997 ++++-------------
.../forge/game/card/CardCharacteristics.java | 8 +-
.../java/forge/game/card/CardFactory.java | 21 +-
.../java/forge/game/card/CardFactoryUtil.java | 6 +-
.../main/java/forge/game/card/CardUtil.java | 9 +-
.../main/java/forge/game/card/CardView.java | 625 +++
.../main/java/forge/game/combat/Combat.java | 4 +-
.../java/forge/game/combat/CombatUtil.java | 6 +-
.../java/forge/game/combat/CombatView.java | 150 +
.../java/forge/game/cost/CostUnattach.java | 2 +-
.../forge/game/io/GameStateSerializer.java | 2 +-
.../java/forge/game/phase/PhaseHandler.java | 2 +-
.../src/main/java/forge/game/phase/Untap.java | 4 +-
.../main/java/forge/game/player/Player.java | 1279 ++---
.../java/forge/game/player/PlayerView.java | 207 +
.../game/replacement/ReplacementHandler.java | 4 +-
.../game/spellability/AbilityManaPart.java | 6 +-
.../forge/game/spellability/SpellAbility.java | 1123 +---
.../spellability/SpellAbilityCondition.java | 2 +-
.../spellability/SpellAbilityRestriction.java | 2 +-
.../SpellAbilityStackInstance.java | 224 +-
.../game/spellability/SpellAbilityView.java | 49 +
.../game/spellability/StackItemView.java | 98 +
.../StaticAbilityContinuous.java | 16 +-
.../forge/game/trigger/TriggerHandler.java | 6 +-
.../game/trigger/TriggerSpellAbilityCast.java | 8 +-
.../game/trigger/TriggerTapsForMana.java | 2 +-
.../forge/game/trigger/WrappedAbility.java | 12 +-
.../main/java/forge/game/zone/MagicStack.java | 14 +-
.../forge/trackable/TrackableCollection.java | 21 +
.../java/forge/trackable/TrackableIndex.java | 9 +
.../java/forge/trackable/TrackableObject.java | 48 +
.../forge/trackable/TrackableProperty.java | 118 +
.../util/PlayerControllerForTests.java | 2 +-
.../main/java/forge/card/CardDetailUtil.java | 3 +-
.../java/forge/match/input/InputBlock.java | 2 +-
.../java/forge/player/HumanCostDecision.java | 2 +-
.../forge/player/PlayerControllerHuman.java | 10 +-
.../java/forge/player/TargetSelection.java | 4 +-
.../src/main/java/forge/view/CardView.java | 11 +-
.../main/java/forge/view/LocalGameView.java | 2 +-
.../main/java/forge/view/StackItemView.java | 4 +-
.../src/main/java/forge/view/ViewUtil.java | 9 +-
92 files changed, 3490 insertions(+), 6023 deletions(-)
create mode 100644 forge-game/src/main/java/forge/game/GameEntityView.java
create mode 100644 forge-game/src/main/java/forge/game/GameView.java
create mode 100644 forge-game/src/main/java/forge/game/card/CardView.java
create mode 100644 forge-game/src/main/java/forge/game/combat/CombatView.java
create mode 100644 forge-game/src/main/java/forge/game/player/PlayerView.java
create mode 100644 forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java
create mode 100644 forge-game/src/main/java/forge/game/spellability/StackItemView.java
create mode 100644 forge-game/src/main/java/forge/trackable/TrackableCollection.java
create mode 100644 forge-game/src/main/java/forge/trackable/TrackableIndex.java
create mode 100644 forge-game/src/main/java/forge/trackable/TrackableObject.java
create mode 100644 forge-game/src/main/java/forge/trackable/TrackableProperty.java
diff --git a/.gitattributes b/.gitattributes
index 47cc6c8f09a..2afcf899a31 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -271,6 +271,7 @@ forge-game/src/main/java/forge/game/GameAction.java svneol=native#text/plain
forge-game/src/main/java/forge/game/GameActionUtil.java svneol=native#text/plain
forge-game/src/main/java/forge/game/GameEndReason.java -text
forge-game/src/main/java/forge/game/GameEntity.java -text
+forge-game/src/main/java/forge/game/GameEntityView.java -text
forge-game/src/main/java/forge/game/GameFormat.java -text
forge-game/src/main/java/forge/game/GameLog.java -text
forge-game/src/main/java/forge/game/GameLogEntry.java -text
@@ -281,6 +282,7 @@ forge-game/src/main/java/forge/game/GameOutcome.java -text
forge-game/src/main/java/forge/game/GameRules.java -text
forge-game/src/main/java/forge/game/GameStage.java -text
forge-game/src/main/java/forge/game/GameType.java -text
+forge-game/src/main/java/forge/game/GameView.java -text
forge-game/src/main/java/forge/game/GlobalRuleChange.java -text
forge-game/src/main/java/forge/game/IHasGameType.java -text
forge-game/src/main/java/forge/game/IIdentifiable.java -text
@@ -441,12 +443,14 @@ forge-game/src/main/java/forge/game/card/CardPredicates.java svneol=native#text/
forge-game/src/main/java/forge/game/card/CardShields.java -text
forge-game/src/main/java/forge/game/card/CardType.java svneol=native#text/plain
forge-game/src/main/java/forge/game/card/CardUtil.java svneol=native#text/plain
+forge-game/src/main/java/forge/game/card/CardView.java -text
forge-game/src/main/java/forge/game/card/CounterType.java svneol=native#text/plain
forge-game/src/main/java/forge/game/card/package-info.java -text
forge-game/src/main/java/forge/game/combat/AttackingBand.java -text
forge-game/src/main/java/forge/game/combat/Combat.java svneol=native#text/plain
forge-game/src/main/java/forge/game/combat/CombatLki.java -text
forge-game/src/main/java/forge/game/combat/CombatUtil.java svneol=native#text/plain
+forge-game/src/main/java/forge/game/combat/CombatView.java -text
forge-game/src/main/java/forge/game/cost/Cost.java svneol=native#text/plain
forge-game/src/main/java/forge/game/cost/CostAddMana.java -text
forge-game/src/main/java/forge/game/cost/CostChooseCreatureType.java -text
@@ -550,6 +554,7 @@ forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java -text
forge-game/src/main/java/forge/game/player/PlayerController.java -text
forge-game/src/main/java/forge/game/player/PlayerOutcome.java -text
forge-game/src/main/java/forge/game/player/PlayerStatistics.java -text
+forge-game/src/main/java/forge/game/player/PlayerView.java -text
forge-game/src/main/java/forge/game/player/RegisteredPlayer.java -text
forge-game/src/main/java/forge/game/player/package-info.java svneol=native#text/plain
forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java -text
@@ -585,7 +590,9 @@ forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java svne
forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java svneol=native#text/plain
forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java svneol=native#text/plain
forge-game/src/main/java/forge/game/spellability/SpellAbilityVariables.java svneol=native#text/plain
+forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java -text
forge-game/src/main/java/forge/game/spellability/SpellPermanent.java svneol=native#text/plain
+forge-game/src/main/java/forge/game/spellability/StackItemView.java -text
forge-game/src/main/java/forge/game/spellability/TargetChoices.java svneol=native#text/plain
forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java svneol=native#text/plain
forge-game/src/main/java/forge/game/spellability/package-info.java svneol=native#text/plain
@@ -663,6 +670,10 @@ forge-game/src/main/java/forge/game/zone/PlayerZoneBattlefield.java svneol=nativ
forge-game/src/main/java/forge/game/zone/Zone.java -text
forge-game/src/main/java/forge/game/zone/ZoneType.java -text
forge-game/src/main/java/forge/game/zone/package-info.java svneol=native#text/plain
+forge-game/src/main/java/forge/trackable/TrackableCollection.java -text
+forge-game/src/main/java/forge/trackable/TrackableIndex.java -text
+forge-game/src/main/java/forge/trackable/TrackableObject.java -text
+forge-game/src/main/java/forge/trackable/TrackableProperty.java -text
forge-game/src/main/java/forge/util/Expressions.java -text
forge-game/src/main/java/forge/util/MessageUtil.java -text
forge-gui-android/.classpath -text
diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java
index fdf0802e7da..0580c7a9312 100644
--- a/forge-ai/src/main/java/forge/ai/AiController.java
+++ b/forge-ai/src/main/java/forge/ai/AiController.java
@@ -27,7 +27,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-
import com.esotericsoftware.minlog.Log;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
@@ -1147,11 +1146,14 @@ public class AiController {
List list = player.getCardsIn(ZoneType.Battlefield);
list = CardLists.filter(list, CardPredicates.Presets.PLANEWALKERS);
- List type = card.getType();
- final String subtype = type.get(type.size() - 1);
- final List cl = CardLists.getType(list, subtype);
- if (!cl.isEmpty()) {
- return AiPlayDecision.WouldDestroyOtherPlaneswalker;
+ for (String type : card.getType()) { //determine planewalker subtype
+ if (!type.equals("Planeswalker")) {
+ final List cl = CardLists.getType(list, type);
+ if (!cl.isEmpty()) {
+ return AiPlayDecision.WouldDestroyOtherPlaneswalker;
+ }
+ break;
+ }
}
}
if (card.isType("World")) {
diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java
index 0c6971fb405..84c8b09432d 100644
--- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java
+++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java
@@ -172,7 +172,7 @@ public class AiCostDecision extends CostDecisionMakerBase implements ICostVisito
}
List chosen = new ArrayList();
for (SpellAbilityStackInstance si :source.getGame().getStack()) {
- SpellAbility sp = si.getSpellAbility().getRootAbility();
+ SpellAbility sp = si.getSpellAbility(true).getRootAbility();
if (si.getSourceCard().isValid(cost.getType().split(";"), source.getController(), source)) {
chosen.add(sp);
}
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
index 50704c0f724..419f3c2a672 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
@@ -1196,7 +1196,7 @@ public class ComputerUtil {
for (StaticAbility stAb : c.getStaticAbilities()) {
Map params = stAb.getMapParams();
if ("Continuous".equals(params.get("Mode")) && params.containsKey("AddKeyword")
- && params.get("AddKeyword").contains("Haste") && c.getEquippingCard() == null) {
+ && params.get("AddKeyword").contains("Haste") && c.getEquipping() == null) {
return true;
}
}
@@ -1376,7 +1376,7 @@ public class ComputerUtil {
}
// already regenerated
- if (!c.getShield().isEmpty()) {
+ if (c.getShieldCount() > 0) {
continue;
}
@@ -1431,13 +1431,13 @@ public class ComputerUtil {
if (o instanceof Card) {
final Card c = (Card) o;
final boolean canRemove = (c.getNetDefense() <= dmg)
- || (!c.hasKeyword("Indestructible") && c.getShield().isEmpty() && (dmg >= ComputerUtilCombat.getDamageToKill(c)));
+ || (!c.hasKeyword("Indestructible") && c.getShieldCount() == 0 && (dmg >= ComputerUtilCombat.getDamageToKill(c)));
if (!canRemove) {
continue;
}
if (saviourApi == ApiType.Pump || saviourApi == ApiType.PumpAll ) {
final boolean cantSave = c.getNetDefense() + defense <= dmg
- || (!c.hasKeyword("Indestructible") && c.getShield().isEmpty() && !grantIndestructible
+ || (!c.hasKeyword("Indestructible") && c.getShieldCount() == 0 && !grantIndestructible
&& (dmg >= defense + ComputerUtilCombat.getDamageToKill(c)));
if (cantSave && (tgt == null || !grantShroud)) {
continue;
@@ -1473,7 +1473,7 @@ public class ComputerUtil {
}
// already regenerated
- if (!c.getShield().isEmpty()) {
+ if (c.getShieldCount() > 0) {
continue;
}
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
index 85c3fa3610e..55be867bc6d 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
@@ -784,9 +784,7 @@ public class ComputerUtilCard {
final Map map = new HashMap();
for (final Card c : list) {
- final ArrayList typeList = c.getType();
-
- for (final String var : typeList) {
+ for (final String var : c.getType()) {
if (CardType.isACreatureType(var)) {
if (!map.containsKey(var)) {
map.put(var, 1);
@@ -987,7 +985,7 @@ public class ComputerUtilCard {
Combat currCombat = game.getCombat();
if (currCombat != null && !currCombat.getAllBlockers().isEmpty() && currCombat.getAllBlockers().contains(c)) {
for (Card attacker : currCombat.getAttackersBlockedBy(c)) {
- if (attacker.getShield().isEmpty() && ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, currCombat)) {
+ if (attacker.getShieldCount() == 0 && ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, currCombat)) {
List blockers = currCombat.getBlockers(attacker);
ComputerUtilCard.sortByEvaluateCreature(blockers);
Combat combat = new Combat(ai);
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java
index b424d16d990..155c45d6d90 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java
@@ -1978,7 +1978,7 @@ public class ComputerUtilCombat {
final boolean noPrevention) {
final int killDamage = ComputerUtilCombat.getDamageToKill(c);
- if (c.hasKeyword("Indestructible") || !c.getShield().isEmpty()) {
+ if (c.hasKeyword("Indestructible") || c.getShieldCount() > 0) {
if (!(source.hasKeyword("Wither") || source.hasKeyword("Infect"))) {
return maxDamage + 1;
}
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
index 76e141ab96d..bde24f0879c 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
@@ -1118,7 +1118,7 @@ public class ComputerUtilMana {
&& replacementEffect.zonesCheck(game.getZoneOf(crd))) {
String repType = crd.getSVar(replacementEffect.getMapParams().get("ManaReplacement"));
if (repType.contains("Chosen")) {
- repType = repType.replace("Chosen", MagicColor.toShortString(crd.getChosenColor().get(0)));
+ repType = repType.replace("Chosen", MagicColor.toShortString(crd.getChosenColors().get(0)));
}
mp.setManaReplaceType(repType);
}
diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
index aa34b502177..e5244310876 100644
--- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
+++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
@@ -634,7 +634,7 @@ public class PlayerControllerAi extends PlayerController {
String choice = choices.get(0);
if (game.stack.size() > 1) {
for (SpellAbilityStackInstance si : game.getStack()) {
- SpellAbility spell = si.getSpellAbility();
+ SpellAbility spell = si.getSpellAbility(true);
if (sa != spell) {
String s = ProtectAi.toProtectFrom(spell.getHostCard(), sa);
if (s != null) {
@@ -786,7 +786,7 @@ public class PlayerControllerAi extends PlayerController {
@Override
public CardShields chooseRegenerationShield(Card c) {
- return Iterables.getFirst(c.getShield(), null);
+ return Iterables.getFirst(c.getShields(), null);
}
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
index b6c03fcfac5..43f05da4c54 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
@@ -326,7 +326,7 @@ public class AnimateAi extends SpellAbilityAi {
final String colors = sa.getParam("Colors");
if (colors.equals("ChosenColor")) {
- tmpDesc = CardUtil.getShortColorsString(source.getChosenColor());
+ tmpDesc = CardUtil.getShortColorsString(source.getChosenColors());
} else {
tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(","))));
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java
index 1c5fa56ae96..1a877afcbc1 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java
@@ -678,7 +678,7 @@ public class AttachAi extends SpellAbilityAi {
//don't equip a worse creature
if (card.isEquipping()) {
- Card oldTarget = card.getEquipping().get(0);
+ Card oldTarget = card.getEquipping();
if (ComputerUtilCard.evaluateCreature(oldTarget) > ComputerUtilCard.evaluateCreature(newTarget)) {
return false;
}
@@ -990,7 +990,7 @@ public class AttachAi extends SpellAbilityAi {
return null;
}
// Don't fortify if already fortifying
- if (attachSource.getFortifyingCard() != null && attachSource.getFortifyingCard().getController() == aiPlayer) {
+ if (attachSource.getFortifying() != null && attachSource.getFortifying().getController() == aiPlayer) {
return null;
}
@@ -1019,14 +1019,14 @@ public class AttachAi extends SpellAbilityAi {
AiController aic = ((PlayerControllerAi)aiPlayer.getController()).getAi();
if (c != null && attachSource.getType().contains("Equipment")
- && attachSource.getEquippingCard() != null
- && attachSource.getEquippingCard().getController() == aiPlayer) {
- if (c.equals(attachSource.getEquippingCard())) {
+ && attachSource.isEquipping()
+ && attachSource.getEquipping().getController() == aiPlayer) {
+ if (c.equals(attachSource.getEquipping())) {
// Do not equip if equipping the same card already
return null;
}
- boolean uselessCreature = isUselessCreature(aiPlayer, attachSource.getEquippingCard());
+ boolean uselessCreature = isUselessCreature(aiPlayer, attachSource.getEquipping());
if (aic.getProperty(AiProps.MOVE_EQUIPMENT_TO_BETTER_CREATURES).equals("never")) {
// Do not equip other creatures if the AI profile does not allow moving equipment around
@@ -1330,9 +1330,7 @@ public class AttachAi extends SpellAbilityAi {
return true;
}
- ArrayList cardTypes = sa.getHostCard().getType();
-
- if (cardTypes.contains("Equipment") && isUselessCreature(ai, c)) {
+ if (sa.getHostCard().getType().contains("Equipment") && isUselessCreature(ai, c)) {
// useless to equip a creature that can't attack or block.
return false;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
index a2a1a2b953e..70040e7994a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
@@ -736,7 +736,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
for (Card attacker : attackers) {
List blockers = currCombat.getBlockers(attacker);
// Save my attacker by bouncing a blocker
- if (attacker.getController().equals(ai) && attacker.getShield().isEmpty()
+ if (attacker.getController().equals(ai) && attacker.getShieldCount() == 0
&& ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, currCombat)
&& !currCombat.getBlockers(attacker).isEmpty()) {
ComputerUtilCard.sortByEvaluateCreature(blockers);
@@ -799,7 +799,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
ComputerUtilCard.sortByEvaluateCreature(combatants);
for (final Card c : combatants) {
- if (c.getShield().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat) && c.getOwner() == ai && !c.isToken()) {
+ if (c.getShieldCount() == 0 && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat) && c.getOwner() == ai && !c.isToken()) {
sa.getTargets().add(c);
return true;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java
index 4d34c4baa06..cbc94ab7ac6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java
@@ -157,7 +157,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
private Card chooseCardOnStack(SpellAbility sa, Player ai, Game game) {
for (SpellAbilityStackInstance si : game.getStack()) {
final Card source = si.getSourceCard();
- final SpellAbility abilityOnStack = si.getSpellAbility();
+ final SpellAbility abilityOnStack = si.getSpellAbility(true);
if (sa.hasParam("Choices") && !abilityOnStack.getHostCard().isValid(sa.getParam("Choices"), ai, sa.getHostCard())) {
continue;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
index eb633ac119e..b6c0dc3483a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
@@ -287,7 +287,7 @@ public class DamageDealAi extends DamageAiBase {
}
final int assignedDamage = ComputerUtilCombat.getEnoughDamageToKill(humanCreature, dmg, source, false, noPrevention);
if (assignedDamage <= dmg
- && humanCreature.getShield().isEmpty() && !ComputerUtil.canRegenerate(humanCreature.getController(), humanCreature)) {
+ && humanCreature.getShieldCount() == 0 && !ComputerUtil.canRegenerate(humanCreature.getController(), humanCreature)) {
tcs.add(humanCreature);
tgt.addDividedAllocation(humanCreature, assignedDamage);
lastTgt = humanCreature;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
index a3e0cc30b58..6c3b7be3329 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
@@ -113,7 +113,7 @@ public class DestroyAi extends SpellAbilityAi {
list = CardLists.filter(list, new Predicate() {
@Override
public boolean apply(final Card c) {
- return (c.getShield().isEmpty() && !ComputerUtil.canRegenerate(ai, c));
+ return (c.getShieldCount() == 0 && !ComputerUtil.canRegenerate(ai, c));
}
});
}
@@ -237,7 +237,7 @@ public class DestroyAi extends SpellAbilityAi {
preferred = CardLists.filter(preferred, new Predicate() {
@Override
public boolean apply(final Card c) {
- return c.getShield().isEmpty();
+ return c.getShieldCount() == 0;
}
});
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java
index 295616f38ac..ec35e5b2130 100644
--- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java
@@ -118,10 +118,11 @@ public class EffectAi extends SpellAbilityAi {
return false;
}
boolean threatened = false;
- for (final SpellAbilityStackInstance stackSA : game.getStack()) {
- if (!stackSA.isSpell()) { continue; }
- if (stackSA.getSpellAbility().getApi() == ApiType.DealDamage) {
- final SpellAbility saTargeting = stackSA.getSpellAbility().getSATargetingPlayer();
+ for (final SpellAbilityStackInstance stackInst : game.getStack()) {
+ if (!stackInst.isSpell()) { continue; }
+ SpellAbility stackSpellAbility = stackInst.getSpellAbility(true);
+ if (stackSpellAbility.getApi() == ApiType.DealDamage) {
+ final SpellAbility saTargeting = stackSpellAbility.getSATargetingPlayer();
if (saTargeting != null && Iterables.contains(saTargeting.getTargets().getTargetPlayers(), ai)) {
threatened = true;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java
index 5021fbeee79..1a3ccbbfc5c 100644
--- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java
@@ -153,7 +153,7 @@ public class FightAi extends SpellAbilityAi {
return true;
}
if (opponent.hasProtectionFrom(fighter) || !opponent.canBeDestroyed()
- || !opponent.getShield().isEmpty() || ComputerUtil.canRegenerate(opponent.getController(), opponent)) {
+ || opponent.getShieldCount() > 0 || ComputerUtil.canRegenerate(opponent.getController(), opponent)) {
return false;
}
if (fighter.hasKeyword("Deathtouch") || ComputerUtilCombat.getDamageToKill(opponent) <= fighter.getNetAttack() + pumpAttack) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
index 2245339c249..9e3f26975b6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
@@ -138,7 +138,7 @@ public abstract class PumpAiBase extends SpellAbilityAi {
return false;
}
} else if (keyword.endsWith("CARDNAME can't be regenerated.")) {
- if (!card.getShield().isEmpty()) {
+ if (card.getShieldCount() > 0) {
return true;
}
if (card.hasKeyword("If CARDNAME would be destroyed, regenerate it.") && combat != null
diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java
index b98b82af27f..8b531700c0b 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java
@@ -99,7 +99,7 @@ public class RegenerateAi extends SpellAbilityAi {
boolean flag = false;
for (final Card c : list) {
- if (c.getShield().isEmpty()) {
+ if (c.getShieldCount() == 0) {
flag |= ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat);
}
}
@@ -128,7 +128,7 @@ public class RegenerateAi extends SpellAbilityAi {
final List threatenedTargets = new ArrayList();
for (final Card c : targetables) {
- if (objects.contains(c) && c.getShield().isEmpty() && !ComputerUtil.canRegenerate(ai, c)) {
+ if (objects.contains(c) && c.getShieldCount() == 0 && !ComputerUtil.canRegenerate(ai, c)) {
threatenedTargets.add(c);
}
}
@@ -144,7 +144,7 @@ public class RegenerateAi extends SpellAbilityAi {
ComputerUtilCard.sortByEvaluateCreature(combatants);
for (final Card c : combatants) {
- if (c.getShield().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
+ if (c.getShieldCount() == 0 && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
sa.getTargets().add(c);
chance = true;
break;
@@ -200,7 +200,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().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
+ if (c.getShieldCount() == 0 && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
sa.getTargets().add(c);
return true;
}
@@ -213,7 +213,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().isEmpty()) {
+ if (c.getShieldCount() == 0) {
sa.getTargets().add(c);
return true;
}
@@ -223,7 +223,7 @@ public class RegenerateAi extends SpellAbilityAi {
} else {
CardLists.sortByCmcDesc(compTargetables);
for (final Card c : compTargetables) {
- if (c.getShield().isEmpty()) {
+ if (c.getShieldCount() == 0) {
sa.getTargets().add(c);
return true;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java
index 44188f2d666..cf954940785 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java
+++ b/forge-ai/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().isEmpty()) {
+ if (objects.contains(c) && c.getShieldCount() == 0) {
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().isEmpty() && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
+ if (c.getShieldCount() == 0 && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat)) {
numSaved++;
}
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
index e382ac27857..a9e9220929e 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
@@ -296,7 +296,7 @@ public class TokenAi extends SpellAbilityAi {
for (int i = 0; i < substitutedColors.length; i++) {
if (substitutedColors[i].equals("ChosenColor")) {
// this currently only supports 1 chosen color
- substitutedColors[i] = host.getChosenColor().get(0);
+ substitutedColors[i] = host.getChosenColors().get(0);
}
}
String colorDesc = "";
diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
index 1aa54608e2a..00cced54536 100644
--- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
@@ -83,7 +83,7 @@ public class UnattachAllAi extends SpellAbilityAi {
//don't equip a worse creature
if (card.isEquipping()) {
- Card oldTarget = card.getEquipping().get(0);
+ Card oldTarget = card.getEquipping();
if (ComputerUtilCard.evaluateCreature(oldTarget) > ComputerUtilCard.evaluateCreature(newTarget)) {
return false;
}
diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java
index ed2e0a3f589..da5dc3a91f9 100644
--- a/forge-game/src/main/java/forge/game/Game.java
+++ b/forge-game/src/main/java/forge/game/Game.java
@@ -100,6 +100,8 @@ public class Game implements IGameStateObject {
private GameOutcome outcome;
private boolean disableAutoYields;
+ private final GameView view = new GameView();
+
@Override
public void loadState(GameStateDeserializer gsd) {
gsd.readObject(rules);
@@ -202,6 +204,10 @@ public class Game implements IGameStateObject {
subscribeToEvents(gameLog.getEventVisitor());
}
+ public GameView getView() {
+ return view;
+ }
+
/**
* Gets the players who are still fighting to win, in turn order.
*
diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java
index 33b3e20d6a5..957f968b64f 100644
--- a/forge-game/src/main/java/forge/game/GameAction.java
+++ b/forge-game/src/main/java/forge/game/GameAction.java
@@ -354,14 +354,14 @@ public class GameAction {
}
// equipment moving off battlefield
if (copied.isEquipping()) {
- final Card equippedCreature = copied.getEquipping().get(0);
+ final Card equippedCreature = copied.getEquipping();
if (equippedCreature.isInPlay()) {
copied.unEquipCard(equippedCreature);
}
}
// fortifications moving off battlefield
if (copied.isFortifying()) {
- final Card fortifiedLand = copied.getFortifying().get(0);
+ final Card fortifiedLand = copied.getFortifying();
if (fortifiedLand.isInPlay()) {
copied.unFortifyCard(fortifiedLand);
}
@@ -1040,7 +1040,7 @@ public class GameAction {
} // if isFortified()
if (c.isEquipping()) {
- final Card equippedCreature = c.getEquipping().get(0);
+ final Card equippedCreature = c.getEquipping();
if (!equippedCreature.isCreature() || !equippedCreature.isInPlay()
|| !equippedCreature.canBeEquippedBy(c)
|| (equippedCreature.isPhasedOut() && !c.isPhasedOut())
@@ -1056,7 +1056,7 @@ public class GameAction {
} // if isEquipping()
if (c.isFortifying()) {
- final Card fortifiedLand = c.getFortifying().get(0);
+ final Card fortifiedLand = c.getFortifying();
if (!fortifiedLand.isLand() || !fortifiedLand.isInPlay()
|| (fortifiedLand.isPhasedOut() && !c.isPhasedOut())) {
c.unFortifyCard(fortifiedLand);
@@ -1071,11 +1071,6 @@ public class GameAction {
return checkAgain;
}
- /**
- * TODO: Write javadoc for this method.
- * @param c
- * @return
- */
private boolean stateBasedAction704_5r(Card c) {
boolean checkAgain = false;
int plusOneCounters = c.getCounters(CounterType.P1P1);
@@ -1334,7 +1329,7 @@ public class GameAction {
}
if (c.canBeShielded() && (!c.isCreature() || c.getNetDefense() > 0)
- && (!c.getShield().isEmpty() || c.hasKeyword("If CARDNAME would be destroyed, regenerate it."))) {
+ && (c.getShieldCount() > 0 || c.hasKeyword("If CARDNAME would be destroyed, regenerate it."))) {
c.subtractShield(c.getController().getController().chooseRegenerationShield(c));
c.setDamage(0);
c.tap();
@@ -1483,7 +1478,7 @@ public class GameAction {
final Card persistCard = newCard;
String effect = String.format("AB$ ChangeZone | Cost$ 0 | Defined$ CardUID_%d" +
" | Origin$ Graveyard | Destination$ Battlefield | WithCounters$ M1M1_1",
- persistCard.getUniqueNumber());
+ persistCard.getId());
SpellAbility persistAb = AbilityFactory.getAbility(effect, c);
persistAb.setTrigger(true);
persistAb.setStackDescription(newCard.getName() + " - Returning from Persist");
@@ -1497,7 +1492,7 @@ public class GameAction {
final Card undyingCard = newCard;
String effect = String.format("AB$ ChangeZone | Cost$ 0 | Defined$ CardUID_%d |" +
" Origin$ Graveyard | Destination$ Battlefield | WithCounters$ P1P1_1",
- undyingCard.getUniqueNumber());
+ undyingCard.getId());
SpellAbility undyingAb = AbilityFactory.getAbility(effect, c);
undyingAb.setTrigger(true);
undyingAb.setStackDescription(newCard.getName() + " - Returning from Undying");
diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java
index c9e231a8686..9fe0b94ed28 100644
--- a/forge-game/src/main/java/forge/game/GameEntity.java
+++ b/forge-game/src/main/java/forge/game/GameEntity.java
@@ -438,4 +438,5 @@ public abstract class GameEntity extends GameObject {
}
public abstract Game getGame();
+ public abstract GameEntityView> getView();
}
diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java
new file mode 100644
index 00000000000..79dfe283c51
--- /dev/null
+++ b/forge-game/src/main/java/forge/game/GameEntityView.java
@@ -0,0 +1,22 @@
+package forge.game;
+
+import forge.trackable.TrackableObject;
+
+public abstract class GameEntityView> extends TrackableObject {
+ public static GameEntityView> get(GameEntity e) {
+ return e == null ? null : e.getView();
+ }
+
+ protected GameEntityView(int id0, Class propEnum0) {
+ super(id0, propEnum0);
+ }
+
+ protected abstract E preventNextDamageProp();
+
+ public int getPreventNextDamage() {
+ return get(preventNextDamageProp());
+ }
+ void updatePreventNextDamage(GameEntity e) {
+ set(preventNextDamageProp(), e.getPreventNextDamageTotalShields());
+ }
+}
diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java
new file mode 100644
index 00000000000..5e2a745c077
--- /dev/null
+++ b/forge-game/src/main/java/forge/game/GameView.java
@@ -0,0 +1,50 @@
+package forge.game;
+
+import java.util.List;
+
+import forge.game.card.Card;
+import forge.game.card.CardView;
+import forge.game.combat.AttackingBand;
+import forge.game.combat.Combat;
+import forge.game.combat.CombatView;
+import forge.game.player.PlayerView;
+import forge.game.spellability.SpellAbilityView;
+import forge.game.spellability.StackItemView;
+import forge.trackable.TrackableIndex;
+
+public class GameView {
+ private final TrackableIndex cards = new TrackableIndex();
+ private final TrackableIndex players = new TrackableIndex();
+ private final TrackableIndex spellAbilities = new TrackableIndex();
+ private final TrackableIndex stackItems = new TrackableIndex();
+ private CombatView combatView;
+
+ public GameView() {
+
+ }
+
+ public CombatView getCombatView() {
+ return combatView;
+ }
+
+ public void refreshCombat(Game game) {
+ final Combat combat = game.getCombat();
+ if (combat == null) {
+ combatView = null;
+ return;
+ }
+
+ combatView = new CombatView();
+ for (final AttackingBand b : combat.getAttackingBands()) {
+ if (b == null) continue;
+ final GameEntity defender = combat.getDefenderByAttacker(b);
+ final List blockers = combat.getBlockers(b);
+ final boolean isBlocked = b.isBlocked() == Boolean.TRUE;
+ combatView.addAttackingBand(
+ CardView.getCollection(b.getAttackers()),
+ GameEntityView.get(defender),
+ isBlocked ? CardView.getCollection(blockers) : null,
+ CardView.getCollection(blockers));
+ }
+ }
+}
diff --git a/forge-game/src/main/java/forge/game/StaticEffects.java b/forge-game/src/main/java/forge/game/StaticEffects.java
index 55f9ca5ccaf..6514e8977d2 100644
--- a/forge-game/src/main/java/forge/game/StaticEffects.java
+++ b/forge-game/src/main/java/forge/game/StaticEffects.java
@@ -146,7 +146,7 @@ public class StaticEffects implements IGameStateObject {
if (params.containsKey("AddColor")) {
final String colors = params.get("AddColor");
if (colors.equals("ChosenColor")) {
- addColors = CardUtil.getShortColorsString(se.getSource().getChosenColor());
+ addColors = CardUtil.getShortColorsString(se.getSource().getChosenColors());
} else {
addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(" & "))));
}
@@ -155,7 +155,7 @@ public class StaticEffects implements IGameStateObject {
if (params.containsKey("SetColor")) {
final String colors = params.get("SetColor");
if (colors.equals("ChosenColor")) {
- addColors = CardUtil.getShortColorsString(se.getSource().getChosenColor());
+ addColors = CardUtil.getShortColorsString(se.getSource().getChosenColors());
} else {
addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(" & "))));
}
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
index e54e5060d9e..68f4d241125 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
@@ -89,19 +89,16 @@ public class AbilityUtils {
if (defined.equals("Self")) {
c = hostCard;
}
-
else if (defined.equals("OriginalHost")) {
c = sa.getRootAbility().getOriginalHost();
}
-
else if (defined.equals("EffectSource")) {
if (hostCard.isType("Effect")) {
c = AbilityUtils.findEffectRoot(hostCard);
}
}
-
else if (defined.equals("Equipped")) {
- c = hostCard.getEquippingCard();
+ c = hostCard.getEquipping();
}
else if (defined.equals("Enchanted")) {
@@ -112,7 +109,6 @@ public class AbilityUtils {
c = sa.getRootAbility().getPaidList("Sacrificed").get(0).getEnchantingCard();
}
}
-
else if (defined.endsWith("OfLibrary")) {
final List lib = hostCard.getController().getCardsIn(ZoneType.Library);
if (lib.size() > 0) { // TopOfLibrary or BottomOfLibrary
@@ -121,22 +117,26 @@ public class AbilityUtils {
// we don't want this to fall through and return the "Self"
return cards;
}
- } else if (defined.equals("Targeted")) {
+ }
+ else if (defined.equals("Targeted")) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
Iterables.addAll(cards, saTargeting.getTargets().getTargetCards());
}
- } else if (defined.equals("ThisTargetedCard")) { // do not add parent targeted
+ }
+ else if (defined.equals("ThisTargetedCard")) { // do not add parent targeted
if (sa != null && sa.getTargets() != null) {
Iterables.addAll(cards, sa.getTargets().getTargetCards());
}
- } else if (defined.equals("ParentTarget")) {
+ }
+ else if (defined.equals("ParentTarget")) {
final SpellAbility parent = sa.getParentTargetingCard();
if (parent != null) {
Iterables.addAll(cards, parent.getTargets().getTargetCards());
}
- } else if (defined.startsWith("Triggered") && (sa != null)) {
+ }
+ else if (defined.startsWith("Triggered") && (sa != null)) {
final SpellAbility root = sa.getRootAbility();
if (defined.contains("LKICopy")) { //TriggeredCardLKICopy
final Object crd = root.getTriggeringObject(defined.substring(9, 13));
@@ -154,7 +154,8 @@ public class AbilityUtils {
}
}
}
- } else if (defined.startsWith("Replaced") && (sa != null)) {
+ }
+ else if (defined.startsWith("Replaced") && (sa != null)) {
final SpellAbility root = sa.getRootAbility();
final Object crd = root.getReplacingObject(defined.substring(8));
if (crd instanceof Card) {
@@ -164,7 +165,8 @@ public class AbilityUtils {
cards.add(cardItem);
}
}
- } else if (defined.equals("Remembered")) {
+ }
+ else if (defined.equals("Remembered")) {
if (hostCard.getRemembered().isEmpty()) {
final Card newCard = game.getCardState(hostCard);
for (final Object o : newCard.getRemembered()) {
@@ -179,7 +181,8 @@ public class AbilityUtils {
cards.add(game.getCardState((Card) o));
}
}
- } else if (defined.equals("DirectRemembered")) {
+ }
+ else if (defined.equals("DirectRemembered")) {
if (hostCard.getRemembered().isEmpty()) {
final Card newCard = game.getCardState(hostCard);
for (final Object o : newCard.getRemembered()) {
@@ -194,7 +197,8 @@ public class AbilityUtils {
cards.add((Card) o);
}
}
- } else if (defined.equals("DelayTriggerRemembered")) {
+ }
+ else if (defined.equals("DelayTriggerRemembered")) {
if (sa.getRootAbility().isTrigger()) {
for (Object o : sa.getRootAbility().getTriggerRemembered()) {
if (o instanceof Card) {
@@ -202,20 +206,24 @@ public class AbilityUtils {
}
}
}
- } else if (defined.equals("FirstRemembered")) {
+ }
+ else if (defined.equals("FirstRemembered")) {
Object o = Iterables.getFirst(hostCard.getRemembered(), null);
if (o != null && o instanceof Card) {
cards.add(game.getCardState((Card) o));
}
- } else if (defined.equals("Clones")) {
+ }
+ else if (defined.equals("Clones")) {
for (final Card clone : hostCard.getClones()) {
cards.add(game.getCardState(clone));
}
- } else if (defined.equals("Imprinted")) {
+ }
+ else if (defined.equals("Imprinted")) {
for (final Card imprint : hostCard.getImprinted()) {
cards.add(game.getCardState(imprint));
}
- } else if (defined.startsWith("ThisTurnEntered")) {
+ }
+ else if (defined.startsWith("ThisTurnEntered")) {
final String[] workingCopy = defined.split("_");
ZoneType destination, origin;
String validFilter;
@@ -231,7 +239,8 @@ public class AbilityUtils {
for (final Card cl : CardUtil.getThisTurnEntered(destination, origin, validFilter, hostCard)) {
cards.add(game.getCardState(cl));
}
- } else if (defined.equals("ChosenCard")) {
+ }
+ else if (defined.equals("ChosenCard")) {
for (final Card chosen : hostCard.getChosenCard()) {
cards.add(game.getCardState(chosen));
}
@@ -239,11 +248,12 @@ public class AbilityUtils {
else if (defined.startsWith("CardUID_")) {
String idString = defined.substring(8);
for (final Card cardByID : game.getCardsInGame()) {
- if (cardByID.getUniqueNumber() == Integer.valueOf(idString)) {
+ if (cardByID.getId() == Integer.valueOf(idString)) {
cards.add(game.getCardState(cardByID));
}
}
- } else {
+ }
+ else {
List list = null;
if (defined.startsWith("SacrificedCards")) {
list = sa.getRootAbility().getPaidList("SacrificedCards");
@@ -251,50 +261,42 @@ public class AbilityUtils {
else if (defined.startsWith("Sacrificed")) {
list = sa.getRootAbility().getPaidList("Sacrificed");
}
-
else if (defined.startsWith("DiscardedCards")) {
list = sa.getRootAbility().getPaidList("DiscardedCards");
}
else if (defined.startsWith("Discarded")) {
list = sa.getRootAbility().getPaidList("Discarded");
}
-
else if (defined.startsWith("ExiledCards")) {
list = sa.getRootAbility().getPaidList("ExiledCards");
}
else if (defined.startsWith("Exiled")) {
list = sa.getRootAbility().getPaidList("Exiled");
}
-
else if (defined.startsWith("TappedCards")) {
list = sa.getRootAbility().getPaidList("TappedCards");
}
else if (defined.startsWith("Tapped")) {
list = sa.getRootAbility().getPaidList("Tapped");
}
-
else if (defined.startsWith("UntappedCards")) {
list = sa.getRootAbility().getPaidList("UntappedCards");
}
else if (defined.startsWith("Untapped")) {
list = sa.getRootAbility().getPaidList("Untapped");
}
-
else if (defined.startsWith("Valid ")) {
String validDefined = defined.substring("Valid ".length());
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validDefined.split(","), hostCard.getController(), hostCard);
}
-
else if (defined.startsWith("ValidHand ")) {
String validDefined = defined.substring("ValidHand ".length());
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Hand), validDefined.split(","), hostCard.getController(), hostCard);
}
-
else if (defined.startsWith("ValidAll ")) {
String validDefined = defined.substring("ValidAll ".length());
list = CardLists.getValidCards(game.getCardsInGame(), validDefined.split(","), hostCard.getController(), hostCard);
}
-
else {
return cards;
}
@@ -307,7 +309,6 @@ public class AbilityUtils {
if (c != null) {
cards.add(c);
}
-
return cards;
}
@@ -1151,7 +1152,7 @@ public class AbilityUtils {
for (SpellAbility targetSpell : saTargeting.getTargets().getTargetSpells()) {
SpellAbilityStackInstance stackInstance = game.getStack().getInstanceFromSpellAbility(targetSpell);
if (stackInstance != null) {
- SpellAbility instanceSA = stackInstance.getSpellAbility();
+ SpellAbility instanceSA = stackInstance.getSpellAbility(true);
if (instanceSA != null) {
sas.add(instanceSA);
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java
index 7d91dfead15..b663591a146 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java
@@ -89,7 +89,7 @@ public class AnimateAllEffect extends AnimateEffectBase {
if (sa.hasParam("Colors")) {
final String colors = sa.getParam("Colors");
if (colors.equals("ChosenColor")) {
- tmpDesc = CardUtil.getShortColorsString(host.getChosenColor());
+ tmpDesc = CardUtil.getShortColorsString(host.getChosenColors());
} else {
tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(","))));
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java
index 36483d2166f..e3e6d005716 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java
@@ -109,7 +109,7 @@ public class AnimateEffect extends AnimateEffectBase {
final String colors = sa.getParam("Colors");
if (colors.equals("ChosenColor")) {
- tmpDesc = CardUtil.getShortColorsString(source.getChosenColor());
+ tmpDesc = CardUtil.getShortColorsString(source.getChosenColors());
} else {
tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(","))));
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java
index 0281bcebe7f..c3cdd033ff3 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java
@@ -50,21 +50,21 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
// Redirect rules read 'you MAY choose new targets' ... okay!
// TODO: Don't even ask to change targets, if the SA and subs don't actually have targets
boolean isOptional = sa.hasParam("Optional");
- if( isOptional && !chooser.getController().confirmAction(sa, null, "Do you want to change targets of " + tgtSA.getHostCard() + "?"))
+ if (isOptional && !chooser.getController().confirmAction(sa, null, "Do you want to change targets of " + tgtSA.getHostCard() + "?")) {
continue;
-
- if( changesOneTarget ) {
+ }
+ if (changesOneTarget) {
// 1. choose a target of target spell
List> allTargets = new ArrayList<>();
while(changingTgtSI != null) {
- SpellAbility changedSa = changingTgtSI.getSpellAbility();
- if(changedSa.usesTargeting()) {
+ SpellAbility changedSa = changingTgtSI.getSpellAbility(true);
+ if (changedSa.usesTargeting()) {
for(GameObject it : changedSa.getTargets().getTargets())
allTargets.add(ImmutablePair.of(changingTgtSI, it));
}
changingTgtSI = changingTgtSI.getSubInstance();
}
- if( allTargets.isEmpty() ) {
+ if (allTargets.isEmpty()) {
// is it an error or not?
System.err.println("Player managed to target a spell without targets with Spellskite's ability.");
return;
@@ -80,28 +80,33 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
replaceIn.updateTarget(newTargetBlock);
// 3. test if updated choices would be correct.
GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa), null);
- if(replaceIn.getSpellAbility().canTarget(newTarget)) {
+ if (replaceIn.getSpellAbility(true).canTarget(newTarget)) {
newTargetBlock.add(newTarget);
replaceIn.updateTarget(newTargetBlock);
- } else
+ }
+ else {
replaceIn.updateTarget(oldTargetBlock);
- } else {
+ }
+ }
+ else {
while(changingTgtSI != null) {
- SpellAbility changingTgtSA = changingTgtSI.getSpellAbility();
+ SpellAbility changingTgtSA = changingTgtSI.getSpellAbility(true);
if (sa.hasParam("RandomTarget")){
changingTgtSA.resetTargets();
List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true);
GameEntity choice = Aggregates.random(candidates);
changingTgtSA.getTargets().add(choice);
changingTgtSI.updateTarget(changingTgtSA.getTargets());
- } else if (sa.hasParam("DefinedMagnet")){
+ }
+ else if (sa.hasParam("DefinedMagnet")){
GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa, "DefinedMagnet"), null);
- if(changingTgtSA.canTarget(newTarget)) {
+ if (changingTgtSA.canTarget(newTarget)) {
changingTgtSA.resetTargets();
changingTgtSA.getTargets().add(newTarget);
changingTgtSI.updateTarget(changingTgtSA.getTargets());
}
- } else {
+ }
+ else {
// Update targets, with a potential new target
TargetChoices newTarget = sa.getActivatingPlayer().getController().chooseNewTargetsFor(changingTgtSA);
if (null != newTarget) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java
index cba1b4c36cc..4e7032994c4 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java
@@ -471,14 +471,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
tgtC.enchantEntity(attachedTo);
} else if (tgtC.isEquipment()) { //Equipment
if (tgtC.isEquipping()) {
- final Card oldEquiped = tgtC.getEquippingCard();
+ final Card oldEquiped = tgtC.getEquipping();
if ( null != oldEquiped )
tgtC.unEquipCard(oldEquiped);
}
tgtC.equipCard(attachedTo);
} else { // fortification
if (tgtC.isFortifying()) {
- final Card oldFortified = tgtC.getFortifyingCard();
+ final Card oldFortified = tgtC.getFortifying();
if( oldFortified != null )
tgtC.unFortifyCard(oldFortified);
}
@@ -856,7 +856,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
else if (c.isEquipment()) { //Equipment
if (c.isEquipping()) {
- final Card oldEquiped = c.getEquippingCard();
+ final Card oldEquiped = c.getEquipping();
if ( null != oldEquiped )
c.unEquipCard(oldEquiped);
}
@@ -864,7 +864,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
else {
if (c.isFortifying()) {
- final Card oldFortified = c.getFortifyingCard();
+ final Card oldFortified = c.getFortifying();
if ( null != oldFortified )
c.unFortifyCard(oldFortified);
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java
index 7fa8d9b6aa3..855f30c2634 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java
@@ -68,7 +68,7 @@ public class ChooseColorEffect extends SpellAbilityEffect {
if (chosenColors.isEmpty()) {
return;
}
- card.setChosenColor(chosenColors);
+ card.setChosenColors(chosenColors);
p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + Lang.joinHomogenous(chosenColors), p);
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java
index c2ed4299543..048026dda77 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java
@@ -61,8 +61,9 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
stackSources.add(stackinst.getSourceCard());
}
// Get the list of cards that are referenced by effects on the stack
- if (null != stackinst.getSpellAbility().getTriggeringObjects()) {
- for (Object c : stackinst.getSpellAbility().getTriggeringObjects().values()) {
+ SpellAbility siSpellAbility = stackinst.getSpellAbility(true);
+ if (siSpellAbility.getTriggeringObjects() != null) {
+ for (Object c : siSpellAbility.getTriggeringObjects().values()) {
if (c instanceof Card) {
if (!stackSources.contains((Card) c)) {
referencedSources.add((Card) c);
@@ -70,12 +71,12 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
}
}
}
- if (null != stackinst.getSpellAbility().getTargetCard()) {
- referencedSources.add(stackinst.getSpellAbility().getTargetCard());
+ if (siSpellAbility.getTargetCard() != null) {
+ referencedSources.add(siSpellAbility.getTargetCard());
}
// TODO: is this necessary?
- if (null != stackinst.getSpellAbility().getReplacingObjects()) {
- for (Object c : stackinst.getSpellAbility().getReplacingObjects().values()) {
+ if (siSpellAbility.getReplacingObjects() != null) {
+ for (Object c : siSpellAbility.getReplacingObjects().values()) {
if (c instanceof Card) {
if (!stackSources.contains((Card) c)) {
referencedSources.add((Card) c);
@@ -85,7 +86,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
}
}
-
if (sa.hasParam("Choices")) {
permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host);
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java
index 7f366f244e1..55b5a07321a 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java
@@ -106,12 +106,12 @@ public class CloneEffect extends SpellAbilityEffect {
tgtCard.clearStates(CardCharacteristicName.Cloner);
}
// add "Cloner" state to clone
- tgtCard.addAlternateState(CardCharacteristicName.Cloner);
+ tgtCard.addAlternateState(CardCharacteristicName.Cloner, false);
tgtCard.switchStates(CardCharacteristicName.Original, CardCharacteristicName.Cloner);
tgtCard.setState(CardCharacteristicName.Original);
} else {
//copy Original state to Cloned
- tgtCard.addAlternateState(CardCharacteristicName.Cloned);
+ tgtCard.addAlternateState(CardCharacteristicName.Cloned, false);
tgtCard.switchStates(CardCharacteristicName.Original, CardCharacteristicName.Cloned);
if (tgtCard.isFlipCard()) {
tgtCard.setState(CardCharacteristicName.Original);
@@ -285,7 +285,7 @@ public class CloneEffect extends SpellAbilityEffect {
if (sa.hasParam("Colors")) {
final String colors = sa.getParam("Colors");
if (colors.equals("ChosenColor")) {
- shortColors = CardUtil.getShortColorsString(tgtCard.getChosenColor());
+ shortColors = CardUtil.getShortColorsString(tgtCard.getChosenColors());
} else {
shortColors = CardUtil.getShortColorsString(Arrays.asList(colors.split(",")));
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java
index d5b4ff9513b..bc9b791ccf3 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java
@@ -37,7 +37,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
for (final Card c : getDefinedCards(sa)) {
sb.append(" ");
if (c.isFaceDown()) {
- sb.append("Face-down creature (").append(c.getUniqueNumber()).append(')');
+ sb.append("Face-down creature (").append(c.getId()).append(')');
} else {
sb.append(c);
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java
index d54f9b44116..9042cb8e743 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java
@@ -26,7 +26,7 @@ public class CounterEffect extends SpellAbilityEffect {
if (sa.hasParam("AllType")) {
sas = new ArrayList();
for (SpellAbilityStackInstance si : game.getStack()) {
- SpellAbility spell = si.getSpellAbility();
+ SpellAbility spell = si.getSpellAbility(true);
if (sa.getParam("AllType").equals("Spell") && !spell.isSpell()) {
continue;
}
@@ -71,7 +71,7 @@ public class CounterEffect extends SpellAbilityEffect {
if (sa.hasParam("AllType")) {
sas = new ArrayList();
for (SpellAbilityStackInstance si : game.getStack()) {
- SpellAbility spell = si.getSpellAbility();
+ SpellAbility spell = si.getSpellAbility(true);
if (sa.getParam("AllType").equals("Spell") && !spell.isSpell()) {
continue;
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java
index b5575de5eb7..686248dd8cf 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java
@@ -104,7 +104,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa);
for (final Object effTgt : effTgts) {
if (effTgt instanceof Card) {
- effTgtString = String.valueOf(((Card) effTgt).getUniqueNumber());
+ effTgtString = String.valueOf(((Card) effTgt).getId());
effectMap.put("ShieldEffectTarget", "CardUID_" + effTgtString);
} else if (effTgt instanceof Player) {
effTgtString = ((Player) effTgt).getName();
@@ -131,7 +131,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa);
for (final Object effTgt : effTgts) {
if (effTgt instanceof Card) {
- effTgtString = String.valueOf(((Card) effTgt).getUniqueNumber());
+ effTgtString = String.valueOf(((Card) effTgt).getId());
effectMap.put("ShieldEffectTarget", "CardUID_" + effTgtString);
} else if (effTgt instanceof Player) {
effTgtString = ((Player) effTgt).getName();
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java
index 0650f5ce58e..1845ac6350b 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java
@@ -32,7 +32,7 @@ public class DestroyEffect extends SpellAbilityEffect {
while (it.hasNext()) {
final Card tgtC = it.next();
if (tgtC.isFaceDown()) {
- sb.append("Morph ").append("(").append(tgtC.getUniqueNumber()).append(")");
+ sb.append("Morph ").append("(").append(tgtC.getId()).append(")");
} else {
sb.append(tgtC);
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java
index 8c3fff7c0cb..fcf6e384f26 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java
@@ -189,8 +189,8 @@ public class EffectEffect extends SpellAbilityEffect {
}
// Set Chosen Color(s)
- if (!hostCard.getChosenColor().isEmpty()) {
- eff.setChosenColor(hostCard.getChosenColor());
+ if (!hostCard.getChosenColors().isEmpty()) {
+ eff.setChosenColors(hostCard.getChosenColors());
}
// Set Chosen name
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java
index 332e4ee52fa..9c3b44d2ef4 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java
@@ -75,7 +75,7 @@ public class PlayLandVariantEffect extends SpellAbilityEffect {
}
String imageFileName = game.getRules().canCloneUseTargetsImage ? source.getImageKey() : random.getImageKey();
- source.addAlternateState(CardCharacteristicName.Cloner);
+ source.addAlternateState(CardCharacteristicName.Cloner, false);
source.switchStates(CardCharacteristicName.Original, CardCharacteristicName.Cloner);
source.setState(CardCharacteristicName.Original);
CardCharacteristicName stateToCopy = random.getCurState();
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java
index eee0d86e360..1615cc2d261 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java
@@ -56,7 +56,7 @@ public class ProtectAllEffect extends SpellAbilityEffect {
game.getAction().nofityOfValue(sa, choser, Lang.joinHomogenous(gains), choser);
} else {
if (sa.getParam("Gains").equals("ChosenColor")) {
- for (final String color : host.getChosenColor()) {
+ for (final String color : host.getChosenColors()) {
gains.add(color.toLowerCase());
}
} else if (sa.getParam("Gains").equals("TargetedCardColor")) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java
index 9672a96da0a..938b3e15bb7 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java
@@ -114,7 +114,7 @@ public class ProtectEffect extends SpellAbilityEffect {
game.getAction().nofityOfValue(sa, choser, Lang.joinHomogenous(gains), choser);
} else {
if (sa.getParam("Gains").equals("ChosenColor")) {
- for (final String color : host.getChosenColor()) {
+ for (final String color : host.getChosenColors()) {
gains.add(color.toLowerCase());
}
} else {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java
index 804884f0183..075405f8f26 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java
@@ -209,7 +209,7 @@ public class PumpEffect extends SpellAbilityEffect {
if (defined.equals("ChosenType")) {
replaced = host.getChosenType();
} else if (defined.equals("CardUIDSource")) {
- replaced = "CardUID_" + String.valueOf(host.getUniqueNumber());
+ replaced = "CardUID_" + String.valueOf(host.getId());
}
for (int i = 0; i < keywords.size(); i++) {
keywords.set(i, keywords.get(i).replaceAll(defined, replaced));
diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java
index 5519073276e..c513b0694a1 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java
@@ -73,7 +73,7 @@ public class RegenerateEffect extends SpellAbilityEffect {
} 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()));
+ abString = abString.replace(def, replaced.isEmpty() ? "" : Integer.toString(replaced.get(0).getId()));
}
triggerSA = AbilityFactory.getAbility(abString, sourceCard);
triggerSA.setActivatingPlayer(sa.getActivatingPlayer());
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java
index 0ee19c42103..4a52f35e06e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java
@@ -28,7 +28,7 @@ public class SetStateEffect extends SpellAbilityEffect {
while (it.hasNext()) {
final Card tgtC = it.next();
if (tgtC.isFaceDown()) {
- sb.append("Morph ").append("(").append(tgtC.getUniqueNumber()).append(")");
+ sb.append("Morph ").append("(").append(tgtC.getId()).append(")");
} else {
sb.append(tgtC);
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java
index 3d87e8a63a9..d733b4a34cc 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java
@@ -170,7 +170,7 @@ public class TokenEffect extends SpellAbilityEffect {
for (int i = 0; i < substitutedColors.length; i++) {
if (substitutedColors[i].equals("ChosenColor")) {
// this currently only supports 1 chosen color
- substitutedColors[i] = host.getChosenColor().get(0);
+ substitutedColors[i] = host.getChosenColors().get(0);
}
}
String colorDesc = "";
diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java
index 495c2d29c22..e7698add90c 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java
@@ -24,11 +24,11 @@ public class UnattachAllEffect extends SpellAbilityEffect {
//AbilityFactoryAttach.handleUnattachAura(cardToUnattach, c, gainControl);
} else if (cardToUnattach.isEquipment()) {
if (cardToUnattach.isEquipping() && c.getEquippedBy().contains(cardToUnattach)) {
- cardToUnattach.unEquipCard(cardToUnattach.getEquipping().get(0));
+ cardToUnattach.unEquipCard(cardToUnattach.getEquipping());
}
} else if (cardToUnattach.isFortification()) {
if (cardToUnattach.isFortifying() && c.getFortifiedBy().contains(cardToUnattach)) {
- cardToUnattach.unFortifyCard(cardToUnattach.getFortifying().get(0));
+ cardToUnattach.unFortifyCard(cardToUnattach.getFortifying());
}
}
} else if (o instanceof Player) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java
index 1ada2ca58a9..9754b0f6d4f 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java
@@ -33,11 +33,11 @@ public class UnattachEffect extends SpellAbilityEffect {
//AbilityFactoryAttach.handleUnattachAura(cardToUnattach, c, gainControl);
} else if (cardToUnattach.isEquipment()) {
if (cardToUnattach.isEquipping()) {
- cardToUnattach.unEquipCard(cardToUnattach.getEquipping().get(0));
+ cardToUnattach.unEquipCard(cardToUnattach.getEquipping());
}
} else if (cardToUnattach.isFortification()) {
if (cardToUnattach.isFortifying()) {
- cardToUnattach.unFortifyCard(cardToUnattach.getFortifying().get(0));
+ cardToUnattach.unFortifyCard(cardToUnattach.getFortifying());
}
}
}
diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java
index ba07d500816..d6e839c83d3 100644
--- a/forge-game/src/main/java/forge/game/card/Card.java
+++ b/forge-game/src/main/java/forge/game/card/Card.java
@@ -36,6 +36,7 @@ import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardView;
import forge.game.combat.AttackingBand;
import forge.game.combat.Combat;
import forge.game.cost.Cost;
@@ -76,13 +77,13 @@ import java.util.concurrent.CopyOnWriteArrayList;
*
*
* Can now be used as keys in Tree data structures. The comparison is based
- * entirely on getUniqueNumber().
+ * entirely on id.
*
* @author Forge
* @version $Id$
*/
public class Card extends GameEntity implements Comparable, IIdentifiable {
- private final int uniqueNumber;
+ private final int id;
private final IPaperCard paperCard;
private final Map characteristicsMap
@@ -101,15 +102,13 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
// which equipment cards are equipping this card?
private ArrayList equippedBy = new ArrayList();
- // equipping size will always be 0 or 1
// if this card is of the type equipment, what card is it currently equipping?
- private ArrayList equipping = new ArrayList();
+ private Card equipping = null;
// which fortification cards are fortifying this card?
private ArrayList fortifiedBy = new ArrayList();
- // fortifying size will always be 0 or 1
// if this card is of the type fortification, what card is it currently fortifying?
- private ArrayList fortifying = new ArrayList();
+ private Card fortifying = null;
// which auras enchanted this card?
// if this card is an Aura, what Entity is it enchanting?
@@ -187,7 +186,7 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
private int damage;
// regeneration
- private List nShield = new ArrayList();
+ private List shields = new ArrayList();
private int regeneratedThisTurn = 0;
private int turnInZone;
@@ -214,7 +213,7 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
private String echoCost = "";
private Cost miracleCost = null;
private String chosenType = "";
- private List chosenColor = new ArrayList();
+ private List chosenColors = new ArrayList();
private String namedCard = "";
private int chosenNumber;
private Player chosenPlayer;
@@ -244,6 +243,9 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
private int countersAdded = 0;
+ private CardRules cardRules;
+ private final CardView view;
+
// Enumeration for CMC request types
public enum SplitCMCMode {
CurrentSideCMC,
@@ -256,8 +258,8 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
* Instantiates a new card not associated to any paper card.
* @param id the unique id of the new card.
*/
- public Card(final int id) {
- this(id, null);
+ public Card(final int id0) {
+ this(id0, null);
}
/**
@@ -268,23 +270,16 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
* card.
* @see IPaperCard
*/
- public Card(final int id, final IPaperCard paperCard) {
- this.uniqueNumber = id;
- this.paperCard = paperCard;
- this.characteristicsMap.put(CardCharacteristicName.Original, new CardCharacteristics());
- this.characteristicsMap.put(CardCharacteristicName.FaceDown, CardUtil.getFaceDownCharacteristic());
+ public Card(final int id0, final IPaperCard paperCard0) {
+ id = id0;
+ paperCard = paperCard0;
+ characteristicsMap.put(CardCharacteristicName.Original, new CardCharacteristics());
+ characteristicsMap.put(CardCharacteristicName.FaceDown, CardUtil.getFaceDownCharacteristic());
+ view = new CardView(id0);
}
- /**
- * Sets the state.
- *
- * @param state
- * the state
- * @return true, if successful
- */
public boolean changeToState(final CardCharacteristicName state) {
-
- CardCharacteristicName cur = this.curCharacteristics;
+ CardCharacteristicName cur = curCharacteristics;
if (!setState(state)) {
return false;
@@ -304,28 +299,23 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
return true;
}
- /**
- * Sets the state.
- *
- * @param state
- * the state
- * @return true, if successful
- */
public boolean setState(final CardCharacteristicName state) {
- if (state == CardCharacteristicName.FaceDown && this.isDoubleFaced()) {
+ if (state == CardCharacteristicName.FaceDown && isDoubleFaced()) {
return false; // Doublefaced cards can't be turned face-down.
}
- if (!this.characteristicsMap.containsKey(state)) {
- System.out.println(this.getName() + " tried to switch to non-existant state \"" + state + "\"!");
+ if (!characteristicsMap.containsKey(state)) {
+ System.out.println(getName() + " tried to switch to non-existant state \"" + state + "\"!");
return false; // Nonexistant state.
}
- if (state.equals(this.curCharacteristics)) {
+ if (state.equals(curCharacteristics)) {
return false;
}
- this.curCharacteristics = state;
+ curCharacteristics = state;
+
+ view.updateState(this, true);
Game game = getGame();
if (game != null) {
@@ -335,74 +325,43 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
return true;
}
- /**
- * Gets the states.
- *
- * @return the states
- */
public Set getStates() {
- return this.characteristicsMap.keySet();
+ return characteristicsMap.keySet();
}
- /**
- * Gets the cur state.
- *
- * @return the cur state
- */
public CardCharacteristicName getCurState() {
- return this.curCharacteristics;
+ return curCharacteristics;
}
- /**
- * Switch states.
- *
- * @param from
- * the from
- * @param to
- * the to
- */
public void switchStates(final CardCharacteristicName from, final CardCharacteristicName to) {
- final CardCharacteristics tmp = this.characteristicsMap.get(from);
- this.characteristicsMap.put(from, this.characteristicsMap.get(to));
- this.characteristicsMap.put(to, tmp);
+ final CardCharacteristics tmp = characteristicsMap.get(from);
+ characteristicsMap.put(from, characteristicsMap.get(to));
+ characteristicsMap.put(to, tmp);
+ view.updateState(this, false);
}
- /**
- * Clear states.
- *
- * @param state
- * the state
- */
public void clearStates(final CardCharacteristicName state) {
- this.characteristicsMap.remove(state);
+ if (characteristicsMap.remove(state) != null) {
+ view.updateState(this, false);
+ }
}
public void setPreFaceDownCharacteristic(CardCharacteristicName preCharacteristic) {
- this.preTFDCharacteristic = preCharacteristic;
+ preTFDCharacteristic = preCharacteristic;
}
- /**
- * Turn face down.
- *
- * @return true, if successful
- */
public boolean turnFaceDown() {
- if (!this.isDoubleFaced()) {
- this.preTFDCharacteristic = this.curCharacteristics;
- return this.setState(CardCharacteristicName.FaceDown);
+ if (!isDoubleFaced()) {
+ preTFDCharacteristic = curCharacteristics;
+ return setState(CardCharacteristicName.FaceDown);
}
return false;
}
- /**
- * Turn face up.
- *
- * @return true, if successful
- */
public boolean turnFaceUp() {
- if (this.curCharacteristics == CardCharacteristicName.FaceDown) {
- boolean result = this.setState(this.preTFDCharacteristic);
+ if (curCharacteristics == CardCharacteristicName.FaceDown) {
+ boolean result = setState(preTFDCharacteristic);
if (result) {
getGame().getTriggerHandler().registerActiveTrigger(this, false);
// Run replacement effects
@@ -422,75 +381,38 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
return false;
}
- /**
- * Gets the state.
- *
- * @param state
- * the state
- * @return the state
- */
public CardCharacteristics getState(final CardCharacteristicName state) {
- return this.characteristicsMap.get(state);
+ return characteristicsMap.get(state);
}
- /**
- * Gets the characteristics.
- *
- * @return the characteristics
- */
public CardCharacteristics getCharacteristics() {
- return this.characteristicsMap.get(this.curCharacteristics);
+ return characteristicsMap.get(curCharacteristics);
}
- /**
- * addAlternateState.
- *
- * @param state
- * the state
- */
- public final void addAlternateState(final CardCharacteristicName state) {
- this.characteristicsMap.put(state, new CardCharacteristics());
+ public final void addAlternateState(final CardCharacteristicName state, final boolean updateView) {
+ characteristicsMap.put(state, new CardCharacteristics());
+ if (updateView) {
+ view.updateState(this, false);
+ }
}
- /*
- * (non-Javadoc)
- *
- * @see forge.GameEntity#getName()
- */
@Override
public final String getName() {
- return this.getCharacteristics().getName();
+ return getCharacteristics().getName();
}
- /*
- * (non-Javadoc)
- *
- * @see forge.GameEntity#setName(java.lang.String)
- */
@Override
public final void setName(final String name0) {
- this.getCharacteristics().setName(name0);
+ getCharacteristics().setName(name0);
}
- /**
- *
- * isInAlternateState.
- *
- * @return boolean
- */
public final boolean isInAlternateState() {
- return this.curCharacteristics != CardCharacteristicName.Original
- && this.curCharacteristics != CardCharacteristicName.Cloned;
+ return curCharacteristics != CardCharacteristicName.Original
+ && curCharacteristics != CardCharacteristicName.Cloned;
}
- /**
- *
- * hasAlternateState.
- *
- * @return boolean
- */
public final boolean hasAlternateState() {
- return this.characteristicsMap.keySet().size() > 2;
+ return characteristicsMap.keySet().size() > 2;
}
public final boolean isDoubleFaced() {
@@ -504,206 +426,88 @@ public class Card extends GameEntity implements Comparable, IIdentifiable
public final boolean isSplitCard() {
return characteristicsMap.containsKey(CardCharacteristicName.LeftSplit);
}
-
- /**
- * Checks if is cloned.
- *
- * @return true, if is cloned
- */
+
public boolean isCloned() {
return characteristicsMap.containsKey(CardCharacteristicName.Cloner);
}
- /**
- *
- * TODO Write javadoc for this method.
- *
- * @return a String array
- */
public static List getStorableSVars() {
return Card.storableSVars;
}
- /**
- *
- * TODO Write javadoc for this method.
- *
- * @param c
- * a Card object
- */
public final void addDevoured(final Card c) {
- this.devouredCards.add(c);
+ devouredCards.add(c);
}
- /**
- *
- * TODO Write javadoc for this method.
- */
public final void clearDevoured() {
- this.devouredCards.clear();
+ devouredCards.clear();
}
- /**
- *
- * TODO Write javadoc for this method.
- *
- * @return a List object
- */
public final List getDevoured() {
- return this.devouredCards;
+ return devouredCards;
}
public final void addRememberMap(final GameEntity e, final List