package forge.card.abilityFactory; import forge.AllZone; import forge.Card; import forge.GameActionUtil; import forge.Player; import forge.card.spellability.Ability_Activated; import forge.card.spellability.Ability_Sub; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; import java.util.ArrayList; import java.util.HashMap; /** * <p>AbilityFactory_Clash class.</p> * * @author Forge * @version $Id: $ */ public class AbilityFactory_Clash { /** * <p>getAbilityClash.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. * @since 1.0.15 */ public static SpellAbility getAbilityClash(final AbilityFactory AF) { final SpellAbility abClash = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { private static final long serialVersionUID = -8019637116128196248L; @Override public boolean canPlayAI() { return true; } @Override public boolean canPlay() { return true; } @Override public boolean doTrigger(boolean mandatory) { return true; } @Override public String getStackDescription() { return AF.getHostCard().getName() + " - Clash with an opponent."; } @Override public void resolve() { clashResolve(AF, this); } }; return abClash; } /** * <p>getSpellClash.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. * @since 1.0.15 */ public static SpellAbility getSpellClash(final AbilityFactory AF) { final SpellAbility spClash = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { private static final long serialVersionUID = -4991665176268317172L; @Override public boolean canPlayAI() { return true; } @Override public boolean canPlay() { return true; } @Override public boolean doTrigger(boolean mandatory) { return true; } @Override public String getStackDescription() { return AF.getHostCard().getName() + " - Clash with an opponent."; } @Override public void resolve() { clashResolve(AF, this); } }; return spClash; } /** * <p>getDrawbackClash.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. * @since 1.0.15 */ public static SpellAbility getDrawbackClash(final AbilityFactory AF) { final SpellAbility dbClash = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { private static final long serialVersionUID = -3850086157052881360L; @Override public boolean canPlayAI() { return true; } @Override public boolean canPlay() { return true; } @Override public boolean chkAI_Drawback() { return true; } @Override public boolean doTrigger(boolean mandatory) { return true; } @Override public String getStackDescription() { return AF.getHostCard().getName() + " - Clash with an opponent."; } @Override public void resolve() { clashResolve(AF, this); } }; return dbClash; } /** * <p>clashResolve.</p> * * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. * @param SA a {@link forge.card.spellability.SpellAbility} object. */ private static void clashResolve(final AbilityFactory AF, final SpellAbility SA) { AbilityFactory AF_Outcomes = new AbilityFactory(); boolean victory = AF.getHostCard().getController().clashWithOpponent(AF.getHostCard()); //Run triggers HashMap<String, Object> runParams = new HashMap<String, Object>(); runParams.put("Player", AF.getHostCard().getController()); if (victory) { if (AF.getMapParams().containsKey("WinSubAbility")) { SpellAbility win = AF_Outcomes.getAbility(AF.getHostCard().getSVar(AF.getMapParams().get("WinSubAbility")), AF.getHostCard()); win.setActivatingPlayer(AF.getHostCard().getController()); ((Ability_Sub) win).setParent(SA); AbilityFactory.resolve(win, false); } runParams.put("Won", "True"); } else { if (AF.getMapParams().containsKey("OtherwiseSubAbility")) { SpellAbility otherwise = AF_Outcomes.getAbility(AF.getHostCard().getSVar(AF.getMapParams().get("OtherwiseSubAbility")), AF.getHostCard()); otherwise.setActivatingPlayer(AF.getHostCard().getController()); ((Ability_Sub) otherwise).setParent(SA); AbilityFactory.resolve(otherwise, false); } runParams.put("Won", "False"); } AllZone.getTriggerHandler().runTrigger("Clashed", runParams); } // ************************************************************************* // ************************* FlipACoin ************************************* // ************************************************************************* /** * <p>createAbilityFlip.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. * @since 1.0.15 */ public static SpellAbility createAbilityFlip(final AbilityFactory af) { final SpellAbility abFlip = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { private static final long serialVersionUID = -8293336773930687488L; @Override public boolean canPlayAI() { return true; } @Override public boolean doTrigger(boolean mandatory) { return true; } @Override public String getStackDescription() { return flipGetStackDescription(af, this); } @Override public void resolve() { flipResolve(af, this); } }; return abFlip; } /** * <p>createSpellFlip.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. * @since 1.0.15 */ public static SpellAbility createSpellFlip(final AbilityFactory af) { final SpellAbility spFlip = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { private static final long serialVersionUID = -4402144245527547151L; @Override public boolean canPlayAI() { return true; } @Override public boolean canPlay() { return true; } @Override public boolean doTrigger(boolean mandatory) { return true; } @Override public String getStackDescription() { return flipGetStackDescription(af, this); } @Override public void resolve() { flipResolve(af, this); } }; return spFlip; } /** * <p>createDrawbackFlip.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @return a {@link forge.card.spellability.SpellAbility} object. * @since 1.0.15 */ public static SpellAbility createDrawbackFlip(final AbilityFactory af) { final SpellAbility dbFlip = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { private static final long serialVersionUID = 8581978154811461324L; @Override public boolean canPlayAI() { return true; } @Override public boolean canPlay() { return true; } @Override public boolean chkAI_Drawback() { return true; } @Override public boolean doTrigger(boolean mandatory) { return true; } @Override public String getStackDescription() { return flipGetStackDescription(af, this); } @Override public void resolve() { flipResolve(af, this); } }; return dbFlip; } /** * <p>flipGetStackDescription.</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 flipGetStackDescription(AbilityFactory af, SpellAbility sa) { HashMap<String, String> params = af.getMapParams(); Card host = af.getHostCard(); Player player = params.containsKey("OpponentCalls") ? host.getController().getOpponent() : host.getController(); StringBuilder sb = new StringBuilder(); if (!(sa instanceof Ability_Sub)) sb.append(sa.getSourceCard()).append(" - "); else sb.append(" "); sb.append(player).append(" flips a coin."); Ability_Sub abSub = sa.getSubAbility(); if (abSub != null) { sb.append(abSub.getStackDescription()); } return sb.toString(); } /** * <p>flipResolve.</p> * * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. */ private static void flipResolve(final AbilityFactory af, final SpellAbility sa) { HashMap<String, String> params = af.getMapParams(); Card host = af.getHostCard(); Player player = host.getController(); ArrayList<Player> caller = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Caller"), sa); if(caller.size() == 0) caller.add(player); AbilityFactory AF_Outcomes = new AbilityFactory(); boolean victory = GameActionUtil.flipACoin(caller.get(0), sa.getSourceCard()); //Run triggers //HashMap<String,Object> runParams = new HashMap<String,Object>(); //runParams.put("Player", player); if (victory) { if (params.containsKey("WinSubAbility")) { SpellAbility win = AF_Outcomes.getAbility(host.getSVar(params.get("WinSubAbility")), host); win.setActivatingPlayer(player); ((Ability_Sub) win).setParent(sa); AbilityFactory.resolve(win, false); } //runParams.put("Won","True"); } else { if(params.containsKey("LoseSubAbility")) { SpellAbility lose = AF_Outcomes.getAbility(host.getSVar(params.get("LoseSubAbility")), host); lose.setActivatingPlayer(player); ((Ability_Sub)lose).setParent(sa); AbilityFactory.resolve(lose, false); } //runParams.put("Won","False"); } //AllZone.getTriggerHandler().runTrigger("FlipsACoin",runParams); } }//end class AbilityFactory_Clash