mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
- Added Discard as an Ability_Cost
- Added Kris Mage and Stormbind as Samples.
This commit is contained in:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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/krakilin.txt -text svneol=native#text/plain
|
||||||
res/cardsfolder/kranioceros.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/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_cloudscraper.txt -text svneol=native#text/plain
|
||||||
res/cardsfolder/krosan_colossus.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
|
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_seeker.txt -text svneol=native#text/plain
|
||||||
res/cardsfolder/storm_shaman.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/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/stormcallers_boon.txt -text svneol=native#text/plain
|
||||||
res/cardsfolder/stormcloud_djinn.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
|
res/cardsfolder/stormfront_pegasus.txt -text svneol=native#text/plain
|
||||||
|
|||||||
10
res/cardsfolder/kris_mage.txt
Normal file
10
res/cardsfolder/kris_mage.txt
Normal 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
|
||||||
9
res/cardsfolder/stormbind.txt
Normal file
9
res/cardsfolder/stormbind.txt
Normal 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
|
||||||
@@ -32,6 +32,13 @@ public class Ability_Cost {
|
|||||||
private int lifeAmount = 0;
|
private int lifeAmount = 0;
|
||||||
public int getLifeAmount() { return lifeAmount; }
|
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"); };
|
public boolean hasNoManaCost() { return manaCost.equals("") || manaCost.equals("0"); };
|
||||||
private String manaCost = "";
|
private String manaCost = "";
|
||||||
public String getMana() { return manaCost; }
|
public String getMana() { return manaCost; }
|
||||||
@@ -75,6 +82,23 @@ public class Ability_Cost {
|
|||||||
lifeAmount = Integer.parseInt(str);
|
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-")) {
|
if(parse.contains("Sac-")) {
|
||||||
// todo(sol): change from Sac- to Sac<X, type>, also use IsValidCard with type
|
// todo(sol): change from Sac- to Sac<X, type>, also use IsValidCard with type
|
||||||
sacCost = true;
|
sacCost = true;
|
||||||
@@ -121,7 +145,7 @@ public class Ability_Cost {
|
|||||||
cost.append(manaCost);
|
cost.append(manaCost);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tapCost){
|
if (tapCost || untapCost){
|
||||||
// tap cost for spells will not be in this form.
|
// tap cost for spells will not be in this form.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,6 +165,29 @@ public class Ability_Cost {
|
|||||||
first = false;
|
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(sacString(first));
|
||||||
|
|
||||||
cost.append(".");
|
cost.append(".");
|
||||||
@@ -201,6 +248,28 @@ public class Ability_Cost {
|
|||||||
first = false;
|
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));
|
cost.append(sacString(first));
|
||||||
|
|
||||||
|
|||||||
@@ -244,7 +244,27 @@ public class ComputerUtil
|
|||||||
return false;
|
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 (cost.getSacCost()){
|
||||||
// if there's a sacrifice in the cost, just because we can Pay it doesn't mean we want to.
|
// if there's a sacrifice in the cost, just because we can Pay it doesn't mean we want to.
|
||||||
if (!cost.getSacThis()){
|
if (!cost.getSacThis()){
|
||||||
|
|||||||
@@ -23,10 +23,12 @@ public class Cost_Payment {
|
|||||||
private boolean paySubCounter;
|
private boolean paySubCounter;
|
||||||
private boolean paySac;
|
private boolean paySac;
|
||||||
private boolean payLife;
|
private boolean payLife;
|
||||||
|
private boolean payDiscard;
|
||||||
|
|
||||||
private boolean bCancel = false;
|
private boolean bCancel = false;
|
||||||
|
|
||||||
public void setPayMana(boolean bPay){ payMana = bPay; }
|
public void setPayMana(boolean bPay){ payMana = bPay; }
|
||||||
|
public void setPayDiscard(boolean bSac){ payDiscard = bSac; }
|
||||||
public void setPaySac(boolean bSac){ paySac = bSac; }
|
public void setPaySac(boolean bSac){ paySac = bSac; }
|
||||||
|
|
||||||
final private Input changeInput = new Input() {
|
final private Input changeInput = new Input() {
|
||||||
@@ -42,6 +44,7 @@ public class Cost_Payment {
|
|||||||
paySubCounter = !cost.getSubCounter();
|
paySubCounter = !cost.getSubCounter();
|
||||||
paySac = !cost.getSacCost();
|
paySac = !cost.getSacCost();
|
||||||
payLife = !cost.getLifeCost();
|
payLife = !cost.getLifeCost();
|
||||||
|
payDiscard = !cost.getDiscardCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canPayAdditionalCosts(){
|
public boolean canPayAdditionalCosts(){
|
||||||
@@ -66,6 +69,27 @@ public class Cost_Payment {
|
|||||||
return false;
|
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.getSacCost()){
|
||||||
if (!cost.getSacThis()){
|
if (!cost.getSacThis()){
|
||||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
|
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
|
||||||
@@ -147,8 +171,33 @@ public class Cost_Payment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!paySac && cost.getSacCost()){
|
if (!payDiscard && cost.getDiscardCost()){ // discard here
|
||||||
// sacrifice stuff 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())
|
if (cost.getSacThis())
|
||||||
changeInput.stopSetNext(sacrificeThis(ability, this));
|
changeInput.stopSetNext(sacrificeThis(ability, this));
|
||||||
else
|
else
|
||||||
@@ -161,7 +210,7 @@ public class Cost_Payment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAllPaid(){
|
public boolean isAllPaid(){
|
||||||
return (payTap && payUntap && payMana && paySubCounter && paySac && payLife);
|
return (payTap && payUntap && payMana && paySubCounter && paySac && payLife && payDiscard);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelPayment(){
|
public void cancelPayment(){
|
||||||
@@ -190,10 +239,13 @@ public class Cost_Payment {
|
|||||||
life.payLife(cost.getLifeAmount()*-1);
|
life.payLife(cost.getLifeAmount()*-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can't really undiscard things
|
||||||
|
|
||||||
// can't really unsacrifice things
|
// can't really unsacrifice things
|
||||||
}
|
}
|
||||||
|
|
||||||
public void payComputerCosts(){
|
public void payComputerCosts(){
|
||||||
|
// make sure ComputerUtil.canPayAdditionalCosts() is updated when updating new Costs
|
||||||
Card sacCard = null;
|
Card sacCard = null;
|
||||||
ability.setActivatingPlayer(Constant.Player.Computer);
|
ability.setActivatingPlayer(Constant.Player.Computer);
|
||||||
|
|
||||||
@@ -235,12 +287,87 @@ public class Cost_Payment {
|
|||||||
if (cost.getLifeCost())
|
if (cost.getLifeCost())
|
||||||
AllZone.GameAction.getPlayerLife(card.getController()).payLife(cost.getLifeAmount());
|
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())
|
if (cost.getSacCost())
|
||||||
AllZone.GameAction.sacrifice(sacCard);
|
AllZone.GameAction.sacrifice(sacCard);
|
||||||
|
|
||||||
AllZone.Stack.add(ability);
|
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) {
|
public static Input sacrificeThis(final SpellAbility spell, final Cost_Payment payment) {
|
||||||
Input target = new Input() {
|
Input target = new Input() {
|
||||||
|
|||||||
Reference in New Issue
Block a user