- Added Discard as an Ability_Cost

- Added Kris Mage and Stormbind as Samples.
This commit is contained in:
jendave
2011-08-06 07:19:45 +00:00
parent 41ca7992eb
commit e5e7d4fcaf
6 changed files with 242 additions and 5 deletions

2
.gitattributes vendored
View File

@@ -1968,6 +1968,7 @@ res/cardsfolder/kraken_hatchling.txt -text svneol=native#text/plain
res/cardsfolder/krakilin.txt -text svneol=native#text/plain
res/cardsfolder/kranioceros.txt -text svneol=native#text/plain
res/cardsfolder/kresh_the_bloodbraided.txt -text svneol=native#text/plain
res/cardsfolder/kris_mage.txt -text svneol=native#text/plain
res/cardsfolder/krosan_cloudscraper.txt -text svneol=native#text/plain
res/cardsfolder/krosan_colossus.txt -text svneol=native#text/plain
res/cardsfolder/krovikan_horror.txt -text svneol=native#text/plain
@@ -3391,6 +3392,7 @@ res/cardsfolder/storm_herd.txt -text svneol=native#text/plain
res/cardsfolder/storm_seeker.txt -text svneol=native#text/plain
res/cardsfolder/storm_shaman.txt -text svneol=native#text/plain
res/cardsfolder/storm_spirit.txt -text svneol=native#text/plain
res/cardsfolder/stormbind.txt -text svneol=native#text/plain
res/cardsfolder/stormcallers_boon.txt -text svneol=native#text/plain
res/cardsfolder/stormcloud_djinn.txt -text svneol=native#text/plain
res/cardsfolder/stormfront_pegasus.txt -text svneol=native#text/plain

View File

@@ -0,0 +1,10 @@
Name:Kris Mage
ManaCost:R
Types:Creature Human Spellshaper
Text:no text
PT:1/1
K:abDamageTgtCP R T Discard<1,Any>:1
K:SVar:Rarity:Common
K:SVar:Picture:http://www.wizards.com/global/images/magic/general/kris_mage.jpg
K:SVar:RemAIDeck:True
End

View File

@@ -0,0 +1,9 @@
Name:Stormbind
ManaCost:1 R G
Types:Enchantment
Text:no text
K:abDamageTgtCP 2 Discard<1,Random>:2
K:SVar:Rarity:Rare
K:SVar:Picture:http://www.wizards.com/global/images/magic/general/stormbind.jpg
K:SVar:RemAIDeck:True
End

View File

@@ -32,6 +32,13 @@ public class Ability_Cost {
private int lifeAmount = 0;
public int getLifeAmount() { return lifeAmount; }
private boolean discardCost = false;
public boolean getDiscardCost() { return discardCost; }
private int discardAmount = 0;
public int getDiscardAmount() { return discardAmount; }
private String discardType = "";
public String getDiscardType() { return discardType; }
public boolean hasNoManaCost() { return manaCost.equals("") || manaCost.equals("0"); };
private String manaCost = "";
public String getMana() { return manaCost; }
@@ -75,6 +82,23 @@ public class Ability_Cost {
lifeAmount = Integer.parseInt(str);
}
if (parse.contains("Discard<")){
// Discard<NumCards,DiscardType>
discardCost = true;
int startPos = parse.indexOf("Discard<");
int endPos = parse.indexOf(">", startPos);
String str = parse.substring(startPos, endPos+1);
parse = parse.replace(str, "").trim();
str = str.replace("Discard<", "");
str = str.replace(">", "");
String[] splitStr = str.split(",");
discardAmount = Integer.parseInt(splitStr[0]);
discardType = splitStr[1];
}
if(parse.contains("Sac-")) {
// todo(sol): change from Sac- to Sac<X, type>, also use IsValidCard with type
sacCost = true;
@@ -121,7 +145,7 @@ public class Ability_Cost {
cost.append(manaCost);
}
if (tapCost){
if (tapCost || untapCost){
// tap cost for spells will not be in this form.
}
@@ -141,6 +165,29 @@ public class Ability_Cost {
first = false;
}
if (discardCost){
if (first)
cost.append("discard ");
else
cost.append("and discard ");
if (discardType.equals("Hand")){
cost.append(" your hand");
}
else{
cost.append(discardAmount);
int type = discardType.indexOf("/");
if (type != -1)
cost.append(discardType.substring(type + 1)).append(" ");
cost.append(" card");
if (discardAmount > 1)
cost.append("s");
if (discardType.equals("Random"))
cost.append(" at random");
}
first = false;
}
cost.append(sacString(first));
cost.append(".");
@@ -201,6 +248,28 @@ public class Ability_Cost {
first = false;
}
if (discardCost){
if (first)
cost.append("Discard ");
else
cost.append(", discard ");
if (discardType.equals("Hand")){
cost.append(" your hand");
}
else{
cost.append(discardAmount);
int type = discardType.indexOf("/");
if (type != -1)
cost.append(discardType.substring(type + 1)).append(" ");
cost.append(" card");
if (discardAmount > 1)
cost.append("s");
if (discardType.equals("Random"))
cost.append(" at random");
}
first = false;
}
cost.append(sacString(first));

View File

@@ -244,7 +244,27 @@ public class ComputerUtil
return false;
}
// check additional costs.
if (cost.getDiscardCost()){
PlayerZone zone = AllZone.getZone(Constant.Zone.Hand, card.getController());
CardList handList = new CardList(zone.getCards());
String discType = cost.getDiscardType();
int discAmount = cost.getDiscardAmount();
if (discType.equals("Hand")){
// this will always work
}
else{
int type = discType.indexOf("/");
if (type != -1){
String validType[] = discType.substring(type+1).split(",");
handList = handList.getValidCards(validType);
}
if (discAmount > handList.size()){
// not enough cards in hand to pay
return false;
}
}
}
if (cost.getSacCost()){
// if there's a sacrifice in the cost, just because we can Pay it doesn't mean we want to.
if (!cost.getSacThis()){

View File

@@ -23,10 +23,12 @@ public class Cost_Payment {
private boolean paySubCounter;
private boolean paySac;
private boolean payLife;
private boolean payDiscard;
private boolean bCancel = false;
public void setPayMana(boolean bPay){ payMana = bPay; }
public void setPayDiscard(boolean bSac){ payDiscard = bSac; }
public void setPaySac(boolean bSac){ paySac = bSac; }
final private Input changeInput = new Input() {
@@ -42,6 +44,7 @@ public class Cost_Payment {
paySubCounter = !cost.getSubCounter();
paySac = !cost.getSacCost();
payLife = !cost.getLifeCost();
payDiscard = !cost.getDiscardCost();
}
public boolean canPayAdditionalCosts(){
@@ -66,6 +69,27 @@ public class Cost_Payment {
return false;
}
if (cost.getDiscardCost()){
PlayerZone zone = AllZone.getZone(Constant.Zone.Hand, card.getController());
CardList handList = new CardList(zone.getCards());
String discType = cost.getDiscardType();
int discAmount = cost.getDiscardAmount();
if (discType.equals("Hand")){
// this will always work
}
else{
int type = discType.indexOf("/");
if (type != -1){
String validType[] = discType.substring(type+1).split(",");
handList = handList.getValidCards(validType);
}
if (discAmount > handList.size()){
// not enough cards in hand to pay
return false;
}
}
}
if (cost.getSacCost()){
if (!cost.getSacThis()){
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
@@ -147,8 +171,33 @@ public class Cost_Payment {
}
}
if (!paySac && cost.getSacCost()){
// sacrifice stuff here
if (!payDiscard && cost.getDiscardCost()){ // discard here
PlayerZone zone = AllZone.getZone(Constant.Zone.Hand, card.getController());
CardList handList = new CardList(zone.getCards());
String discType = cost.getDiscardType();
int discAmount = cost.getDiscardAmount();
if (discType.equals("Hand")){
AllZone.GameAction.discardHand(card.getController(), ability);
payDiscard = true;
}
else{
if (discType.equals("Random")){
AllZone.GameAction.discardRandom(card.getController(), discAmount, ability);
payDiscard = true;
}
else{
int type = discType.indexOf("/");
if (type != -1){
String validType[] = discType.substring(type+1).split(",");
handList = handList.getValidCards(validType);
}
changeInput.stopSetNext(input_discardCost(discAmount, handList, ability, this));
return false;
}
}
}
if (!paySac && cost.getSacCost()){ // sacrifice stuff here
if (cost.getSacThis())
changeInput.stopSetNext(sacrificeThis(ability, this));
else
@@ -161,7 +210,7 @@ public class Cost_Payment {
}
public boolean isAllPaid(){
return (payTap && payUntap && payMana && paySubCounter && paySac && payLife);
return (payTap && payUntap && payMana && paySubCounter && paySac && payLife && payDiscard);
}
public void cancelPayment(){
@@ -190,10 +239,13 @@ public class Cost_Payment {
life.payLife(cost.getLifeAmount()*-1);
}
// can't really undiscard things
// can't really unsacrifice things
}
public void payComputerCosts(){
// make sure ComputerUtil.canPayAdditionalCosts() is updated when updating new Costs
Card sacCard = null;
ability.setActivatingPlayer(Constant.Player.Computer);
@@ -235,12 +287,87 @@ public class Cost_Payment {
if (cost.getLifeCost())
AllZone.GameAction.getPlayerLife(card.getController()).payLife(cost.getLifeAmount());
if (cost.getDiscardCost()){
String discType = cost.getDiscardType();
int discAmount = cost.getDiscardAmount();
if (discType.equals("Hand")){
AllZone.GameAction.discardHand(card.getController(), ability);
}
else{
if (discType.equals("Random")){
AllZone.GameAction.discardRandom(card.getController(), discAmount, ability);
}
else{
int type = discType.indexOf("/");
if (type != -1){
String validType[] = discType.substring(type+1).split(",");
AllZone.GameAction.AI_discardNumType(discAmount, validType, ability);
}
else{
AllZone.GameAction.AI_discardNumUnless(discAmount, ability);
}
}
}
}
if (cost.getSacCost())
AllZone.GameAction.sacrifice(sacCard);
AllZone.Stack.add(ability);
}
public static Input input_discardCost(final int nCards, final CardList handList, SpellAbility sa, final Cost_Payment payment) {
final SpellAbility sp = sa;
Input target = new Input() {
private static final long serialVersionUID = -329993322080934435L;
int nDiscard = 0;
@Override
public void showMessage() {
if (AllZone.Human_Hand.getCards().length == 0) stop();
AllZone.Display.showMessage("Select a card to discard");
ButtonUtil.enableOnlyCancel();
}
@Override
public void selectButtonCancel() {
cancel();
}
@Override
public void selectCard(Card card, PlayerZone zone) {
if(zone.is(Constant.Zone.Hand) && handList.contains(card) ) {
// send in CardList for Typing
AllZone.GameAction.discard(card, sp);
handList.remove(card);
nDiscard++;
//in case no more cards in hand
if(nDiscard == nCards)
done();
else if (AllZone.Human_Hand.getCards().length == 0) // this really shouldn't happen
cancel();
else
showMessage();
}
}
public void cancel(){
payment.setCancel(true);
stop();
payment.payCost();
}
public void done(){
payment.setPayDiscard(true);
stop();
payment.payCost();
}
};
return target;
}//input_discard()
public static Input sacrificeThis(final SpellAbility spell, final Cost_Payment payment) {
Input target = new Input() {