- Centralized condition check and calling subabilities in AF resolve.

This commit is contained in:
jendave
2011-08-07 01:07:02 +00:00
parent 1d4fb9f9a3
commit 207cb5d9e9
28 changed files with 24 additions and 289 deletions

View File

@@ -701,11 +701,11 @@ public class MagicStack extends MyObservable {
}
});
}
if(sa.getAbilityFactory() != null)
{
if(sa.getAbilityFactory() != null) {
AbilityFactory.handleRemembering(sa.getAbilityFactory());
}
sa.resolve();
AbilityFactory.resolve(sa);
} else
sa.resolve();
} else {
// TODO: Spell fizzles, what's the best way to alert player?
Log.debug(source.getName() + " ability fizzles.");

View File

@@ -1237,12 +1237,13 @@ public class AbilityFactory {
return Card.compare(left, compare, right);
}
/*
public static void resolveSubAbility(SpellAbility sa){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null){
abSub.resolve();
}
}
}*/
public static void handleRemembering(AbilityFactory AF)
{
@@ -1278,4 +1279,18 @@ public class AbilityFactory {
}
}
public static void resolve(SpellAbility sa) {
if (sa == null) return;
AbilityFactory af = sa.getAbilityFactory();
HashMap<String,String> params = af.getMapParams();
//check conditions
if (AbilityFactory.checkConditional(params, sa))
sa.resolve();
//try to resolve subabilities (see null check above)
Ability_Sub abSub = sa.getSubAbility();
resolve(abSub);
}
}//end class AbilityFactory

View File

@@ -278,11 +278,6 @@ public class AbilityFactory_AlterLife {
public static void gainLifeResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa);
ArrayList<Player> tgtPlayers;
@@ -296,8 +291,6 @@ public class AbilityFactory_AlterLife {
for(Player p : tgtPlayers)
if (tgt == null || p.canTarget(af.getHostCard()))
p.gainLife(lifeAmount, sa.getSourceCard());
AbilityFactory.resolveSubAbility(sa);
}
// *************************************************************************
@@ -559,11 +552,6 @@ public class AbilityFactory_AlterLife {
public static void loseLifeResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa);
ArrayList<Player> tgtPlayers;
@@ -578,7 +566,6 @@ public class AbilityFactory_AlterLife {
if (tgt == null || p.canTarget(af.getHostCard()))
p.loseLife(lifeAmount, sa.getSourceCard());
AbilityFactory.resolveSubAbility(sa);
}
// *************************************************************************
@@ -721,12 +708,6 @@ public class AbilityFactory_AlterLife {
}
private static void poisonResolve(final AbilityFactory af, final SpellAbility sa, int num){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
ArrayList<Player> tgtPlayers;
@@ -739,9 +720,6 @@ public class AbilityFactory_AlterLife {
for(Player p : tgtPlayers)
if (tgt == null || p.canTarget(af.getHostCard()))
p.addPoisonCounters(num);
AbilityFactory.resolveSubAbility(sa);
}
private static String poisonStackDescription(AbilityFactory af, SpellAbility sa){
@@ -1072,11 +1050,6 @@ public class AbilityFactory_AlterLife {
private static void setLifeResolve(final AbilityFactory af, final SpellAbility sa) {
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa);
ArrayList<Player> tgtPlayers;
@@ -1089,8 +1062,6 @@ public class AbilityFactory_AlterLife {
for(Player p : tgtPlayers)
if(tgt == null || p.canTarget(af.getHostCard()))
p.setLife(lifeAmount, sa.getSourceCard());
AbilityFactory.resolveSubAbility(sa);
}
}//end class AbilityFactory_AlterLife

View File

@@ -347,14 +347,6 @@ public class AbilityFactory_Animate {
else AllZone.EndOfTurn.addUntil(unanimate);
}
}
if(af.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}
private static long doAnimate(Card c, AbilityFactory af, int power, int toughness, ArrayList<String> types, String colors, ArrayList<String> keywords) {

View File

@@ -186,23 +186,11 @@ public class AbilityFactory_ChangeZone {
HashMap<String,String> params = af.getMapParams();
String origin = params.get("Origin");
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
if (isHidden(origin, params.containsKey("Hidden")) && !params.containsKey("Ninjutsu"))
changeHiddenOriginResolve(af, sa);
else if (isKnown(origin) || params.containsKey("Ninjutsu"))
changeKnownOriginResolve(af, sa);
if (af.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null)
abSub.resolve();
}
}
// *************************************************************************************
@@ -1208,8 +1196,6 @@ public class AbilityFactory_ChangeZone {
}
}
}
AbilityFactory.resolveSubAbility(sa);
}
// **************************** Known Utility **************************************
@@ -1517,8 +1503,6 @@ public class AbilityFactory_ChangeZone {
if (cards.getOwner(AllZone.ComputerPlayer).size() > 0)
AllZone.ComputerPlayer.shuffle();
}
AbilityFactory.resolveSubAbility(sa);
}

View File

@@ -200,13 +200,6 @@ public class AbilityFactory_Choose {
}
}
}
if(af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null) {
abSub.resolve();
}
}
}
// *************************************************************************

View File

@@ -168,11 +168,6 @@ public class AbilityFactory_Clash {
runParams.put("Won","False");
}
//Oldstyle drawbacks shouldn't be necessary anymore?
if(AF.hasSubAbility())
if (SA.getSubAbility() != null)
SA.getSubAbility().resolve();
AllZone.TriggerHandler.runTrigger("Clashed",runParams);
}
@@ -334,10 +329,6 @@ public class AbilityFactory_Clash {
//runParams.put("Won","False");
}
if(af.hasSubAbility() && sa.getSubAbility() != null) {
sa.getSubAbility().resolve();
}
//AllZone.TriggerHandler.runTrigger("FlipsACoin",runParams);
}

View File

@@ -40,7 +40,5 @@ public class AbilityFactory_Cleanup {
if (params.containsKey("ClearRemembered"))
sa.getSourceCard().clearRemembered();
AbilityFactory.resolveSubAbility(sa);
}
}

View File

@@ -171,11 +171,8 @@ public class AbilityFactory_Combat {
}
public static void fogResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
// Expand Fog keyword here depending on what we need out of it.
AllZone.GameInfo.setPreventCombatDamageThisTurn(true);
AbilityFactory.resolveSubAbility(sa);
}
}

View File

@@ -351,13 +351,6 @@ public class AbilityFactory_Copy {
}
}//end canTarget
if(af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}//end foreach Card
}//end resolve
@@ -514,13 +507,6 @@ public class AbilityFactory_Copy {
//end copied from Twincast
}//end canTarget
if(af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}//end foreach SpellAbility
}//end resolve

View File

@@ -273,10 +273,6 @@ public class AbilityFactory_CounterMagic {
}
private void counterResolve(final AbilityFactory af, final SpellAbility sa) {
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
// TODO: Before this resolves we should see if any of our targets are still on the stack
Target tgt = sa.getTarget();
@@ -352,8 +348,6 @@ public class AbilityFactory_CounterMagic {
}
}
}
AbilityFactory.resolveSubAbility(sa);
}//end counterResolve
private void doPowerSink(Player p) {

View File

@@ -483,10 +483,6 @@ public class AbilityFactory_Counters {
public static void putResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
Card card = af.getHostCard();
String type = params.get("CounterType");
@@ -509,8 +505,6 @@ public class AbilityFactory_Counters {
tgtCard.addCounterFromNonEffect(Counters.valueOf(type), counterAmount);
}
}
AbilityFactory.resolveSubAbility(sa);
}
// *******************************************
@@ -761,10 +755,6 @@ public class AbilityFactory_Counters {
public static void removeResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
Card card = af.getHostCard();
String type = params.get("CounterType");
@@ -792,8 +782,6 @@ public class AbilityFactory_Counters {
}
tgtCard.subtractCounter(Counters.valueOf(type), counterAmount);
}
AbilityFactory.resolveSubAbility(sa);
}
// *******************************************
@@ -931,10 +919,6 @@ public class AbilityFactory_Counters {
private static void proliferateResolve(final AbilityFactory AF, SpellAbility sa) {
HashMap<String,String> params = AF.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
CardList hperms = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer);
hperms = hperms.filter(new CardListFilter() {
@@ -1075,8 +1059,6 @@ public class AbilityFactory_Counters {
AllZone.HumanPlayer.addPoisonCounters(1);
} //comp
AbilityFactory.resolveSubAbility(sa);
}
// *******************************************
@@ -1282,11 +1264,7 @@ public class AbilityFactory_Counters {
}
public static void putAllResolve(final AbilityFactory af, final SpellAbility sa) {
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
HashMap<String,String> params = af.getMapParams();
String type = params.get("CounterType");
int counterAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa);
@@ -1307,7 +1285,5 @@ public class AbilityFactory_Counters {
else // adding counters to something like re-suspend cards
tgtCard.addCounterFromNonEffect(Counters.valueOf(type), counterAmount);
}
AbilityFactory.resolveSubAbility(sa);
}
}

View File

@@ -515,10 +515,6 @@ public class AbilityFactory_DealDamage {
private void doResolve(SpellAbility saMe)
{
HashMap<String,String> params = AF.getMapParams();
if (!AbilityFactory.checkConditional(params, saMe)){
AbilityFactory.resolveSubAbility(saMe);
return;
}
int dmg = getNumDamage(saMe);
@@ -556,8 +552,6 @@ public class AbilityFactory_DealDamage {
}
}
}
AbilityFactory.resolveSubAbility(saMe);
}
// ******************************************************************************************************
@@ -857,7 +851,5 @@ public class AbilityFactory_DealDamage {
else {
//anything else to go here?
}
AbilityFactory.resolveSubAbility(sa);
}
}

View File

@@ -88,9 +88,5 @@ public class AbilityFactory_DelayedTrigger {
Trigger delTrig = TriggerHandler.parseTrigger(mapParams,AF.getHostCard());
AllZone.TriggerHandler.registerDelayedTrigger(delTrig);
if(AF.hasSubAbility())
if(SA.getSubAbility() != null)
SA.getSubAbility().resolve();
}
}

View File

@@ -369,11 +369,6 @@ public class AbilityFactory_Destroy {
final boolean noRegen = params.containsKey("NoRegen");
Card card = sa.getSourceCard();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
ArrayList<Card> tgtCards;
@@ -392,8 +387,6 @@ public class AbilityFactory_Destroy {
AllZone.GameAction.destroy(tgtC);
}
}
AbilityFactory.resolveSubAbility(sa);
}
// *********************************************************************************
@@ -605,11 +598,6 @@ public class AbilityFactory_Destroy {
Card card = sa.getSourceCard();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
String Valid = "";
if(params.containsKey("ValidCards"))
@@ -638,7 +626,5 @@ public class AbilityFactory_Destroy {
if (AllZone.GameAction.destroy(list.get(i)) && remDestroyed)
card.addRemembered(list.get(i));
}
AbilityFactory.resolveSubAbility(sa);
}
}

View File

@@ -265,12 +265,5 @@ public class AbilityFactory_Effect {
// TODO: Add targeting to the effect so it knows who it's dealing with
AllZone.GameAction.moveToPlay(eff);
if (af.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null){
abSub.resolve();
}
}
}
}

View File

@@ -1,7 +1,6 @@
package forge.card.abilityFactory;
import java.util.ArrayList;
import java.util.HashMap;
import forge.AllZone;
@@ -164,11 +163,6 @@ public class AbilityFactory_EndGameCondition {
}
public static void winsGameResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
Card card = af.getHostCard();
@@ -176,13 +170,6 @@ public class AbilityFactory_EndGameCondition {
for(Player p : players)
p.altWinConditionMet(card.getName());
if (af.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null){
abSub.resolve();
}
}
}
// ***********************************************************************************************
@@ -364,11 +351,6 @@ public class AbilityFactory_EndGameCondition {
}
public static void losesGameResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
Card card = af.getHostCard();
@@ -383,13 +365,6 @@ public class AbilityFactory_EndGameCondition {
for(Player p : players)
p.altLoseConditionMet(card.getName());
if (af.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null){
abSub.resolve();
}
}
}
}

View File

@@ -294,14 +294,6 @@ public class AbilityFactory_GainControl {
hostCard.addGainControlReleaseCommand(getLoseControlCommand(0));
}//end foreach target
if (AF.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null){
abSub.resolve();
}
// doesn't support old style drawbacks
}
}
private Command getDestroyCommand(final int i) {

View File

@@ -468,11 +468,8 @@ public class AbilityFactory_Mana {
public static void doDrawback(AbilityFactory af, Ability_Mana abMana, Card card){
// if mana production has any type of SubAbility, undoable=false
if (af.hasSubAbility()){
if (af.hasSubAbility())
abMana.setUndoable(false);
Ability_Sub abSub = abMana.getSubAbility();
abSub.resolve();
}
}
private static boolean hasUrzaLands(Player p){

View File

@@ -384,8 +384,6 @@ public class AbilityFactory_PermanentState {
tgtC.untap();
}
}
AbilityFactory.resolveSubAbility(sa);
}
public static void chooseUntapUpTo(AbilityFactory af, SpellAbility sa, HashMap<String,String> params){
@@ -772,8 +770,6 @@ public class AbilityFactory_PermanentState {
if (AllZoneUtil.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(af.getHostCard(), tgtC)))
tgtC.tap();
}
AbilityFactory.resolveSubAbility(sa);
}
// ****************************************
@@ -876,8 +872,6 @@ public class AbilityFactory_PermanentState {
list = list.getValidCards(Valid.split(","), card.getController(), card);
for(int i = 0; i < list.size(); i++) list.get(i).untap();
AbilityFactory.resolveSubAbility(sa);
}
private static boolean untapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
@@ -1017,8 +1011,6 @@ public class AbilityFactory_PermanentState {
list = list.getValidCards(Valid.split(","), card.getController(), card);
for(int i = 0; i < list.size(); i++) list.get(i).tap();
AbilityFactory.resolveSubAbility(sa);
}
private static boolean tapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
@@ -1368,8 +1360,6 @@ public class AbilityFactory_PermanentState {
else tgtC.untap();
}
}
AbilityFactory.resolveSubAbility(sa);
}
//Phasing? Something else? Who knows!

View File

@@ -313,12 +313,5 @@ public class AbilityFactory_PreventDamage {
}
}
}
if (af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}//doResolve
}

View File

@@ -694,9 +694,6 @@ public class AbilityFactory_Pump {
else AllZone.EndOfTurn.addUntil(untilEOT);
}
}
AbilityFactory.resolveSubAbility(sa);
}
@@ -893,9 +890,7 @@ public class AbilityFactory_Pump {
AllZone.EndOfTurn.addUntil(untilEOT);
}
}
AbilityFactory.resolveSubAbility(sa);
}
}
private boolean pumpAllTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory){

View File

@@ -335,12 +335,5 @@ public class AbilityFactory_Regenerate {
AllZone.EndOfTurn.addUntil(untilEOT);
}
}
if (af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}//doResolve
}

View File

@@ -377,13 +377,6 @@ public class AbilityFactory_Reveal {
}
}//end if canTarget
}//end foreach player
if (af.hasSubAbility()){
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null) {
abSub.resolve();
}
}
}
}//end resolve
@@ -628,15 +621,7 @@ public class AbilityFactory_Reveal {
}
}
}
if(af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}
}
//**********************************************************************
@@ -744,8 +729,6 @@ public class AbilityFactory_Reveal {
p.scry(num);
}
}
AbilityFactory.resolveSubAbility(sa);
}
private static boolean scryTargetAI(AbilityFactory af, SpellAbility sa) {
@@ -1005,7 +988,6 @@ public class AbilityFactory_Reveal {
if (tgt == null || p.canTarget(AF.getHostCard()))
AllZoneUtil.rearrangeTopOfLibrary(AF.getHostCard(), p, numCards, shuffle);
}
AbilityFactory.resolveSubAbility(sa);
}
}//end class AbilityFactory_Reveal

View File

@@ -275,11 +275,6 @@ public class AbilityFactory_Sacrifice {
HashMap<String,String> params = af.getMapParams();
Card card = sa.getSourceCard();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
// Expand Sacrifice keyword here depending on what we need out of it.
String num = params.containsKey("Amount") ? params.get("Amount") : "1";
int amount = AbilityFactory.calculateAmount(card, num, sa);
@@ -327,8 +322,6 @@ public class AbilityFactory_Sacrifice {
sacrificeHuman(p, amount, valid, sa, msg);
}
}
AbilityFactory.resolveSubAbility(sa);
}

View File

@@ -452,7 +452,5 @@ public class AbilityFactory_Token extends AbilityFactory {
}
}
}
AbilityFactory.resolveSubAbility(sa);
}
}

View File

@@ -180,13 +180,6 @@ public class AbilityFactory_Turns {
}
}
}
if(af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) {
abSub.resolve();
}
}
}
}//end class AbilityFactory_Turns

View File

@@ -341,10 +341,6 @@ public class AbilityFactory_ZoneAffecting {
public static void drawResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
Card source = sa.getSourceCard();
int numCards = 1;
@@ -392,8 +388,6 @@ public class AbilityFactory_ZoneAffecting {
p.drawCards(numCards);
}
AbilityFactory.resolveSubAbility(sa);
}
//**********************************************************************
@@ -668,11 +662,6 @@ public class AbilityFactory_ZoneAffecting {
public static void millResolve(final AbilityFactory af, final SpellAbility sa){
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa);
@@ -691,8 +680,6 @@ public class AbilityFactory_ZoneAffecting {
for(Player p : tgtPlayers)
if (tgt == null || p.canTarget(af.getHostCard()))
p.mill(numCards, destination);
AbilityFactory.resolveSubAbility(sa);
}
//////////////////////
@@ -804,11 +791,6 @@ public class AbilityFactory_ZoneAffecting {
private static void discardResolve(final AbilityFactory af, final SpellAbility sa){
Card source = sa.getSourceCard();
HashMap<String,String> params = af.getMapParams();
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
String mode = params.get("Mode");
@@ -932,8 +914,6 @@ public class AbilityFactory_ZoneAffecting {
}
}
}
AbilityFactory.resolveSubAbility(sa);
}
private static String discardStackDescription(AbilityFactory af, SpellAbility sa){
@@ -1312,11 +1292,6 @@ public class AbilityFactory_ZoneAffecting {
Card host = af.getHostCard();
HashMap<String,String> params = af.getMapParams();
boolean optional = params.containsKey("Optional");
if (!AbilityFactory.checkConditional(params, sa)){
AbilityFactory.resolveSubAbility(sa);
return;
}
ArrayList<Player> tgtPlayers;
@@ -1336,11 +1311,6 @@ public class AbilityFactory_ZoneAffecting {
}
}
}
if(af.hasSubAbility()) {
Ability_Sub abSub = sa.getSubAbility();
if(abSub != null) abSub.resolve();
}
}
}//end class AbilityFactory_ZoneAffecting