*Added CC-prefix to ExtraActions of spCounter

*Fixed Cancel not having anything in it's TargetingRestriction section.
This commit is contained in:
jendave
2011-08-06 05:48:31 +00:00
parent 59d57940e7
commit 38c00e879c
4 changed files with 382 additions and 365 deletions

View File

@@ -277,6 +277,318 @@ public class CardFactory implements NewConstants {
}
});
}//if "Comes into play tapped."
if(hasKeyword(card,"spCounter") != -1) {
System.out.println("Processing spCounter for card " + card.getName());
ComputerAI_counterSpells2.KeywordedCounterspells.add(card.getName());
String keyword = card.getKeyword().get(hasKeyword(card,"spCounter"));
if(keyword.contains("X"))
{
keyword = keyword.replace("X", card.getSVar("X"));
}
card.removeIntrinsicKeyword(keyword);
String[] splitkeyword = keyword.split(":");
final String TargetType = splitkeyword[1];
final String TargetingRestrictions = splitkeyword[2];
final String Destination = splitkeyword[3];
final String ExtraActions = splitkeyword[4];
final String[] SplitTargetingRestrictions = TargetingRestrictions.split(" ");
final String[] SplitExtraActions = ExtraActions.split(" ");
SpellAbility spCounterAbility = new Spell(card)
{
private static final long serialVersionUID = 9763720166553L;
@Override
public boolean canPlayAI()
{
System.out.println("AI is pondering us...");
return canPlay();
}
@Override
public boolean canPlay()
{
if(AllZone.Stack.size() == 0)
{
return false;
}
boolean fullResult = true;
SpellAbility sa = AllZone.Stack.peek();
Card tgtCard = sa.getSourceCard();
if(TargetType.equals("Spell"))
{
if(sa.isAbility())
{
System.out.println(card.getName() + " can only counter spells, not abilities.");
return false;
}
}
else if(TargetType.equals("Ability"))
{
if(sa.isSpell())
{
System.out.println(card.getName() + " can only counter abilities, not spells.");
return false;
}
}
else if(TargetType.equals("SpellOrAbility"))
{
//Do nothing. This block is only for clarity and enforcing parameters.
}
else
{
throw new IllegalArgumentException("Invalid target type for card " + card.getName());
}
for(int i=0;i<SplitTargetingRestrictions.length;i++)
{
boolean subResult = false;
if(TargetingRestrictions.equals("None"))
{
return true;
}
String RestrictionID = SplitTargetingRestrictions[i].substring(0,SplitTargetingRestrictions[i].indexOf('('));
String Parameters = SplitTargetingRestrictions[i].substring(SplitTargetingRestrictions[i].indexOf('(')+1);
Parameters = Parameters.substring(0,Parameters.length()-1);
String[] SplitParameters = Parameters.split(",");
System.out.println(card.getName() + " currently checking restriction '" + RestrictionID + "'");
if(RestrictionID.equals("Color"))
{
for(int p=0;p<SplitParameters.length;p++)
{
System.out.println("Parameter: " + SplitParameters[p]);
if(SplitParameters[p].startsWith("Non-"))
{
subResult |= !CardUtil.getColors(tgtCard).contains(SplitParameters[p].substring(4).toLowerCase());
}
else
{
subResult |= CardUtil.getColors(tgtCard).contains(SplitParameters[p].toLowerCase());
}
}
}
else if(RestrictionID.equals("Type"))
{
for(int p=0;p<SplitParameters.length;p++)
{
System.out.println("Parameter: " + SplitParameters[p]);
if(SplitParameters[p].startsWith("Non-"))
{
System.out.println(SplitParameters[p].substring(4));
subResult |= !tgtCard.getType().contains(SplitParameters[p].substring(4));
}
else
{
subResult |= tgtCard.getType().contains(SplitParameters[p]);
}
}
}
else if(RestrictionID.equals("CMC"))
{
String mode = SplitParameters[0];
int value = Integer.parseInt(SplitParameters[1]);
System.out.println(mode);
System.out.println(Integer.toString(value));
if(mode.equals("<"))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) < value);
}
else if(mode.equals(">"))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) > value);
}
else if(mode.equals("=="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) == value);
}
else if(mode.equals("!="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) != value);
}
else if(mode.equals("<="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) <= value);
}
else if(mode.equals(">="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) >= value);
}
else
{
throw new IllegalArgumentException("spCounter: Invalid mode parameter to CMC restriction in card " + card.getName());
}
}
else if(RestrictionID.equals("Targets"))
{
for(int p=0;p<SplitParameters.length;p++)
{
System.out.println("Parameter: " + SplitParameters[p]);
if(SplitParameters[p].startsWith("My-")) //Targets my <type> permanent
{
if(sa.getTargetCard().getController() != card.getController())
{
return false;
}
if(SplitParameters[p].contains("Non-"))
{
subResult |= !sa.getTargetCard().getType().contains(SplitParameters[p].substring(7));
}
else
{
subResult |= (sa.getTargetCard().getType().contains(SplitParameters[p].substring(3)));
}
}
else if(SplitParameters[p].startsWith("Opp-")) //Targets opponent's <type> permanent
{
if(sa.getTargetCard().getController() == card.getController())
{
return false;
}
if(SplitParameters[p].contains("Non-"))
{
subResult |= !(sa.getTargetCard().getType().contains(SplitParameters[p].substring(8)));
}
else
{
subResult |= (sa.getTargetCard().getType().contains(SplitParameters[p].substring(4)));
}
}
else
{
if(SplitParameters[p].contains("Non-"))
{
subResult |= !(sa.getTargetCard().getType().contains(SplitParameters[p].substring(4)));
}
else
{
subResult |= (sa.getTargetCard().getType().contains(SplitParameters[p]));
}
}
}
}
System.out.println("Sub: " + Boolean.toString(subResult));
fullResult &= subResult;
} //End Targeting parsing
System.out.println("Success: " + Boolean.toString(fullResult));
return fullResult;
}
@Override
public void resolve()
{
System.out.println("Resolving " + card.getName());
SpellAbility sa = AllZone.Stack.pop();
System.out.println("Send countered spell to " + Destination);
if(Destination.equals("None") || TargetType.contains("Ability")) //For Ability-targeting counterspells
{
}
else if(Destination.equals("Graveyard"))
{
AllZone.GameAction.moveToGraveyard(sa.getSourceCard());
}
else if(Destination.equals("Exile"))
{
AllZone.GameAction.exile(sa.getSourceCard());
}
else if(Destination.equals("Topdeck"))
{
AllZone.GameAction.moveToTopOfLibrary(sa.getSourceCard());
}
else if(Destination.equals("Hand"))
{
AllZone.GameAction.moveToHand(sa.getSourceCard());
}
else if(Destination.equals("BottomDeck"))
{
AllZone.GameAction.moveToBottomOfLibrary(sa.getSourceCard());
}
else if(Destination.equals("Shuffle"))
{
AllZone.GameAction.moveToBottomOfLibrary(sa.getSourceCard());
AllZone.GameAction.shuffle(sa.getSourceCard().getController());
}
else
{
throw new IllegalArgumentException("spCounter: Invalid Destination argument for card " + card.getName());
}
for(int ea = 0;ea<SplitExtraActions.length;ea++)
{
if(ExtraActions.equals("None"))
{
break;
}
String ActionID = SplitExtraActions[ea].substring(0,SplitExtraActions[ea].indexOf('('));
String Target = "";
String ActionParams = SplitExtraActions[ea].substring(SplitExtraActions[ea].indexOf('(')+1);
ActionParams = ActionParams.substring(0,ActionParams.length()-1);
String[] SplitActionParams = ActionParams.split(",");
System.out.println("Extra Action: " + ActionID);
System.out.println("Parameters: " + ActionParams);
if(ActionID.startsWith("My-"))
{
ActionID = ActionID.substring(3);
Target = card.getController();
}
else if(ActionID.startsWith("Opp-"))
{
ActionID = ActionID.substring(4);
Target = AllZone.GameAction.getOpponent(card.getController());
}
else if(ActionID.startsWith("CC-"))
{
ActionID = ActionID.substring(3);
Target = sa.getSourceCard().getController();
}
if(ActionID.equals("Draw"))
{
AllZone.GameAction.drawCards(Target, Integer.parseInt(SplitActionParams[0]));
}
else if(ActionID.equals("Discard"))
{
AllZone.GameAction.discard(Target, Integer.parseInt(SplitActionParams[0]));
}
else if(ActionID.equals("LoseLife"))
{
AllZone.GameAction.getPlayerLife(Target).subtractLife(Integer.parseInt(SplitActionParams[0]), card);
}
else if(ActionID.equals("GainLife"))
{
AllZone.GameAction.getPlayerLife(Target).addLife(Integer.parseInt(SplitActionParams[0]));
}
else
{
throw new IllegalArgumentException("spCounter: Invalid Extra Action for card " + card.getName());
}
}
}
};
card.clearSpellAbility();
card.addSpellAbility(spCounterAbility);
} //spCounter
if (hasKeyword(card, "CARDNAME enters the battlefield tapped unless you control") != -1)
{
int n = hasKeyword(card, "CARDNAME enters the battlefield tapped unless you control");
@@ -23696,313 +24008,6 @@ public class CardFactory implements NewConstants {
card.addChangeControllerCommand(controllerChanges);
} //HandSize
if(hasKeyword(card,"spCounter") != -1) {
System.out.println("Processing spCounter for card " + card.getName());
ComputerAI_counterSpells2.KeywordedCounterspells.add(card.getName());
String keyword = card.getKeyword().get(hasKeyword(card,"spCounter"));
if(keyword.contains("X"))
{
keyword = keyword.replace("X", card.getSVar("X"));
}
card.removeIntrinsicKeyword(keyword);
String[] splitkeyword = keyword.split(":");
final String TargetType = splitkeyword[1];
final String TargetingRestrictions = splitkeyword[2];
final String Destination = splitkeyword[3];
final String ExtraActions = splitkeyword[4];
final String[] SplitTargetingRestrictions = TargetingRestrictions.split(" ");
final String[] SplitExtraActions = ExtraActions.split(" ");
SpellAbility spCounterAbility = new Spell(card)
{
private static final long serialVersionUID = 9763720166553L;
@Override
public boolean canPlayAI()
{
System.out.println("AI is pondering us...");
return canPlay();
}
@Override
public boolean canPlay()
{
if(AllZone.Stack.size() == 0)
{
return false;
}
boolean fullResult = true;
SpellAbility sa = AllZone.Stack.peek();
Card tgtCard = sa.getSourceCard();
if(TargetType.equals("Spell"))
{
if(sa.isAbility())
{
System.out.println(card.getName() + " can only counter spells, not abilities.");
return false;
}
}
else if(TargetType.equals("Ability"))
{
if(sa.isSpell())
{
System.out.println(card.getName() + " can only counter abilities, not spells.");
return false;
}
}
else if(TargetType.equals("SpellOrAbility"))
{
//Do nothing. This block is only for clarity and enforcing parameters.
}
else
{
throw new IllegalArgumentException("Invalid target type for card " + card.getName());
}
for(int i=0;i<SplitTargetingRestrictions.length;i++)
{
boolean subResult = false;
if(TargetingRestrictions.equals("None"))
{
return true;
}
String RestrictionID = SplitTargetingRestrictions[i].substring(0,SplitTargetingRestrictions[i].indexOf('('));
String Parameters = SplitTargetingRestrictions[i].substring(SplitTargetingRestrictions[i].indexOf('(')+1);
Parameters = Parameters.substring(0,Parameters.length()-1);
String[] SplitParameters = Parameters.split(",");
System.out.println(card.getName() + " currently checking restriction '" + RestrictionID + "'");
if(RestrictionID.equals("Color"))
{
for(int p=0;p<SplitParameters.length;p++)
{
System.out.println("Parameter: " + SplitParameters[p]);
if(SplitParameters[p].startsWith("Non-"))
{
subResult |= !CardUtil.getColors(tgtCard).contains(SplitParameters[p].substring(4).toLowerCase());
}
else
{
subResult |= CardUtil.getColors(tgtCard).contains(SplitParameters[p].toLowerCase());
}
}
}
else if(RestrictionID.equals("Type"))
{
for(int p=0;p<SplitParameters.length;p++)
{
System.out.println("Parameter: " + SplitParameters[p]);
if(SplitParameters[p].startsWith("Non-"))
{
System.out.println(SplitParameters[p].substring(4));
subResult |= !tgtCard.getType().contains(SplitParameters[p].substring(4));
}
else
{
subResult |= tgtCard.getType().contains(SplitParameters[p]);
}
}
}
else if(RestrictionID.equals("CMC"))
{
String mode = SplitParameters[0];
int value = Integer.parseInt(SplitParameters[1]);
System.out.println(mode);
System.out.println(Integer.toString(value));
if(mode.equals("<"))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) < value);
}
else if(mode.equals(">"))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) > value);
}
else if(mode.equals("=="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) == value);
}
else if(mode.equals("!="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) != value);
}
else if(mode.equals("<="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) <= value);
}
else if(mode.equals(">="))
{
subResult |= (CardUtil.getConvertedManaCost(tgtCard) >= value);
}
else
{
throw new IllegalArgumentException("spCounter: Invalid mode parameter to CMC restriction in card " + card.getName());
}
}
else if(RestrictionID.equals("Targets"))
{
for(int p=0;p<SplitParameters.length;p++)
{
System.out.println("Parameter: " + SplitParameters[p]);
if(SplitParameters[p].startsWith("My-")) //Targets my <type> permanent
{
if(sa.getTargetCard().getController() != card.getController())
{
return false;
}
if(SplitParameters[p].contains("Non-"))
{
subResult |= !sa.getTargetCard().getType().contains(SplitParameters[p].substring(7));
}
else
{
subResult |= (sa.getTargetCard().getType().contains(SplitParameters[p].substring(3)));
}
}
else if(SplitParameters[p].startsWith("Opp-")) //Targets opponent's <type> permanent
{
if(sa.getTargetCard().getController() == card.getController())
{
return false;
}
if(SplitParameters[p].contains("Non-"))
{
subResult |= !(sa.getTargetCard().getType().contains(SplitParameters[p].substring(8)));
}
else
{
subResult |= (sa.getTargetCard().getType().contains(SplitParameters[p].substring(4)));
}
}
else
{
if(SplitParameters[p].contains("Non-"))
{
subResult |= !(sa.getTargetCard().getType().contains(SplitParameters[p].substring(4)));
}
else
{
subResult |= (sa.getTargetCard().getType().contains(SplitParameters[p]));
}
}
}
}
System.out.println("Sub: " + Boolean.toString(subResult));
fullResult &= subResult;
} //End Targeting parsing
System.out.println("Success: " + Boolean.toString(fullResult));
return fullResult;
}
@Override
public void resolve()
{
System.out.println("Resolving " + card.getName());
SpellAbility sa = AllZone.Stack.pop();
System.out.println("Send countered spell to " + Destination);
if(Destination.equals("None") || TargetType.contains("Ability")) //For Ability-targeting counterspells
{
}
else if(Destination.equals("Graveyard"))
{
AllZone.GameAction.moveToGraveyard(sa.getSourceCard());
}
else if(Destination.equals("Exile"))
{
AllZone.GameAction.exile(sa.getSourceCard());
}
else if(Destination.equals("Topdeck"))
{
AllZone.GameAction.moveToTopOfLibrary(sa.getSourceCard());
}
else if(Destination.equals("Hand"))
{
AllZone.GameAction.moveToHand(sa.getSourceCard());
}
else if(Destination.equals("BottomDeck"))
{
AllZone.GameAction.moveToBottomOfLibrary(sa.getSourceCard());
}
else if(Destination.equals("Shuffle"))
{
AllZone.GameAction.moveToBottomOfLibrary(sa.getSourceCard());
AllZone.GameAction.shuffle(sa.getSourceCard().getController());
}
else
{
throw new IllegalArgumentException("spCounter: Invalid Destination argument for card " + card.getName());
}
for(int ea = 0;ea<SplitExtraActions.length;ea++)
{
if(ExtraActions.equals("None"))
{
break;
}
String ActionID = SplitExtraActions[ea].substring(0,SplitExtraActions[ea].indexOf('('));
String Target = "";
String ActionParams = SplitExtraActions[ea].substring(SplitExtraActions[ea].indexOf('(')+1);
ActionParams = ActionParams.substring(0,ActionParams.length()-1);
String[] SplitActionParams = ActionParams.split(",");
System.out.println("Extra Action: " + ActionID);
System.out.println("Parameters: " + ActionParams);
if(ActionID.startsWith("My-"))
{
ActionID = ActionID.substring(3);
Target = card.getController();
}
else if(ActionID.startsWith("Opp-"))
{
ActionID = ActionID.substring(4);
Target = AllZone.GameAction.getOpponent(card.getController());
}
if(ActionID.equals("Draw"))
{
AllZone.GameAction.drawCards(Target, Integer.parseInt(SplitActionParams[0]));
}
else if(ActionID.equals("Discard"))
{
AllZone.GameAction.discard(Target, Integer.parseInt(SplitActionParams[0]));
}
else if(ActionID.equals("LoseLife"))
{
AllZone.GameAction.getPlayerLife(Target).subtractLife(Integer.parseInt(SplitActionParams[0]), card);
}
else if(ActionID.equals("GainLife"))
{
AllZone.GameAction.getPlayerLife(Target).addLife(Integer.parseInt(SplitActionParams[0]));
}
else
{
throw new IllegalArgumentException("spCounter: Invalid Extra Action for card " + card.getName());
}
}
}
};
card.clearSpellAbility();
card.addSpellAbility(spCounterAbility);
} //spCounter
if (card.getManaCost().contains("X"))
{
SpellAbility sa = card.getSpellAbility()[0];