package forge.card.abilityFactory; import forge.AllZone; import forge.ComputerUtil; import forge.Player; import forge.card.spellability.*; import java.util.ArrayList; import java.util.HashMap; /** * <p>AbilityFactory_Turns class.</p> * * @author Forge * @version $Id: $ */ public class AbilityFactory_Turns { // ************************************************************************* // ************************* ADD TURN ************************************** // ************************************************************************* /** * <p>createAbilityAddTurn.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. */ public static SpellAbility createAbilityAddTurn(final AbilityFactory af) { final SpellAbility abAddTurn = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { private static final long serialVersionUID = -3526200766738015688L; @Override public String getStackDescription() { return addTurnStackDescription(af, this); } @Override public boolean canPlayAI() { return addTurnCanPlayAI(af, this); } @Override public void resolve() { addTurnResolve(af, this); } @Override public boolean doTrigger(boolean mandatory) { return addTurnTriggerAI(af, this, mandatory); } }; return abAddTurn; } /** * <p>createSpellAddTurn.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. */ public static SpellAbility createSpellAddTurn(final AbilityFactory af) { final SpellAbility spAddTurn = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { private static final long serialVersionUID = -3921131887560356006L; @Override public String getStackDescription() { return addTurnStackDescription(af, this); } @Override public boolean canPlayAI() { return addTurnCanPlayAI(af, this); } @Override public void resolve() { addTurnResolve(af, this); } }; return spAddTurn; } /** * <p>createDrawbackAddTurn.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. */ public static SpellAbility createDrawbackAddTurn(final AbilityFactory af) { final SpellAbility dbAddTurn = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { private static final long serialVersionUID = -562517287448810951L; @Override public String getStackDescription() { return addTurnStackDescription(af, this); } @Override public void resolve() { addTurnResolve(af, this); } @Override public boolean chkAI_Drawback() { return true; } @Override public boolean doTrigger(boolean mandatory) { return addTurnTriggerAI(af, this, mandatory); } }; return dbAddTurn; } /** * <p>addTurnStackDescription.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a {@link java.lang.String} object. */ private static String addTurnStackDescription(AbilityFactory af, SpellAbility sa) { HashMap<String, String> params = af.getMapParams(); StringBuilder sb = new StringBuilder(); int numTurns = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), sa); if (!(sa instanceof Ability_Sub)) sb.append(sa.getSourceCard()).append(" - "); else sb.append(" "); ArrayList<Player> tgtPlayers; Target tgt = af.getAbTgt(); if (tgt != null) tgtPlayers = tgt.getTargetPlayers(); else tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); for (Player player : tgtPlayers) sb.append(player).append(" "); sb.append("takes "); if (numTurns > 1) { sb.append(numTurns); } else { sb.append("an"); } sb.append(" extra turn"); if (numTurns > 1) sb.append("s"); sb.append(" after this one."); Ability_Sub abSub = sa.getSubAbility(); if (abSub != null) { sb.append(abSub.getStackDescription()); } return sb.toString(); } /** * <p>addTurnCanPlayAI.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ private static boolean addTurnCanPlayAI(final AbilityFactory af, final SpellAbility sa) { return addTurnTriggerAI(af, sa, false); } /** * <p>addTurnTriggerAI.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @param mandatory a boolean. * @return a boolean. */ private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { if (!ComputerUtil.canPayCost(sa)) return false; HashMap<String, String> params = af.getMapParams(); Target tgt = sa.getTarget(); if (sa.getTarget() != null) { tgt.resetTargets(); sa.getTarget().addTarget(AllZone.getComputerPlayer()); } else { ArrayList<Player> tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); for (Player p : tgtPlayers) if (p.isHuman() && !mandatory) return false; // not sure if the AI should be playing with cards that give the Human more turns. } return true; } /** * <p>addTurnResolve.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. */ private static void addTurnResolve(final AbilityFactory af, final SpellAbility sa) { HashMap<String, String> params = af.getMapParams(); int numTurns = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), sa); ArrayList<Player> tgtPlayers; Target tgt = af.getAbTgt(); if (tgt != null) tgtPlayers = tgt.getTargetPlayers(); else tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); for (Player p : tgtPlayers) { if (tgt == null || p.canTarget(af.getHostCard())) { for (int i = 0; i < numTurns; i++) { AllZone.getPhase().addExtraTurn(p); } } } } }//end class AbilityFactory_Turns