mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
- Radiant, Archangel is a 3/3 now.
- Discarding when controlling Necropotence should exile the card. - Fixed a bug in the combat code where if a creature has received equal to its toughness, it will die no matter what. - Umezawa's Jitte should trigger now when attacking a planeswalker. - Added Pit Scorpion and Serpent Generator.
This commit is contained in:
@@ -18,6 +18,8 @@ forest.jpg http://resources.wizards.com/magic/cards/unh/en-us/card73946.jpg
|
||||
forest1.jpg http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=2748
|
||||
forest2.jpg http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=587
|
||||
forest3.jpg http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=586
|
||||
serpent_generator.jpg http://www.wizards.com/global/images/magic/general/serpent_generator.jpg
|
||||
pit_scorpion.jpg http://www.wizards.com/global/images/magic/general/pit_scorpion.jpg
|
||||
bridge_from_below.jpg http://www.wizards.com/global/images/magic/general/bridge_from_below.jpg
|
||||
swamp_mosquito.jpg http://www.wizards.com/global/images/magic/general/swamp_mosquito.jpg
|
||||
suqata_assassin.jpg http://www.wizards.com/global/images/magic/general/suqata_assassin.jpg
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
Serpent Generator
|
||||
6
|
||||
Artifact
|
||||
no text
|
||||
|
||||
Pit Scorpion
|
||||
2 B
|
||||
Creature Scorpion
|
||||
Whenever this creature deals damage to a player, that player gets a poison counter.
|
||||
1/1
|
||||
|
||||
Bridge from Below
|
||||
B B B
|
||||
Enchantment
|
||||
@@ -13933,7 +13944,7 @@ Radiant, Archangel
|
||||
3 W W
|
||||
Legendary Creature Angel
|
||||
Radiant, Archangel gets +1/+1 for each creature with flying in play.
|
||||
2/2
|
||||
3/3
|
||||
Flying
|
||||
Vigilance
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<java version="1.6.0_16" class="java.beans.XMLDecoder">
|
||||
<java version="1.6.0_17" class="java.beans.XMLDecoder">
|
||||
<object id="MultiSplitLayout$Split0" class="org.jdesktop.swingx.MultiSplitLayout$Split">
|
||||
<void property="bounds">
|
||||
<object class="java.awt.Rectangle">
|
||||
@@ -64,7 +64,7 @@
|
||||
<int>0</int>
|
||||
<int>148</int>
|
||||
<int>244</int>
|
||||
<int>181</int>
|
||||
<int>183</int>
|
||||
</object>
|
||||
</void>
|
||||
<void property="name">
|
||||
@@ -83,7 +83,7 @@
|
||||
<void property="bounds">
|
||||
<object class="java.awt.Rectangle">
|
||||
<int>0</int>
|
||||
<int>329</int>
|
||||
<int>331</int>
|
||||
<int>244</int>
|
||||
<int>10</int>
|
||||
</object>
|
||||
@@ -98,9 +98,9 @@
|
||||
<void property="bounds">
|
||||
<object class="java.awt.Rectangle">
|
||||
<int>0</int>
|
||||
<int>339</int>
|
||||
<int>341</int>
|
||||
<int>244</int>
|
||||
<int>115</int>
|
||||
<int>113</int>
|
||||
</object>
|
||||
</void>
|
||||
<void property="name">
|
||||
@@ -339,7 +339,7 @@
|
||||
<int>254</int>
|
||||
<int>512</int>
|
||||
<int>902</int>
|
||||
<int>137</int>
|
||||
<int>146</int>
|
||||
</object>
|
||||
</void>
|
||||
<void property="name">
|
||||
@@ -358,7 +358,7 @@
|
||||
<void property="bounds">
|
||||
<object class="java.awt.Rectangle">
|
||||
<int>254</int>
|
||||
<int>649</int>
|
||||
<int>658</int>
|
||||
<int>902</int>
|
||||
<int>10</int>
|
||||
</object>
|
||||
@@ -373,9 +373,9 @@
|
||||
<void property="bounds">
|
||||
<object class="java.awt.Rectangle">
|
||||
<int>254</int>
|
||||
<int>659</int>
|
||||
<int>668</int>
|
||||
<int>902</int>
|
||||
<int>168</int>
|
||||
<int>159</int>
|
||||
</object>
|
||||
</void>
|
||||
<void property="name">
|
||||
|
||||
@@ -17801,9 +17801,47 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase();
|
||||
};
|
||||
card.clearSpellAbility();
|
||||
card.addSpellAbility(spell);
|
||||
}
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
|
||||
|
||||
//*************** START *********** START **************************
|
||||
if (cardName.equals("Serpent Generator"))
|
||||
{
|
||||
final SpellAbility ability = new Ability_Tap(card, "4")
|
||||
{
|
||||
private static final long serialVersionUID = 8428205362391909464L;
|
||||
|
||||
public void resolve()
|
||||
{
|
||||
PlayerZone play = AllZone.getZone(card);
|
||||
Card c = new Card();
|
||||
|
||||
c.setOwner(card.getController());
|
||||
c.setController(card.getController());
|
||||
|
||||
c.setName("Snake");
|
||||
c.setImageName("C 1 1 Snake");
|
||||
c.setManaCost("");
|
||||
c.setToken(true);
|
||||
|
||||
c.addType("Artifact");
|
||||
c.addType("Creature");
|
||||
c.addType("Snake");
|
||||
c.setBaseAttack(1);
|
||||
c.setBaseDefense(1);
|
||||
|
||||
c.addIntrinsicKeyword("Whenever this creature deals damage to a player, that player gets a poison counter.");
|
||||
|
||||
play.add(c);
|
||||
}
|
||||
};
|
||||
ability.setStackDescription("Put a 1/1 colorless Snake artifact creature token onto the battlefield. This creature has \"Whenever this creature deals damage to a player, that player gets a poison counter.\"");
|
||||
ability.setDescription("4, Tap: Put a 1/1 colorless Snake artifact creature token onto the battlefield. This creature has \"Whenever this creature deals damage to a player, that player gets a poison counter.\" (A player with ten or more poison counters loses the game.)");
|
||||
card.addSpellAbility(ability);
|
||||
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
// Cards with Cycling abilities
|
||||
// -1 means keyword "Cycling" not found
|
||||
if (hasKeyword(card, "Cycling") != -1)
|
||||
|
||||
@@ -2917,6 +2917,14 @@ public class CardFactoryUtil
|
||||
return s;
|
||||
}
|
||||
|
||||
public static boolean hasNecropotence(String player)
|
||||
{
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, player);
|
||||
CardList list = new CardList(play.getCards());
|
||||
list = list.getName("Necropotence");
|
||||
return list.size() > 0;
|
||||
}
|
||||
|
||||
public static int getCanPlayNumberOfLands(String player)
|
||||
{
|
||||
int count = 1;
|
||||
@@ -2941,6 +2949,7 @@ public class CardFactoryUtil
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
public static CardList getFastbonds(String player)
|
||||
{
|
||||
CardList list = new CardList(AllZone.getZone(Constant.Zone.Play, player).getCards());
|
||||
|
||||
@@ -570,6 +570,25 @@ public class CombatUtil
|
||||
return display;
|
||||
}//getPlaneswalkerBlockers()
|
||||
|
||||
public static void executeCombatDamageEffects(Card c)
|
||||
{
|
||||
if (c.getKeyword().contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(c);
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(c, "Guilty Conscience");
|
||||
for (Card crd : cl)
|
||||
GameActionUtil.executeGuiltyConscienceEffects(c, crd);
|
||||
|
||||
if(CardFactoryUtil.hasNumberEquipments(c, "Umezawa's Jitte") == 1 && c.getNetAttack() > 0)
|
||||
{
|
||||
PlayerZone play = AllZone.getZone(c);
|
||||
CardList clist = new CardList(play.getCards());
|
||||
clist = clist.getName("Umezawa's Jitte");
|
||||
Card jitte = clist.get(0);
|
||||
jitte.addCounter(Counters.CHARGE, 2);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean canBlockProtection(Card attacker, Card blocker)
|
||||
{
|
||||
ArrayList<String> list = attacker.getKeyword();
|
||||
|
||||
@@ -99,6 +99,8 @@ private Card getCurrentCard(int ID)
|
||||
discard_nath(c);
|
||||
discard_megrim(c);
|
||||
moveToGraveyard(c);
|
||||
if (CardFactoryUtil.hasNecropotence(c.getOwner()))
|
||||
removeFromGame(c);
|
||||
}
|
||||
|
||||
public void discardRandom(String player, int numDiscard)
|
||||
|
||||
@@ -3630,6 +3630,9 @@ public class GameActionUtil
|
||||
public static void executePlayerCombatDamageEffects(Card c)
|
||||
{
|
||||
|
||||
if (c.getKeyword().contains("Whenever this creature deals damage to a player, that player gets a poison counter."))
|
||||
playerCombatDamage_PoisonCounter(c);
|
||||
|
||||
if (c.getName().equals("Hypnotic Specter"))
|
||||
playerCombatDamage_Hypnotic_Specter(c);
|
||||
else if (c.getName().equals("Dimir Cutpurse"))
|
||||
@@ -3724,6 +3727,18 @@ public class GameActionUtil
|
||||
}//for
|
||||
}
|
||||
*/
|
||||
|
||||
private static void playerCombatDamage_PoisonCounter(Card c)
|
||||
{
|
||||
final String player = c.getController();
|
||||
final String opponent = AllZone.GameAction.getOpponent(player);
|
||||
|
||||
if (opponent.equals(Constant.Player.Human))
|
||||
AllZone.Human_PoisonCounter.addPoisonCounters(1);
|
||||
else
|
||||
AllZone.Computer_PoisonCounter.addPoisonCounters(1);
|
||||
}
|
||||
|
||||
private static void playerCombatDamage_Oros(Card c)
|
||||
{
|
||||
SpellAbility[] sa = c.getSpellAbility();
|
||||
@@ -13291,7 +13306,6 @@ public class GameActionUtil
|
||||
else k = countHand_Computer();
|
||||
c.setBaseAttack(k);
|
||||
c.setBaseDefense(k);
|
||||
|
||||
}
|
||||
}
|
||||
private int countHand_Human()
|
||||
@@ -14036,7 +14050,7 @@ public class GameActionUtil
|
||||
{
|
||||
public boolean addCard(Card c)
|
||||
{
|
||||
return c.isCreature() && c.getKeyword().contains("Flying");
|
||||
return c.isCreature() && c.getKeyword().contains("Flying") && !c.getName().equals("Radiant, Archangel");
|
||||
}
|
||||
});
|
||||
return flying.size();
|
||||
|
||||
@@ -119,23 +119,7 @@ private void playerDamage(PlayerLife p)
|
||||
}
|
||||
*/
|
||||
|
||||
if (list.contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(attackers.getCard(i));
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(attackers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(attackers.getCard(i), c);
|
||||
}
|
||||
|
||||
if(CardFactoryUtil.hasNumberEquipments(attackers.getCard(i), "Umezawa's Jitte") == 1 && attackers.get(i).getNetAttack() > 0)
|
||||
{
|
||||
PlayerZone play = AllZone.getZone(attackers.getCard(i));
|
||||
CardList clist = new CardList(play.getCards());
|
||||
clist = clist.getName("Umezawa's Jitte");
|
||||
Card jitte = clist.get(0);
|
||||
jitte.addCounter(Counters.CHARGE, 2);
|
||||
}
|
||||
CombatUtil.executeCombatDamageEffects(attackers.getCard(i));
|
||||
}
|
||||
|
||||
//not sure if this will work correctly with multiple blockers?
|
||||
@@ -170,17 +154,7 @@ private void playerDamage(PlayerLife p)
|
||||
(blockers.getCard(i).hasFirstStrike() && blockers.getCard(i).hasDoubleStrike()))
|
||||
{
|
||||
|
||||
if (blockers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
{
|
||||
GameActionUtil.executeLifeLinkEffects(blockers.getCard(i));
|
||||
}
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(blockers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i), c);
|
||||
}
|
||||
|
||||
CombatUtil.executeCombatDamageEffects(blockers.getCard(i));
|
||||
/*
|
||||
ArrayList<String> list = blockers.getCard(i).getKeyword();
|
||||
for (int j=0; j < list.size(); j++)
|
||||
@@ -213,31 +187,14 @@ private void playerDamage(PlayerLife p)
|
||||
//System.out.println("attacker #" + i + ": " + attackers.getCard(i).getName() +" " + attackers.getCard(i).getAttack());
|
||||
if ( (!pwAttackers.getCard(i).hasFirstStrike() || (pwAttackers.getCard(i).hasFirstStrike() && pwAttackers.getCard(i).hasDoubleStrike()) ) )
|
||||
{
|
||||
if (pwAttackers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(pwAttackers.getCard(i));
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(pwAttackers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i), c);
|
||||
}
|
||||
|
||||
CombatUtil.executeCombatDamageEffects(pwAttackers.getCard(i));
|
||||
}
|
||||
}
|
||||
for (int i=0; i < pwBlockers.size(); i++){
|
||||
//System.out.println("blocker #" + i + ": " + blockers.getCard(i).getName() +" " + blockers.getCard(i).getAttack());
|
||||
//if ( (pwBlockers.getCard(i).hasSecondStrike()) )
|
||||
if ( (!pwBlockers.getCard(i).hasFirstStrike() || (pwBlockers.getCard(i).hasFirstStrike() &&
|
||||
pwBlockers.getCard(i).hasDoubleStrike()) ) )
|
||||
{
|
||||
if (pwBlockers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(pwBlockers.getCard(i));
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(pwBlockers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i), c);
|
||||
}
|
||||
CombatUtil.executeCombatDamageEffects(pwBlockers.getCard(i));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -279,9 +236,10 @@ private void playerDamage(PlayerLife p)
|
||||
//AllZone.GameAction.addDamage(c, crd , assignedDamageMap.get(crd));
|
||||
damageMap.put(crd, assignedDamageMap.get(crd));
|
||||
}
|
||||
|
||||
AllZone.GameAction.addDamage(c, damageMap);
|
||||
|
||||
AllZone.GameAction.checkStateEffects();
|
||||
|
||||
damageMap.clear();
|
||||
c.clearAssignedDamage();
|
||||
}
|
||||
|
||||
@@ -95,31 +95,7 @@ private void playerDamage(PlayerLife p)
|
||||
|
||||
if ((attackers.getCard(i).hasFirstStrike() || attackers.getCard(i).hasDoubleStrike()))
|
||||
{
|
||||
if (attackers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
{
|
||||
GameActionUtil.executeLifeLinkEffects(attackers.getCard(i));
|
||||
}
|
||||
|
||||
/*
|
||||
for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(attackers.getCard(i), "Guilty Conscience"); j++)
|
||||
GameActionUtil.executeGuiltyConscienceEffects(attackers.getCard(i));
|
||||
*/
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(attackers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(attackers.getCard(i), c);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(CardFactoryUtil.hasNumberEquipments(attackers.getCard(i), "Umezawa's Jitte") == 1 && attackers.get(i).getNetAttack() > 0)
|
||||
{
|
||||
PlayerZone play = AllZone.getZone(attackers.getCard(i));
|
||||
CardList clist = new CardList(play.getCards());
|
||||
clist = clist.getName("Umezawa's Jitte");
|
||||
Card jitte = clist.get(0);
|
||||
jitte.addCounter(Counters.CHARGE, 2);
|
||||
}
|
||||
CombatUtil.executeCombatDamageEffects(attackers.getCard(i));
|
||||
|
||||
/*
|
||||
|
||||
@@ -150,14 +126,7 @@ private void playerDamage(PlayerLife p)
|
||||
//System.out.println("blocker #" + i + ": " + blockers.getCard(i).getName() +" " + blockers.getCard(i).getAttack());
|
||||
if ( (blockers.getCard(i).hasFirstStrike() || blockers.getCard(i).hasDoubleStrike()))
|
||||
{
|
||||
if (blockers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(blockers.getCard(i));
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(blockers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i), c);
|
||||
}
|
||||
CombatUtil.executeCombatDamageEffects(blockers.getCard(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,28 +139,14 @@ private void playerDamage(PlayerLife p)
|
||||
//System.out.println("attacker #" + i + ": " + attackers.getCard(i).getName() +" " + attackers.getCard(i).getAttack());
|
||||
if ( (pwAttackers.getCard(i).hasFirstStrike() || pwAttackers.getCard(i).hasDoubleStrike()))
|
||||
{
|
||||
if (pwAttackers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(pwAttackers.getCard(i));
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(pwAttackers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i), c);
|
||||
}
|
||||
CombatUtil.executeCombatDamageEffects(pwAttackers.getCard(i));
|
||||
}
|
||||
}
|
||||
for (int i=0; i < pwBlockers.size(); i++){
|
||||
//System.out.println("blocker #" + i + ": " + blockers.getCard(i).getName() +" " + blockers.getCard(i).getAttack());
|
||||
if ((pwBlockers.getCard(i).hasFirstStrike() || pwBlockers.getCard(i).hasDoubleStrike()))
|
||||
{
|
||||
if ( pwAttackers.getCard(i).getKeyword().contains("Lifelink"))
|
||||
GameActionUtil.executeLifeLinkEffects(pwBlockers.getCard(i));
|
||||
|
||||
CardList cl = CardFactoryUtil.getAurasEnchanting(pwBlockers.getCard(i), "Guilty Conscience");
|
||||
for (Card c : cl)
|
||||
{
|
||||
GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i), c);
|
||||
}
|
||||
CombatUtil.executeCombatDamageEffects(pwBlockers.getCard(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,6 +181,8 @@ private void playerDamage(PlayerLife p)
|
||||
|
||||
AllZone.GameAction.addDamage(c, damageMap);
|
||||
|
||||
AllZone.GameAction.checkStateEffects();
|
||||
|
||||
damageMap.clear();
|
||||
c.clearAssignedDamage();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user