[Simulated AI] Fix copying tokens with abilities, like Eldrazi Scions.

Also fixes a bug in the main game code where if you have Clone try to copy a token with abilities, like an Eldrazi Scion, it would previously not get those abilities.

Adds a test for the game simulation/copy case.
This commit is contained in:
Myrd
2016-12-27 04:09:18 +00:00
parent 5f634730ff
commit 77a526b6d9
3 changed files with 42 additions and 1 deletions

View File

@@ -197,7 +197,10 @@ public class GameCopier {
private Card createCardCopy(Game newGame, Player newOwner, Card c) {
if (c.isToken() && !c.isEmblem()) {
String tokenStr = new CardFactory.TokenInfo(c).toString();
return CardFactory.makeOneToken(CardFactory.TokenInfo.fromString(tokenStr), newOwner);
Card result = CardFactory.makeOneToken(CardFactory.TokenInfo.fromString(tokenStr), newOwner);
CardFactory.copyCopiableCharacteristics(c, result);
CardFactory.copyCopiableAbilities(c, result);
return result;
}
if (USE_FROM_PAPER_CARD && !c.isEmblem()) {
return Card.fromPaperCard(c.getPaperCard(), newOwner);

View File

@@ -291,6 +291,8 @@ public class TokenEffect extends SpellAbilityEffect {
final String actualAbility = AbilityUtils.getSVar(root, s);
for (final Card c : tokens) {
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c);
// Set intrinsic, so that effects like Clone will copy these.
grantedAbility.setIntrinsic(true);
c.addSpellAbility(grantedAbility);
}
}

View File

@@ -623,4 +623,40 @@ public class GameSimulatorTest extends TestCase {
assertEquals(1, berserker2.getNetToughness());
assertFalse(berserker2.isSick());
}
public void testTokenAbilities() {
Game game = initAndCreateGame();
Player p = game.getPlayers().get(1);
addCard("Forest", p);
addCard("Forest", p);
addCard("Forest", p);
Card callTheScionsCard = addCardToZone("Call the Scions", p, ZoneType.Hand);
game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p);
SpellAbility callTheScionsSA = callTheScionsCard.getSpellAbilities().get(0);
GameSimulator sim = createSimulator(game, p);
int score = sim.simulateSpellAbility(callTheScionsSA).value;
assertTrue(score > 0);
Game simGame = sim.getSimulatedGameState();
Card scion = findCardWithName(simGame, "Eldrazi Scion");
assertNotNull(scion);
assertEquals(1, scion.getNetPower());
assertEquals(1, scion.getNetToughness());
assertTrue(scion.isSick());
assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C} to your mana pool."));
GameCopier copier = new GameCopier(simGame);
Game copy = copier.makeCopy();
Card scionCopy = findCardWithName(copy, "Eldrazi Scion");
assertNotNull(scionCopy);
assertEquals(1, scionCopy.getNetPower());
assertEquals(1, scionCopy.getNetToughness());
assertTrue(scionCopy.isSick());
System.err.println("Search continues on: " + scionCopy);
assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C} to your mana pool."));
}
}