diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 189363e0edc..f70eff1b745 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1245,7 +1245,7 @@ public abstract class GameState { System.err.println("ERROR: Tried to create a non-existent token named " + cardinfo[0] + " when loading game state!"); continue; } - c = Card.fromPaperCard(token, player, player.getGame()); + c = CardFactory.getCard(token, player, player.getGame()); } else { PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode, artID); if (pc == null) { diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index 361441090fc..f493a58a387 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -14,6 +14,8 @@ import com.google.common.collect.Table; import forge.LobbyPlayer; import forge.ai.AIOption; import forge.ai.LobbyPlayerAi; +import forge.card.CardRarity; +import forge.card.CardRules; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; @@ -38,6 +40,7 @@ import forge.game.staticability.StaticAbility; import forge.game.trigger.TriggerType; import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.ZoneType; +import forge.item.PaperCard; public class GameCopier { private static final ZoneType[] ZONES = new ZoneType[] { @@ -118,7 +121,7 @@ public class GameCopier { ((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false); } - copyGameState(newGame); + copyGameState(newGame, aiPlayer); for (Player p : newGame.getPlayers()) { List commanders = Lists.newArrayList(); @@ -231,7 +234,7 @@ public class GameCopier { return clone; } - private void copyGameState(Game newGame) { + private void copyGameState(Game newGame, Player aiPlayer) { newGame.setAge(origGame.getAge()); // TODO countersAddedThisTurn @@ -254,7 +257,7 @@ public class GameCopier { for (ZoneType zone : ZONES) { for (Card card : origGame.getCardsIn(zone)) { - addCard(newGame, zone, card); + addCard(newGame, zone, card, aiPlayer); } // TODO CardsAddedThisTurn is now messed up } @@ -290,15 +293,24 @@ public class GameCopier { } } + private static PaperCard hidden_info_card = new PaperCard(CardRules.fromScript(Lists.newArrayList("Name:hidden", "Types:Artifact", "Oracle:")), "", CardRarity.Common); + private static final boolean PRUNE_HIDDEN_INFO = false; private static final boolean USE_FROM_PAPER_CARD = true; - private Card createCardCopy(Game newGame, Player newOwner, Card c) { + private Card createCardCopy(Game newGame, Player newOwner, Card c, Player aiPlayer) { if (c.isToken() && !c.isImmutable()) { Card result = new TokenInfo(c).makeOneToken(newOwner); CardFactory.copyCopiableCharacteristics(c, result, null, null); return result; } if (USE_FROM_PAPER_CARD && !c.isImmutable() && c.getPaperCard() != null) { - Card newCard = Card.fromPaperCard(c.getPaperCard(), newOwner); + Card newCard; + if (PRUNE_HIDDEN_INFO && !c.getView().canBeShownTo(aiPlayer.getView())) { + // TODO also check REVEALED_CARDS memory + newCard = new Card(newGame.nextCardId(), hidden_info_card, newGame); + newCard.setOwner(newOwner); + } else { + newCard = Card.fromPaperCard(c.getPaperCard(), newOwner); + } newCard.setCommander(c.isCommander()); return newCard; } @@ -327,9 +339,9 @@ public class GameCopier { return newCard; } - private void addCard(Game newGame, ZoneType zone, Card c) { + private void addCard(Game newGame, ZoneType zone, Card c, Player aiPlayer) { final Player owner = playerMap.get(c.getOwner()); - final Card newCard = createCardCopy(newGame, owner, c); + final Card newCard = createCardCopy(newGame, owner, c, aiPlayer); cardMap.put(c, newCard); // TODO ExiledWith diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java index 0d7f5939e29..e7c62d72f9e 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java @@ -50,7 +50,7 @@ public class GameStateEvaluator { return null; } GameCopier copier = new GameCopier(evalGame); - Game gameCopy = copier.makeCopy(); + Game gameCopy = copier.makeCopy(null, aiPlayer); gameCopy.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_DAMAGE, new Runnable() { @Override public void run() { 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 a505ddd674e..095d9654ed8 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 @@ -56,25 +56,20 @@ public class ChooseSourceEffect extends SpellAbilityEffect { // Get the list of cards that are referenced by effects on the stack SpellAbility siSpellAbility = stackinst.getSpellAbility(); - if (siSpellAbility.getTriggeringObjects() != null) { - for (Object c : siSpellAbility.getTriggeringObjects().values()) { - if (c instanceof Card) { - if (!stackSources.contains(c)) { - referencedSources.add((Card) c); - } + for (Object c : siSpellAbility.getTriggeringObjects().values()) { + if (c instanceof Card) { + if (!stackSources.contains(c)) { + referencedSources.add((Card) c); } } } if (siSpellAbility.getTargetCard() != null) { referencedSources.add(siSpellAbility.getTargetCard()); } - // TODO: is this necessary? - if (siSpellAbility.getReplacingObjects() != null) { - for (Object c : siSpellAbility.getReplacingObjects().values()) { - if (c instanceof Card) { - if (!stackSources.contains(c)) { - referencedSources.add((Card) c); - } + for (Object c : siSpellAbility.getReplacingObjects().values()) { + if (c instanceof Card) { + if (!stackSources.contains(c)) { + referencedSources.add((Card) c); } } } 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 a346348a822..59b8938241e 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6966,9 +6966,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public static Card fromPaperCard(IPaperCard pc, Player owner) { return CardFactory.getCard(pc, owner, owner == null ? null : owner.getGame()); } - public static Card fromPaperCard(IPaperCard pc, Player owner, Game game) { - return CardFactory.getCard(pc, owner, game); - } private static final Map cp2card = Maps.newHashMap(); public static Card getCardForUi(IPaperCard pc) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 222358e8eb8..b4c64999e41 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -652,8 +652,6 @@ public class CardFactory { if (p != null) { to.setActivatingPlayer(p, lki); } - - //to.changeText(); } /** diff --git a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java index 257f37b8cc8..340d6bacbb2 100644 --- a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java +++ b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java @@ -17,6 +17,7 @@ import forge.card.MagicColor; import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.card.CardFactory; import forge.game.card.CardFactoryUtil; import forge.game.card.CardUtil; import forge.game.keyword.KeywordInterface; @@ -279,7 +280,7 @@ public class TokenInfo { if (token == null) { return null; } - final Card result = Card.fromPaperCard(token, owner, game); + final Card result = CardFactory.getCard(token, owner, game); if (sa.hasParam("TokenPower")) { String str = sa.getParam("TokenPower"); diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 20ade36394f..cdf5b6b0c36 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -308,6 +308,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable addTokens(String name, int amount, Player p) { diff --git a/forge-gui/res/cardsfolder/i/ignoble_soldier.txt b/forge-gui/res/cardsfolder/i/ignoble_soldier.txt index bd43258031b..d38c4b07914 100644 --- a/forge-gui/res/cardsfolder/i/ignoble_soldier.txt +++ b/forge-gui/res/cardsfolder/i/ignoble_soldier.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Creature Human Soldier PT:3/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigNodamage | TriggerDescription$ Whenever CARDNAME becomes blocked, prevent all combat damage that would be dealt by it this turn. -SVar:TrigNodamage:DB$ Effect | ReplacementEffects$ RPrevent | RememberObjects$ TriggeredCard | ExileOnMoved$ Battlefield +SVar:TrigNodamage:DB$ Effect | ReplacementEffects$ RPrevent | RememberObjects$ TriggeredAttackerLKICopy | ExileOnMoved$ Battlefield SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidSource$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt by it this turn. SVar:MustBeBlocked:True Oracle:Whenever Ignoble Soldier becomes blocked, prevent all combat damage that would be dealt by it this turn.