mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
- Recoded how Additional Land Plays work
- Added Summer Bloom - Added Horn of Greed - Each Fastbond will now deal damage to owner, not just 1 damage for all of them. Also, removed limit of 100 land plays for Fastbond. - Additional lands granted by Rites of Flourishing and Storm Cauldron in place for when the second ability for each is implemented. - Oh god, this update was way larger than I was expecting.
This commit is contained in:
@@ -38,6 +38,8 @@ snow_covered_mountain.jpg http://www.wizards.com/global/images/magic/gene
|
||||
snow_covered_mountain1.jpg http://www.wizards.com/global/images/magic/general/snow_covered_mountain.jpg
|
||||
snow_covered_mountain2.jpg http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_mountain.jpg
|
||||
snow_covered_mountain3.jpg http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_mountain.jpg
|
||||
summer_bloom.jpg http://www.wizards.com/global/images/magic/general/summer_bloom.jpg
|
||||
horn_of_greed.jpg http://www.wizards.com/global/images/magic/general/horn_of_greed.jpg
|
||||
dune_brood_nephilim.jpg http://www.wizards.com/global/images/magic/general/dune_brood_nephilim.jpg
|
||||
akuta_born_of_ash.jpg http://www.wizards.com/global/images/magic/general/akuta_born_of_ash.jpg
|
||||
agent_of_masks.jpg http://www.wizards.com/global/images/magic/general/agent_of_masks.jpg
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
Summer Bloom
|
||||
1 G
|
||||
Sorcery
|
||||
You may play up to three additional lands this turn.
|
||||
|
||||
Horn of Greed
|
||||
3
|
||||
Artifact
|
||||
When a player plays a land, that player draws a card.
|
||||
|
||||
Dune-Brood Nephilim
|
||||
B R G W
|
||||
Creature Nephilim
|
||||
@@ -526,7 +536,7 @@ spDiscardTgt:TgtChoose:2:Target player discards two cards.:Mind Rot - target pla
|
||||
|
||||
Mind Sludge
|
||||
4 B
|
||||
Sorcery
|
||||
ry
|
||||
no text
|
||||
spDiscardTgt:TgtChoose:X:Target player discards a card for each Swamp you control.:Mind Sludge - target player discards cards
|
||||
SVar:X:Count$TypeYouCtrl.Swamp
|
||||
|
||||
@@ -8534,12 +8534,13 @@ public class CardFactory implements NewConstants {
|
||||
|
||||
if(c != null) {
|
||||
if(c.isLand() == true) {
|
||||
if(AllZone.GameInfo.getHumanCanPlayNumberOfLands() > 0) {
|
||||
if(CardFactoryUtil.canHumanPlayLand()) {
|
||||
// todo(sol): would prefer this in GameAction.playLand somehow
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, player);
|
||||
play.add(c);
|
||||
card.unattachCard(c);
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
CardFactoryUtil.playLandEffects(c);
|
||||
AllZone.GameInfo.incrementHumanPlayedLands();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(null, "You can't play any more lands this turn.", "", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
@@ -8804,11 +8805,9 @@ public class CardFactory implements NewConstants {
|
||||
Object check = AllZone.Display.getChoiceOptional("Select spells to play in reserve order: ", Pile1.toArray());
|
||||
if(check != null) {
|
||||
if(((Card) check).isLand() == true) {
|
||||
if(AllZone.GameInfo.getHumanCanPlayNumberOfLands() > 0) {
|
||||
if(CardFactoryUtil.canHumanPlayLand()) {
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
|
||||
play.add(check);
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
GameAction.playLand((Card)check, play);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(null, "You can't play any more lands this turn.", "", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
@@ -8828,11 +8827,9 @@ public class CardFactory implements NewConstants {
|
||||
Object check = AllZone.Display.getChoiceOptional("Select spells to play in reserve order: ", Pile2.toArray());
|
||||
if(check != null) {
|
||||
if(((Card) check).isLand() == true) {
|
||||
if(AllZone.GameInfo.getHumanCanPlayNumberOfLands() > 0) {
|
||||
if(CardFactoryUtil.canHumanPlayLand()) {
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
|
||||
play.add(check);
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
GameAction.playLand((Card)check, play);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(null, "You can't play any more lands this turn.", "", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
@@ -20658,6 +20655,54 @@ public class CardFactory implements NewConstants {
|
||||
card.addSpellAbility(spell);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Summer Bloom"))
|
||||
{
|
||||
final SpellAbility spell = new Spell(card) {
|
||||
private static final long serialVersionUID = 5559004016728325736L;
|
||||
|
||||
public boolean canPlayAI() {
|
||||
// The computer should only play this card if it has at least
|
||||
// one land in its hand. Because of the way the computer turn
|
||||
// is structured, it will already have played land to it's limit
|
||||
PlayerZone hand = AllZone.getZone(Constant.Zone.Hand,
|
||||
Constant.Player.Computer);
|
||||
|
||||
CardList list = new CardList(hand.getCards());
|
||||
|
||||
list = list.getType("Land");
|
||||
if (list.size() > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
public void resolve() {
|
||||
final String thePlayer = card.getController();
|
||||
if (thePlayer.equals(Constant.Player.Human))
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(3);
|
||||
else
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(3);
|
||||
|
||||
Command untilEOT = new Command()
|
||||
{
|
||||
private static final long serialVersionUID = 1665720009691293263L;
|
||||
|
||||
public void execute(){
|
||||
if (thePlayer.equals(Constant.Player.Human))
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(-3);
|
||||
else
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(-3);
|
||||
}
|
||||
};
|
||||
AllZone.EndOfTurn.addUntil(untilEOT);
|
||||
}
|
||||
};
|
||||
card.clearSpellAbility();
|
||||
card.addSpellAbility(spell);
|
||||
|
||||
card.setSVar("PlayMain1", "TRUE");
|
||||
} //*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Explore"))
|
||||
@@ -20684,22 +20729,20 @@ public class CardFactory implements NewConstants {
|
||||
public void resolve() {
|
||||
final String thePlayer = card.getController();
|
||||
if (thePlayer.equals(Constant.Player.Human))
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(1);
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(1);
|
||||
else
|
||||
AllZone.GameInfo.addComputerCanPlayNumberOfLands(1);
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(1);
|
||||
|
||||
Command untilEOT = new Command()
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = -2618916698575607634L;
|
||||
|
||||
public void execute()
|
||||
{
|
||||
public void execute(){
|
||||
if (thePlayer.equals(Constant.Player.Human))
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
// There's no corresponding 'if' for the computer
|
||||
// The computer's land total gets reset to the right value
|
||||
// every turn
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(-1);
|
||||
else
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(-1);
|
||||
}
|
||||
};
|
||||
AllZone.EndOfTurn.addUntil(untilEOT);
|
||||
|
||||
@@ -3801,26 +3801,6 @@ public class CardFactoryUtil {
|
||||
return list.size() > 0;
|
||||
}
|
||||
|
||||
public static int getCanPlayNumberOfLands(String player) {
|
||||
int count = 1;
|
||||
CardList list = new CardList(AllZone.getZone(Constant.Zone.Play, player).getCards());
|
||||
list = list.filter(new CardListFilter() {
|
||||
public boolean addCard(Card c) {
|
||||
return c.getName().equals("Exploration") || c.getName().equals("Azusa, Lost but Seeking")
|
||||
|| c.getName().equals("Fastbond") || c.getName().equals("Oracle of Mul Daya");
|
||||
}
|
||||
});
|
||||
|
||||
for(Card var:list) {
|
||||
if(var.getName().equals("Exploration")) count++;
|
||||
else if(var.getName().equals("Azusa, Lost but Seeking")) count = count + 2;
|
||||
else if(var.getName().equals("Oracle of Mul Daya")) count = count + 1;
|
||||
else if(var.getName().equals("Fastbond")) count = 100;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public static CardList getCards(String cardName)
|
||||
{
|
||||
CardList list = new CardList();
|
||||
@@ -3831,17 +3811,12 @@ public class CardFactoryUtil {
|
||||
}
|
||||
|
||||
public static CardList getCards(String cardName, String player) {
|
||||
CardList list = new CardList(AllZone.getZone(Constant.Zone.Play, player).getCards());
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, player);
|
||||
CardList list = new CardList(play.getCards());
|
||||
list = list.getName(cardName);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static CardList getFastbonds(String player) {
|
||||
CardList list = new CardList(AllZone.getZone(Constant.Zone.Play, player).getCards());
|
||||
list = list.getName("Fastbond");
|
||||
return list;
|
||||
}
|
||||
|
||||
public static int countBasicLandTypes(String player) {
|
||||
String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"};
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, player);
|
||||
@@ -4211,6 +4186,53 @@ public class CardFactoryUtil {
|
||||
c.setManaCost(cost);
|
||||
}
|
||||
|
||||
public static boolean canHumanPlayLand(){
|
||||
return (AllZone.GameInfo.humanNumberLandPlaysLeft() > 0 || CardFactoryUtil.getCards("Fastbond", "Human").size() > 0);
|
||||
}
|
||||
|
||||
public static boolean canComputerPlayLand(){
|
||||
return (AllZone.GameInfo.computerNumberLandPlaysLeft() > 0 || CardFactoryUtil.getCards("Fastbond", "Computer").size() > 0);
|
||||
}
|
||||
|
||||
public static void playLandEffects(Card c){
|
||||
final String player = c.getController();
|
||||
boolean extraLand;
|
||||
if (player.equals("Human")){
|
||||
extraLand = AllZone.GameInfo.humanPlayedFirstLandThisTurn();
|
||||
}
|
||||
else{
|
||||
extraLand = AllZone.GameInfo.computerPlayedFirstLandThisTurn();
|
||||
}
|
||||
|
||||
if(extraLand) {
|
||||
CardList fastbonds = CardFactoryUtil.getCards("Fastbond", player);
|
||||
for(final Card f : fastbonds){
|
||||
SpellAbility ability = new Ability(f, "0") {
|
||||
@Override
|
||||
public void resolve() {
|
||||
AllZone.GameAction.getPlayerLife(f.getController()).subtractLife(1,f);
|
||||
}
|
||||
};
|
||||
ability.setStackDescription("Fastbond - Deals 1 damage to you.");
|
||||
AllZone.Stack.add(ability);
|
||||
}
|
||||
}
|
||||
|
||||
CardList greedy = CardFactoryUtil.getCards("Horn of Greed");
|
||||
if (!greedy.isEmpty()){
|
||||
for(final Card g : greedy){
|
||||
SpellAbility ability = new Ability(g, "0") {
|
||||
@Override
|
||||
public void resolve() {
|
||||
AllZone.GameAction.drawCard(player);
|
||||
}
|
||||
};
|
||||
ability.setStackDescription("Horn of Greed - " + player + " draws a card.");
|
||||
AllZone.Stack.add(ability);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
CardList in = AllZone.CardFactory.getAllCards();
|
||||
|
||||
@@ -2704,28 +2704,27 @@ public class CardFactory_Creatures {
|
||||
@Override
|
||||
public void resolve() {
|
||||
CardList library = new CardList(AllZone.getZone(Constant.Zone.Library, card.getController()).getCards());
|
||||
CardList Fastbond = new CardList(AllZone.getZone(Constant.Zone.Play, card.getController()).getCards());
|
||||
Fastbond = Fastbond.getName("Fastbond");
|
||||
if(library.size() > 0) {
|
||||
if(library.get(0).getType().contains("Land")) {
|
||||
Card top = library.get(0);
|
||||
|
||||
if(library.size() > 0 && top.getType().contains("Land") ) {
|
||||
boolean canPlayLand = false;
|
||||
boolean isHuman = false;
|
||||
if(card.getController() == Constant.Player.Human){
|
||||
canPlayLand = CardFactoryUtil.canHumanPlayLand();
|
||||
isHuman = true;
|
||||
}
|
||||
else{
|
||||
canPlayLand = CardFactoryUtil.canComputerPlayLand();
|
||||
}
|
||||
if (canPlayLand){
|
||||
//todo(sol): would prefer to use GameAction.playLand(top, play) but it doesn't work
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
|
||||
AllZone.GameAction.moveTo(play, library.get(0));
|
||||
if(card.getController() == Constant.Player.Human) {
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
if(AllZone.GameInfo.humanPlayedFirstLandThisTurn() == true) {
|
||||
for(int i = 0; i < Fastbond.size(); i++)
|
||||
AllZone.GameAction.addDamage(card.getController(), 1,Fastbond.get(0));
|
||||
}
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
}
|
||||
else {
|
||||
AllZone.GameInfo.addComputerCanPlayNumberOfLands(-1);
|
||||
if(AllZone.GameInfo.computerPlayedFirstLandThisTurn() == true) {
|
||||
for(int i = 0; i < Fastbond.size(); i++)
|
||||
AllZone.GameAction.addDamage(card.getController(), 1,Fastbond.get(0));
|
||||
}
|
||||
AllZone.GameInfo.setComputerPlayedFirstLandThisTurn(true);
|
||||
}
|
||||
Card land = AllZone.GameAction.moveTo(play, top);
|
||||
CardFactoryUtil.playLandEffects(land);
|
||||
if (isHuman)
|
||||
AllZone.GameInfo.incrementHumanPlayedLands();
|
||||
else
|
||||
AllZone.GameInfo.incrementComputerPlayedLands();
|
||||
}
|
||||
}
|
||||
}//resolve()
|
||||
@@ -2735,11 +2734,11 @@ public class CardFactory_Creatures {
|
||||
CardList library = new CardList(AllZone.getZone(Constant.Zone.Library, card.getController()).getCards());
|
||||
if(library.size() == 0) return false;
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController());
|
||||
int PlayLand = 0;
|
||||
if(card.getController() == Constant.Player.Human) PlayLand = AllZone.GameInfo.getHumanCanPlayNumberOfLands();
|
||||
else PlayLand = AllZone.GameInfo.getComputerCanPlayNumberOfLands();
|
||||
boolean canPlayLand = false;
|
||||
if(card.getController() == Constant.Player.Human) canPlayLand = CardFactoryUtil.canHumanPlayLand();
|
||||
else canPlayLand = CardFactoryUtil.canComputerPlayLand();
|
||||
|
||||
return (AllZone.GameAction.isCardInZone(card, play) && library.get(0).getType().contains("Land") && PlayLand > 0)
|
||||
return (AllZone.GameAction.isCardInZone(card, play) && library.get(0).getType().contains("Land") && canPlayLand)
|
||||
&& (AllZone.Stack.size() == 0) && AllZone.GameAction.getLastPlayerToDraw().equals(card.getController());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -8,13 +8,9 @@ import forge.error.ErrorViewer;
|
||||
|
||||
|
||||
public class ComputerAI_Burn implements Computer {
|
||||
private volatile int numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
public void main1() {
|
||||
if(numberPlayLand > 0) {
|
||||
numberPlayLand--;
|
||||
ComputerUtil.playLand();
|
||||
}
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
Runnable run = new Runnable() {
|
||||
public void run() {
|
||||
synchronized(ComputerAI_Burn.this) {
|
||||
@@ -56,8 +52,7 @@ public class ComputerAI_Burn implements Computer {
|
||||
}//main1()
|
||||
|
||||
public void main2() {
|
||||
numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
//AllZone.Phase.nextPhase();
|
||||
//for debugging: System.out.println("need to nextPhase(ComputerAI_Burn.main2) = true; Note, this is untested, did it work?");
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
@@ -137,16 +132,6 @@ public class ComputerAI_Burn implements Computer {
|
||||
return library.toArray();
|
||||
}
|
||||
|
||||
public void addNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand += n;
|
||||
}
|
||||
|
||||
public void setNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand = n;
|
||||
}
|
||||
|
||||
public void stack_not_empty() {
|
||||
//same as Input.stop() method
|
||||
//ends the method
|
||||
|
||||
@@ -6,21 +6,9 @@ import forge.error.ErrorViewer;
|
||||
|
||||
|
||||
public class ComputerAI_Burn2 implements Computer {
|
||||
private volatile int numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
public void main1() {
|
||||
if(numberPlayLand > 0 ) {
|
||||
numberPlayLand--;
|
||||
ComputerUtil.playLand();
|
||||
|
||||
Card c[] = AllZone.Computer_Hand.getCards();
|
||||
if(c.length != 0) {
|
||||
// System.out.print("hand - ");
|
||||
// for(int i = 0; i < c.length; i++)
|
||||
// System.out.print(c[i] +" ");
|
||||
// System.out.println();
|
||||
}
|
||||
}
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
Runnable run = new Runnable() {
|
||||
public void run() {
|
||||
synchronized(ComputerAI_Burn2.this) {
|
||||
@@ -71,8 +59,7 @@ public class ComputerAI_Burn2 implements Computer {
|
||||
}//main1()
|
||||
|
||||
public void main2() {
|
||||
numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
//AllZone.Phase.nextPhase();
|
||||
//for debugging: System.out.println("need to nextPhase(ComputerAI_Burn2.main2) = true; Note, this is not tested, did it work?");
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
@@ -176,16 +163,6 @@ public class ComputerAI_Burn2 implements Computer {
|
||||
return library.toArray();
|
||||
}
|
||||
|
||||
public void addNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand += n;
|
||||
}
|
||||
|
||||
public void setNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand = n;
|
||||
}
|
||||
|
||||
public void stack_not_empty() {
|
||||
//same as Input.stop() method
|
||||
//ends the method
|
||||
|
||||
@@ -22,40 +22,13 @@ public class ComputerAI_General implements Computer {
|
||||
}
|
||||
|
||||
public void main1() {
|
||||
if(AllZone.GameInfo.getComputerCanPlayNumberOfLands() > 0) {
|
||||
|
||||
AllZone.GameInfo.addComputerCanPlayNumberOfLands(-1);
|
||||
ComputerUtil.playLand();
|
||||
for(String effect:AllZone.StaticEffects.getStateBasedMap().keySet()) {
|
||||
Command com = GameActionUtil.commands.get(effect);
|
||||
com.execute();
|
||||
}
|
||||
GameActionUtil.executeCardStateEffects();
|
||||
}
|
||||
|
||||
// AllZone.Phase.nextPhase();
|
||||
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
playCards(Constant.Phase.Main1);
|
||||
|
||||
//for cards like Exploration, Fastbond, Azusa, ...
|
||||
while(AllZone.GameInfo.getComputerCanPlayNumberOfLands() > 0)
|
||||
{
|
||||
AllZone.GameInfo.addComputerCanPlayNumberOfLands(-1);
|
||||
ComputerUtil.playLand();
|
||||
|
||||
for(String effect:AllZone.StaticEffects.getStateBasedMap().keySet()) {
|
||||
Command com = GameActionUtil.commands.get(effect);
|
||||
com.execute();
|
||||
}
|
||||
GameActionUtil.executeCardStateEffects();
|
||||
}
|
||||
}//main1()
|
||||
|
||||
public void main2() {
|
||||
AllZone.GameInfo.setComputerCanPlayNumberOfLands(CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer));
|
||||
|
||||
ComputerUtil.chooseLandsToPlay(); // in case we can play more lands now, or drew cards since first main phase
|
||||
playCards(Constant.Phase.Main2);
|
||||
|
||||
}
|
||||
|
||||
private void playCards(final String phase) {
|
||||
|
||||
@@ -3,20 +3,14 @@ import java.util.*;
|
||||
|
||||
public class ComputerAI_Rats2 implements Computer
|
||||
{
|
||||
private int numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
private static Random random = new Random();
|
||||
|
||||
public void main1()
|
||||
{
|
||||
if(numberPlayLand > 0)
|
||||
{
|
||||
numberPlayLand--;
|
||||
ComputerUtil.playLand();
|
||||
}
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
|
||||
// if(playActivatedAbilities() || playSorcery())
|
||||
// return;
|
||||
// if(playActivatedAbilities() || playSorcery())
|
||||
// return;
|
||||
Card[] c = AllZone.Computer_Hand.getCards();
|
||||
System.out.println("Computer Thinking " +new CardList(c));
|
||||
|
||||
@@ -24,14 +18,15 @@ public class ComputerAI_Rats2 implements Computer
|
||||
//for debugging: System.out.println("need to nextPhase(ComputerAI_Rats2.main1) = true");
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
}
|
||||
|
||||
public void main2()
|
||||
{
|
||||
numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
ComputerUtil.chooseLandsToPlay();
|
||||
//AllZone.Phase.nextPhase();
|
||||
//for debugging: System.out.println("need to nextPhase(ComputerAI_Rats2.main2) = true");
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
}
|
||||
|
||||
public void declare_blockers()
|
||||
{
|
||||
if(random.nextBoolean() || AllZone.Computer_Life.getLife() < 10)
|
||||
@@ -145,16 +140,6 @@ public class ComputerAI_Rats2 implements Computer
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
}
|
||||
|
||||
public void addNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand += n;
|
||||
}
|
||||
|
||||
public void setNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand = n;
|
||||
}
|
||||
|
||||
public void stack_not_empty()
|
||||
{
|
||||
AllZone.InputControl.resetInput();
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
package forge;
|
||||
public class ComputerAI_Testing implements Computer
|
||||
{
|
||||
|
||||
private int numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer);
|
||||
|
||||
//must shuffle this
|
||||
public Card[] getLibrary() {return new Card[] {};}
|
||||
|
||||
@@ -71,14 +68,4 @@ public class ComputerAI_Testing implements Computer
|
||||
//for debugging: System.out.println("need to nextPhase(ComputerAI_Testing.end_of_turn) = true");
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
}
|
||||
|
||||
public void addNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand += n;
|
||||
}
|
||||
|
||||
public void setNumberPlayLands(int n)
|
||||
{
|
||||
numberPlayLand = n;
|
||||
}
|
||||
}
|
||||
@@ -370,32 +370,34 @@ public class ComputerUtil
|
||||
}//getAvailableMana()
|
||||
|
||||
//plays a land if one is available
|
||||
static public void playLand()
|
||||
static public void chooseLandsToPlay()
|
||||
{
|
||||
ArrayList<Card> landList = PlayerZoneUtil.getCardType(AllZone.Computer_Hand, "Land");
|
||||
if(! landList.isEmpty())
|
||||
{
|
||||
while(!landList.isEmpty() && (AllZone.GameInfo.computerNumberLandPlaysLeft() > 0 ||
|
||||
CardFactoryUtil.getCards("Fastbond", "Computer").size() > 0)){
|
||||
// play as many lands as you can
|
||||
int ix = 0;
|
||||
while (landList.get(ix).isReflectedLand() && (ix+1 < landList.size())) {
|
||||
// Play reflected lands LAST so that there is colored mana in play
|
||||
// Don't increment past the end of the list!
|
||||
// Skip through reflected lands. Choose last if they are all reflected.
|
||||
ix++;
|
||||
}
|
||||
AllZone.Computer_Hand.remove(landList.get(ix));
|
||||
AllZone.Computer_Play.add(landList.get(ix));
|
||||
|
||||
if (!AllZone.GameInfo.computerPlayedFirstLandThisTurn()) {
|
||||
AllZone.GameInfo.setComputerPlayedFirstLandThisTurn(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (CardFactoryUtil.getFastbonds(Constant.Player.Computer).size() > 0)
|
||||
AllZone.GameAction.getPlayerLife(Constant.Player.Computer).subtractLife(1,CardFactoryUtil.getFastbonds(Constant.Player.Computer).get(0));
|
||||
}
|
||||
Card land = landList.get(ix);
|
||||
landList.remove(ix);
|
||||
playLand(land, AllZone.Computer_Hand);
|
||||
|
||||
AllZone.GameAction.checkStateEffects();
|
||||
}
|
||||
}
|
||||
|
||||
static public void playLand(Card land, PlayerZone zone)
|
||||
{
|
||||
zone.remove(land);
|
||||
AllZone.Computer_Play.add(land);
|
||||
CardFactoryUtil.playLandEffects(land);
|
||||
AllZone.GameInfo.incrementComputerPlayedLands();
|
||||
}
|
||||
|
||||
static public void untapDraw()
|
||||
{
|
||||
AllZone.GameAction.drawCard(Constant.Player.Computer);
|
||||
|
||||
@@ -1654,8 +1654,8 @@ public class GameAction {
|
||||
|
||||
lastPlayerToDraw = Constant.Player.Human;
|
||||
|
||||
AllZone.GameInfo.setComputerCanPlayNumberOfLands(1);
|
||||
AllZone.GameInfo.setHumanCanPlayNumberOfLands(1);
|
||||
AllZone.GameInfo.setComputerMaxPlayNumberOfLands(1);
|
||||
AllZone.GameInfo.setHumanMaxPlayNumberOfLands(1);
|
||||
|
||||
AllZone.GameInfo.setPreventCombatDamageThisTurn(false);
|
||||
AllZone.GameInfo.setHumanNumberOfTimesMulliganed(0);
|
||||
@@ -2043,8 +2043,7 @@ public class GameAction {
|
||||
|
||||
ArrayList<String> choices = new ArrayList<String>();
|
||||
|
||||
if(AllZone.GameInfo.getHumanCanPlayNumberOfLands() > 0
|
||||
&& AllZone.Stack.size() == 0
|
||||
if(AllZone.Stack.size() == 0 && CardFactoryUtil.canHumanPlayLand()
|
||||
&& (AllZone.Phase.getPhase().equals(Constant.Phase.Main1) || AllZone.Phase.getPhase().equals(
|
||||
Constant.Phase.Main2))) choices.add("Play land");
|
||||
|
||||
@@ -2066,10 +2065,7 @@ public class GameAction {
|
||||
|
||||
if(choice == null) ;
|
||||
else if(choice.equals("Play land")) {
|
||||
AllZone.Human_Hand.remove(c);
|
||||
AllZone.Human_Play.add(c);
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
playLand(c, AllZone.Human_Hand);
|
||||
} else {
|
||||
SpellAbility sa = map.get(choice);
|
||||
playSpellAbility(sa);
|
||||
@@ -2094,6 +2090,16 @@ public class GameAction {
|
||||
}
|
||||
}
|
||||
|
||||
static public void playLand(Card land, PlayerZone zone)
|
||||
{
|
||||
if (CardFactoryUtil.canHumanPlayLand()){
|
||||
zone.remove(land);
|
||||
AllZone.Human_Play.add(land);
|
||||
CardFactoryUtil.playLandEffects(land);
|
||||
AllZone.GameInfo.incrementHumanPlayedLands();
|
||||
}
|
||||
}
|
||||
|
||||
public void playCardNoCost(Card c) {
|
||||
//SpellAbility[] choices = (SpellAbility[]) c.getSpells().toArray();
|
||||
ArrayList<SpellAbility> choices = c.getBasicSpells();
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package forge;
|
||||
|
||||
public class GameInfo {
|
||||
private int computerCanPlayNumberOfLands;
|
||||
private int humanCanPlayNumberOfLands;
|
||||
private int computerMaxPlayNumberOfLands = 1;
|
||||
private int humanMaxPlayNumberOfLands = 1;
|
||||
|
||||
private int computerLandsPlayedThisTurn = 0;
|
||||
private int humanLandsPlayedThisTurn = 0;
|
||||
|
||||
private boolean computerStartedThisGame = false;
|
||||
|
||||
private boolean computerPlayedFirstLandThisTurn;
|
||||
private boolean humanPlayedFirstLandThisTurn;
|
||||
|
||||
private int humanNumberOfTimesMulliganed;
|
||||
private boolean humanMulliganedToZero;
|
||||
|
||||
@@ -16,47 +16,66 @@ public class GameInfo {
|
||||
private boolean assignedFirstStrikeDamageThisCombat;
|
||||
private boolean resolvedFirstStrikeDamageThisCombat;
|
||||
|
||||
public void setComputerCanPlayNumberOfLands(int n) {
|
||||
computerCanPlayNumberOfLands = n;
|
||||
public void setComputerMaxPlayNumberOfLands(int n) {
|
||||
computerMaxPlayNumberOfLands = n;
|
||||
}
|
||||
|
||||
public int getComputerCanPlayNumberOfLands() {
|
||||
return computerCanPlayNumberOfLands;
|
||||
}
|
||||
|
||||
public void addComputerCanPlayNumberOfLands(int n)
|
||||
public void addComputerMaxPlayNumberOfLands(int n)
|
||||
{
|
||||
computerCanPlayNumberOfLands += n;
|
||||
computerMaxPlayNumberOfLands += n;
|
||||
}
|
||||
|
||||
public void setHumanCanPlayNumberOfLands(int n) {
|
||||
humanCanPlayNumberOfLands = n;
|
||||
public void setHumanMaxPlayNumberOfLands(int n) {
|
||||
humanMaxPlayNumberOfLands = n;
|
||||
}
|
||||
|
||||
public int getHumanCanPlayNumberOfLands() {
|
||||
return humanCanPlayNumberOfLands;
|
||||
}
|
||||
|
||||
public void addHumanCanPlayNumberOfLands(int n)
|
||||
public void addHumanMaxPlayNumberOfLands(int n)
|
||||
{
|
||||
humanCanPlayNumberOfLands += n;
|
||||
humanMaxPlayNumberOfLands += n;
|
||||
}
|
||||
|
||||
public void setComputerPlayedLands(int n) {
|
||||
computerLandsPlayedThisTurn = n;
|
||||
}
|
||||
|
||||
public void setComputerPlayedFirstLandThisTurn(boolean b) {
|
||||
computerPlayedFirstLandThisTurn = b;
|
||||
public int getComputerPlayedLands() {
|
||||
return computerLandsPlayedThisTurn;
|
||||
}
|
||||
|
||||
public void incrementComputerPlayedLands()
|
||||
{
|
||||
computerLandsPlayedThisTurn++;
|
||||
}
|
||||
|
||||
public void setHumanPlayedLands(int n) {
|
||||
humanLandsPlayedThisTurn = n;
|
||||
}
|
||||
|
||||
public int getHumanPlayedLands() {
|
||||
return humanLandsPlayedThisTurn;
|
||||
}
|
||||
|
||||
public void incrementHumanPlayedLands()
|
||||
{
|
||||
humanLandsPlayedThisTurn++;
|
||||
}
|
||||
|
||||
public int computerNumberLandPlaysLeft()
|
||||
{
|
||||
return computerMaxPlayNumberOfLands - computerLandsPlayedThisTurn;
|
||||
}
|
||||
|
||||
public int humanNumberLandPlaysLeft()
|
||||
{
|
||||
return humanMaxPlayNumberOfLands - humanLandsPlayedThisTurn;
|
||||
}
|
||||
|
||||
public boolean computerPlayedFirstLandThisTurn() {
|
||||
return computerPlayedFirstLandThisTurn;
|
||||
}
|
||||
|
||||
public void setHumanPlayedFirstLandThisTurn(boolean b) {
|
||||
humanPlayedFirstLandThisTurn = b;
|
||||
return (computerLandsPlayedThisTurn > 0);
|
||||
}
|
||||
|
||||
public boolean humanPlayedFirstLandThisTurn() {
|
||||
return humanPlayedFirstLandThisTurn;
|
||||
return (humanLandsPlayedThisTurn > 0);
|
||||
}
|
||||
|
||||
public int getHumanNumberOfTimesMulliganed()
|
||||
|
||||
@@ -30,21 +30,10 @@ public class InputUtil
|
||||
if (count > 0)
|
||||
AllZone.GameAction.playCard(card);
|
||||
else //play the land
|
||||
{
|
||||
AllZone.Human_Hand.remove(card);
|
||||
AllZone.Human_Play.add(card);
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
|
||||
}
|
||||
GameAction.playLand(card, zone);
|
||||
}
|
||||
else //play the land
|
||||
{
|
||||
AllZone.Human_Hand.remove(card);
|
||||
AllZone.Human_Play.add(card);
|
||||
AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(true);
|
||||
}
|
||||
GameAction.playLand(card, zone);
|
||||
} //land
|
||||
/**
|
||||
else if(zone.is(Constant.Zone.Hand, Constant.Player.Human) &&
|
||||
|
||||
@@ -22,9 +22,7 @@ public class Input_Draw extends Input {
|
||||
|| humanCards.containsName("Yawgmoth's Bargain");
|
||||
|
||||
if(AllZone.Phase.getPhase().equals(Constant.Phase.Draw) && humanSkipsDrawPhase) {
|
||||
//Input_Main.canPlayLand = true;
|
||||
AllZone.GameInfo.setHumanCanPlayNumberOfLands(CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Human));
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(false);
|
||||
AllZone.GameInfo.setHumanPlayedLands(0);
|
||||
AllZone.Phase.setNeedToNextPhase(true);
|
||||
|
||||
} else { //continue with draw phase
|
||||
@@ -54,8 +52,7 @@ public class Input_Draw extends Input {
|
||||
if(drawCard && AllZone.Phase.getTurn() > 1) AllZone.GameAction.drawCard(Constant.Player.Human);
|
||||
|
||||
if(AllZone.Phase.getPhase().equals(Constant.Phase.Draw)) {
|
||||
AllZone.GameInfo.setHumanCanPlayNumberOfLands(CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Human));
|
||||
AllZone.GameInfo.setHumanPlayedFirstLandThisTurn(false);
|
||||
AllZone.GameInfo.setHumanPlayedLands(0);
|
||||
|
||||
//AllZone.Phase.nextPhase();
|
||||
//for debugging: System.out.println("need to nextPhase(from Input_Draw on human's draw) = true");
|
||||
|
||||
@@ -29,16 +29,8 @@ public class Input_Main extends Input {
|
||||
public void selectCard(Card card, PlayerZone zone) {
|
||||
//these if statements cannot be combined
|
||||
if(card.isLand() && zone.is(Constant.Zone.Hand, Constant.Player.Human)) {
|
||||
if(AllZone.GameInfo.getHumanCanPlayNumberOfLands() > 0) {
|
||||
CardList fastbonds = CardFactoryUtil.getFastbonds(Constant.Player.Human);
|
||||
if(fastbonds.size() > 0) {
|
||||
if(AllZone.GameInfo.humanPlayedFirstLandThisTurn()) {
|
||||
AllZone.GameAction.getPlayerLife(Constant.Player.Human).subtractLife(1,fastbonds.get(0));
|
||||
}
|
||||
}
|
||||
if(CardFactoryUtil.canHumanPlayLand()) {
|
||||
InputUtil.playAnyCard(card, zone);
|
||||
//canPlayNumberOfLands--;
|
||||
//firstLandHasBeenPlayed = true;
|
||||
AllZone.GameAction.checkStateEffects();
|
||||
}
|
||||
|
||||
@@ -53,13 +45,9 @@ public class Input_Main extends Input {
|
||||
if(count > 0) InputUtil.playAnyCard(card, zone);
|
||||
}
|
||||
}
|
||||
//TODO: add code for exploration / fastbond here
|
||||
|
||||
} else {
|
||||
// SpellAbility sa = card.getSpellAbility()[0];
|
||||
// sa.setRandomTargetAI();
|
||||
// AllZone.Stack.add(sa);
|
||||
InputUtil.playAnyCard(card, zone);
|
||||
}
|
||||
AllZone.GameAction.checkStateEffects();
|
||||
}//selectCard()
|
||||
}
|
||||
|
||||
@@ -240,6 +240,7 @@ public class Phase extends MyObservable
|
||||
PlayerCreatureSpellCount = 0;
|
||||
ComputerSpellCount = 0;
|
||||
ComputerCreatureSpellCount = 0;
|
||||
AllZone.GameInfo.setHumanPlayedLands(0);
|
||||
turn++;
|
||||
/*
|
||||
if (humanExtraTurns > 0)
|
||||
@@ -255,7 +256,7 @@ public class Phase extends MyObservable
|
||||
PlayerCreatureSpellCount = 0;
|
||||
ComputerSpellCount = 0;
|
||||
ComputerCreatureSpellCount = 0;
|
||||
AllZone.GameInfo.setComputerPlayedFirstLandThisTurn(false);
|
||||
AllZone.GameInfo.setComputerPlayedLands(0);
|
||||
turn++;
|
||||
|
||||
/*
|
||||
@@ -265,15 +266,13 @@ public class Phase extends MyObservable
|
||||
computerExtraTurns++;
|
||||
*/
|
||||
}
|
||||
if(is(Constant.Phase.Main1, Constant.Player.Human)) {
|
||||
if(turn == 1) {
|
||||
if(turn == 1 && is(Constant.Phase.Main1, Constant.Player.Human)) {
|
||||
StormCount = 0;
|
||||
PlayerSpellCount = 0;
|
||||
PlayerCreatureSpellCount = 0;
|
||||
ComputerSpellCount = 0;
|
||||
ComputerCreatureSpellCount = 0;
|
||||
}
|
||||
}
|
||||
//for debugging: System.out.println(getPhase());
|
||||
//System.out.println(getPhase() + " " + getActivePlayer());
|
||||
//System.out.print("");
|
||||
|
||||
@@ -29,18 +29,37 @@ public class PlayerZone_ComesIntoPlay extends DefaultPlayerZone {
|
||||
&& (c.isLand() || c.isCreature() || c.isArtifact())) c.tap();
|
||||
|
||||
//cannot use addComesIntoPlayCommand - trigger might be set to false;
|
||||
if(c.getName().equals("Exploration")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(1);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(1);
|
||||
} else if(c.getName().equals("Azusa, Lost but Seeking")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(2);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(2);
|
||||
} else if(c.getName().equals("Oracle of Mul Daya")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(1);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(1);
|
||||
} else if(c.getName().equals("Fastbond")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(100);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(100);
|
||||
// Keep track of max lands can play per turn
|
||||
int addMax = 0;
|
||||
boolean isHuman = c.getController().equals(Constant.Player.Human);
|
||||
boolean adjustLandPlays = false;
|
||||
boolean eachPlayer = false;
|
||||
|
||||
if(c.getName().equals("Exploration") || c.getName().equals("Oracle of Mul Daya")) {
|
||||
addMax = 1;
|
||||
adjustLandPlays = true;
|
||||
}
|
||||
else if(c.getName().equals("Azusa, Lost but Seeking")) {
|
||||
addMax = 2;
|
||||
adjustLandPlays = true;
|
||||
}
|
||||
else if (c.getName().equals("Storm Cauldron") || c.getName().equals("Rites of Flourishing")){
|
||||
// these two aren't in yet, but will just need the other part of the card to work with more lands
|
||||
adjustLandPlays = true;
|
||||
eachPlayer = true;
|
||||
addMax = 1;
|
||||
}
|
||||
// 7/13: fastbond code removed, fastbond should be unlimited and will be handled elsewhere.
|
||||
|
||||
if (adjustLandPlays){
|
||||
if (eachPlayer){
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(addMax);
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(addMax);
|
||||
}
|
||||
else if (isHuman)
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(addMax);
|
||||
else
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(addMax);
|
||||
}
|
||||
|
||||
if(trigger) {
|
||||
@@ -234,19 +253,36 @@ public class PlayerZone_ComesIntoPlay extends DefaultPlayerZone {
|
||||
|
||||
Card c = (Card) o;
|
||||
|
||||
//cannot use addLeavesPlayCommand - trigger might be set to false
|
||||
if(c.getName().equals("Exploration")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(-1);
|
||||
// Keep track of max lands can play per turn
|
||||
int addMax = 0;
|
||||
boolean isHuman = c.getController().equals(Constant.Player.Human);
|
||||
boolean adjustLandPlays = false;
|
||||
boolean eachPlayer = false;
|
||||
|
||||
if(c.getName().equals("Exploration") || c.getName().equals("Oracle of Mul Daya")) {
|
||||
addMax = -1;
|
||||
adjustLandPlays = true;
|
||||
} else if(c.getName().equals("Azusa, Lost but Seeking")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(-2);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(-2);
|
||||
} else if(c.getName().equals("Oracle of Mul Daya")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(-1);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(-1);
|
||||
} else if(c.getName().equals("Fastbond")) {
|
||||
if(c.getController().equals(Constant.Player.Human)) AllZone.GameInfo.addHumanCanPlayNumberOfLands(-100);
|
||||
else AllZone.GameInfo.addComputerCanPlayNumberOfLands(-100);
|
||||
addMax = -2;
|
||||
adjustLandPlays = true;
|
||||
}
|
||||
else if (c.getName().equals("Storm Cauldron") || c.getName().equals("Rites of Flourishing")){
|
||||
// once their second half of their abilities are programmed these two can be added in
|
||||
adjustLandPlays = true;
|
||||
eachPlayer = true;
|
||||
addMax = -1;
|
||||
}
|
||||
// 7/12: fastbond code removed, fastbond should be unlimited and will be handled elsewhere.
|
||||
|
||||
if (adjustLandPlays){
|
||||
if (eachPlayer){
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(addMax);
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(addMax);
|
||||
}
|
||||
else if (isHuman)
|
||||
AllZone.GameInfo.addHumanMaxPlayNumberOfLands(addMax);
|
||||
else
|
||||
AllZone.GameInfo.addComputerMaxPlayNumberOfLands(addMax);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user