- SetInfo Script will now skip .svn file it will also only overwrite data files that it has grabbed Set Info for.

- Pump and Draw can now handle variable Amounts for attack/defense boost or cards drawn.
- Removed Braingeyser from AI Decks until AF_Draw can learn how to play it better. (The Code block was forcing the Human to draw anyway)
- Added Targeted to AF.calculateAmount()
- Added Surge of Strength
This commit is contained in:
jendave
2011-08-06 12:05:02 +00:00
parent 219ce48769
commit f0a074a66e
8 changed files with 89 additions and 128 deletions

1
.gitattributes vendored
View File

@@ -4521,6 +4521,7 @@ res/cardsfolder/sunweb.txt -text svneol=native#text/plain
res/cardsfolder/supreme_exemplar.txt -text svneol=native#text/plain res/cardsfolder/supreme_exemplar.txt -text svneol=native#text/plain
res/cardsfolder/suqata_assassin.txt -text svneol=native#text/plain res/cardsfolder/suqata_assassin.txt -text svneol=native#text/plain
res/cardsfolder/suqata_lancer.txt -text svneol=native#text/plain res/cardsfolder/suqata_lancer.txt -text svneol=native#text/plain
res/cardsfolder/surge_of_strength.txt -text svneol=native#text/plain
res/cardsfolder/surging_aether.txt -text svneol=native#text/plain res/cardsfolder/surging_aether.txt -text svneol=native#text/plain
res/cardsfolder/surging_dementia.txt -text svneol=native#text/plain res/cardsfolder/surging_dementia.txt -text svneol=native#text/plain
res/cardsfolder/surging_flame.txt -text svneol=native#text/plain res/cardsfolder/surging_flame.txt -text svneol=native#text/plain

View File

@@ -4,6 +4,7 @@ Types:Sorcery
Text:no text Text:no text
A:SP$Draw | Cost$ X U U | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player to draw X cards | SpellDescription$ Target player draws X cards. A:SP$Draw | Cost$ X U U | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player to draw X cards | SpellDescription$ Target player draws X cards.
SVar:X:Count$xPaid SVar:X:Count$xPaid
SVar:RemAIDeck:True
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/braingeyser.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/braingeyser.jpg
SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/51.jpg SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/51.jpg

View File

@@ -0,0 +1,11 @@
Name:Surge of Strength
ManaCost:R G
Types:Instant
Text:no text
A:SP$Pump | Cost$ R G Discard<1/Card.Green,Card.Red>| ValidTgts$ Creature | NumAtt$ +X | KW$ Trample | CostDesc$ As an additional cost to cast Surge of Strength, discard a red or green card.\n | SpellDescription$ Target creature gains trample and gets +X/+0 until end of turn, where X is that creature's converted mana cost.
SVar:X:Targeted$CardManaCost
SVar:RemAIDeck:True
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_of_strength.jpg
SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/197.jpg
End

View File

@@ -199,6 +199,9 @@ cardDict = {}
setStr = 'SetInfo:' setStr = 'SetInfo:'
for fileName in os.listdir(folder): for fileName in os.listdir(folder):
if fileName.startswith('.'):
continue
# parse cardsfolder for Card Lines and Rarity/Picture SVars. Filling in any gaps # parse cardsfolder for Card Lines and Rarity/Picture SVars. Filling in any gaps
file = open(folder + '\\' + fileName) file = open(folder + '\\' + fileName)
cleanName = fileName.replace('.txt', '') cleanName = fileName.replace('.txt', '')
@@ -239,14 +242,14 @@ for fileName in os.listdir(folder):
addSets(card) addSets(card)
card.hasSet = True card.hasSet = True
file = open(folder + "/" + fileName, 'w') file = open(folder + "/" + fileName, 'w')
file.write(card.lines) file.write(card.lines)
if card.hasSet: if card.hasSet:
for s in card.sets.values(): for s in card.sets.values():
file.write('SetInfo:'+ s.set + '|' + s.rarity + '|' + s.image + '\n') file.write('SetInfo:'+ s.set + '|' + s.rarity + '|' + s.image + '\n')
file.write('End') file.write('End')
file.close() file.close()
err.write(card.name + '... Updated\n') err.write(card.name + '... Updated\n')
err.close() err.close()

View File

@@ -432,7 +432,8 @@ public class AbilityFactory {
} }
public static int calculateAmount(Card card, String amount, SpellAbility ability){ public static int calculateAmount(Card card, String amount, SpellAbility ability){
if (amount.matches("X")) // amount can be anything, not just 'X' as long as sVar exists
if (!card.getSVar(amount).equals(""))
{ {
String calcX[] = card.getSVar(amount).split("\\$"); String calcX[] = card.getSVar(amount).split("\\$");
if (calcX.length == 1 || calcX[1].equals("none")) if (calcX.length == 1 || calcX[1].equals("none"))
@@ -450,6 +451,11 @@ public class AbilityFactory {
{ {
return CardFactoryUtil.handlePaid(ability.getDiscardedCost(), calcX[1]); return CardFactoryUtil.handlePaid(ability.getDiscardedCost(), calcX[1]);
} }
else if (ability != null && calcX[0].startsWith("Targeted"))
{
CardList list = new CardList(ability.getTarget().getTargetCards().toArray());
return CardFactoryUtil.handlePaid(list, calcX[1]);
}
else else
return 0; return 0;
} }

View File

@@ -6,12 +6,11 @@ import java.util.Random;
public class AbilityFactory_Pump { public class AbilityFactory_Pump {
private final int NumAttack[] = {-1138};
private final int NumDefense[] = {-1138};
private final String AttackX[] = {"none"};
private final String DefenseX[] = {"none"};
private final ArrayList<String> Keywords = new ArrayList<String>(); private final ArrayList<String> Keywords = new ArrayList<String>();
private String numAttack;
private String numDefense;
private AbilityFactory AF = null; private AbilityFactory AF = null;
private HashMap<String,String> params = null; private HashMap<String,String> params = null;
private Card hostCard = null; private Card hostCard = null;
@@ -23,55 +22,15 @@ public class AbilityFactory_Pump {
hostCard = AF.getHostCard(); hostCard = AF.getHostCard();
if (params.containsKey("NumAtt")) numAttack = (params.containsKey("NumAtt")) ? params.get("NumAtt") : "0";
{ numDefense = (params.containsKey("NumDef")) ? params.get("NumDef") : "0";
String tmp = params.get("NumAtt");
if(tmp.matches("[\\+\\-][XY]"))
{
String xy = hostCard.getSVar(tmp.replaceAll("[\\+\\-]", ""));
if(xy.startsWith("Count$")) {
String kk[] = xy.split("\\$");
AttackX[0] = kk[1];
if(tmp.contains("-"))
{
if(AttackX[0].contains("/"))
AttackX[0] = AttackX[0].replace("/", "/Negative");
else
AttackX[0] += "/Negative";
}
}
}
else if(tmp.matches("[\\+\\-][0-9]"))
NumAttack[0] = Integer.parseInt(tmp.replace("+", ""));
}
if (params.containsKey("NumDef")) // Start with + sign now optional
{ if (numAttack.startsWith("+"))
String tmp = params.get("NumDef"); numAttack = numAttack.substring(1);
if(tmp.matches("[\\+\\-][XY]")) if (numDefense.startsWith("+"))
{ numDefense = numDefense.substring(1);
String xy = hostCard.getSVar(tmp.replaceAll("[\\+\\-]", ""));
if(xy.startsWith("Count$")) {
String kk[] = xy.split("\\$");
DefenseX[0] = kk[1];
if(tmp.contains("-"))
{
if(DefenseX[0].contains("/"))
DefenseX[0] = DefenseX[0].replace("/", "/Negative");
else
DefenseX[0] += "/Negative";
}
}
}
else if(tmp.matches("[\\+\\-][0-9]"))
NumDefense[0] = Integer.parseInt(tmp.replace("+", ""));
}
Keywords.add("none");
if (params.containsKey("KW")) if (params.containsKey("KW"))
{ {
String tmp = params.get("KW"); String tmp = params.get("KW");
@@ -81,6 +40,8 @@ public class AbilityFactory_Pump {
for (int i=0; i<kk.length; i++) for (int i=0; i<kk.length; i++)
Keywords.add(kk[i]); Keywords.add(kk[i]);
} }
else
Keywords.add("none");
} }
public SpellAbility getSpell() public SpellAbility getSpell()
@@ -137,7 +98,7 @@ public class AbilityFactory_Pump {
if (!ComputerUtil.canPayCost(this)) if (!ComputerUtil.canPayCost(this))
return false; return false;
int defense = getNumDefense(); int defense = getNumDefense(this);
if(AllZone.Phase.getPhase().equals(Constant.Phase.Main2)) return false; if(AllZone.Phase.getPhase().equals(Constant.Phase.Main2)) return false;
@@ -189,24 +150,12 @@ public class AbilityFactory_Pump {
return abPump; return abPump;
} }
private int getNumAttack() { private int getNumAttack(SpellAbility sa) {
if(NumAttack[0] != -1138) return AbilityFactory.calculateAmount(hostCard, numAttack, sa);
return NumAttack[0];
if(!AttackX[0].equals("none"))
return CardFactoryUtil.xCount(hostCard, AttackX[0]);
return 0;
} }
private int getNumDefense() { private int getNumDefense(SpellAbility sa) {
if(NumDefense[0] != -1138) return AbilityFactory.calculateAmount(hostCard, numDefense, sa);
return NumDefense[0];
if(!DefenseX[0].equals("none"))
return CardFactoryUtil.xCount(hostCard, DefenseX[0]);
return 0;
} }
private CardList getPumpCreatures() { private CardList getPumpCreatures() {
@@ -239,9 +188,9 @@ public class AbilityFactory_Pump {
return list; return list;
} }
private CardList getCurseCreatures() private CardList getCurseCreatures(SpellAbility sa)
{ {
final int defense = getNumDefense(); final int defense = getNumDefense(sa);
CardList list = new CardList(AllZone.Human_Play.getCards()); CardList list = new CardList(AllZone.Human_Play.getCards());
list = list.filter(new CardListFilter() { list = list.filter(new CardListFilter() {
@@ -280,7 +229,7 @@ public class AbilityFactory_Pump {
private boolean doTgtAI(SpellAbility sa) private boolean doTgtAI(SpellAbility sa)
{ {
int defense = getNumDefense(); int defense = getNumDefense(sa);
String curPhase = AllZone.Phase.getPhase(); String curPhase = AllZone.Phase.getPhase();
if(curPhase.equals(Constant.Phase.Main2) && !(AF.isCurse() && defense < 0)) if(curPhase.equals(Constant.Phase.Main2) && !(AF.isCurse() && defense < 0))
@@ -289,7 +238,7 @@ public class AbilityFactory_Pump {
Target tgt = AF.getAbTgt(); Target tgt = AF.getAbTgt();
CardList list; CardList list;
if (AF.isCurse()) // Curse means spells with negative effect if (AF.isCurse()) // Curse means spells with negative effect
list = getCurseCreatures(); list = getCurseCreatures(sa);
else else
list = getPumpCreatures(); list = getPumpCreatures();
@@ -340,7 +289,7 @@ public class AbilityFactory_Pump {
} }
} }
return false; return true;
} }
@@ -363,8 +312,8 @@ public class AbilityFactory_Pump {
sb.append(c.getName()); sb.append(c.getName());
sb.append(" "); sb.append(" ");
} }
final int atk = getNumAttack(); final int atk = getNumAttack(sa);
final int def = getNumDefense(); final int def = getNumDefense(sa);
sb.append("gains "); sb.append("gains ");
if (atk != 0 || def != 0){ if (atk != 0 || def != 0){
@@ -388,6 +337,14 @@ public class AbilityFactory_Pump {
} }
sb.append("until end of turn."); sb.append("until end of turn.");
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null) {
abSub.setParent(sa);
sb.append(abSub.getStackDescription());
}
return sb.toString(); return sb.toString();
} }
@@ -414,8 +371,8 @@ public class AbilityFactory_Pump {
if (tgt != null && !CardFactoryUtil.canTarget(AF.getHostCard(), tgtC)) if (tgt != null && !CardFactoryUtil.canTarget(AF.getHostCard(), tgtC))
continue; continue;
final int a = getNumAttack(); final int a = getNumAttack(sa);
final int d = getNumDefense(); final int d = getNumDefense(sa);
final Command untilEOT = new Command() { final Command untilEOT = new Command() {
private static final long serialVersionUID = -42244224L; private static final long serialVersionUID = -42244224L;
@@ -453,12 +410,22 @@ public class AbilityFactory_Pump {
} }
Card first = tgtCards.get(0);
if(AF.hasSubAbility())
CardFactoryUtil.doDrawBack(params.get("SubAbility"), 0, if (AF.hasSubAbility()){
hostCard.getController(), hostCard.getController().getOpponent(), Ability_Sub abSub = sa.getSubAbility();
first.getController(), hostCard, first, sa); if (abSub != null){
if (abSub.getParent() == null)
abSub.setParent(sa);
abSub.resolve();
}
else{
Card first = tgtCards.get(0);
CardFactoryUtil.doDrawBack(params.get("SubAbility"), 0,
hostCard.getController(), hostCard.getController().getOpponent(),
first.getController(), hostCard, first, sa);
}
}
} }
} }

View File

@@ -86,7 +86,7 @@ public class AbilityFactory_ZoneAffecting {
@Override @Override
public boolean chkAI_Drawback() { public boolean chkAI_Drawback() {
return drawTargetAI(af); return drawTargetAI(af, this);
} }
}; };
@@ -104,7 +104,7 @@ public class AbilityFactory_ZoneAffecting {
sb.append(player.toString()); sb.append(player.toString());
sb.append(" draws ("); sb.append(" draws (");
sb.append(af.getMapParams().get("NumCards")); sb.append(AbilityFactory.calculateAmount(sa.getSourceCard(), af.getMapParams().get("NumCards"), sa));
sb.append(")."); sb.append(").");
Ability_Sub abSub = sa.getSubAbility(); Ability_Sub abSub = sa.getSubAbility();
@@ -142,7 +142,7 @@ public class AbilityFactory_ZoneAffecting {
} }
boolean bFlag = drawTargetAI(af); boolean bFlag = drawTargetAI(af, sa);
if (!bFlag) if (!bFlag)
return false; return false;
@@ -164,7 +164,7 @@ public class AbilityFactory_ZoneAffecting {
return randomReturn; return randomReturn;
} }
public static boolean drawTargetAI(AbilityFactory af) { public static boolean drawTargetAI(AbilityFactory af, SpellAbility sa) {
Target tgt = af.getAbTgt(); Target tgt = af.getAbTgt();
HashMap<String,String> params = af.getMapParams(); HashMap<String,String> params = af.getMapParams();
@@ -173,10 +173,11 @@ public class AbilityFactory_ZoneAffecting {
int computerLibrarySize = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.ComputerPlayer).size(); int computerLibrarySize = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.ComputerPlayer).size();
int computerMaxHandSize = AllZone.ComputerPlayer.getMaxHandSize(); int computerMaxHandSize = AllZone.ComputerPlayer.getMaxHandSize();
// todo: handle deciding what X would be around here for Braingeyser type cards // todo: handle deciding what X would be around here for Braingeyser type cards
int numCards = 1; int numCards = 1;
if (params.containsKey("NumCards")) if (params.containsKey("NumCards"))
numCards = Integer.parseInt(params.get("NumCards")); numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa);
if (tgt != null) { if (tgt != null) {
// ability is targeted // ability is targeted
@@ -218,7 +219,7 @@ public class AbilityFactory_ZoneAffecting {
HashMap<String,String> params = af.getMapParams(); HashMap<String,String> params = af.getMapParams();
Card source = sa.getSourceCard(); Card source = sa.getSourceCard();
int numCards = Integer.parseInt(params.get("NumCards")); int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa);
ArrayList<Player> tgtPlayers; ArrayList<Player> tgtPlayers;

View File

@@ -5113,35 +5113,6 @@ public class CardFactory_Sorceries {
} }
//*************** END ************ END ************************** //*************** END ************ END **************************
//*************** START *********** START **************************
else if(cardName.equals("Braingeyser"))
{
final SpellAbility spell = new Spell(card){
private static final long serialVersionUID = -7141472916367953810L;
public void resolve()
{
Player player = getTargetPlayer();
player.drawCards(card.getXManaCostPaid());
card.setXManaCostPaid(0);
}
public boolean canPlayAI()
{
final int maxX = ComputerUtil.getAvailableMana().size() - 1;
return maxX > 3 && AllZone.Computer_Hand.size() <= 3;
}
};
spell.setDescription("Target player draws X cards.");
spell.setBeforePayMana(CardFactoryUtil.input_targetPlayer(spell));
spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman());
card.clearSpellAbility();
card.addSpellAbility(spell);
}
//*************** END ************ END **************************
//*************** START *********** START ************************** //*************** START *********** START **************************
else if (cardName.equals("Beacon of Creation")) else if (cardName.equals("Beacon of Creation"))