package forge.card.abilityFactory; import forge.AllZone; import forge.CombatUtil; import forge.ComputerUtil; import forge.Constant; import forge.card.spellability.Ability_Activated; import forge.card.spellability.Ability_Sub; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; /** * <p>AbilityFactory_Combat class.</p> * * @author Forge * @version $Id: $ */ public class AbilityFactory_Combat { //************************************************************** // ****************************** FOG ************************** //************************************************************** /** * <p>createAbilityFog.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. */ public static SpellAbility createAbilityFog(final AbilityFactory AF) { final SpellAbility abFog = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { private static final long serialVersionUID = -1933592438783630254L; final AbilityFactory af = AF; @Override public String getStackDescription() { // when getStackDesc is called, just build exactly what is happening return fogStackDescription(af, this); } public boolean canPlayAI() { return fogCanPlayAI(af, this); } @Override public void resolve() { fogResolve(af, this); } @Override public boolean doTrigger(boolean mandatory) { return fogDoTriggerAI(af, this, mandatory); } }; return abFog; } /** * <p>createSpellFog.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. */ public static SpellAbility createSpellFog(final AbilityFactory AF) { final SpellAbility spFog = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { private static final long serialVersionUID = -5141246507533353605L; final AbilityFactory af = AF; @Override public String getStackDescription() { // when getStackDesc is called, just build exactly what is happening return fogStackDescription(af, this); } public boolean canPlayAI() { return fogCanPlayAI(af, this); } @Override public void resolve() { fogResolve(af, this); } }; return spFog; } /** * <p>createDrawbackFog.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. */ public static SpellAbility createDrawbackFog(final AbilityFactory AF) { final SpellAbility dbFog = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { private static final long serialVersionUID = -5141246507533353605L; final AbilityFactory af = AF; @Override public void resolve() { fogResolve(af, this); } @Override public boolean chkAI_Drawback() { return fogPlayDrawbackAI(af, this); } @Override public boolean doTrigger(boolean mandatory) { return fogDoTriggerAI(af, this, mandatory); } }; return dbFog; } /** * <p>fogStackDescription.</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. */ public static String fogStackDescription(AbilityFactory af, SpellAbility sa) { StringBuilder sb = new StringBuilder(); if (!(sa instanceof Ability_Sub)) sb.append(sa.getSourceCard().getName()).append(" - "); else sb.append(" "); sb.append(sa.getSourceCard().getController()); sb.append(" prevents all combat damage this turn."); Ability_Sub abSub = sa.getSubAbility(); if (abSub != null) { sb.append(abSub.getStackDescription()); } return sb.toString(); } /** * <p>fogCanPlayAI.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ public static boolean fogCanPlayAI(final AbilityFactory af, SpellAbility sa) { // AI should only activate this during Human's Declare Blockers phase if (AllZone.getPhase().isPlayerTurn(sa.getActivatingPlayer())) return false; if (!AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) return false; // Only cast when Stack is empty, so Human uses spells/abilities first if (AllZone.getStack().size() != 0) return false; // Don't cast it, if the effect is already in place if (AllZone.getGameInfo().isPreventCombatDamageThisTurn()) return false; Ability_Sub subAb = sa.getSubAbility(); if (subAb != null) if (!subAb.chkAI_Drawback()) return false; // Cast it if life is in danger return CombatUtil.lifeInDanger(AllZone.getCombat()); } /** * <p>fogPlayDrawbackAI.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ public static boolean fogPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { // AI should only activate this during Human's turn boolean chance; if (AllZone.getPhase().isPlayerTurn(sa.getActivatingPlayer().getOpponent())) chance = AllZone.getPhase().isBefore(Constant.Phase.Combat_FirstStrikeDamage); else chance = AllZone.getPhase().isAfter(Constant.Phase.Combat_Damage); Ability_Sub subAb = sa.getSubAbility(); if (subAb != null) chance &= subAb.chkAI_Drawback(); return chance; } /** * <p>fogDoTriggerAI.</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. */ public static boolean fogDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory return false; boolean chance; if (AllZone.getPhase().isPlayerTurn(sa.getActivatingPlayer().getOpponent())) chance = AllZone.getPhase().isBefore(Constant.Phase.Combat_FirstStrikeDamage); else chance = AllZone.getPhase().isAfter(Constant.Phase.Combat_Damage); // check SubAbilities DoTrigger? Ability_Sub abSub = sa.getSubAbility(); if (abSub != null) { return chance && abSub.doTrigger(mandatory); } return chance; } /** * <p>fogResolve.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. */ public static void fogResolve(final AbilityFactory af, final SpellAbility sa) { // Expand Fog keyword here depending on what we need out of it. AllZone.getGameInfo().setPreventCombatDamageThisTurn(true); } }