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