Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions forge-gui-desktop/src/test/java/forge/ai/ability/PumpAiTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package forge.ai.ability;

import forge.ai.AITest;
import forge.ai.AiPlayDecision;
import forge.ai.SpellAbilityAi;
import forge.ai.SpellApiToAi;
import forge.game.Game;
import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;

public class PumpAiTest extends AITest {
@Test
public void testCounterBoonWrapperTargetsOwnCommander() {
Game game = initAndCreateGame();
Player ai = game.getPlayers().get(1);
Player opponent = game.getPlayers().get(0);
ai.setTeam(0);
opponent.setTeam(1);

Card forge = addCard("Forge of Heroes", ai);
Card aiCommander = addCard("Elvish Mystic", ai);
Card opponentCommander = addCard("Emrakul, the Aeons Torn", opponent);
aiCommander.setCommander(true);
opponentCommander.setCommander(true);

game.getPhaseHandler().devModeSet(PhaseType.MAIN2, ai);
game.getAction().checkStateEffects(true);

SpellAbility forgeSa = findSAWithPrefix(forge, "{T}: Choose target commander");
AssertJUnit.assertNotNull(forgeSa);
forgeSa.setActivatingPlayer(ai);
AssertJUnit.assertNotNull("Forge of Heroes should have counter sub-abilities", forgeSa.getSubAbility());
AssertJUnit.assertEquals("P1P1", forgeSa.getSubAbility().getParam("CounterType"));
AssertJUnit.assertEquals("ParentTarget", forgeSa.getSubAbility().getParam("Defined"));
AssertJUnit.assertTrue("AI commander should be a legal Forge of Heroes target", forgeSa.canTarget(aiCommander));
AssertJUnit.assertTrue("Opponent commander should be a legal Forge of Heroes target", forgeSa.canTarget(opponentCommander));

SpellAbilityAi pumpAi = SpellApiToAi.Converter.get(ApiType.Pump);
AiPlayDecision decision = pumpAi.canPlayWithSubs(ai, forgeSa).decision();

AssertJUnit.assertEquals("AI should activate Forge of Heroes for its own commander",
AiPlayDecision.WillPlay, decision);
AssertJUnit.assertEquals("AI should not put a beneficial commander counter on an opponent's commander",
aiCommander, forgeSa.getTargetCard());
}

@Test
public void testForgeOfHeroesDoesNotTargetOpponentCommander() {
Game game = initAndCreateGame();
Player ai = game.getPlayers().get(1);
Player opponent = game.getPlayers().get(0);
ai.setTeam(0);
opponent.setTeam(1);

Card forge = addCard("Forge of Heroes", ai);
Card opponentCommander = addCard("Emrakul, the Aeons Torn", opponent);
opponentCommander.setCommander(true);

game.getPhaseHandler().devModeSet(PhaseType.MAIN2, ai);
game.getAction().checkStateEffects(true);

SpellAbility forgeSa = findSAWithPrefix(forge, "{T}: Choose target commander");
AssertJUnit.assertNotNull(forgeSa);
forgeSa.setActivatingPlayer(ai);
AssertJUnit.assertTrue("Opponent commander should be a legal Forge of Heroes target",
forgeSa.canTarget(opponentCommander));

SpellAbilityAi pumpAi = SpellApiToAi.Converter.get(ApiType.Pump);
AiPlayDecision decision = pumpAi.canPlayWithSubs(ai, forgeSa).decision();

AssertJUnit.assertFalse("AI should not activate Forge of Heroes only to benefit an opponent's commander",
AiPlayDecision.WillPlay.equals(decision));
AssertJUnit.assertNull("AI should leave Forge of Heroes untargeted when only opponent commanders are valid",
forgeSa.getTargetCard());
}
}
2 changes: 1 addition & 1 deletion forge-gui/res/cardsfolder/f/forge_of_heroes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Name:Forge of Heroes
ManaCost:no cost
Types:Land
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
A:AB$ Pump | Cost$ T | ValidTgts$ Card.IsCommander+ThisTurnEntered | TgtPrompt$ Select target commander that entered this turn | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Choose target commander that entered this turn. Put a +1/+1 counter on it if it's a creature and a loyalty counter on it if it's a planeswalker.
A:AB$ Pump | Cost$ T | ValidTgts$ Card.IsCommander+ThisTurnEntered | AILogic$ AnyPhase | AITgts$ Card.YourTeamCtrl | TgtPrompt$ Select target commander that entered this turn | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Choose target commander that entered this turn. Put a +1/+1 counter on it if it's a creature and a loyalty counter on it if it's a planeswalker.
SVar:DBPutCounter:DB$ PutCounter | Defined$ ParentTarget | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ ParentTarget | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBPutCounterCommander
SVar:DBPutCounterCommander:DB$ PutCounter | Defined$ ParentTarget | CounterType$ LOYALTY | CounterNum$ 1 | ConditionDefined$ ParentTarget | ConditionPresent$ Planeswalker | ConditionCompare$ GE1
Oracle:{T}: Add {C}.\n{T}: Choose target commander that entered this turn. Put a +1/+1 counter on it if it's a creature and a loyalty counter on it if it's a planeswalker.