mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 04:38:00 +00:00
- Add?\127ed Spell Snare, Jace Beleren, Timber Protector, Viridian Zealot, ...
- Added Vasiliy's deck download option. - Enchant creature Auras will get destroyed if the permanent which they enchanted ceases to be a creature (eg. Mishra's Factory). - Fixed Mishra's Factory ability text. - Removed Legendary type of all planeswalkers, and added in code to destroy planeswalkers if there are multiple of the same subtype in play.
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -136,6 +136,7 @@ src/forge/Deck.java svneol=native#text/plain
|
||||
src/forge/DeckIO.java svneol=native#text/plain
|
||||
src/forge/DefaultPlayerZone.java svneol=native#text/plain
|
||||
src/forge/Display.java svneol=native#text/plain
|
||||
src/forge/DownloadDeck.java -text svneol=native#text/plain
|
||||
src/forge/EndOfTurn.java svneol=native#text/plain
|
||||
src/forge/ExternalPanel.java svneol=native#text/plain
|
||||
src/forge/FileUtil.java -text svneol=native#text/plain
|
||||
|
||||
@@ -1,3 +1,43 @@
|
||||
Jace Beleren
|
||||
1 U U
|
||||
Planeswalker - Jace
|
||||
no text
|
||||
|
||||
Spell Snare
|
||||
U
|
||||
Instant
|
||||
Counter target spell with converted mana cost 2.
|
||||
|
||||
Timber Protector
|
||||
4 G
|
||||
Creature Treefolk Warrior
|
||||
Other Treefolk creatures you control get +1/+1. Other Treefolk and Forests you control are indestructible.
|
||||
4/6
|
||||
|
||||
Viridian Zealot
|
||||
G G
|
||||
Creature Elf Warrior
|
||||
no text
|
||||
2/1
|
||||
|
||||
Ronom Unicorn
|
||||
1 W
|
||||
Creature Unicorn
|
||||
no text
|
||||
2/2
|
||||
|
||||
Kami of Ancient Law
|
||||
1 W
|
||||
Creature Spirit
|
||||
no text
|
||||
2/2
|
||||
|
||||
Capashen Unicorn
|
||||
1 W
|
||||
Creature Unicorn
|
||||
no text
|
||||
1/2
|
||||
|
||||
Qasali Pridemage
|
||||
G W
|
||||
Creature Cat Wizard
|
||||
@@ -2929,7 +2969,7 @@ Cycling:2
|
||||
|
||||
Nissa Revane
|
||||
2 G G
|
||||
Legendary Planeswalker - Nissa
|
||||
Planeswalker - Nissa
|
||||
no text
|
||||
|
||||
Nissa's Chosen
|
||||
@@ -7713,7 +7753,7 @@ Whenever you draw a card, you may put a hoofprint counter on Hoofprints of the S
|
||||
|
||||
Nicol Bolas, Planeswalker
|
||||
4 U B B R
|
||||
Legendary Planeswalker - Bolas
|
||||
Planeswalker - Bolas
|
||||
no text
|
||||
|
||||
Aven Squire
|
||||
@@ -8769,7 +8809,7 @@ Exalted
|
||||
|
||||
Elspeth, Knight-Errant
|
||||
2 W W
|
||||
Legendary Planeswalker - Elspeth
|
||||
Planeswalker - Elspeth
|
||||
no text
|
||||
|
||||
Ratcatcher
|
||||
@@ -11694,7 +11734,7 @@ Flying
|
||||
Mishra's Factory
|
||||
no cost
|
||||
Land
|
||||
1: Mishra's Factory becomes a 2/2 Assembly-Worker artifact creature until end of turn. It's still a land.
|
||||
no text
|
||||
tap: add 1
|
||||
|
||||
Cranial Extraction
|
||||
@@ -11765,22 +11805,22 @@ Choose two - Incendiary Command deals 4 damage to target player; or Incendiary C
|
||||
|
||||
Ajani Goldmane
|
||||
2 W W
|
||||
Legendary Planeswalker - Ajani
|
||||
Planeswalker - Ajani
|
||||
no text
|
||||
|
||||
Chandra Nalaar
|
||||
3 R R
|
||||
Legendary Planeswalker - Chandra
|
||||
Planeswalker - Chandra
|
||||
no text
|
||||
|
||||
Garruk Wildspeaker
|
||||
2 G G
|
||||
Legendary Planeswalker - Garruk
|
||||
Planeswalker - Garruk
|
||||
no text
|
||||
|
||||
Liliana Vess
|
||||
3 B B
|
||||
Legendary Planeswalker - Liliana
|
||||
Planeswalker - Liliana
|
||||
no text
|
||||
|
||||
Dark Banishing
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
program/mail=mtgerror@yahoo.com
|
||||
program/forum=http://www.slightlymagic.net/forum/viewforum.php?f=26
|
||||
program/version=MTG Forge -- official beta: 09/11/02, SVN revision: 96
|
||||
program/version=MTG Forge -- official beta: 09/11/02, SVN revision: 97
|
||||
|
||||
tokens--file=AllTokens.txt
|
||||
|
||||
|
||||
@@ -17433,6 +17433,34 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase();
|
||||
ability.setBeforePayMana(runtime);
|
||||
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Spell Snare"))
|
||||
{
|
||||
SpellAbility spell = new Spell(card)
|
||||
{
|
||||
private static final long serialVersionUID = -3254886985412814994L;
|
||||
public void resolve()
|
||||
{
|
||||
SpellAbility sa = AllZone.Stack.pop();
|
||||
AllZone.GameAction.moveToGraveyard(sa.getSourceCard());
|
||||
}
|
||||
public boolean canPlay()
|
||||
{
|
||||
if(AllZone.Stack.size() == 0)
|
||||
return false;
|
||||
|
||||
//see if spell is on stack and that opponent played it
|
||||
String opponent = AllZone.GameAction.getOpponent(card.getController());
|
||||
SpellAbility sa = AllZone.Stack.peek();
|
||||
|
||||
return sa.isSpell() && opponent.equals(sa.getSourceCard().getController())
|
||||
&& CardFactoryUtil.isCounterable(sa.getSourceCard()) && CardUtil.getConvertedManaCost(sa.getSourceCard().getManaCost()) == 2;
|
||||
}
|
||||
};
|
||||
card.clearSpellAbility();
|
||||
card.addSpellAbility(spell);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -16528,13 +16528,27 @@ public class CardFactory_Creatures {
|
||||
final Ability ability = new Ability(card, "1")
|
||||
{
|
||||
public void resolve() {
|
||||
if (AllZone.GameAction.isCardInPlay(card))
|
||||
if (AllZone.GameAction.isCardInPlay(card)) {
|
||||
AllZone.GameAction.sacrifice(card);
|
||||
|
||||
Card c = getTargetCard();
|
||||
AllZone.GameAction.destroy(c);
|
||||
Card c = getTargetCard();
|
||||
AllZone.GameAction.destroy(c);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canPlay()
|
||||
{
|
||||
SpellAbility sa;
|
||||
for (int i=0; i<AllZone.Stack.size(); i++)
|
||||
{
|
||||
sa = AllZone.Stack.peek(i);
|
||||
if (sa.getSourceCard().equals(card))
|
||||
return false;
|
||||
}
|
||||
|
||||
return super.canPlay();
|
||||
}
|
||||
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
@@ -16586,6 +16600,243 @@ public class CardFactory_Creatures {
|
||||
card.addSpellAbility(ability);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if (cardName.equals("Viridian Zealot"))
|
||||
{
|
||||
final Ability ability = new Ability(card, "1 G")
|
||||
{
|
||||
public void resolve() {
|
||||
if (AllZone.GameAction.isCardInPlay(card)) {
|
||||
AllZone.GameAction.sacrifice(card);
|
||||
|
||||
Card c = getTargetCard();
|
||||
AllZone.GameAction.destroy(c);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canPlay()
|
||||
{
|
||||
SpellAbility sa;
|
||||
for (int i=0; i<AllZone.Stack.size(); i++)
|
||||
{
|
||||
sa = AllZone.Stack.peek(i);
|
||||
if (sa.getSourceCard().equals(card))
|
||||
return false;
|
||||
}
|
||||
|
||||
return super.canPlay();
|
||||
}
|
||||
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
CardList list = new CardList();
|
||||
list.addAll(hPlay.getCards());
|
||||
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c) {
|
||||
return c.isArtifact() || c.isEnchantment() && CardUtil.getConvertedManaCost(c.getManaCost()) >= 4;
|
||||
}
|
||||
});
|
||||
|
||||
if (list.size() > 0)
|
||||
{
|
||||
list.shuffle();
|
||||
setTargetCard(list.get(0));
|
||||
}
|
||||
|
||||
return list.size() > 0;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
ability.setDescription("1 G, Sacrifice Viridian Zealot: Destroy target artifact or enchantment.");
|
||||
ability.setBeforePayMana(new Input()
|
||||
{
|
||||
private static final long serialVersionUID = -3565024591921095303L;
|
||||
|
||||
public void showMessage()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
PlayerZone cPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer);
|
||||
|
||||
CardList list = new CardList();
|
||||
list.addAll(hPlay.getCards());
|
||||
list.addAll(cPlay.getCards());
|
||||
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c) {
|
||||
return c.isArtifact() || c.isEnchantment();
|
||||
}
|
||||
});
|
||||
|
||||
stopSetNext(CardFactoryUtil.input_targetSpecific(ability, list, "Select an Artifact or Enchantment", true));
|
||||
}
|
||||
});
|
||||
card.addSpellAbility(ability);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if (cardName.equals("Ronom Unicorn") || cardName.equals("Kami of Ancient Law"))
|
||||
{
|
||||
final Ability ability = new Ability(card, "0")
|
||||
{
|
||||
public void resolve() {
|
||||
if (AllZone.GameAction.isCardInPlay(card)) {
|
||||
AllZone.GameAction.sacrifice(card);
|
||||
|
||||
Card c = getTargetCard();
|
||||
AllZone.GameAction.destroy(c);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canPlay()
|
||||
{
|
||||
SpellAbility sa;
|
||||
for (int i=0; i<AllZone.Stack.size(); i++)
|
||||
{
|
||||
sa = AllZone.Stack.peek(i);
|
||||
if (sa.getSourceCard().equals(card))
|
||||
return false;
|
||||
}
|
||||
|
||||
return super.canPlay();
|
||||
}
|
||||
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
CardList list = new CardList();
|
||||
list.addAll(hPlay.getCards());
|
||||
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c) {
|
||||
return c.isEnchantment() && CardUtil.getConvertedManaCost(c.getManaCost()) >= 4;
|
||||
}
|
||||
});
|
||||
|
||||
if (list.size() > 0)
|
||||
{
|
||||
list.shuffle();
|
||||
setTargetCard(list.get(0));
|
||||
}
|
||||
|
||||
return list.size() > 0;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
ability.setDescription("Sacrifice " +cardName +": Destroy target enchantment.");
|
||||
ability.setBeforePayMana(new Input()
|
||||
{
|
||||
private static final long serialVersionUID = -2023409303136493987L;
|
||||
|
||||
public void showMessage()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
PlayerZone cPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer);
|
||||
|
||||
CardList list = new CardList();
|
||||
list.addAll(hPlay.getCards());
|
||||
list.addAll(cPlay.getCards());
|
||||
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c) {
|
||||
return c.isEnchantment();
|
||||
}
|
||||
});
|
||||
|
||||
stopSetNext(CardFactoryUtil.input_targetSpecific(ability, list, "Select target Enchantment", true));
|
||||
}
|
||||
});
|
||||
card.addSpellAbility(ability);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if (cardName.equals("Capashen Unicorn"))
|
||||
{
|
||||
final Ability_Tap ability = new Ability_Tap(card, "1 W")
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = 3723881006291076691L;
|
||||
|
||||
public void resolve() {
|
||||
if (AllZone.GameAction.isCardInPlay(card)) {
|
||||
AllZone.GameAction.sacrifice(card);
|
||||
|
||||
Card c = getTargetCard();
|
||||
AllZone.GameAction.destroy(c);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canPlay()
|
||||
{
|
||||
SpellAbility sa;
|
||||
for (int i=0; i<AllZone.Stack.size(); i++)
|
||||
{
|
||||
sa = AllZone.Stack.peek(i);
|
||||
if (sa.getSourceCard().equals(card))
|
||||
return false;
|
||||
}
|
||||
|
||||
return super.canPlay();
|
||||
}
|
||||
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
CardList list = new CardList();
|
||||
list.addAll(hPlay.getCards());
|
||||
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c) {
|
||||
return c.isArtifact() || c.isEnchantment() && CardUtil.getConvertedManaCost(c.getManaCost()) >= 4;
|
||||
}
|
||||
});
|
||||
|
||||
if (list.size() > 0)
|
||||
{
|
||||
list.shuffle();
|
||||
setTargetCard(list.get(0));
|
||||
}
|
||||
|
||||
return list.size() > 0;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
ability.setDescription("1 W, tap, Sacrifice Capashen Unicorn: Destroy target artifact or enchantment.");
|
||||
ability.setBeforePayMana(new Input()
|
||||
{
|
||||
private static final long serialVersionUID = -4032330058005016682L;
|
||||
|
||||
public void showMessage()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
PlayerZone cPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer);
|
||||
|
||||
CardList list = new CardList();
|
||||
list.addAll(hPlay.getCards());
|
||||
list.addAll(cPlay.getCards());
|
||||
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c) {
|
||||
return c.isArtifact() || c.isEnchantment();
|
||||
}
|
||||
});
|
||||
|
||||
stopSetNext(CardFactoryUtil.input_targetSpecific(ability, list, "Select an Artifact or Enchantment", true));
|
||||
}
|
||||
});
|
||||
card.addSpellAbility(ability);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
// Cards with Cycling abilities
|
||||
// -1 means keyword "Cycling" not found
|
||||
if (shouldCycle(card) != -1)
|
||||
|
||||
@@ -557,6 +557,7 @@ class CardFactory_Lands {
|
||||
}
|
||||
};//SpellAbility
|
||||
card.addSpellAbility(a1);
|
||||
a1.setDescription("1: Mishra's Factory becomes a 2/2 Assembly-Worker artifact creature until end of turn. It's still a land.");
|
||||
a1.setStackDescription(card +" - becomes a 2/2 creature until EOT");
|
||||
|
||||
Command paid1 = new Command() {
|
||||
|
||||
@@ -1866,6 +1866,143 @@ class CardFactory_Planeswalkers {
|
||||
return card2;
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if (cardName.equals("Jace Beleren"))
|
||||
{
|
||||
|
||||
final int turn[] = new int[1];
|
||||
turn[0] = -1;
|
||||
|
||||
final Card card2 = new Card()
|
||||
{
|
||||
public void addDamage(int n)
|
||||
{
|
||||
subtractCounter(Counters.LOYALTY,n);
|
||||
AllZone.GameAction.checkStateEffects();
|
||||
}
|
||||
};
|
||||
card2.addCounter(Counters.LOYALTY,3);
|
||||
|
||||
card2.setOwner(owner);
|
||||
card2.setController(owner);
|
||||
|
||||
card2.setName(card.getName());
|
||||
card2.setType(card.getType());
|
||||
card2.setManaCost(card.getManaCost());
|
||||
card2.addSpellAbility(new Spell_Permanent(card2));
|
||||
|
||||
|
||||
//ability1
|
||||
final SpellAbility ability1 = new Ability(card2, "0")
|
||||
{
|
||||
public void resolve()
|
||||
{
|
||||
card2.addCounter(Counters.LOYALTY, 2);
|
||||
|
||||
turn[0] = AllZone.Phase.getTurn();
|
||||
|
||||
AllZone.GameAction.drawCard(Constant.Player.Computer);
|
||||
AllZone.GameAction.drawCard(Constant.Player.Human);
|
||||
|
||||
}//resolve()
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
return card2.getCounters(Counters.LOYALTY) < 11 && AllZone.Phase.getPhase().equals(Constant.Phase.Main2);
|
||||
}
|
||||
public boolean canPlay()
|
||||
{
|
||||
return AllZone.getZone(card2).is(Constant.Zone.Play) &&
|
||||
turn[0] != AllZone.Phase.getTurn() &&
|
||||
AllZone.Phase.getActivePlayer().equals(card2.getController()) &&
|
||||
!AllZone.Phase.getPhase().equals("End of Turn") &&
|
||||
(AllZone.Phase.getPhase().equals("Main1") || AllZone.Phase.getPhase().equals("Main2"));
|
||||
}//canPlay()
|
||||
};
|
||||
|
||||
ability1.setDescription("+2: Each player draws a card.");
|
||||
ability1.setStackDescription(cardName + " - Each player draws a card.");
|
||||
|
||||
//ability2
|
||||
final SpellAbility ability2 = new Ability(card2, "0")
|
||||
{
|
||||
public void resolve()
|
||||
{
|
||||
card2.subtractCounter(Counters.LOYALTY, 1);
|
||||
|
||||
turn[0] = AllZone.Phase.getTurn();
|
||||
String player = getTargetPlayer();
|
||||
|
||||
AllZone.GameAction.drawCard(player);
|
||||
|
||||
}//resolve()
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public boolean canPlay()
|
||||
{
|
||||
return AllZone.getZone(card2).is(Constant.Zone.Play) &&
|
||||
card2.getCounters(Counters.LOYALTY) >= 1 &&
|
||||
turn[0] != AllZone.Phase.getTurn() &&
|
||||
AllZone.Phase.getActivePlayer().equals(card2.getController()) &&
|
||||
!AllZone.Phase.getPhase().equals("End of Turn") &&
|
||||
(AllZone.Phase.getPhase().equals("Main1") || AllZone.Phase.getPhase().equals("Main2"));
|
||||
}//canPlay()
|
||||
};
|
||||
ability2.setDescription("-1: Target player draws a card.");
|
||||
ability2.setBeforePayMana(CardFactoryUtil.input_targetPlayer(ability2));
|
||||
|
||||
//ability3
|
||||
final SpellAbility ability3 = new Ability(card2, "0")
|
||||
{
|
||||
public void resolve()
|
||||
{
|
||||
card2.subtractCounter(Counters.LOYALTY, 10);
|
||||
|
||||
turn[0] = AllZone.Phase.getTurn();
|
||||
String player = getTargetPlayer();
|
||||
|
||||
PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player);
|
||||
PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, player);
|
||||
CardList libList = new CardList(lib.getCards());
|
||||
|
||||
int max = 20;
|
||||
if (libList.size() < 20)
|
||||
max = libList.size();
|
||||
|
||||
for (int i=0;i<max;i++)
|
||||
{
|
||||
Card c = libList.get(i);
|
||||
lib.remove(c);
|
||||
grave.add(c);
|
||||
}
|
||||
|
||||
}//resolve()
|
||||
public boolean canPlayAI()
|
||||
{
|
||||
setTargetPlayer(Constant.Player.Human);
|
||||
return card2.getCounters(Counters.LOYALTY) >= 11;
|
||||
}
|
||||
public boolean canPlay()
|
||||
{
|
||||
return AllZone.getZone(card2).is(Constant.Zone.Play) &&
|
||||
card2.getCounters(Counters.LOYALTY) >= 10 &&
|
||||
turn[0] != AllZone.Phase.getTurn() &&
|
||||
AllZone.Phase.getActivePlayer().equals(card2.getController()) &&
|
||||
!AllZone.Phase.getPhase().equals("End of Turn") &&
|
||||
(AllZone.Phase.getPhase().equals("Main1") || AllZone.Phase.getPhase().equals("Main2"));
|
||||
}//canPlay()
|
||||
};
|
||||
ability3.setDescription("-10: Target player puts the top twenty cards of his or her library into his or her graveyard.");
|
||||
ability3.setBeforePayMana(CardFactoryUtil.input_targetPlayer(ability3));
|
||||
|
||||
card2.addSpellAbility(ability1);
|
||||
card2.addSpellAbility(ability2);
|
||||
card2.addSpellAbility(ability3);
|
||||
|
||||
return card2;
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
return card;
|
||||
}
|
||||
}
|
||||
147
src/forge/DownloadDeck.java
Normal file
147
src/forge/DownloadDeck.java
Normal file
@@ -0,0 +1,147 @@
|
||||
package forge;
|
||||
|
||||
public class DownloadDeck {
|
||||
|
||||
private Card DownloadCard;
|
||||
|
||||
public String FoundNumberCard(String rStr)
|
||||
{
|
||||
int temp;
|
||||
int i;
|
||||
|
||||
for(i=0; i<rStr.length();i++)
|
||||
{
|
||||
temp=rStr.codePointAt(i) ;
|
||||
if(temp>=48 && temp<=57)
|
||||
{
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if(rStr.codePointAt(i+1)>=48 &&rStr.codePointAt(i+1)<=57)
|
||||
{
|
||||
return rStr.substring(i,i+2);
|
||||
}else
|
||||
{
|
||||
return rStr.substring(i,i+1);
|
||||
}
|
||||
}
|
||||
|
||||
public String FoundNameCard(String rStr)
|
||||
{
|
||||
int temp;
|
||||
int i;
|
||||
|
||||
for(i=0; i<rStr.length();i++)
|
||||
{
|
||||
temp=rStr.codePointAt(i) ;
|
||||
if(temp>=48 && temp<=57)
|
||||
{
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return rStr.substring(0,i-1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String RemoveSpace(String rStr)
|
||||
{
|
||||
int temp;
|
||||
int i;
|
||||
|
||||
for(i=0; i<rStr.length();i++)
|
||||
{
|
||||
temp=rStr.codePointAt(i) ;
|
||||
if(temp!=32)
|
||||
{
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return rStr.substring(i);
|
||||
}
|
||||
public String RemoveSpaceBack(String rStr)
|
||||
{
|
||||
int temp;
|
||||
int i;
|
||||
|
||||
for(i=rStr.length()-1; i>-1;i=i-1)
|
||||
{
|
||||
temp=rStr.codePointAt(i) ;
|
||||
if(temp!=32)
|
||||
{
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return rStr.substring(0,i+1);
|
||||
}
|
||||
|
||||
public String RemoveFoundNumberCard(String rStr, String Number)
|
||||
{
|
||||
int a;
|
||||
int temp;
|
||||
a=rStr.indexOf(Number);
|
||||
temp=rStr.codePointAt(a+1) ;
|
||||
if(temp>=48 && temp<=57)
|
||||
{
|
||||
return rStr.substring(a+2);
|
||||
}else
|
||||
{
|
||||
return rStr.substring(a+1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public String RemoveFoundNameCard(String rStr, String Name)
|
||||
{
|
||||
int a;
|
||||
a=Name.length();
|
||||
return rStr.substring(a);
|
||||
|
||||
}
|
||||
|
||||
public boolean IsCardSupport(String CardName)
|
||||
{
|
||||
CardList all = AllZone.CardFactory.getAllCards();
|
||||
|
||||
Card gCard = new Card();
|
||||
for(int i=0;i<all.size();i++)
|
||||
{
|
||||
gCard = all.getCard(i);
|
||||
if(CardName.equalsIgnoreCase(gCard.getName()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Card GetCardDownload(Card c, String CardName)
|
||||
{
|
||||
CardList all = AllZone.CardFactory.getAllCards();
|
||||
|
||||
|
||||
for(int i=0;i<all.size();i++)
|
||||
{
|
||||
DownloadCard = all.getCard(i);
|
||||
|
||||
if(CardName.equalsIgnoreCase(DownloadCard.getName()))
|
||||
{
|
||||
return DownloadCard;
|
||||
}
|
||||
}
|
||||
return DownloadCard;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -391,7 +391,8 @@ private Card getCurrentCard(int ID)
|
||||
for (int i=0;i < c.getEnchanting().size(); i++)
|
||||
{
|
||||
Card perm = c.getEnchanting().get(i);
|
||||
if (!AllZone.GameAction.isCardInPlay(perm) || CardFactoryUtil.hasProtectionFrom(c, perm))
|
||||
if (!AllZone.GameAction.isCardInPlay(perm) || CardFactoryUtil.hasProtectionFrom(c, perm)
|
||||
|| (c.getKeyword().contains("Enchant creature") && !perm.getType().contains("Creature")) )
|
||||
{
|
||||
c.unEnchantCard(perm);
|
||||
destroy(c);
|
||||
@@ -436,9 +437,21 @@ private Card getCurrentCard(int ID)
|
||||
for(int i = 0; i < list.size(); i++)
|
||||
{
|
||||
c = list.get(i);
|
||||
|
||||
if(c.getCounters(Counters.LOYALTY) <= 0)
|
||||
AllZone.GameAction.moveToGraveyard(c);
|
||||
|
||||
CardList cl = getPlaneswalkerSubtype(list, c);
|
||||
|
||||
if (cl.size() > 1)
|
||||
{
|
||||
for (Card crd : cl)
|
||||
{
|
||||
AllZone.GameAction.moveToGraveyard(crd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void destroyLegendaryCreatures()
|
||||
@@ -454,6 +467,8 @@ private Card getCurrentCard(int ID)
|
||||
{
|
||||
for(int i = 0; i < b.size(); i++)
|
||||
AllZone.GameAction.destroy((Card)b.get(i));
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}//destroyLegendaryCreatures()
|
||||
@@ -472,6 +487,21 @@ private Card getCurrentCard(int ID)
|
||||
return a;
|
||||
}
|
||||
|
||||
public CardList getPlaneswalkerSubtype(CardList search, Card planeswalker)
|
||||
{
|
||||
final String type = planeswalker.getType().toString();
|
||||
CardList list = search;
|
||||
list = list.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c)
|
||||
{
|
||||
return c.getType().toString().equals(type);
|
||||
}
|
||||
});
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
public void sacrificeCreature(String player, SpellAbility sa)
|
||||
{
|
||||
|
||||
@@ -8809,6 +8809,115 @@ public class GameActionUtil
|
||||
|
||||
};//Elvish_Champion_Other
|
||||
|
||||
public static Command Timber_Protector_Pump = new Command()
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = 395882142255572162L;
|
||||
CardList gloriousAnthemList = new CardList();
|
||||
|
||||
public void execute()
|
||||
{
|
||||
|
||||
CardList cList = gloriousAnthemList;
|
||||
Card c;
|
||||
|
||||
for (int i = 0; i < cList.size(); i++)
|
||||
{
|
||||
c = cList.get(i);
|
||||
if (c.isCreature()) {
|
||||
c.addSemiPermanentAttackBoost(-1);
|
||||
c.addSemiPermanentDefenseBoost(-1);
|
||||
c.removeExtrinsicKeyword("Indestructible");
|
||||
}
|
||||
else //forest
|
||||
{
|
||||
c.removeExtrinsicKeyword("Indestructible");
|
||||
}
|
||||
}
|
||||
cList.clear();
|
||||
PlayerZone[] zone = getZone("Timber Protector");
|
||||
|
||||
// for each zone found add +1/+1 to each card
|
||||
for (int outer = 0; outer < zone.length; outer++)
|
||||
{
|
||||
CardList creature = new CardList();
|
||||
creature.addAll(AllZone.Human_Play.getCards());
|
||||
creature.addAll(AllZone.Computer_Play.getCards());
|
||||
creature = creature.filter(new CardListFilter()
|
||||
{
|
||||
public boolean addCard(Card c)
|
||||
{
|
||||
return c.getType().equals("Treefolk") || c.getType().equals("Forest") || c.getKeyword().contains("Changeling");
|
||||
}
|
||||
});
|
||||
|
||||
for (int i = 0; i < creature.size(); i++)
|
||||
{
|
||||
c = creature.get(i);
|
||||
if (c.isCreature()
|
||||
&& !c.getName().equals("Timber Protector"))
|
||||
{
|
||||
c.addSemiPermanentAttackBoost(1);
|
||||
c.addSemiPermanentDefenseBoost(1);
|
||||
c.addExtrinsicKeyword("Indestructible");
|
||||
gloriousAnthemList.add(c);
|
||||
}
|
||||
else if (c.getKeyword().contains("Forest"))
|
||||
{
|
||||
c.addExtrinsicKeyword("Indestructible");
|
||||
}
|
||||
|
||||
} // for
|
||||
} // for
|
||||
|
||||
}// execute()
|
||||
|
||||
};//Timber_Protector_Pump
|
||||
|
||||
public static Command Timber_Protector_Other = new Command()
|
||||
{
|
||||
private static final long serialVersionUID = -3107498901233064819L;
|
||||
int otherLords=0;
|
||||
|
||||
private int countOtherLords()
|
||||
{
|
||||
PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human);
|
||||
PlayerZone cPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer);
|
||||
CardList lords = new CardList();
|
||||
lords.addAll(hPlay.getCards());
|
||||
lords.addAll(cPlay.getCards());
|
||||
lords = lords.getName("Timber Protector");
|
||||
return lords.size()-1;
|
||||
|
||||
}
|
||||
|
||||
public void execute()
|
||||
{
|
||||
|
||||
|
||||
CardList creature = new CardList();
|
||||
creature.addAll(AllZone.Human_Play.getCards());
|
||||
creature.addAll(AllZone.Computer_Play.getCards());
|
||||
|
||||
creature = creature.getName("Timber Protector");
|
||||
|
||||
for (int i = 0; i < creature.size(); i++)
|
||||
{
|
||||
Card c = creature.get(i);
|
||||
otherLords = countOtherLords();
|
||||
c.setOtherAttackBoost(otherLords);
|
||||
c.setOtherDefenseBoost(otherLords);
|
||||
if (!c.getExtrinsicKeyword().contains("Indestructible") && otherLords > 0)
|
||||
c.addExtrinsicKeyword("Indestructible");
|
||||
//else if (c.getExtrinsicKeyword().contains("Mountainwalk") && otherLords == 0 )
|
||||
|
||||
|
||||
}// for inner
|
||||
}// execute()
|
||||
|
||||
};//Timber_Protector_Other
|
||||
|
||||
|
||||
public static Command Goblin_Chieftain_Pump = new Command()
|
||||
{
|
||||
|
||||
@@ -11582,6 +11691,8 @@ public class GameActionUtil
|
||||
commands.put("Merfolk_Sovereign_Other", Merfolk_Sovereign_Other);
|
||||
commands.put("Lord_of_Atlantis_Pump", Lord_of_Atlantis_Pump);
|
||||
commands.put("Lord_of_Atlantis_Other", Lord_of_Atlantis_Other);
|
||||
commands.put("Timber_Protector_Pump", Timber_Protector_Pump);
|
||||
commands.put("Timber_Protector_Other", Timber_Protector_Other);
|
||||
commands.put("Goblin_Chieftain_Pump", Goblin_Chieftain_Pump);
|
||||
commands.put("Goblin_Chieftain_Other", Goblin_Chieftain_Other);
|
||||
commands.put("Goblin_King_Pump", Goblin_King_Pump);
|
||||
|
||||
@@ -4,12 +4,18 @@ package forge;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.net.Proxy;
|
||||
import java.net.URL;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -26,6 +32,7 @@ import javax.swing.filechooser.FileFilter;
|
||||
import forge.error.ErrorViewer;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.properties.NewConstants.LANG.Gui_DownloadPictures.ERRORS;
|
||||
|
||||
|
||||
interface DeckDisplay {
|
||||
@@ -66,6 +73,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
private DeckDisplay deckDisplay;
|
||||
|
||||
private Command exitCommand;
|
||||
|
||||
|
||||
public Gui_DeckEditor_Menu(DeckDisplay in_display, Command exit) {
|
||||
deckDisplay = in_display;
|
||||
@@ -308,6 +316,8 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
private File getImportFilename() {
|
||||
JFileChooser chooser = new JFileChooser(previousDirectory);
|
||||
@@ -402,6 +412,153 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
|
||||
}//importDeck()
|
||||
|
||||
private void downloadDeck(){
|
||||
|
||||
Object o = JOptionPane.showInputDialog(null, "URL(only from http://magic.tcgplayer.com):", "Download Deck", JOptionPane.OK_CANCEL_OPTION);
|
||||
if(o==null )
|
||||
{
|
||||
return;
|
||||
}
|
||||
String url = o.toString();
|
||||
|
||||
if((url.length()<37)||(url.substring(0, 39).equalsIgnoreCase("http://magic.tcgplayer.com/db/deck.asp") ) )
|
||||
{
|
||||
JOptionPane.showMessageDialog(null, "Bad URL." +"\n"+ "Support only deck from http://magic.tcgplayer.com"+ "\n"+ "Example: http://magic.tcgplayer.com/db/deck.asp?deck_id=474146", "Information", JOptionPane.INFORMATION_MESSAGE );
|
||||
return;
|
||||
}
|
||||
Proxy p = null;
|
||||
p = Proxy.NO_PROXY;
|
||||
BufferedInputStream in;
|
||||
BufferedOutputStream out;
|
||||
try {
|
||||
byte[] buf = new byte[1024];
|
||||
int len;
|
||||
File f = new File("deck_temp.html");
|
||||
in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream());
|
||||
out = new BufferedOutputStream(new FileOutputStream(f));
|
||||
//while - read and write file
|
||||
while((len = in.read(buf)) != -1) {
|
||||
out.write(buf, 0, len);
|
||||
|
||||
}//while - read and write file
|
||||
in.close();
|
||||
out.flush();
|
||||
out.close();
|
||||
String fileName = "deck_temp.html";
|
||||
FileReader fr = new FileReader(fileName);
|
||||
BufferedReader br = new BufferedReader(fr);
|
||||
String s = "";
|
||||
String z = "";
|
||||
while((z=br.readLine())!=null){s=s+z;}
|
||||
br.close();
|
||||
int start = s.indexOf("MAIN DECK");
|
||||
int finish = s.indexOf("SIDEBOARD");
|
||||
String rStr = "";
|
||||
rStr = s.substring(start+9, finish);
|
||||
int first;
|
||||
int second;
|
||||
while (rStr.indexOf("<")!=-1)
|
||||
{
|
||||
first = rStr.indexOf("<");
|
||||
second = rStr.indexOf(">", first);
|
||||
if(first==0){
|
||||
rStr =rStr.substring(second+1);
|
||||
}else
|
||||
{
|
||||
rStr = rStr.substring(0, first)+" "+rStr.substring(second+1);
|
||||
}
|
||||
}
|
||||
first = rStr.indexOf("Creatures [");
|
||||
second = rStr.indexOf("]", first);
|
||||
if (first!=-1){
|
||||
rStr = rStr.substring(0,first)+rStr.substring(second+1);
|
||||
}
|
||||
first = rStr.indexOf("Spells [");
|
||||
second = rStr.indexOf("]", first);
|
||||
if (first!=-1){
|
||||
rStr = rStr.substring(0,first)+rStr.substring(second+1);
|
||||
}
|
||||
first = rStr.indexOf("Lands [");
|
||||
second = rStr.indexOf("]", first);
|
||||
if (first!=-1){
|
||||
rStr = rStr.substring(0,first)+rStr.substring(second+1);
|
||||
}
|
||||
String number[] =new String[59];
|
||||
String name[]=new String[59];
|
||||
int count=0;
|
||||
DownloadDeck download = new DownloadDeck();
|
||||
while(rStr.length()!=0)
|
||||
{
|
||||
rStr=download.RemoveSpace(rStr);
|
||||
number[count]=download.FoundNumberCard(rStr);
|
||||
rStr=download.RemoveFoundNumberCard(rStr, number[count]);
|
||||
rStr=download.RemoveSpace(rStr);
|
||||
name[count]=download.FoundNameCard(rStr);
|
||||
name[count]=download.RemoveSpaceBack(name[count]);
|
||||
rStr=download.RemoveFoundNameCard(rStr, name[count]);
|
||||
rStr=download.RemoveSpace(rStr);
|
||||
count=count+1;
|
||||
}
|
||||
String trueName[]=new String[59];
|
||||
String trueNumber[]=new String[59];
|
||||
String falseName[]=new String[59];
|
||||
int trueCount=0;
|
||||
int falseCount=0;
|
||||
for(int i=0;i<count;i++)
|
||||
{
|
||||
if (download.IsCardSupport(name[i])==true)
|
||||
{
|
||||
trueName[trueCount]=name[i];
|
||||
trueNumber[trueCount]=number[i];
|
||||
trueCount = trueCount+1;
|
||||
}else
|
||||
{
|
||||
falseName[falseCount]=name[i];
|
||||
falseCount = falseCount+1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Card c = new Card();
|
||||
CardList trueList = new CardList();
|
||||
for(int i=0;i<trueCount;i++)
|
||||
{
|
||||
for(int k=0; k<Integer.parseInt(trueNumber[i]);k++)
|
||||
{
|
||||
c= download.GetCardDownload(c, trueName[i]);
|
||||
trueList.add(c);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
String FalseCards ="";
|
||||
for(int i=0;i<falseCount;i++)
|
||||
{
|
||||
FalseCards = FalseCards +"\n" +falseName[i] +",";
|
||||
}
|
||||
|
||||
|
||||
deckDisplay.updateDisplay(deckDisplay.getTop(), trueList);
|
||||
|
||||
if(falseCount==0){
|
||||
JOptionPane.showMessageDialog(null, "Deck downloads.", "Information", JOptionPane.INFORMATION_MESSAGE );
|
||||
}else
|
||||
{
|
||||
JOptionPane.showMessageDialog(null, "Sorry, cards:"+FalseCards+"\nnot supported in this version MTGForge. \nDeck downloads without this cards.", "Information", JOptionPane.INFORMATION_MESSAGE );
|
||||
}
|
||||
|
||||
f.delete();
|
||||
|
||||
} catch(Exception ex) {
|
||||
ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.OTHER), "deck_temp.html",
|
||||
url);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void exportDeck() {
|
||||
File filename = getExportFilename();
|
||||
|
||||
@@ -714,7 +871,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
// save();
|
||||
|
||||
deckIO.close();
|
||||
boosterDeckIO.close();
|
||||
boosterDeckIO.close();
|
||||
exitCommand.execute();
|
||||
}//close
|
||||
|
||||
@@ -838,6 +995,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
|
||||
JMenuItem importDeck = new JMenuItem("Import Deck");
|
||||
JMenuItem exportDeck = new JMenuItem("Export Deck");
|
||||
JMenuItem downloadDeck = new JMenuItem("Download Deck");
|
||||
|
||||
|
||||
JMenuItem openConstructed = new JMenuItem("Open Deck - Constructed");
|
||||
@@ -866,6 +1024,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
|
||||
fileMenu.add(importDeck);
|
||||
fileMenu.add(exportDeck);
|
||||
fileMenu.add(downloadDeck);
|
||||
fileMenu.addSeparator();
|
||||
|
||||
fileMenu.add(newRandomConstructed);
|
||||
@@ -913,6 +1072,20 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants {
|
||||
}
|
||||
});
|
||||
|
||||
downloadDeck.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
try {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
downloadDeck();
|
||||
}
|
||||
});
|
||||
} catch(Exception ex) {
|
||||
ErrorViewer.showError(ex);
|
||||
throw new RuntimeException("Gui_DeckEditor_Menu : downloadDeck() error - " + ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
newConstructed.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
|
||||
@@ -65,6 +65,7 @@ public class StateBasedEffects
|
||||
cardToEffectsList.put("Privileged Position", new String[] {"Privileged_Position", "Privileged_Position_Other"});
|
||||
cardToEffectsList.put("Elvish Archdruid", new String[] {"Elvish_Archdruid_Pump", "Elvish_Archdruid_Other"});
|
||||
cardToEffectsList.put("Wizened Cenn", new String[] {"Wizened_Cenn_Pump", "Wizened_Cenn_Other"});
|
||||
cardToEffectsList.put("Timber Protector", new String[] {"Timber_Protector_Pump", "Timber_Protector_Other"});
|
||||
cardToEffectsList.put("Goblin Chieftain", new String[] {"Goblin_Chieftain_Pump", "Goblin_Chieftain_Other"});
|
||||
cardToEffectsList.put("Goblin King", new String[] {"Goblin_King_Pump", "Goblin_King_Other"});
|
||||
cardToEffectsList.put("Merfolk Sovereign", new String[] {"Merfolk_Sovereign_Pump", "Merfolk_Sovereign_Other"});
|
||||
|
||||
Reference in New Issue
Block a user