diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index ccd752044c4..b2853a2e422 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -1,6 +1,6 @@
-#Sat Aug 27 19:23:42 EDT 2011
+#Sun Apr 28 22:56:26 CEST 2013
eclipse.preferences.version=1
formatter_profile=_Forge Java Code Style - Formatter Settings
formatter_settings_version=12
org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n *//**\r\n * @param ${param}0 the ${bare_field_name} to set\r\n *//**\r\n * ${todo}\: Write javadoc for Constructor.\r\n * ${tags}\r\n *//** \r\n * ${todo}\: Write javadoc for this type.\r\n *\r\n * ${tags}\r\n *//**\r\n * ${todo}\: Write javadoc for this method.\r\n * ${tags}\r\n *//* (non-Javadoc)\r\n * ${see_to_overridden}\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n// ${todo} Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log.\r\n${exception_var}.printStackTrace();// ${todo} Auto-generated method stub\r\n${body_statement}\r\nthrow new net.slightlymagic.braids.util.NotImplementedError();${body_statement}\r\n// ${todo} Auto-generated constructor stub\r\nthrow new net.slightlymagic.braids.util.NotImplementedError();return ${field};${field} \= ${param}0; // ${todo}\: Add 0 to parameter's name.
+org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n *//**\r\n * @param ${param}0 the ${bare_field_name} to set\r\n *//**\r\n * ${todo}\: Write javadoc for Constructor.\r\n * ${tags}\r\n *//** \r\n * ${todo}\: Write javadoc for this type.\r\n *\r\n * ${tags}\r\n *//**\r\n * ${todo}\: Write javadoc for this method.\r\n * ${tags}\r\n *//* (non-Javadoc)\r\n * ${see_to_overridden}\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n// ${todo} Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log.\r\n${exception_var}.printStackTrace();// ${todo} Auto-generated method stub\r\n${body_statement}${body_statement}\r\n// ${todo} Auto-generated constructor stubreturn ${field};${field} \= ${param}0; // ${todo}\: Add 0 to parameter's name.
diff --git a/res/cardsfolder/d/deathgreeter.txt b/res/cardsfolder/d/deathgreeter.txt
index ff78a3feefe..6fe0fab8257 100644
--- a/res/cardsfolder/d/deathgreeter.txt
+++ b/res/cardsfolder/d/deathgreeter.txt
@@ -2,7 +2,7 @@ Name:Deathgreeter
ManaCost:B
Types:Creature Human Shaman
PT:1/1
-T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you gain 1 life.
+T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may gain 1 life.
SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1
SVar:Picture:http://www.wizards.com/global/images/magic/general/deathgreeter.jpg
Oracle:Whenever another creature dies, you may gain 1 life.
diff --git a/src/main/java/forge/card/trigger/WrappedAbility.java b/src/main/java/forge/card/trigger/WrappedAbility.java
index 091069f5ef1..a54107e4f4d 100644
--- a/src/main/java/forge/card/trigger/WrappedAbility.java
+++ b/src/main/java/forge/card/trigger/WrappedAbility.java
@@ -385,6 +385,11 @@ public class WrappedAbility extends Ability implements ISpellAbility {
private boolean confirmTrigger(Player decider, Map triggerParams) {
if (decider.isHuman()) {
+ if(decider.getController().shouldAlwaysAcceptTrigger(regtrig.getId()))
+ return true;
+ else if(decider.getController().shouldAlwaysDeclineTrigger(regtrig.getId()))
+ return false;
+
String triggerDesc = triggerParams.get("TriggerDescription").replace("CARDNAME", regtrig.getHostCard().getName());
final StringBuilder buildQuestion = new StringBuilder("Use triggered ability of ");
buildQuestion.append(regtrig.getHostCard().toString()).append("?");
diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java
index a6fa341be04..631f46e8110 100644
--- a/src/main/java/forge/game/player/PlayerController.java
+++ b/src/main/java/forge/game/player/PlayerController.java
@@ -1,5 +1,6 @@
package forge.game.player;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -40,6 +41,11 @@ public abstract class PlayerController {
public abstract Input getCleanupInput();
public abstract Input getAutoPassPriorityInput();
+ public abstract boolean shouldAlwaysAcceptTrigger(Integer trigger);
+ public abstract boolean shouldAlwaysDeclineTrigger(Integer trigger);
+ public abstract void setShouldAlwaysAcceptTrigger(Integer trigger);
+ public abstract void setShouldAlwaysDeclineTrigger(Integer trigger);
+ public abstract void setShouldAlwaysAskTrigger(Integer trigger);
/**
* TODO: Write javadoc for this method.
diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java
index e1866e3a45b..0553265f3bb 100644
--- a/src/main/java/forge/game/player/PlayerControllerAi.java
+++ b/src/main/java/forge/game/player/PlayerControllerAi.java
@@ -262,4 +262,41 @@ public class PlayerControllerAi extends PlayerController {
return null;
}
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#shouldAlwaysAcceptTrigger(java.lang.Integer)
+ */
+ @Override
+ public boolean shouldAlwaysAcceptTrigger(Integer trigger) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#shouldAlwaysDeclineTrigger(java.lang.Integer)
+ */
+ @Override
+ public boolean shouldAlwaysDeclineTrigger(Integer trigger) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#setShouldAlwaysAcceptTrigger(java.lang.Integer)
+ */
+ @Override
+ public void setShouldAlwaysAcceptTrigger(Integer trigger) {
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#setShouldAlwaysDeclineTrigger(java.lang.Integer)
+ */
+ @Override
+ public void setShouldAlwaysDeclineTrigger(Integer trigger) {
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#setShouldAlwaysAskTrigger(java.lang.Integer)
+ */
+ @Override
+ public void setShouldAlwaysAskTrigger(Integer trigger) {
+ }
+
}
diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java
index 92147f21971..6118355b9f2 100644
--- a/src/main/java/forge/game/player/PlayerControllerHuman.java
+++ b/src/main/java/forge/game/player/PlayerControllerHuman.java
@@ -421,4 +421,53 @@ public class PlayerControllerHuman extends PlayerController {
return oldTarget;
}
}
+
+ private List triggersAlwaysAccept = new ArrayList();
+ private List triggersAlwaysDecline = new ArrayList();
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#shouldAlwaysAcceptTrigger(int)
+ */
+ @Override
+ public boolean shouldAlwaysAcceptTrigger(Integer trigger) {
+ return triggersAlwaysAccept.contains(trigger);
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#shouldAlwaysDeclineTrigger(int)
+ */
+ @Override
+ public boolean shouldAlwaysDeclineTrigger(Integer trigger) {
+ return triggersAlwaysDecline.contains(trigger);
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#setShouldAlwaysAcceptTrigger(int)
+ */
+ @Override
+ public void setShouldAlwaysAcceptTrigger(Integer trigger) {
+ if(!triggersAlwaysAccept.contains(trigger))
+ triggersAlwaysAccept.add(trigger);
+ triggersAlwaysDecline.remove((Object)trigger);
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#setShouldAlwaysDeclineTrigger(int)
+ */
+ @Override
+ public void setShouldAlwaysDeclineTrigger(Integer trigger) {
+ if(!triggersAlwaysDecline.contains(trigger))
+ triggersAlwaysDecline.add(trigger);
+ triggersAlwaysAccept.remove((Object)trigger);
+ }
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#setShouldAlwaysAskTrigger(java.lang.Integer)
+ */
+ @Override
+ public void setShouldAlwaysAskTrigger(Integer trigger) {
+ triggersAlwaysAccept.remove((Object)trigger);
+ triggersAlwaysDecline.remove((Object)trigger);
+ }
+
}
diff --git a/src/main/java/forge/gui/match/views/VStack.java b/src/main/java/forge/gui/match/views/VStack.java
index a3f2171bceb..0773eec2b46 100644
--- a/src/main/java/forge/gui/match/views/VStack.java
+++ b/src/main/java/forge/gui/match/views/VStack.java
@@ -18,11 +18,15 @@
package forge.gui.match.views;
import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
@@ -30,6 +34,8 @@ import javax.swing.border.EmptyBorder;
import net.miginfocom.swing.MigLayout;
import forge.CardUtil;
import forge.card.spellability.SpellAbilityStackInstance;
+import forge.control.FControl;
+import forge.game.player.PlayerController;
import forge.game.zone.MagicStack;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
@@ -54,6 +60,7 @@ public enum VStack implements IVDoc {
// Other fields
private List stackTARs = new ArrayList();
+ private OptionalTriggerMenu otMenu = new OptionalTriggerMenu();
//========= Overridden methods
@@ -163,6 +170,19 @@ public enum VStack implements IVDoc {
}
}
});
+
+ if(spell.getSpellAbility().isOptionalTrigger()) {
+ tar.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e){
+ if (e.getButton() == MouseEvent.BUTTON3)
+ {
+ otMenu.setStackInstance(spell);
+ otMenu.show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+ });
+ }
/*
* This updates the Card Picture/Detail when the spell is added to
@@ -201,5 +221,75 @@ public enum VStack implements IVDoc {
}
//========= Custom class handling
+
+ private final class OptionalTriggerMenu extends JPopupMenu {
+ private static final long serialVersionUID = 1548494191627807962L;
+ private final JCheckBoxMenuItem jmiAccept;
+ private final JCheckBoxMenuItem jmiDecline;
+ private final JCheckBoxMenuItem jmiAsk;
+ private PlayerController localPlayer;
+
+ private Integer triggerID = 0;
+
+ public OptionalTriggerMenu(){
+
+ jmiAccept = new JCheckBoxMenuItem("Always Accept");
+ jmiDecline = new JCheckBoxMenuItem("Always Decline");
+ jmiAsk = new JCheckBoxMenuItem("Always Ask");
+
+ jmiAccept.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ localPlayer.setShouldAlwaysAcceptTrigger(triggerID);
+ }
+
+ });
+
+ jmiDecline.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ localPlayer.setShouldAlwaysDeclineTrigger(triggerID);
+ }
+
+ });
+
+ jmiAsk.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ System.out.println("ask");
+ localPlayer.setShouldAlwaysAskTrigger(triggerID);
+ }
+
+ });
+
+ add(jmiAccept);
+ add(jmiDecline);
+ add(jmiAsk);
+ }
+
+ public void setStackInstance(final SpellAbilityStackInstance SI)
+ {
+ if(localPlayer == null)
+ localPlayer = FControl.SINGLETON_INSTANCE.getPlayer().getController();
+
+ triggerID = SI.getSpellAbility().getSourceTrigger();
+
+ if(localPlayer.shouldAlwaysAcceptTrigger(triggerID)) {
+ jmiAccept.setSelected(true);
+ jmiDecline.setSelected(false);
+ jmiAsk.setSelected(false);
+ } else if(localPlayer.shouldAlwaysDeclineTrigger(triggerID)) {
+ jmiDecline.setSelected(true);
+ jmiAccept.setSelected(false);
+ jmiAsk.setSelected(false);
+ } else {
+ jmiAsk.setSelected(true);
+ jmiAccept.setSelected(false);
+ jmiDecline.setSelected(false);
+ }
+ }
+ }
}