diff --git a/.gitattributes b/.gitattributes index 72ee03e3744..1a37706fc95 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15275,6 +15275,7 @@ forge-gui/src/main/java/forge/gui/events/IUiEventVisitor.java -text forge-gui/src/main/java/forge/gui/events/UiEvent.java -text forge-gui/src/main/java/forge/gui/events/UiEventAttackerDeclared.java -text forge-gui/src/main/java/forge/gui/events/UiEventBlockerAssigned.java -text +forge-gui/src/main/java/forge/gui/events/UiEventCardPhased.java -text forge-gui/src/main/java/forge/gui/framework/CEmptyDoc.java -text forge-gui/src/main/java/forge/gui/framework/DragCell.java -text forge-gui/src/main/java/forge/gui/framework/DragTab.java -text diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index e8206501075..c1b98723b15 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -1,5 +1,6 @@ DEFAULT_MAX_PLANAR_DIE_ROLLS_PER_TURN=1 DEFAULT_MIN_TURN_TO_ROLL_PLANAR_DIE=3 DEFAULT_PLANAR_DIE_ROLL_CHANCE=50 -MULLIGAN_THRESHOLD=5 PLANAR_DIE_ROLL_HESITATION_CHANCE=10 +MULLIGAN_THRESHOLD=5 +CHEAT_WITH_MANA_ON_SHUFFLE=False diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 5d95749fd6c..e4483feaa64 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -1,5 +1,6 @@ DEFAULT_MAX_PLANAR_DIE_ROLLS_PER_TURN=1 DEFAULT_MIN_TURN_TO_ROLL_PLANAR_DIE=1 DEFAULT_PLANAR_DIE_ROLL_CHANCE=100 -MULLIGAN_THRESHOLD=2 PLANAR_DIE_ROLL_HESITATION_CHANCE=0 +MULLIGAN_THRESHOLD=2 +CHEAT_WITH_MANA_ON_SHUFFLE=False diff --git a/forge-gui/src/main/java/forge/game/card/Card.java b/forge-gui/src/main/java/forge/game/card/Card.java index 2bb4588465f..2015da89ad4 100644 --- a/forge-gui/src/main/java/forge/game/card/Card.java +++ b/forge-gui/src/main/java/forge/game/card/Card.java @@ -86,6 +86,8 @@ import forge.game.trigger.TriggerType; import forge.game.trigger.ZCTrigger; import forge.game.zone.Zone; import forge.game.zone.ZoneType; +import forge.gui.events.UiEventCardPhased; +import forge.gui.match.CMatchUI; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.util.Expressions; @@ -4912,6 +4914,8 @@ public class Card extends GameEntity implements Comparable { aura.phase(false); } } + + CMatchUI.SINGLETON_INSTANCE.fireEvent(new UiEventCardPhased(this, this.isPhasedOut())); } private boolean switchPhaseState() { diff --git a/forge-gui/src/main/java/forge/gui/events/IUiEventVisitor.java b/forge-gui/src/main/java/forge/gui/events/IUiEventVisitor.java index 3d0f5d4d2e9..54e81c7d971 100644 --- a/forge-gui/src/main/java/forge/gui/events/IUiEventVisitor.java +++ b/forge-gui/src/main/java/forge/gui/events/IUiEventVisitor.java @@ -3,5 +3,5 @@ package forge.gui.events; public interface IUiEventVisitor { T visit(UiEventBlockerAssigned event); T visit(UiEventAttackerDeclared event); - + T visit(UiEventCardPhased event); } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/gui/events/UiEventCardPhased.java b/forge-gui/src/main/java/forge/gui/events/UiEventCardPhased.java new file mode 100644 index 00000000000..36f3686fabc --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/events/UiEventCardPhased.java @@ -0,0 +1,32 @@ +package forge.gui.events; + +import forge.game.card.Card; + +/** + * TODO: Write javadoc for this type. + * + */ +public class UiEventCardPhased extends UiEvent { + + public final Card phasingCard; + public final boolean phaseState; + + public UiEventCardPhased(Card card, boolean state) { + phasingCard = card; + phaseState = state; + } + + @Override + public T visit(IUiEventVisitor visitor) { + return visitor.visit(this); + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return phasingCard != null ? phasingCard.toString() : "(unknown)" + " changed its phased-out state to " + phaseState; + } +} + diff --git a/forge-gui/src/main/java/forge/gui/match/CMatchUI.java b/forge-gui/src/main/java/forge/gui/match/CMatchUI.java index 7bf623eb30e..620ff0aabd7 100644 --- a/forge-gui/src/main/java/forge/gui/match/CMatchUI.java +++ b/forge-gui/src/main/java/forge/gui/match/CMatchUI.java @@ -49,6 +49,7 @@ import forge.gui.events.IUiEventVisitor; import forge.gui.events.UiEvent; import forge.gui.events.UiEventAttackerDeclared; import forge.gui.events.UiEventBlockerAssigned; +import forge.gui.events.UiEventCardPhased; import forge.gui.framework.EDocID; import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; @@ -407,16 +408,22 @@ public enum CMatchUI implements ICDoc, IMenuProvider { uiEvents.post(uiEvent); } - public class MatchUiEventVisitor implements IUiEventVisitor { - @Override - public Void visit(UiEventBlockerAssigned event) { - updateSingleCard(event.blocker); - return null; - } + public class MatchUiEventVisitor implements IUiEventVisitor { + @Override + public Void visit(UiEventBlockerAssigned event) { + updateSingleCard(event.blocker); + return null; + } + + @Override + public Void visit(UiEventAttackerDeclared event) { + updateSingleCard(event.attacker); + return null; + } @Override - public Void visit(UiEventAttackerDeclared event) { - updateSingleCard(event.attacker); + public Void visit(UiEventCardPhased event) { + updateSingleCard(event.phasingCard); return null; } diff --git a/forge-gui/src/main/java/forge/sound/EventVisualizer.java b/forge-gui/src/main/java/forge/sound/EventVisualizer.java index 58222fbceda..6867407a832 100644 --- a/forge-gui/src/main/java/forge/sound/EventVisualizer.java +++ b/forge-gui/src/main/java/forge/sound/EventVisualizer.java @@ -28,6 +28,7 @@ import forge.game.zone.ZoneType; import forge.gui.events.IUiEventVisitor; import forge.gui.events.UiEventAttackerDeclared; import forge.gui.events.UiEventBlockerAssigned; +import forge.gui.events.UiEventCardPhased; import forge.net.FServer; import forge.util.maps.MapOfLists; @@ -207,4 +208,8 @@ public class EventVisualizer extends IGameEventVisitor.Base imp public SoundEffectType visit(UiEventAttackerDeclared event) { return null; } + @Override + public SoundEffectType visit(UiEventCardPhased event) { + return SoundEffectType.Phasing; + } } diff --git a/forge-gui/src/main/java/forge/sound/SoundEffectType.java b/forge-gui/src/main/java/forge/sound/SoundEffectType.java index 481babe4d7f..24f1b6a691d 100644 --- a/forge-gui/src/main/java/forge/sound/SoundEffectType.java +++ b/forge-gui/src/main/java/forge/sound/SoundEffectType.java @@ -36,44 +36,44 @@ package forge.sound; public enum SoundEffectType { // Sounds must be listed in alphabetic order. - AddCounter("add_counter.wav", true), - Artifact("artifact.wav", false), - ArtifactCreature("artifact_creature.wav", false), - BlackLand("black_land.wav", false), - Block("block.wav", false), - BlueLand("blue_land.wav", false), - Creature("creature.wav", false), - Damage("damage.wav", true), - Destroy("destroy.wav", true), - Discard("discard.wav", false), - Draw("draw.wav", false), - Enchantment("enchant.wav", false), - EndOfTurn("end_of_turn.wav", false), - Equip("equip.wav", false), - Exile("exile.wav", false), - FlipCoin("flip_coin.wav", false), - GreenLand("green_land.wav", false), - Instant("instant.wav", false), - LifeGain("life_gain.wav", true), - LifeLoss("life_loss.wav", true), - LoseDuel("lose_duel.wav", false), - ManaBurn("mana_burn.wav", false), - OtherLand("other_land.wav", false), - Planeswalker("planeswalker.wav", false), - Poison("poison.wav", true), - RedLand("red_land.wav", false), - Regen("regeneration.wav", false), - RemoveCounter("remove_counter.wav", true), - Sacrifice("sacrifice.wav", true), - ScriptedEffect("", false), // Plays the effect defined by SVar:SoundEffect - Shuffle("shuffle.wav", false), - Sorcery("sorcery.wav", false), - Tap("tap.wav", false), - Token("token.wav", true), - Untap("untap.wav", true), - WhiteLand("white_land.wav", false), - WinDuel("win_duel.wav", false); - + AddCounter("add_counter.wav", true), + Artifact("artifact.wav", false), + ArtifactCreature("artifact_creature.wav", false), + BlackLand("black_land.wav", false), + Block("block.wav", false), + BlueLand("blue_land.wav", false), + Creature("creature.wav", false), + Damage("damage.wav", true), + Destroy("destroy.wav", true), + Discard("discard.wav", false), + Draw("draw.wav", false), + Enchantment("enchant.wav", false), + EndOfTurn("end_of_turn.wav", false), + Equip("equip.wav", false), + Exile("exile.wav", false), + FlipCoin("flip_coin.wav", false), + GreenLand("green_land.wav", false), + Instant("instant.wav", false), + LifeGain("life_gain.wav", true), + LifeLoss("life_loss.wav", true), + LoseDuel("lose_duel.wav", false), + ManaBurn("mana_burn.wav", false), + OtherLand("other_land.wav", false), + Phasing("phasing.wav", true), + Planeswalker("planeswalker.wav", false), + Poison("poison.wav", true), + RedLand("red_land.wav", false), + Regen("regeneration.wav", false), + RemoveCounter("remove_counter.wav", true), + Sacrifice("sacrifice.wav", true), + ScriptedEffect("", false), // Plays the effect defined by SVar:SoundEffect + Shuffle("shuffle.wav", false), + Sorcery("sorcery.wav", false), + Tap("tap.wav", false), + Token("token.wav", true), + Untap("untap.wav", true), + WhiteLand("white_land.wav", false), + WinDuel("win_duel.wav", false); private final String resourceFileName; private final boolean isSync;