mirror of
https://github.com/magefree/mage.git
synced 2025-12-23 03:51:58 -08:00
* Added an option to auto order triggers with the same text. Added options to pass priority automatically after spell cast and ability activation. Fixed a problem of the tests with the new Scry mulligan.
This commit is contained in:
parent
e16276a3cd
commit
707c1acf6b
10 changed files with 281 additions and 78 deletions
|
|
@ -82,8 +82,8 @@
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="main_card" min="-2" max="-2" attributes="0"/>
|
<Component id="main_card" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="main_game" max="32767" attributes="0"/>
|
<Component id="main_game" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Component id="main_gamelog" min="-2" max="-2" attributes="0"/>
|
<Component id="main_gamelog" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
@ -159,7 +159,7 @@
|
||||||
<Property name="toolTipText" type="java.lang.String" value=""/>
|
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||||
<Property name="actionCommand" type="java.lang.String" value=""/>
|
<Property name="actionCommand" type="java.lang.String" value=""/>
|
||||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
||||||
<Color id="Default Cursor"/>
|
<Color id="Standardcursor"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
|
|
@ -173,7 +173,7 @@
|
||||||
<Property name="toolTipText" type="java.lang.String" value="Write the card's name on the card to make the card name more recognizable."/>
|
<Property name="toolTipText" type="java.lang.String" value="Write the card's name on the card to make the card name more recognizable."/>
|
||||||
<Property name="actionCommand" type="java.lang.String" value=""/>
|
<Property name="actionCommand" type="java.lang.String" value=""/>
|
||||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
||||||
<Color id="Default Cursor"/>
|
<Color id="Standardcursor"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
|
|
@ -231,7 +231,7 @@
|
||||||
<Component id="cbConfirmEmptyManaPool" min="-2" max="-2" attributes="0"/>
|
<Component id="cbConfirmEmptyManaPool" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="cbAskMoveToGraveOrder" min="-2" max="-2" attributes="0"/>
|
<Component id="cbAskMoveToGraveOrder" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
|
@ -381,8 +381,8 @@
|
||||||
<Container class="javax.swing.JPanel" name="tabPhases">
|
<Container class="javax.swing.JPanel" name="tabPhases">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Phases">
|
<JTabbedPaneConstraints tabName="Phases & Priority">
|
||||||
<Property name="tabTitle" type="java.lang.String" value="Phases"/>
|
<Property name="tabTitle" type="java.lang.String" value="Phases & Priority"/>
|
||||||
</JTabbedPaneConstraints>
|
</JTabbedPaneConstraints>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
@ -528,8 +528,8 @@
|
||||||
<Component id="checkBoxEndTurnOthers" min="-2" max="-2" attributes="0"/>
|
<Component id="checkBoxEndTurnOthers" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Component id="phases_stopSettings" min="-2" max="-2" attributes="0"/>
|
<Component id="phases_stopSettings" max="32767" attributes="0"/>
|
||||||
<EmptySpace pref="45" max="32767" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
|
@ -537,7 +537,7 @@
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="javax.swing.JLabel" name="jLabelHeadLine">
|
<Component class="javax.swing.JLabel" name="jLabelHeadLine">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" value="Choose phases your game will stop on:"/>
|
<Property name="text" type="java.lang.String" value="Choose phases your game will stop on if not skipped by a skip action (e.g. F6):"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabelYourTurn">
|
<Component class="javax.swing.JLabel" name="jLabelYourTurn">
|
||||||
|
|
@ -628,7 +628,7 @@
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
|
||||||
<Property name="columns" type="int" value="1"/>
|
<Property name="columns" type="int" value="1"/>
|
||||||
<Property name="rows" type="int" value="4"/>
|
<Property name="rows" type="int" value="7"/>
|
||||||
</Layout>
|
</Layout>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="javax.swing.JCheckBox" name="cbStopAttack">
|
<Component class="javax.swing.JCheckBox" name="cbStopAttack">
|
||||||
|
|
@ -675,6 +675,45 @@
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbStopOnAllEndActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbStopOnAllEndActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="cbPassPriorityCast">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" value="Pass priority automatically after you have put a spell on the stack"/>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" value="If activated the system passes priority automatically for you if you have put a spell on the stack."/>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" value=""/>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[300, 25]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbPassPriorityCastActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="cbPassPriorityActivation">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" value="Pass priority automatically after you have put an activated ability on the stack"/>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" value="If activated the system passes priority for you automatically after you have put an activated ability on the stack."/>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" value=""/>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[300, 25]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbPassPriorityActivationActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="cbAutoOrderTrigger">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" value="Set order for your triggers automatically if all have the same text"/>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" value="<HTML>If activated the order to put on the stack your triggers that trigger at the same time<br/>
is set automatically if all have the same text."/>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" value=""/>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[300, 25]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbAutoOrderTriggerActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
public static final String KEY_STOP_BLOCK = "stopDeclareBlockersStep";
|
public static final String KEY_STOP_BLOCK = "stopDeclareBlockersStep";
|
||||||
public static final String KEY_STOP_ALL_MAIN_PHASES = "stopOnAllMainPhases";
|
public static final String KEY_STOP_ALL_MAIN_PHASES = "stopOnAllMainPhases";
|
||||||
public static final String KEY_STOP_ALL_END_PHASES = "stopOnAllEndPhases";
|
public static final String KEY_STOP_ALL_END_PHASES = "stopOnAllEndPhases";
|
||||||
|
public static final String KEY_PASS_PRIORITY_CAST = "passPriorityCast";
|
||||||
|
public static final String KEY_PASS_PRIORITY_ACTIVATION = "passPriorityActivation";
|
||||||
|
public static final String KEY_AUTO_ORDER_TRIGGER = "autoOrderTrigger";
|
||||||
|
|
||||||
// mana auto payment
|
// mana auto payment
|
||||||
public static final String KEY_GAME_MANA_AUTOPAYMENT = "gameManaAutopayment";
|
public static final String KEY_GAME_MANA_AUTOPAYMENT = "gameManaAutopayment";
|
||||||
|
|
@ -394,6 +397,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
cbStopBlock = new javax.swing.JCheckBox();
|
cbStopBlock = new javax.swing.JCheckBox();
|
||||||
cbStopOnAllMain = new javax.swing.JCheckBox();
|
cbStopOnAllMain = new javax.swing.JCheckBox();
|
||||||
cbStopOnAllEnd = new javax.swing.JCheckBox();
|
cbStopOnAllEnd = new javax.swing.JCheckBox();
|
||||||
|
cbPassPriorityCast = new javax.swing.JCheckBox();
|
||||||
|
cbPassPriorityActivation = new javax.swing.JCheckBox();
|
||||||
|
cbAutoOrderTrigger = new javax.swing.JCheckBox();
|
||||||
tabImages = new javax.swing.JPanel();
|
tabImages = new javax.swing.JPanel();
|
||||||
panelCardImages = new javax.swing.JPanel();
|
panelCardImages = new javax.swing.JPanel();
|
||||||
cbUseDefaultImageFolder = new javax.swing.JCheckBox();
|
cbUseDefaultImageFolder = new javax.swing.JCheckBox();
|
||||||
|
|
@ -629,7 +635,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
.addComponent(cbConfirmEmptyManaPool)
|
.addComponent(cbConfirmEmptyManaPool)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(cbAskMoveToGraveOrder)
|
.addComponent(cbAskMoveToGraveOrder)
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile");
|
nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile");
|
||||||
|
|
@ -691,8 +697,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
@ -701,7 +707,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
|
|
||||||
tabsPanel.addTab("Main", tabMain);
|
tabsPanel.addTab("Main", tabMain);
|
||||||
|
|
||||||
jLabelHeadLine.setText("Choose phases your game will stop on:");
|
jLabelHeadLine.setText("Choose phases your game will stop on if not skipped by a skip action (e.g. F6):");
|
||||||
|
|
||||||
jLabelYourTurn.setText("Your turn");
|
jLabelYourTurn.setText("Your turn");
|
||||||
|
|
||||||
|
|
@ -722,7 +728,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
jLabelEndOfTurn.setText("End of turn:");
|
jLabelEndOfTurn.setText("End of turn:");
|
||||||
|
|
||||||
phases_stopSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Stop settings"));
|
phases_stopSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Stop settings"));
|
||||||
phases_stopSettings.setLayout(new java.awt.GridLayout(4, 1));
|
phases_stopSettings.setLayout(new java.awt.GridLayout(7, 1));
|
||||||
|
|
||||||
cbStopAttack.setSelected(true);
|
cbStopAttack.setSelected(true);
|
||||||
cbStopAttack.setText("Stop on declare attackers step if you skip steps (F4/F5/F7) and attackers are available");
|
cbStopAttack.setText("Stop on declare attackers step if you skip steps (F4/F5/F7) and attackers are available");
|
||||||
|
|
@ -766,6 +772,39 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
});
|
});
|
||||||
phases_stopSettings.add(cbStopOnAllEnd);
|
phases_stopSettings.add(cbStopOnAllEnd);
|
||||||
|
|
||||||
|
cbPassPriorityCast.setText("Pass priority automatically after you have put a spell on the stack");
|
||||||
|
cbPassPriorityCast.setToolTipText("If activated the system passes priority automatically for you if you have put a spell on the stack.");
|
||||||
|
cbPassPriorityCast.setActionCommand("");
|
||||||
|
cbPassPriorityCast.setPreferredSize(new java.awt.Dimension(300, 25));
|
||||||
|
cbPassPriorityCast.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
cbPassPriorityCastActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
phases_stopSettings.add(cbPassPriorityCast);
|
||||||
|
|
||||||
|
cbPassPriorityActivation.setText("Pass priority automatically after you have put an activated ability on the stack");
|
||||||
|
cbPassPriorityActivation.setToolTipText("If activated the system passes priority for you automatically after you have put an activated ability on the stack.");
|
||||||
|
cbPassPriorityActivation.setActionCommand("");
|
||||||
|
cbPassPriorityActivation.setPreferredSize(new java.awt.Dimension(300, 25));
|
||||||
|
cbPassPriorityActivation.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
cbPassPriorityActivationActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
phases_stopSettings.add(cbPassPriorityActivation);
|
||||||
|
|
||||||
|
cbAutoOrderTrigger.setText("Set order for your triggers automatically if all have the same text");
|
||||||
|
cbAutoOrderTrigger.setToolTipText("<HTML>If activated the order to put on the stack your triggers that trigger at the same time<br/>\nis set automatically if all have the same text.");
|
||||||
|
cbAutoOrderTrigger.setActionCommand("");
|
||||||
|
cbAutoOrderTrigger.setPreferredSize(new java.awt.Dimension(300, 25));
|
||||||
|
cbAutoOrderTrigger.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
cbAutoOrderTriggerActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
phases_stopSettings.add(cbAutoOrderTrigger);
|
||||||
|
|
||||||
javax.swing.GroupLayout tabPhasesLayout = new javax.swing.GroupLayout(tabPhases);
|
javax.swing.GroupLayout tabPhasesLayout = new javax.swing.GroupLayout(tabPhases);
|
||||||
tabPhases.setLayout(tabPhasesLayout);
|
tabPhases.setLayout(tabPhasesLayout);
|
||||||
tabPhasesLayout.setHorizontalGroup(
|
tabPhasesLayout.setHorizontalGroup(
|
||||||
|
|
@ -876,11 +915,11 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
.addComponent(jLabelEndOfTurn)
|
.addComponent(jLabelEndOfTurn)
|
||||||
.addComponent(checkBoxEndTurnOthers))
|
.addComponent(checkBoxEndTurnOthers))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(phases_stopSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addContainerGap(45, Short.MAX_VALUE))
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
tabsPanel.addTab("Phases", tabPhases);
|
tabsPanel.addTab("Phases & Priority", tabPhases);
|
||||||
|
|
||||||
panelCardImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card images:"));
|
panelCardImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card images:"));
|
||||||
|
|
||||||
|
|
@ -1699,7 +1738,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
|
save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
save(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
|
save(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
|
|
||||||
// Phases
|
// Phases & Priority
|
||||||
save(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU);
|
save(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU);
|
||||||
save(prefs, dialog.checkBoxDrawYou, DRAW_YOU);
|
save(prefs, dialog.checkBoxDrawYou, DRAW_YOU);
|
||||||
save(prefs, dialog.checkBoxMainYou, MAIN_YOU);
|
save(prefs, dialog.checkBoxMainYou, MAIN_YOU);
|
||||||
|
|
@ -1720,6 +1759,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
save(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "false", UPDATE_CACHE_POLICY);
|
save(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
save(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false", UPDATE_CACHE_POLICY);
|
save(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
save(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false", UPDATE_CACHE_POLICY);
|
save(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
|
save(prefs, dialog.cbPassPriorityCast, KEY_PASS_PRIORITY_CAST, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
|
save(prefs, dialog.cbPassPriorityActivation, KEY_PASS_PRIORITY_ACTIVATION, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
|
save(prefs, dialog.cbAutoOrderTrigger, KEY_AUTO_ORDER_TRIGGER, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
|
|
||||||
// images
|
// images
|
||||||
save(prefs, dialog.cbUseDefaultImageFolder, KEY_CARD_IMAGES_USE_DEFAULT, "true", "false", UPDATE_CACHE_POLICY);
|
save(prefs, dialog.cbUseDefaultImageFolder, KEY_CARD_IMAGES_USE_DEFAULT, "true", "false", UPDATE_CACHE_POLICY);
|
||||||
|
|
@ -2022,6 +2064,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
// TODO add your handling code here:
|
// TODO add your handling code here:
|
||||||
}//GEN-LAST:event_cbDraftLogAutoSaveActionPerformed
|
}//GEN-LAST:event_cbDraftLogAutoSaveActionPerformed
|
||||||
|
|
||||||
|
private void cbPassPriorityCastActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbPassPriorityCastActionPerformed
|
||||||
|
// TODO add your handling code here:
|
||||||
|
}//GEN-LAST:event_cbPassPriorityCastActionPerformed
|
||||||
|
|
||||||
|
private void cbPassPriorityActivationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbPassPriorityActivationActionPerformed
|
||||||
|
// TODO add your handling code here:
|
||||||
|
}//GEN-LAST:event_cbPassPriorityActivationActionPerformed
|
||||||
|
|
||||||
|
private void cbAutoOrderTriggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbAutoOrderTriggerActionPerformed
|
||||||
|
// TODO add your handling code here:
|
||||||
|
}//GEN-LAST:event_cbAutoOrderTriggerActionPerformed
|
||||||
|
|
||||||
private void showProxySettings() {
|
private void showProxySettings() {
|
||||||
if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) {
|
if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) {
|
||||||
this.pnlProxy.setVisible(true);
|
this.pnlProxy.setVisible(true);
|
||||||
|
|
@ -2122,6 +2176,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
load(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "true");
|
load(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "true");
|
||||||
load(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false");
|
load(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false");
|
||||||
load(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false");
|
load(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false");
|
||||||
|
load(prefs, dialog.cbPassPriorityCast, KEY_PASS_PRIORITY_CAST, "true", "false");
|
||||||
|
load(prefs, dialog.cbPassPriorityActivation, KEY_PASS_PRIORITY_ACTIVATION, "true", "false");
|
||||||
|
load(prefs, dialog.cbAutoOrderTrigger, KEY_AUTO_ORDER_TRIGGER, "true", "true");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2456,7 +2513,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
MageFrame.getPreferences().get(KEY_CONNECT_FLAG, "world"),
|
MageFrame.getPreferences().get(KEY_CONNECT_FLAG, "world"),
|
||||||
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true").equals("true"),
|
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true").equals("true"),
|
||||||
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT, "true").equals("true"),
|
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT, "true").equals("true"),
|
||||||
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT_ONLY_ONE, "true").equals("true")
|
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT_ONLY_ONE, "true").equals("true"),
|
||||||
|
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PASS_PRIORITY_CAST, "true").equals("true"),
|
||||||
|
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PASS_PRIORITY_ACTIVATION, "true").equals("true"),
|
||||||
|
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_AUTO_ORDER_TRIGGER, "true").equals("true")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2469,6 +2529,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
private javax.swing.JButton btnBrowseImageLocation;
|
private javax.swing.JButton btnBrowseImageLocation;
|
||||||
private javax.swing.JCheckBox cbAllowRequestToShowHandCards;
|
private javax.swing.JCheckBox cbAllowRequestToShowHandCards;
|
||||||
private javax.swing.JCheckBox cbAskMoveToGraveOrder;
|
private javax.swing.JCheckBox cbAskMoveToGraveOrder;
|
||||||
|
private javax.swing.JCheckBox cbAutoOrderTrigger;
|
||||||
private javax.swing.JCheckBox cbCheckForNewImages;
|
private javax.swing.JCheckBox cbCheckForNewImages;
|
||||||
private javax.swing.JCheckBox cbConfirmEmptyManaPool;
|
private javax.swing.JCheckBox cbConfirmEmptyManaPool;
|
||||||
private javax.swing.JCheckBox cbDraftLogAutoSave;
|
private javax.swing.JCheckBox cbDraftLogAutoSave;
|
||||||
|
|
@ -2478,6 +2539,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
||||||
private javax.swing.JCheckBox cbEnableOtherSounds;
|
private javax.swing.JCheckBox cbEnableOtherSounds;
|
||||||
private javax.swing.JCheckBox cbEnableSkipButtonsSounds;
|
private javax.swing.JCheckBox cbEnableSkipButtonsSounds;
|
||||||
private javax.swing.JCheckBox cbGameLogAutoSave;
|
private javax.swing.JCheckBox cbGameLogAutoSave;
|
||||||
|
private javax.swing.JCheckBox cbPassPriorityActivation;
|
||||||
|
private javax.swing.JCheckBox cbPassPriorityCast;
|
||||||
private javax.swing.JComboBox<String> cbPreferedImageLanguage;
|
private javax.swing.JComboBox<String> cbPreferedImageLanguage;
|
||||||
private javax.swing.JComboBox<ProxyType> cbProxyType;
|
private javax.swing.JComboBox<ProxyType> cbProxyType;
|
||||||
private javax.swing.JCheckBox cbSaveToZipFiles;
|
private javax.swing.JCheckBox cbSaveToZipFiles;
|
||||||
|
|
|
||||||
|
|
@ -562,6 +562,18 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
public boolean priority(Game game) {
|
public boolean priority(Game game) {
|
||||||
passed = false;
|
passed = false;
|
||||||
if (!abort) {
|
if (!abort) {
|
||||||
|
if (getJustActivatedType() != null) {
|
||||||
|
if (userData.isPassPriorityCast() && getJustActivatedType().equals(AbilityType.SPELL)) {
|
||||||
|
setJustActivatedType(null);
|
||||||
|
pass(game);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (userData.isPassPriorityActivation() && getJustActivatedType().equals(AbilityType.ACTIVATED)) {
|
||||||
|
setJustActivatedType(null);
|
||||||
|
pass(game);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (passedAllTurns) {
|
if (passedAllTurns) {
|
||||||
if (passWithManaPoolCheck(game)) {
|
if (passWithManaPoolCheck(game)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -693,6 +705,8 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TriggeredAbility chooseTriggeredAbility(List<TriggeredAbility> abilities, Game game) {
|
public TriggeredAbility chooseTriggeredAbility(List<TriggeredAbility> abilities, Game game) {
|
||||||
|
String autoOrderRuleText = null;
|
||||||
|
boolean autoOrderUse = getUserData().isAutoOrderTrigger();
|
||||||
while (!abort) {
|
while (!abort) {
|
||||||
// try to set trigger auto order
|
// try to set trigger auto order
|
||||||
List<TriggeredAbility> abilitiesWithNoOrderSet = new ArrayList<>();
|
List<TriggeredAbility> abilitiesWithNoOrderSet = new ArrayList<>();
|
||||||
|
|
@ -712,12 +726,19 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
abilityOrderLast = ability;
|
abilityOrderLast = ability;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (autoOrderUse) {
|
||||||
|
if (autoOrderRuleText == null) {
|
||||||
|
autoOrderRuleText = ability.getRule();
|
||||||
|
} else if (!ability.getRule().equals(autoOrderRuleText)) {
|
||||||
|
autoOrderUse = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
abilitiesWithNoOrderSet.add(ability);
|
abilitiesWithNoOrderSet.add(ability);
|
||||||
}
|
}
|
||||||
if (abilitiesWithNoOrderSet.isEmpty()) {
|
if (abilitiesWithNoOrderSet.isEmpty()) {
|
||||||
return abilityOrderLast;
|
return abilityOrderLast;
|
||||||
}
|
}
|
||||||
if (abilitiesWithNoOrderSet.size() == 1) {
|
if (abilitiesWithNoOrderSet.size() == 1 || autoOrderUse) {
|
||||||
return abilitiesWithNoOrderSet.iterator().next();
|
return abilitiesWithNoOrderSet.iterator().next();
|
||||||
}
|
}
|
||||||
updateGameStatePriority("chooseTriggeredAbility", game);
|
updateGameStatePriority("chooseTriggeredAbility", game);
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
*/
|
*/
|
||||||
package org.mage.test.cards.abilities.keywords;
|
package org.mage.test.cards.abilities.keywords;
|
||||||
|
|
||||||
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.constants.PhaseStep;
|
import mage.constants.PhaseStep;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
|
@ -39,7 +38,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
*
|
*
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ManifestTest extends CardTestPlayerBase {
|
public class ManifestTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -73,7 +71,8 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If Doomwake Giant gets manifested, it's Constellation trigger may not trigger
|
* If Doomwake Giant gets manifested, it's Constellation trigger may not
|
||||||
|
* trigger
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testETBTriggeredAbilities2() {
|
public void testETBTriggeredAbilities2() {
|
||||||
|
|
@ -103,8 +102,10 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertPermanentCount(playerB, "Silvercoat Lion", 1);
|
assertPermanentCount(playerB, "Silvercoat Lion", 1);
|
||||||
assertPowerToughness(playerB, "Silvercoat Lion", 2, 2);
|
assertPowerToughness(playerB, "Silvercoat Lion", 2, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If Doomwake Giant gets manifested, it's Constellation trigger may not trigger
|
* If Doomwake Giant gets manifested, it's Constellation trigger may not
|
||||||
|
* trigger
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testETBTriggeredAbilities3() {
|
public void testETBTriggeredAbilities3() {
|
||||||
|
|
@ -130,7 +131,7 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertLife(playerA, 20);
|
assertLife(playerA, 20);
|
||||||
assertLife(playerB, 20);
|
assertLife(playerB, 20);
|
||||||
assertGraveyardCount(playerB, "Reality Shift", 1);
|
assertGraveyardCount(playerB, "Reality Shift", 1);
|
||||||
assertExileCount("Silvercoat Lion" , 1);
|
assertExileCount("Silvercoat Lion", 1);
|
||||||
// a facedown creature is on the battlefield
|
// a facedown creature is on the battlefield
|
||||||
assertPermanentCount(playerA, "", 1);
|
assertPermanentCount(playerA, "", 1);
|
||||||
assertPowerToughness(playerA, "", 2, 2);
|
assertPowerToughness(playerA, "", 2, 2);
|
||||||
|
|
@ -138,8 +139,10 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertPermanentCount(playerB, "Pillarfield Ox", 1);
|
assertPermanentCount(playerB, "Pillarfield Ox", 1);
|
||||||
assertPowerToughness(playerB, "Pillarfield Ox", 2, 4);
|
assertPowerToughness(playerB, "Pillarfield Ox", 2, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If Doomwake Giant gets manifested, it's Constellation trigger may not trigger
|
* If Doomwake Giant gets manifested, it's Constellation trigger may not
|
||||||
|
* trigger
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testNylea() {
|
public void testNylea() {
|
||||||
|
|
@ -164,7 +167,7 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertLife(playerA, 20);
|
assertLife(playerA, 20);
|
||||||
assertLife(playerB, 20);
|
assertLife(playerB, 20);
|
||||||
assertGraveyardCount(playerB, "Reality Shift", 1);
|
assertGraveyardCount(playerB, "Reality Shift", 1);
|
||||||
assertExileCount("Silvercoat Lion" , 1);
|
assertExileCount("Silvercoat Lion", 1);
|
||||||
// a facedown creature is on the battlefield
|
// a facedown creature is on the battlefield
|
||||||
assertPermanentCount(playerA, "", 1);
|
assertPermanentCount(playerA, "", 1);
|
||||||
assertPowerToughness(playerA, "", 2, 2);
|
assertPowerToughness(playerA, "", 2, 2);
|
||||||
|
|
@ -172,9 +175,9 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Had a Foundry Street Denizen and another creature out.
|
Had a Foundry Street Denizen and another creature out.
|
||||||
Opponent Reality Shift'ed the other creature, manifested card was a red creature. This pumped the foundry street denizen even though it shouldn't.
|
Opponent Reality Shift'ed the other creature, manifested card was a red creature. This pumped the foundry street denizen even though it shouldn't.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testColorOfManifestedCardDoesNotCount() {
|
public void testColorOfManifestedCardDoesNotCount() {
|
||||||
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
|
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
|
||||||
|
|
@ -200,7 +203,7 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertLife(playerA, 20);
|
assertLife(playerA, 20);
|
||||||
assertLife(playerB, 20);
|
assertLife(playerB, 20);
|
||||||
assertGraveyardCount(playerB, "Reality Shift", 1);
|
assertGraveyardCount(playerB, "Reality Shift", 1);
|
||||||
assertExileCount("Silvercoat Lion" , 1);
|
assertExileCount("Silvercoat Lion", 1);
|
||||||
// a facedown creature is on the battlefield
|
// a facedown creature is on the battlefield
|
||||||
assertPermanentCount(playerA, "", 1);
|
assertPermanentCount(playerA, "", 1);
|
||||||
assertPowerToughness(playerA, "", 2, 2);
|
assertPowerToughness(playerA, "", 2, 2);
|
||||||
|
|
@ -208,8 +211,9 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
I casted a Silence the Believers on a manifested card. It moved to the exile zone face-down.
|
I casted a Silence the Believers on a manifested card. It moved to the exile zone face-down.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCardGetsExiledFaceUp() {
|
public void testCardGetsExiledFaceUp() {
|
||||||
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
|
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
|
||||||
|
|
@ -240,12 +244,12 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertLife(playerA, 20);
|
assertLife(playerA, 20);
|
||||||
assertLife(playerB, 20);
|
assertLife(playerB, 20);
|
||||||
assertGraveyardCount(playerB, "Reality Shift", 1);
|
assertGraveyardCount(playerB, "Reality Shift", 1);
|
||||||
assertExileCount("Silvercoat Lion" , 1);
|
assertExileCount("Silvercoat Lion", 1);
|
||||||
assertExileCount("Gore Swine" , 1);
|
assertExileCount("Gore Swine", 1);
|
||||||
// no facedown creature is on the battlefield
|
// no facedown creature is on the battlefield
|
||||||
assertPermanentCount(playerA, "", 0);
|
assertPermanentCount(playerA, "", 0);
|
||||||
|
|
||||||
for (Card card :currentGame.getExile().getAllCards(currentGame)){
|
for (Card card : currentGame.getExile().getAllCards(currentGame)) {
|
||||||
if (card.getName().equals("Gore Swine")) {
|
if (card.getName().equals("Gore Swine")) {
|
||||||
Assert.assertTrue("Gore Swine may not be face down in exile", !card.isFaceDown(currentGame));
|
Assert.assertTrue("Gore Swine may not be face down in exile", !card.isFaceDown(currentGame));
|
||||||
}
|
}
|
||||||
|
|
@ -255,7 +259,6 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
// Qarsi High Priest went to manifest Illusory Gains,
|
// Qarsi High Priest went to manifest Illusory Gains,
|
||||||
// but it made me choose a target for gains, then enchanted the card to that creature.
|
// but it made me choose a target for gains, then enchanted the card to that creature.
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testManifestAura() {
|
public void testManifestAura() {
|
||||||
|
|
||||||
|
|
@ -282,15 +285,13 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
assertGraveyardCount(playerB, "Illusory Gains", 0);
|
assertGraveyardCount(playerB, "Illusory Gains", 0);
|
||||||
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
|
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
|
||||||
|
|
||||||
|
|
||||||
// a facedown creature is on the battlefield
|
// a facedown creature is on the battlefield
|
||||||
assertPermanentCount(playerB, "", 1);
|
assertPermanentCount(playerB, "", 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a Megamorph card is manifested and truned by their megamorph ability
|
// Check if a Megamorph card is manifested and turned face up by their megamorph ability
|
||||||
// it gets the +1/+1 counter.
|
// it gets the +1/+1 counter.
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testManifestMegamorph() {
|
public void testManifestMegamorph() {
|
||||||
|
|
||||||
|
|
@ -300,6 +301,8 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
addCard(Zone.BATTLEFIELD, playerB, "Qarsi High Priest", 1);
|
addCard(Zone.BATTLEFIELD, playerB, "Qarsi High Priest", 1);
|
||||||
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
|
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
|
||||||
|
|
||||||
|
// Reach (This creature can block creatures with flying.)
|
||||||
|
// Megamorph {5}{G}
|
||||||
addCard(Zone.LIBRARY, playerB, "Aerie Bowmasters", 1);
|
addCard(Zone.LIBRARY, playerB, "Aerie Bowmasters", 1);
|
||||||
addCard(Zone.LIBRARY, playerB, "Mountain", 1);
|
addCard(Zone.LIBRARY, playerB, "Mountain", 1);
|
||||||
|
|
||||||
|
|
@ -326,7 +329,8 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When a Forest came manifested into play my Courser of Kruphix gained me a life.
|
* When a Forest came manifested into play my Courser of Kruphix gained me a
|
||||||
|
* life.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -349,7 +353,6 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}{B},{T}, Sacrifice another creature");
|
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}{B},{T}, Sacrifice another creature");
|
||||||
addTarget(playerB, "Silvercoat Lion");
|
addTarget(playerB, "Silvercoat Lion");
|
||||||
|
|
||||||
|
|
||||||
setStopAt(2, PhaseStep.END_TURN);
|
setStopAt(2, PhaseStep.END_TURN);
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
|
|
@ -363,7 +366,7 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whisperwood Elemental - Its sacrifice ability doesn't work..
|
* Whisperwood Elemental - Its sacrifice ability doesn't work..
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
@ -379,7 +382,6 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
|
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
|
||||||
|
|
||||||
|
|
||||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Sacrifice");
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Sacrifice");
|
||||||
|
|
||||||
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Seismic Rupture");
|
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Seismic Rupture");
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests Soulbond effect disabling whenever Soulbond creature changes its controller
|
* Tests Soulbond effect disabling whenever Soulbond creature changes its
|
||||||
|
* controller
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testChangeControllerForSoulbondCreature() {
|
public void testChangeControllerForSoulbondCreature() {
|
||||||
|
|
@ -115,7 +116,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests Soulbond effect disabling when paired creture changes its controller
|
* Tests Soulbond effect disabling when paired creture changes its
|
||||||
|
* controller
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testChangeControllerForAnotherCreature() {
|
public void testChangeControllerForAnotherCreature() {
|
||||||
|
|
@ -141,8 +143,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests Soulbond effect disabling when Soulbond creature changes its controller and then returns back.
|
* Tests Soulbond effect disabling when Soulbond creature changes its
|
||||||
* Effect should not be restored.
|
* controller and then returns back. Effect should not be restored.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testChangeControllerAndGettingBack() {
|
public void testChangeControllerAndGettingBack() {
|
||||||
|
|
@ -166,7 +168,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that stealing creature will allow to use Soulbond ability on controller's creature
|
* Tests that stealing creature will allow to use Soulbond ability on
|
||||||
|
* controller's creature
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testSoulbondWorksOnControllerSide() {
|
public void testSoulbondWorksOnControllerSide() {
|
||||||
|
|
@ -243,7 +246,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that it is possible to animate land and pair it on next coming Soulbond creature
|
* Tests that it is possible to animate land and pair it on next coming
|
||||||
|
* Soulbond creature
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testPairOnAnimatedLand() {
|
public void testPairOnAnimatedLand() {
|
||||||
|
|
@ -263,7 +267,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests no effect whether land was animated after Soulbond creature has entered the battlefield
|
* Tests no effect whether land was animated after Soulbond creature has
|
||||||
|
* entered the battlefield
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testPairOnPostAnimatedLand() {
|
public void testPairOnPostAnimatedLand() {
|
||||||
|
|
@ -302,7 +307,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that after loosing first pair it is possible to pair creature with another one
|
* Tests that after loosing first pair it is possible to pair creature with
|
||||||
|
* another one
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testRebondOnNextCreature() {
|
public void testRebondOnNextCreature() {
|
||||||
|
|
@ -357,6 +363,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
public void testExileAndReturnBack() {
|
public void testExileAndReturnBack() {
|
||||||
addCard(Zone.HAND, playerA, "Elite Vanguard");
|
addCard(Zone.HAND, playerA, "Elite Vanguard");
|
||||||
addCard(Zone.HAND, playerA, "Cloudshift");
|
addCard(Zone.HAND, playerA, "Cloudshift");
|
||||||
|
// Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)
|
||||||
|
// As long as Trusted Forcemage is paired with another creature, each of those creatures gets +1/+1.
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Trusted Forcemage");
|
addCard(Zone.BATTLEFIELD, playerA, "Trusted Forcemage");
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
|
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
|
||||||
|
|
||||||
|
|
@ -375,6 +383,6 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
|
||||||
Permanent trustedForcemange = getPermanent("Trusted Forcemage", playerA.getId());
|
Permanent trustedForcemange = getPermanent("Trusted Forcemage", playerA.getId());
|
||||||
Permanent eliteVanguard = getPermanent("Elite Vanguard", playerA.getId());
|
Permanent eliteVanguard = getPermanent("Elite Vanguard", playerA.getId());
|
||||||
Assert.assertEquals(trustedForcemange.getPairedCard(), null);
|
Assert.assertEquals(trustedForcemange.getPairedCard(), null);
|
||||||
Assert.assertEquals(eliteVanguard.getPairedCard(),null);
|
Assert.assertEquals(eliteVanguard.getPairedCard(), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ import mage.cards.Card;
|
||||||
import mage.cards.Cards;
|
import mage.cards.Cards;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
import mage.choices.Choice;
|
import mage.choices.Choice;
|
||||||
|
import mage.constants.AbilityType;
|
||||||
import mage.constants.ManaType;
|
import mage.constants.ManaType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.PhaseStep;
|
import mage.constants.PhaseStep;
|
||||||
|
|
@ -803,6 +804,9 @@ public class TestPlayer implements Player {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
|
public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
|
||||||
|
if (message.getMessage().equals("Scry 1?")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!choices.isEmpty()) {
|
if (!choices.isEmpty()) {
|
||||||
if (choices.get(0).equals("No")) {
|
if (choices.get(0).equals("No")) {
|
||||||
choices.remove(0);
|
choices.remove(0);
|
||||||
|
|
@ -813,7 +817,7 @@ public class TestPlayer implements Player {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return computerPlayer.chooseUse(outcome, message, source, game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -1822,6 +1826,16 @@ public class TestPlayer implements Player {
|
||||||
return computerPlayer.getMatchPlayer();
|
return computerPlayer.getMatchPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AbilityType getJustActivatedType() {
|
||||||
|
return computerPlayer.getJustActivatedType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setJustActivatedType(AbilityType justActivatedType) {
|
||||||
|
computerPlayer.setJustActivatedType(justActivatedType);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cleanUpOnMatchEnd() {
|
public void cleanUpOnMatchEnd() {
|
||||||
computerPlayer.cleanUpOnMatchEnd();
|
computerPlayer.cleanUpOnMatchEnd();
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ import mage.cards.Card;
|
||||||
import mage.cards.Cards;
|
import mage.cards.Cards;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
import mage.choices.Choice;
|
import mage.choices.Choice;
|
||||||
|
import mage.constants.AbilityType;
|
||||||
import mage.constants.ManaType;
|
import mage.constants.ManaType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.PlayerAction;
|
import mage.constants.PlayerAction;
|
||||||
|
|
@ -192,6 +193,10 @@ public interface Player extends MageItem, Copyable<Player> {
|
||||||
|
|
||||||
boolean getPassedAllTurns();
|
boolean getPassedAllTurns();
|
||||||
|
|
||||||
|
AbilityType getJustActivatedType();
|
||||||
|
|
||||||
|
void setJustActivatedType(AbilityType abilityType);
|
||||||
|
|
||||||
boolean hasLost();
|
boolean hasLost();
|
||||||
|
|
||||||
boolean hasWon();
|
boolean hasWon();
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,7 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
* and abilities in the stack and will pass them as well.
|
* and abilities in the stack and will pass them as well.
|
||||||
*/
|
*/
|
||||||
protected boolean passedAllTurns; // F9
|
protected boolean passedAllTurns; // F9
|
||||||
|
protected AbilityType justActivatedType; // used to check if priority can be passed automatically
|
||||||
|
|
||||||
protected int turns;
|
protected int turns;
|
||||||
protected int storedBookmark = -1;
|
protected int storedBookmark = -1;
|
||||||
|
|
@ -317,6 +318,7 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
this.passedUntilStackResolved = player.passedUntilStackResolved;
|
this.passedUntilStackResolved = player.passedUntilStackResolved;
|
||||||
this.dateLastAddedToStack = player.dateLastAddedToStack;
|
this.dateLastAddedToStack = player.dateLastAddedToStack;
|
||||||
this.passedAllTurns = player.passedAllTurns;
|
this.passedAllTurns = player.passedAllTurns;
|
||||||
|
this.justActivatedType = player.justActivatedType;
|
||||||
|
|
||||||
this.priorityTimeLeft = player.getPriorityTimeLeft();
|
this.priorityTimeLeft = player.getPriorityTimeLeft();
|
||||||
this.reachedNextTurnAfterLeaving = player.reachedNextTurnAfterLeaving;
|
this.reachedNextTurnAfterLeaving = player.reachedNextTurnAfterLeaving;
|
||||||
|
|
@ -440,6 +442,7 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
this.skippedAtLeastOnce = false;
|
this.skippedAtLeastOnce = false;
|
||||||
this.passedUntilStackResolved = false;
|
this.passedUntilStackResolved = false;
|
||||||
this.passedAllTurns = false;
|
this.passedAllTurns = false;
|
||||||
|
this.justActivatedType = null;
|
||||||
this.canGainLife = true;
|
this.canGainLife = true;
|
||||||
this.canLoseLife = true;
|
this.canLoseLife = true;
|
||||||
this.topCardRevealed = false;
|
this.topCardRevealed = false;
|
||||||
|
|
@ -1130,7 +1133,11 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
//if player has taken an action then reset all player passed flags
|
//if player has taken an action then reset all player passed flags
|
||||||
|
justActivatedType = null;
|
||||||
if (result) {
|
if (result) {
|
||||||
|
if (isHuman() && (ability.getAbilityType().equals(AbilityType.SPELL) || ability.getAbilityType().equals(AbilityType.ACTIVATED))) {
|
||||||
|
setJustActivatedType(ability.getAbilityType());
|
||||||
|
}
|
||||||
game.getPlayers().resetPassed();
|
game.getPlayers().resetPassed();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -3246,6 +3253,16 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
return passedUntilStackResolved;
|
return passedUntilStackResolved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AbilityType getJustActivatedType() {
|
||||||
|
return justActivatedType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setJustActivatedType(AbilityType justActivatedType) {
|
||||||
|
this.justActivatedType = justActivatedType;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void revokePermissionToSeeHandCards() {
|
public void revokePermissionToSeeHandCards() {
|
||||||
usersAllowedToSeeHandCards.clear();
|
usersAllowedToSeeHandCards.clear();
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,14 @@ public class UserData implements Serializable {
|
||||||
protected boolean askMoveToGraveOrder;
|
protected boolean askMoveToGraveOrder;
|
||||||
protected boolean manaPoolAutomatic;
|
protected boolean manaPoolAutomatic;
|
||||||
protected boolean manaPoolAutomaticRestricted;
|
protected boolean manaPoolAutomaticRestricted;
|
||||||
|
protected boolean passPriorityCast;
|
||||||
|
protected boolean passPriorityActivation;
|
||||||
|
protected boolean autoOrderTrigger;
|
||||||
|
|
||||||
public UserData(UserGroup userGroup, int avatarId, boolean showAbilityPickerForced,
|
public UserData(UserGroup userGroup, int avatarId, boolean showAbilityPickerForced,
|
||||||
boolean allowRequestShowHandCards, boolean confirmEmptyManaPool, UserSkipPrioritySteps userSkipPrioritySteps,
|
boolean allowRequestShowHandCards, boolean confirmEmptyManaPool, UserSkipPrioritySteps userSkipPrioritySteps,
|
||||||
String flagName, boolean askMoveToGraveOrder, boolean manaPoolAutomatic, boolean manaPoolAutomaticRestricted) {
|
String flagName, boolean askMoveToGraveOrder, boolean manaPoolAutomatic, boolean manaPoolAutomaticRestricted,
|
||||||
|
boolean passPriorityCast, boolean passPriorityActivation, boolean autoOrderTrigger) {
|
||||||
this.groupId = userGroup.getGroupId();
|
this.groupId = userGroup.getGroupId();
|
||||||
this.avatarId = avatarId;
|
this.avatarId = avatarId;
|
||||||
this.showAbilityPickerForced = showAbilityPickerForced;
|
this.showAbilityPickerForced = showAbilityPickerForced;
|
||||||
|
|
@ -33,6 +37,9 @@ public class UserData implements Serializable {
|
||||||
this.askMoveToGraveOrder = askMoveToGraveOrder;
|
this.askMoveToGraveOrder = askMoveToGraveOrder;
|
||||||
this.manaPoolAutomatic = manaPoolAutomatic;
|
this.manaPoolAutomatic = manaPoolAutomatic;
|
||||||
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
|
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
|
||||||
|
this.passPriorityCast = passPriorityCast;
|
||||||
|
this.passPriorityActivation = passPriorityActivation;
|
||||||
|
this.autoOrderTrigger = autoOrderTrigger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update(UserData userData) {
|
public void update(UserData userData) {
|
||||||
|
|
@ -46,10 +53,13 @@ public class UserData implements Serializable {
|
||||||
this.askMoveToGraveOrder = userData.askMoveToGraveOrder;
|
this.askMoveToGraveOrder = userData.askMoveToGraveOrder;
|
||||||
this.manaPoolAutomatic = userData.manaPoolAutomatic;
|
this.manaPoolAutomatic = userData.manaPoolAutomatic;
|
||||||
this.manaPoolAutomaticRestricted = userData.manaPoolAutomaticRestricted;
|
this.manaPoolAutomaticRestricted = userData.manaPoolAutomaticRestricted;
|
||||||
|
this.passPriorityCast = userData.passPriorityCast;
|
||||||
|
this.passPriorityActivation = userData.passPriorityActivation;
|
||||||
|
this.autoOrderTrigger = userData.autoOrderTrigger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UserData getDefaultUserDataView() {
|
public static UserData getDefaultUserDataView() {
|
||||||
return new UserData(UserGroup.DEFAULT, 0, false, false, true, null, "world.png", false, true, true);
|
return new UserData(UserGroup.DEFAULT, 0, false, false, true, null, "world.png", false, true, true, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGroupId(int groupId) {
|
public void setGroupId(int groupId) {
|
||||||
|
|
@ -132,4 +142,28 @@ public class UserData implements Serializable {
|
||||||
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
|
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPassPriorityCast() {
|
||||||
|
return passPriorityCast;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassPriorityCast(boolean passPriorityCast) {
|
||||||
|
this.passPriorityCast = passPriorityCast;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPassPriorityActivation() {
|
||||||
|
return passPriorityActivation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassPriorityActivation(boolean passPriorityActivation) {
|
||||||
|
this.passPriorityActivation = passPriorityActivation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAutoOrderTrigger() {
|
||||||
|
return autoOrderTrigger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAutoOrderTrigger(boolean autoOrderTrigger) {
|
||||||
|
this.autoOrderTrigger = autoOrderTrigger;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ public class SoulbondWatcher extends Watcher {
|
||||||
Cards cards = new CardsImpl();
|
Cards cards = new CardsImpl();
|
||||||
cards.add(chosen);
|
cards.add(chosen);
|
||||||
controller.lookAtCards("Soulbond", cards, game);
|
controller.lookAtCards("Soulbond", cards, game);
|
||||||
if (controller.chooseUse(Outcome.Benefit, "Use Soulbond for recent " + permanent.getLogName() + "?", null, game)) {
|
if (controller.chooseUse(Outcome.Benefit, "Use Soulbond for recent " + permanent.getLogName() + "?", SoulbondAbility.getInstance(), game)) {
|
||||||
chosen.setPairedCard(permanent.getId());
|
chosen.setPairedCard(permanent.getId());
|
||||||
permanent.setPairedCard(chosen.getId());
|
permanent.setPairedCard(chosen.getId());
|
||||||
if (!game.isSimulation()) {
|
if (!game.isSimulation()) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue