mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 09:48:02 +00:00
@@ -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!");
|
System.err.println("ERROR: Tried to create a non-existent token named " + cardinfo[0] + " when loading game state!");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
c = Card.fromPaperCard(token, player, player.getGame());
|
c = CardFactory.getCard(token, player, player.getGame());
|
||||||
} else {
|
} else {
|
||||||
PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode, artID);
|
PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode, artID);
|
||||||
if (pc == null) {
|
if (pc == null) {
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import com.google.common.collect.Table;
|
|||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.ai.AIOption;
|
import forge.ai.AIOption;
|
||||||
import forge.ai.LobbyPlayerAi;
|
import forge.ai.LobbyPlayerAi;
|
||||||
|
import forge.card.CardRarity;
|
||||||
|
import forge.card.CardRules;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.GameObject;
|
import forge.game.GameObject;
|
||||||
@@ -38,6 +40,7 @@ import forge.game.staticability.StaticAbility;
|
|||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.PlayerZoneBattlefield;
|
import forge.game.zone.PlayerZoneBattlefield;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.item.PaperCard;
|
||||||
|
|
||||||
public class GameCopier {
|
public class GameCopier {
|
||||||
private static final ZoneType[] ZONES = new ZoneType[] {
|
private static final ZoneType[] ZONES = new ZoneType[] {
|
||||||
@@ -118,7 +121,7 @@ public class GameCopier {
|
|||||||
((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false);
|
((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
copyGameState(newGame);
|
copyGameState(newGame, aiPlayer);
|
||||||
|
|
||||||
for (Player p : newGame.getPlayers()) {
|
for (Player p : newGame.getPlayers()) {
|
||||||
List<Card> commanders = Lists.newArrayList();
|
List<Card> commanders = Lists.newArrayList();
|
||||||
@@ -231,7 +234,7 @@ public class GameCopier {
|
|||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyGameState(Game newGame) {
|
private void copyGameState(Game newGame, Player aiPlayer) {
|
||||||
newGame.setAge(origGame.getAge());
|
newGame.setAge(origGame.getAge());
|
||||||
|
|
||||||
// TODO countersAddedThisTurn
|
// TODO countersAddedThisTurn
|
||||||
@@ -254,7 +257,7 @@ public class GameCopier {
|
|||||||
|
|
||||||
for (ZoneType zone : ZONES) {
|
for (ZoneType zone : ZONES) {
|
||||||
for (Card card : origGame.getCardsIn(zone)) {
|
for (Card card : origGame.getCardsIn(zone)) {
|
||||||
addCard(newGame, zone, card);
|
addCard(newGame, zone, card, aiPlayer);
|
||||||
}
|
}
|
||||||
// TODO CardsAddedThisTurn is now messed up
|
// 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 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()) {
|
if (c.isToken() && !c.isImmutable()) {
|
||||||
Card result = new TokenInfo(c).makeOneToken(newOwner);
|
Card result = new TokenInfo(c).makeOneToken(newOwner);
|
||||||
CardFactory.copyCopiableCharacteristics(c, result, null, null);
|
CardFactory.copyCopiableCharacteristics(c, result, null, null);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (USE_FROM_PAPER_CARD && !c.isImmutable() && c.getPaperCard() != null) {
|
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());
|
newCard.setCommander(c.isCommander());
|
||||||
return newCard;
|
return newCard;
|
||||||
}
|
}
|
||||||
@@ -327,9 +339,9 @@ public class GameCopier {
|
|||||||
return newCard;
|
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 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);
|
cardMap.put(c, newCard);
|
||||||
|
|
||||||
// TODO ExiledWith
|
// TODO ExiledWith
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class GameStateEvaluator {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
GameCopier copier = new GameCopier(evalGame);
|
GameCopier copier = new GameCopier(evalGame);
|
||||||
Game gameCopy = copier.makeCopy();
|
Game gameCopy = copier.makeCopy(null, aiPlayer);
|
||||||
gameCopy.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_DAMAGE, new Runnable() {
|
gameCopy.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_DAMAGE, new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|||||||
@@ -56,25 +56,20 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
// Get the list of cards that are referenced by effects on the stack
|
// Get the list of cards that are referenced by effects on the stack
|
||||||
SpellAbility siSpellAbility = stackinst.getSpellAbility();
|
SpellAbility siSpellAbility = stackinst.getSpellAbility();
|
||||||
if (siSpellAbility.getTriggeringObjects() != null) {
|
for (Object c : siSpellAbility.getTriggeringObjects().values()) {
|
||||||
for (Object c : siSpellAbility.getTriggeringObjects().values()) {
|
if (c instanceof Card) {
|
||||||
if (c instanceof Card) {
|
if (!stackSources.contains(c)) {
|
||||||
if (!stackSources.contains(c)) {
|
referencedSources.add((Card) c);
|
||||||
referencedSources.add((Card) c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (siSpellAbility.getTargetCard() != null) {
|
if (siSpellAbility.getTargetCard() != null) {
|
||||||
referencedSources.add(siSpellAbility.getTargetCard());
|
referencedSources.add(siSpellAbility.getTargetCard());
|
||||||
}
|
}
|
||||||
// TODO: is this necessary?
|
for (Object c : siSpellAbility.getReplacingObjects().values()) {
|
||||||
if (siSpellAbility.getReplacingObjects() != null) {
|
if (c instanceof Card) {
|
||||||
for (Object c : siSpellAbility.getReplacingObjects().values()) {
|
if (!stackSources.contains(c)) {
|
||||||
if (c instanceof Card) {
|
referencedSources.add((Card) c);
|
||||||
if (!stackSources.contains(c)) {
|
|
||||||
referencedSources.add((Card) c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6966,9 +6966,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
public static Card fromPaperCard(IPaperCard pc, Player owner) {
|
public static Card fromPaperCard(IPaperCard pc, Player owner) {
|
||||||
return CardFactory.getCard(pc, owner, owner == null ? null : owner.getGame());
|
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<PaperCard, Card> cp2card = Maps.newHashMap();
|
private static final Map<PaperCard, Card> cp2card = Maps.newHashMap();
|
||||||
public static Card getCardForUi(IPaperCard pc) {
|
public static Card getCardForUi(IPaperCard pc) {
|
||||||
|
|||||||
@@ -652,8 +652,6 @@ public class CardFactory {
|
|||||||
if (p != null) {
|
if (p != null) {
|
||||||
to.setActivatingPlayer(p, lki);
|
to.setActivatingPlayer(p, lki);
|
||||||
}
|
}
|
||||||
|
|
||||||
//to.changeText();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import forge.card.MagicColor;
|
|||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.ability.AbilityUtils;
|
import forge.game.ability.AbilityUtils;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
|
import forge.game.card.CardFactory;
|
||||||
import forge.game.card.CardFactoryUtil;
|
import forge.game.card.CardFactoryUtil;
|
||||||
import forge.game.card.CardUtil;
|
import forge.game.card.CardUtil;
|
||||||
import forge.game.keyword.KeywordInterface;
|
import forge.game.keyword.KeywordInterface;
|
||||||
@@ -279,7 +280,7 @@ public class TokenInfo {
|
|||||||
if (token == null) {
|
if (token == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final Card result = Card.fromPaperCard(token, owner, game);
|
final Card result = CardFactory.getCard(token, owner, game);
|
||||||
|
|
||||||
if (sa.hasParam("TokenPower")) {
|
if (sa.hasParam("TokenPower")) {
|
||||||
String str = sa.getParam("TokenPower");
|
String str = sa.getParam("TokenPower");
|
||||||
|
|||||||
@@ -308,6 +308,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
|||||||
// if not already copied use a fresh instance
|
// if not already copied use a fresh instance
|
||||||
SpellAbility original = sp;
|
SpellAbility original = sp;
|
||||||
sp = sp.copy();
|
sp = sp.copy();
|
||||||
|
// need to reapply text changes
|
||||||
|
sp.changeText();
|
||||||
sp.setOriginalAbility(original);
|
sp.setOriginalAbility(original);
|
||||||
original.setXManaCostPaid(null);
|
original.setXManaCostPaid(null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import forge.game.GameType;
|
|||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardCollectionView;
|
import forge.game.card.CardCollectionView;
|
||||||
|
import forge.game.card.CardFactory;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
@@ -158,7 +159,7 @@ public class SimulationTest {
|
|||||||
System.out.println("Failed to find token name " + name);
|
System.out.println("Failed to find token name " + name);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return Card.fromPaperCard(token, p, p.getGame());
|
return CardFactory.getCard(token, p, p.getGame());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<Card> addTokens(String name, int amount, Player p) {
|
protected List<Card> addTokens(String name, int amount, Player p) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:2 W
|
|||||||
Types:Creature Human Soldier
|
Types:Creature Human Soldier
|
||||||
PT:3/1
|
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.
|
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: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
|
SVar:MustBeBlocked:True
|
||||||
Oracle:Whenever Ignoble Soldier becomes blocked, prevent all combat damage that would be dealt by it this turn.
|
Oracle:Whenever Ignoble Soldier becomes blocked, prevent all combat damage that would be dealt by it this turn.
|
||||||
|
|||||||
Reference in New Issue
Block a user