diff --git a/.project b/.project index 7622eeda226..8c93e4340a3 100644 --- a/.project +++ b/.project @@ -1,29 +1,23 @@ - - - Forge - - - - - - org.eclipse.jdt.core.javabuilder - - - - - net.sf.eclipsecs.core.CheckstyleBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - net.sf.eclipsecs.core.CheckstyleNature - - + + + Forge + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/res/cardsfolder/l/leyline_of_anticipation.txt b/res/cardsfolder/l/leyline_of_anticipation.txt index 5a4633957b7..2f63e9a6ac5 100644 --- a/res/cardsfolder/l/leyline_of_anticipation.txt +++ b/res/cardsfolder/l/leyline_of_anticipation.txt @@ -3,6 +3,8 @@ ManaCost:2 U U Types:Enchantment Text:If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. S:Mode$ Continuous | Affected$ Card.nonLand+YouCtrl | AddKeyword$ HIDDEN Flash | AffectedZone$ Hand,Graveyard,Exile | Description$ You may cast nonland cards as though they had flash. (You may cast them any time you could cast an instant.) +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_anticipation.jpg diff --git a/res/cardsfolder/l/leyline_of_lifeforce.txt b/res/cardsfolder/l/leyline_of_lifeforce.txt index b650e0177bf..2454d0363a0 100644 --- a/res/cardsfolder/l/leyline_of_lifeforce.txt +++ b/res/cardsfolder/l/leyline_of_lifeforce.txt @@ -3,6 +3,8 @@ ManaCost:2 G G Types:Enchantment Text:If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. S:Mode$ Continuous | Affected$ Creature | AddKeyword$ HIDDEN CARDNAME can't be countered. | AffectedZone$ Stack | Description$ Creature spells can't be countered. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_lifeforce.jpg diff --git a/res/cardsfolder/l/leyline_of_lightning.txt b/res/cardsfolder/l/leyline_of_lightning.txt index 5ae6a664328..b94526951b8 100644 --- a/res/cardsfolder/l/leyline_of_lightning.txt +++ b/res/cardsfolder/l/leyline_of_lightning.txt @@ -4,6 +4,8 @@ Types:Enchantment Text:If Leyline of Lightning is in your opening hand, you may begin the game with it on the battlefield. T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast a spell, you may pay 1. If you do, CARDNAME deals 1 damage to target player. SVar:TrigDealDamage:AB$DealDamage | Cost$ 1 | Tgt$ TgtP | NumDmg$ 1 +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_lightning.jpg diff --git a/res/cardsfolder/l/leyline_of_punishment.txt b/res/cardsfolder/l/leyline_of_punishment.txt index 11b15abbeae..def85a01ab2 100644 --- a/res/cardsfolder/l/leyline_of_punishment.txt +++ b/res/cardsfolder/l/leyline_of_punishment.txt @@ -2,6 +2,8 @@ Name:Leyline of Punishment ManaCost:2 R R Types:Enchantment Text:If Leyline of Punishment is in your opening hand, you may begin the game with it on the battlefield. Players can't gain life. Damage can't be prevented. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_punishment.jpg diff --git a/res/cardsfolder/l/leyline_of_sanctity.txt b/res/cardsfolder/l/leyline_of_sanctity.txt index b9e036dced2..1a33845031b 100644 --- a/res/cardsfolder/l/leyline_of_sanctity.txt +++ b/res/cardsfolder/l/leyline_of_sanctity.txt @@ -2,6 +2,8 @@ Name:Leyline of Sanctity ManaCost:2 W W Types:Enchantment Text:If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield S:Mode$ Continuous | Affected$ You | AddKeyword$ Hexproof | Description$ You have hexproof. (You can't be the target of spells or abilities your opponents control.) SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_sanctity.jpg diff --git a/res/cardsfolder/l/leyline_of_singularity.txt b/res/cardsfolder/l/leyline_of_singularity.txt index 87d66d224f4..40c56f6bb29 100644 --- a/res/cardsfolder/l/leyline_of_singularity.txt +++ b/res/cardsfolder/l/leyline_of_singularity.txt @@ -2,6 +2,8 @@ Name:Leyline of Singularity ManaCost:2 U U Types:Enchantment Text:If Leyline of Singularity is in your opening hand, you may begin the game with it on the battlefield. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield S:Mode$ Continuous | Affected$ Permanent.nonLand | AddType$ Legendary | Description$ All nonland permanents are legendary. SVar:RemRandomDeck:True SVar:Rarity:Rare diff --git a/res/cardsfolder/l/leyline_of_the_meek.txt b/res/cardsfolder/l/leyline_of_the_meek.txt index fd5182fe6ce..129fcfa6325 100644 --- a/res/cardsfolder/l/leyline_of_the_meek.txt +++ b/res/cardsfolder/l/leyline_of_the_meek.txt @@ -2,6 +2,8 @@ Name:Leyline of the Meek ManaCost:2 W W Types:Enchantment Text:If Leyline of the Meek is in your opening hand, you may begin the game with it on the battlefield. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield S:Mode$ Continuous | Affected$ Creature.token | AddPower$ 1 | AddToughness$ 1 | Description$ Creature tokens get +1/+1. SVar:PlayMain1:TRUE SVar:RemRandomDeck:True diff --git a/res/cardsfolder/l/leyline_of_the_void.txt b/res/cardsfolder/l/leyline_of_the_void.txt index e7fa87c16da..08f19b62ddf 100644 --- a/res/cardsfolder/l/leyline_of_the_void.txt +++ b/res/cardsfolder/l/leyline_of_the_void.txt @@ -2,6 +2,8 @@ Name:Leyline of the Void ManaCost:2 B B Types:Enchantment Text:If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield.\r\nIf a card would be put into an opponent's graveyard from anywhere, exile it instead. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_the_void.jpg diff --git a/res/cardsfolder/l/leyline_of_vitality.txt b/res/cardsfolder/l/leyline_of_vitality.txt index 43ddf260e7f..6fc7fb18b73 100644 --- a/res/cardsfolder/l/leyline_of_vitality.txt +++ b/res/cardsfolder/l/leyline_of_vitality.txt @@ -2,6 +2,8 @@ Name:Leyline of Vitality ManaCost:2 G G Types:Enchantment Text:If Leyline of Vitality is in your opening hand, you may begin the game with it on the battlefield. +K:MayEffectFromOpeningHand:PutOnBattlefield +SVar:PutOnBattlefield:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Hand | Destination$ Battlefield S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddToughness$ 1 | Description$ Creatures you control get +0/+1. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature enters the battlefield under your control, you may gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 diff --git a/res/main.properties b/res/main.properties index d27976845a0..11c6ff23613 100644 --- a/res/main.properties +++ b/res/main.properties @@ -58,8 +58,8 @@ draft--properties=draft/draft.properties lang--transparent-properties=lang/lang.properties -image/base--file=pics -image/token--file=pics/tokens -image/icon--file=pics/icons +image/base--file=d:/Games/forge/pics +image/token--file=d:/Games/forge/pics/tokens +image/icon--file=d:/Games/forge/pics/icons symbols/small--file=images/symbols-13 sound/base--file=sound diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 86098ff8ead..e6e6922d3b8 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -1635,6 +1635,8 @@ public class Card extends GameEntity implements Comparable { sbLong.append(" (This enters the battlefield with "); sbLong.append(numCounters); sbLong.append(" +1/+1 counters on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.)"); + } else if (keyword.get(i).startsWith("MayEffectFromOpeningHand")) { + continue; } else { if (i != 0 && sb.length() != 0) { sb.append(", "); diff --git a/src/main/java/forge/card/trigger/TriggerHandler.java b/src/main/java/forge/card/trigger/TriggerHandler.java index 493a90cc279..4688d4aa948 100644 --- a/src/main/java/forge/card/trigger/TriggerHandler.java +++ b/src/main/java/forge/card/trigger/TriggerHandler.java @@ -301,34 +301,38 @@ public class TriggerHandler { } Player playerAP = AllZone.getPhase().getPlayerTurn(); + + //This is done to allow the list of triggers to be modified while triggers are running. + ArrayList registeredTriggersWorkingCopy = new ArrayList(registeredTriggers); + ArrayList delayedTriggersWorkingCopy = new ArrayList(delayedTriggers); //AP - for (int i = 0; i < registeredTriggers.size(); i++) { - if (registeredTriggers.get(i).getHostCard().getController().equals(playerAP)) { - runSingleTrigger(registeredTriggers.get(i), mode, runParams); + for (int i = 0; i < registeredTriggersWorkingCopy.size(); i++) { + if (registeredTriggersWorkingCopy.get(i).getHostCard().getController().equals(playerAP)) { + runSingleTrigger(registeredTriggersWorkingCopy.get(i), mode, runParams); } } - for (int i = 0; i < delayedTriggers.size(); i++) { - Trigger deltrig = delayedTriggers.get(i); + for (int i = 0; i < delayedTriggersWorkingCopy.size(); i++) { + Trigger deltrig = delayedTriggersWorkingCopy.get(i); if (deltrig.getHostCard().getController().equals(playerAP)) { if (runSingleTrigger(deltrig, mode, runParams)) { - delayedTriggers.remove(i); + delayedTriggers.remove(deltrig); i--; } } } //NAP - for (int i = 0; i < registeredTriggers.size(); i++) { - if (registeredTriggers.get(i).getHostCard().getController().equals(playerAP.getOpponent())) { - runSingleTrigger(registeredTriggers.get(i), mode, runParams); + for (int i = 0; i < registeredTriggersWorkingCopy.size(); i++) { + if (registeredTriggersWorkingCopy.get(i).getHostCard().getController().equals(playerAP.getOpponent())) { + runSingleTrigger(registeredTriggersWorkingCopy.get(i), mode, runParams); } } - for (int i = 0; i < delayedTriggers.size(); i++) { - Trigger deltrig = delayedTriggers.get(i); + for (int i = 0; i < delayedTriggersWorkingCopy.size(); i++) { + Trigger deltrig = delayedTriggersWorkingCopy.get(i); if (deltrig.getHostCard().getController().equals(playerAP.getOpponent())) { if (runSingleTrigger(deltrig, mode, runParams)) { - delayedTriggers.remove(i); + delayedTriggers.remove(deltrig); i--; } } diff --git a/src/main/java/forge/gui/input/Input_Mulligan.java b/src/main/java/forge/gui/input/Input_Mulligan.java index 21f9278864d..b61342184b2 100644 --- a/src/main/java/forge/gui/input/Input_Mulligan.java +++ b/src/main/java/forge/gui/input/Input_Mulligan.java @@ -1,6 +1,11 @@ package forge.gui.input; +import java.util.ArrayList; + import forge.*; +import forge.card.abilityFactory.AbilityFactory; +import forge.card.cardFactory.CardFactoryUtil; +import forge.card.spellability.SpellAbility; import forge.game.GamePlayerRating; import forge.game.PlayerIndex; import forge.quest.data.QuestData; @@ -84,27 +89,58 @@ public class Input_Mulligan extends Input { } } - //Human Leylines + //Human Leylines & Chancellors ButtonUtil.reset(); + AbilityFactory af = new AbilityFactory(); CardList humanOpeningHand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - + for (Card c : humanOpeningHand) { - if (c.getName().startsWith("Leyline")) { - if (GameActionUtil.showYesNoDialog(c, "Put onto Battlefield?")) - AllZone.getGameAction().moveToPlay(c); + ArrayList kws = c.getKeyword(); + for(int i = 0;i 0)) { - AllZone.getGameAction().moveToPlay(c); - AllZone.getGameAction().checkStateEffects(); + ArrayList kws = c.getKeyword(); + for(int i = 0;i