From 8ef49b6c61b4f3bdda2d3d3a0b42244f4ccdd6d7 Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 14:04:07 +0000 Subject: [PATCH] add AbilityFactory_Turns. Currently, this houses AddTurn, but could hold anything related to turn/phase? structure. --- .gitattributes | 1 + src/forge/AbilityFactory.java | 9 ++ src/forge/AbilityFactory_Turns.java | 207 ++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 src/forge/AbilityFactory_Turns.java diff --git a/.gitattributes b/.gitattributes index 9702111c841..1ab7c6b39de 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6161,6 +6161,7 @@ src/forge/AbilityFactory_Pump.java -text svneol=native#text/plain src/forge/AbilityFactory_Regenerate.java -text svneol=native#text/plain src/forge/AbilityFactory_Sacrifice.java -text svneol=native#text/plain src/forge/AbilityFactory_Token.java -text svneol=native#text/plain +src/forge/AbilityFactory_Turns.java -text svneol=native#text/plain src/forge/AbilityFactory_ZoneAffecting.java -text svneol=native#text/plain src/forge/Ability_Activated.java svneol=native#text/plain src/forge/Ability_Cost.java -text svneol=native#text/plain diff --git a/src/forge/AbilityFactory.java b/src/forge/AbilityFactory.java index 5a8632445df..9eef6684157 100644 --- a/src/forge/AbilityFactory.java +++ b/src/forge/AbilityFactory.java @@ -435,6 +435,15 @@ public class AbilityFactory { SA = c.getSpellCounter(this); } + if (API.equals("AddTurn")){ + if (isAb) + SA = AbilityFactory_Turns.createAbilityAddTurn(this); + else if (isSp) + SA = AbilityFactory_Turns.createSpellAddTurn(this); + else if (isDb) + SA = AbilityFactory_Turns.createDrawbackAddTurn(this); + } + if (SA == null) throw new RuntimeException("AbilityFactory : SpellAbility was not created. Did you add the API section?"); diff --git a/src/forge/AbilityFactory_Turns.java b/src/forge/AbilityFactory_Turns.java new file mode 100644 index 00000000000..a1f03c3b41a --- /dev/null +++ b/src/forge/AbilityFactory_Turns.java @@ -0,0 +1,207 @@ +package forge; + +import java.util.ArrayList; +import java.util.HashMap; + +public class AbilityFactory_Turns { + // ************************************************************************* + // ************************* ADD TURN ************************************** + // ************************************************************************* + + 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; + final AbilityFactory af = AF; + final HashMap params = af.getMapParams(); + + @Override + public String getStackDescription(){ + return addTurnStackDescription(af, this); + } + + public boolean canPlay(){ + return super.canPlay(); + } + + public boolean canPlayAI() { + return addTurnCanPlayAI(af, this, params.get("NumTurns")); + } + + @Override + public void resolve() { + int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), this); + addTurnResolve(af, this, amount); + } + + }; + return abAddTurn; + } + + public static SpellAbility createSpellAddTurn(final AbilityFactory AF){ + final SpellAbility spAddTurn = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ + private static final long serialVersionUID = -3921131887560356006L; + final AbilityFactory af = AF; + final HashMap params = af.getMapParams(); + + @Override + public String getStackDescription(){ + return addTurnStackDescription(af, this); + } + + public boolean canPlay(){ + // super takes care of AdditionalCosts + return super.canPlay(); + } + + public boolean canPlayAI() + { + // if X depends on abCost, the AI needs to choose which card he would sacrifice first + // then call xCount with that card to properly calculate the amount + // Or choosing how many to sacrifice + return addTurnCanPlayAI(af, this, params.get("NumTurns")); + } + + @Override + public void resolve() { + int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), this); + addTurnResolve(af, this, amount); + } + + }; + return spAddTurn; + } + + public static SpellAbility createDrawbackAddTurn(final AbilityFactory AF){ + final SpellAbility dbAddTurn = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ + private static final long serialVersionUID = -562517287448810951L; + final AbilityFactory af = AF; + final HashMap params = af.getMapParams(); + + @Override + public String getStackDescription(){ + return addTurnStackDescription(af, this); + } + + public boolean canPlayAI() { + return addTurnCanPlayAI(af, this, params.get("NumTurns")); + } + + @Override + public void resolve() { + int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), this); + addTurnResolve(af, this, amount); + } + + @Override + public boolean chkAI_Drawback() { + return true; + } + + }; + return dbAddTurn; + } + + private static String addTurnStackDescription(AbilityFactory af, SpellAbility sa){ + StringBuilder sb = new StringBuilder(); + int numTurns = AbilityFactory.calculateAmount(af.getHostCard(), af.getMapParams().get("NumTurns"), sa); + + if (!(sa instanceof Ability_Sub)) + sb.append(sa.getSourceCard().getName()).append(" - "); + else + sb.append(" "); + + ArrayList tgtPlayers; + + Target tgt = af.getAbTgt(); + if (tgt != null) + tgtPlayers = tgt.getTargetPlayers(); + else + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().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(); + } + + private static boolean addTurnCanPlayAI(final AbilityFactory af, final SpellAbility sa, final String amountStr){ + Ability_Cost abCost = sa.getPayCosts(); + int life = AllZone.ComputerPlayer.getLife(); + + if (abCost != null){ + // AI currently disabled for these costs + if (abCost.getSacCost()){ + if (amountStr.contains("X")) + return false; + if (life > 4) + return false; + } + if (abCost.getLifeCost() && life > 50) return false; + if (abCost.getDiscardCost() && life > 50) return false; + } + + if (!ComputerUtil.canPayCost(sa)) + return false; + else { + Target tgt = sa.getTarget(); + + if (sa.getTarget() != null){ + tgt.resetTargets(); + sa.getTarget().addTarget(AllZone.ComputerPlayer); + } + return true; + } + } + + private static void addTurnResolve(final AbilityFactory af, final SpellAbility sa, int numTurns){ + HashMap params = af.getMapParams(); + Card card = af.getHostCard(); + + ArrayList tgtPlayers; + + Target tgt = af.getAbTgt(); + if (tgt != null) + tgtPlayers = tgt.getTargetPlayers(); + else + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); + + for(Player p : tgtPlayers) { + if (tgt == null || p.canTarget(af.getHostCard())) { + for(int i = 0; i < numTurns; i++) { + AllZone.Phase.addExtraTurn(p); + } + } + } + + + if (af.hasSubAbility()){ + Ability_Sub abSub = sa.getSubAbility(); + if (abSub != null){ + abSub.resolve(); + } + else{ + String DrawBack = params.get("SubAbility"); + if (af.hasSubAbility()) + CardFactoryUtil.doDrawBack(DrawBack, numTurns, card.getController(), card.getController().getOpponent(), tgtPlayers.get(0), card, null, sa); + } + } + } + +}