diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 8c8f7312410..2fb8eaf7d5f 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -1,8 +1,16 @@ package forge.game.player; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Predicate; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; + import forge.LobbyPlayer; import forge.card.ColorSet; import forge.card.ICardFace; @@ -14,7 +22,11 @@ import forge.game.GameEntity; import forge.game.GameObject; import forge.game.GameOutcome.AnteResult; import forge.game.GameType; -import forge.game.card.*; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardCollectionView; +import forge.game.card.CardView; +import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostPart; @@ -23,18 +35,17 @@ import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; import forge.game.replacement.ReplacementEffect; -import forge.game.spellability.*; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCostValue; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetChoices; import forge.game.trigger.WrappedAbility; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.util.ITriggerEvent; import forge.util.collect.FCollectionView; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Collection; -import java.util.List; -import java.util.Map; /** * A prototype for player controller class @@ -278,4 +289,7 @@ public abstract class PlayerController { public abstract CardCollection chooseCardsForEffectMultiple(Map validMap, SpellAbility sa, String title, boolean isOptional); + + public void handleLandPlayed(Card land, Zone zone) { + } } diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 9fe62acfc37..6f5088a34c6 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -28,6 +28,8 @@ import forge.game.card.CardUtil; import forge.game.event.EventValueChangeType; import forge.game.event.GameEventZone; import forge.game.player.Player; +import forge.game.player.PlayerCollection; +import forge.game.player.PlayerController; import forge.util.CollectionSuppliers; import forge.util.MyRandom; import forge.util.maps.EnumMapOfLists; @@ -124,7 +126,19 @@ public class Zone implements java.io.Serializable, Iterable { } onChanged(); game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Added, c)); - } + + if(zoneType == ZoneType.Battlefield && c.isLand()) { + PlayerCollection playerCollection = game.getPlayers(); + int numPlayers = playerCollection.size(); + for (int i = 0; i < numPlayers; i++) { + Player player = playerCollection.get(i); + if(!player.isAI()) { + PlayerController playerControllerHuman = player.getController(); + playerControllerHuman.handleLandPlayed(c,this); + } + } + } + } public final boolean contains(final Card c) { return cardList.contains(c); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 7ecf07dc642..69dbdb79ae7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -246,6 +246,7 @@ public enum CSubmenuPreferences implements ICDoc { initializeMulliganRuleComboBox(); initializeAiProfilesComboBox(); initializeStackAdditionsComboBox(); + initializeLandPlayedComboBox(); initializeColorIdentityCombobox(); initializeAutoYieldModeComboBox(); initializeCounterDisplayTypeComboBox(); @@ -447,7 +448,17 @@ public enum CSubmenuPreferences implements ICDoc { final String selectedItem = this.prefs.getPref(userSetting); panel.setComboBox(comboBox, selectedItem); } - + + private void initializeLandPlayedComboBox() { + final String[] elems = {ForgeConstants.LAND_PLAYED_NOTIFICATION_NEVER, ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS, + ForgeConstants.LAND_PLAYED_NOTIFICATION_AI}; + final FPref userSetting = FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY; + final FComboBoxPanel panel = this.view.getCbpLandPlayedComboBoxPanel(); + final FComboBox comboBox = createComboBox(elems, userSetting); + final String selectedItem = this.prefs.getPref(userSetting); + panel.setComboBox(comboBox, selectedItem); + } + private void initializeColorIdentityCombobox() { final String[] elems = {ForgeConstants.DISP_CURRENT_COLORS_NEVER, ForgeConstants.DISP_CURRENT_COLORS_CHANGED, ForgeConstants.DISP_CURRENT_COLORS_MULTICOLOR, ForgeConstants.DISP_CURRENT_COLORS_MULTI_OR_CHANGED, diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 103a046b3fd..352d1a69a60 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -120,6 +120,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FComboBoxPanel cbpMulliganRule = new FComboBoxPanel<>(localizer.getMessage("cbpMulliganRule")+":"); private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); private final FComboBoxPanel cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":"); + private final FComboBoxPanel cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":"); private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>(localizer.getMessage("cbpDisplayCurrentCardColors")+":"); private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>(localizer.getMessage("cbpAutoYieldMode")+":"); private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayType")+":"); @@ -205,6 +206,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbpStackAdditions, comboBoxConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpStackAdditions")), descriptionConstraints); + + pnlPrefs.add(cbpLandPlayed, comboBoxConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpLandPlayed")), descriptionConstraints); pnlPrefs.add(cbEnforceDeckLegality, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnforceDeckLegality")), descriptionConstraints); @@ -684,6 +688,10 @@ public enum VSubmenuPreferences implements IVSubmenu { public FComboBoxPanel getCbpStackAdditionsComboBoxPanel() { return cbpStackAdditions; } + + public FComboBoxPanel getCbpLandPlayedComboBoxPanel() { + return cbpLandPlayed; + } public FComboBoxPanel getGameLogVerbosityComboBoxPanel() { return cbpGameLogEntryType; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 4d17085fd6b..518b93ce7ed 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -17,11 +17,40 @@ */ package forge.screens.match; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicReference; + +import javax.swing.JMenu; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import forge.*; + +import forge.FThreads; +import forge.GuiBase; +import forge.ImageCache; +import forge.LobbyPlayer; +import forge.Singletons; +import forge.StaticData; import forge.assets.FSkinProp; import forge.card.CardStateName; import forge.control.KeyboardShortcuts; @@ -42,11 +71,28 @@ import forge.game.keyword.Keyword; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; +import forge.game.player.Player; import forge.game.player.PlayerView; -import forge.game.spellability.*; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.SpellAbilityView; +import forge.game.spellability.StackItemView; +import forge.game.spellability.TargetChoices; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.gui.*; -import forge.gui.framework.*; +import forge.gui.FNetOverlay; +import forge.gui.GuiChoose; +import forge.gui.GuiDialog; +import forge.gui.GuiUtils; +import forge.gui.SOverlayUtils; +import forge.gui.framework.DragCell; +import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; +import forge.gui.framework.ICDoc; +import forge.gui.framework.IVDoc; +import forge.gui.framework.SDisplayUtil; +import forge.gui.framework.SLayoutIO; +import forge.gui.framework.VEmptyDoc; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.match.AbstractGuiGame; @@ -57,12 +103,23 @@ import forge.player.PlayerZoneUpdates; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.controllers.*; +import forge.screens.match.controllers.CAntes; +import forge.screens.match.controllers.CCombat; +import forge.screens.match.controllers.CDetailPicture; +import forge.screens.match.controllers.CDev; +import forge.screens.match.controllers.CDock; +import forge.screens.match.controllers.CLog; +import forge.screens.match.controllers.CPrompt; +import forge.screens.match.controllers.CStack; import forge.screens.match.menus.CMatchUIMenus; import forge.screens.match.views.VField; import forge.screens.match.views.VHand; -import forge.toolbox.*; +import forge.toolbox.FButton; +import forge.toolbox.FLabel; +import forge.toolbox.FOptionPane; +import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; +import forge.toolbox.FTextArea; import forge.toolbox.imaging.FImagePanel; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; import forge.toolbox.imaging.FImageUtil; @@ -79,17 +136,6 @@ import forge.view.arcane.CardPanel; import forge.view.arcane.FloatingZone; import net.miginfocom.swing.MigLayout; -import javax.swing.*; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.util.*; -import java.util.List; -import java.util.Map.Entry; -import java.util.concurrent.atomic.AtomicReference; - /** * Constructs instance of match UI controller, used as a single point of * top-level control for child UIs. Tasks targeting the view of individual @@ -1392,4 +1438,54 @@ public final class CMatchUI nextNotifiableStackIndex--; } + @Override + public void handleLandPlayed(Card land, Zone zone) { + Runnable createPopupThread = new Runnable() { + @Override + public void run() { + createLandPopupPanel(land,zone); + } + }; + GuiBase.getInterface().invokeInEdtAndWait(createPopupThread); + } + + private void createLandPopupPanel(Card land, Zone zone) { + + String landPlayedNotificationPolicy = FModel.getPreferences().getPref(FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY); + Player cardController = land.getController(); + boolean isAi = cardController.isAI(); + if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI.equals(landPlayedNotificationPolicy) && (isAi))) { + String title = "Forge"; + List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); + + MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); + JPanel mainPanel = new JPanel(migLayout); + final Dimension parentSize = JOptionPane.getRootFrame().getSize(); + Dimension maxSize = new Dimension(1400, parentSize.height - 100); + mainPanel.setMaximumSize(maxSize); + mainPanel.setOpaque(false); + + int rotation = getRotation(land.getView()); + + FImagePanel imagePanel = new FImagePanel(); + BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); + imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); + int imageWidth = 433; + int imageHeight = 600; + Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); + imagePanel.setMinimumSize(imagePanelDimension); + + mainPanel.add(imagePanel, "cell 0 0, spany 3"); + + String msg = cardController.toString() + " puts " + land.toString() + " into play into " + zone.toString() + "."; + + final FTextArea prompt1 = new FTextArea(msg); + prompt1.setFont(FSkin.getFont(21)); + prompt1.setAutoSize(true); + prompt1.setMinimumSize(new Dimension(475,200)); + mainPanel.add(prompt1, "cell 1 0, aligny top"); + + FOptionPane.showOptionDialog(null, title, null, mainPanel, options); + } + } } diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 7c1cc2d7adc..ea286757045 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2583,4 +2583,6 @@ lblEnterMessageToSend=Enter message to send #OnlineLobbyScreen.java lblDetectedInvalidHostAddress=Invalid host address ({0}) was detected. #Player.java -lblChooseACompanion=Choose a companion \ No newline at end of file +lblChooseACompanion=Choose a companion +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 4f3ef7c081b..71251fab2ab 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -1,11 +1,17 @@ package forge.interfaces; +import java.util.Collection; +import java.util.List; +import java.util.Map; + import com.google.common.base.Function; + import forge.LobbyPlayer; import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; @@ -14,6 +20,7 @@ import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; import forge.game.player.PlayerView; import forge.game.spellability.SpellAbilityView; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.player.PlayerZoneUpdate; @@ -21,10 +28,6 @@ import forge.player.PlayerZoneUpdates; import forge.trackable.TrackableCollection; import forge.util.ITriggerEvent; -import java.util.Collection; -import java.util.List; -import java.util.Map; - public interface IGuiGame { void setGameView(GameView gameView); GameView getGameView(); @@ -51,6 +54,7 @@ public interface IGuiGame { void updateStack(); void notifyStackAddition(final GameEventSpellAbilityCast event); void notifyStackRemoval(final GameEventSpellRemovedFromStack event); + void handleLandPlayed(Card land, Zone zone); Iterable tempShowZones(PlayerView controller, Iterable zonesToUpdate); void hideZones(PlayerView controller, Iterable zonesToUpdate); void updateZones(Iterable zonesToUpdate); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index d2c762b7840..a626d36548f 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -9,8 +9,6 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import forge.GuiBase; -import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -20,13 +18,16 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import forge.FThreads; +import forge.GuiBase; import forge.assets.FSkinProp; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.card.CardView.CardStateView; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; import forge.game.player.PlayerView; +import forge.game.zone.Zone; import forge.interfaces.IGameController; import forge.interfaces.IGuiGame; import forge.interfaces.IMayViewCards; @@ -34,6 +35,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.trackable.TrackableTypes; +import forge.util.Localizer; public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { private PlayerView currentPlayer = null; @@ -709,5 +711,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { public void notifyStackRemoval(GameEventSpellRemovedFromStack event) { } + @Override + public void handleLandPlayed(Card land, Zone zone) { + } + // End of Choice code } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 9606b476eb8..784840224a1 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1,9 +1,37 @@ package forge.player; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.Range; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.*; +import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + import forge.FThreads; import forge.GuiBase; import forge.LobbyPlayer; @@ -11,7 +39,11 @@ import forge.StaticData; import forge.achievement.AchievementCollection; import forge.ai.GameState; import forge.assets.FSkinProp; -import forge.card.*; +import forge.card.CardDb; +import forge.card.CardType; +import forge.card.ColorSet; +import forge.card.ICardFace; +import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; import forge.control.FControlGamePlayback; @@ -19,12 +51,27 @@ import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; import forge.events.UiEventNextGameDecision; -import forge.game.*; +import forge.game.Game; +import forge.game.GameEntity; +import forge.game.GameEntityView; +import forge.game.GameEntityViewMap; +import forge.game.GameLogEntryType; +import forge.game.GameObject; +import forge.game.GameType; +import forge.game.PlanarDice; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; -import forge.game.card.*; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardCollectionView; +import forge.game.card.CardFaceView; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; +import forge.game.card.CardView; +import forge.game.card.CounterEnumType; +import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; @@ -35,10 +82,20 @@ import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; -import forge.game.player.*; +import forge.game.player.DelayedReveal; +import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; +import forge.game.player.PlayerController; +import forge.game.player.PlayerView; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementLayer; -import forge.game.spellability.*; +import forge.game.spellability.AbilityManaPart; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCostValue; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.SpellAbilityView; +import forge.game.spellability.TargetChoices; import forge.game.trigger.Trigger; import forge.game.trigger.WrappedAbility; import forge.game.zone.MagicStack; @@ -52,28 +109,32 @@ import forge.interfaces.IMacroSystem; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.match.NextGameDecision; -import forge.match.input.*; +import forge.match.input.Input; +import forge.match.input.InputAttack; +import forge.match.input.InputBlock; +import forge.match.input.InputConfirm; +import forge.match.input.InputConfirmMulligan; +import forge.match.input.InputLondonMulligan; +import forge.match.input.InputPassPriority; +import forge.match.input.InputPayMana; +import forge.match.input.InputProxy; +import forge.match.input.InputQueue; +import forge.match.input.InputSelectCardsForConvokeOrImprovise; +import forge.match.input.InputSelectCardsFromList; +import forge.match.input.InputSelectEntitiesFromList; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences.FPref; +import forge.util.CardTranslation; import forge.util.ITriggerEvent; import forge.util.Lang; import forge.util.Localizer; -import forge.util.CardTranslation; import forge.util.MessageUtil; import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.gui.SOptionPane; import io.sentry.Sentry; -import org.apache.commons.lang3.Range; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; /** * A prototype for player controller class @@ -3032,5 +3093,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } return result; } + + @Override + public void handleLandPlayed(Card land, Zone zone) { + IGuiGame guiGame = getGui(); + guiGame.handleLandPlayed(land,zone); + } + + } diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index eedfa484152..809d4e823d1 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -321,6 +321,11 @@ public final class ForgeConstants { public static final String STACK_EFFECT_NOTIFICATION_NEVER = "Never"; public static final String STACK_EFFECT_NOTIFICATION_ALWAYS = "Always"; public static final String STACK_EFFECT_NOTIFICATION_AI_AND_TRIGGERED = "AI cast/activated, or triggered by any player"; + + // Constants for LAnd played notification policy + public static final String LAND_PLAYED_NOTIFICATION_NEVER = "Never"; + public static final String LAND_PLAYED_NOTIFICATION_ALWAYS = "Always"; + public static final String LAND_PLAYED_NOTIFICATION_AI = "Lands entering a battlefield because of an action of a AI player"; // Set boolean constant for landscape mode for gdx port public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index fa49f465f71..679b2922e96 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -121,6 +121,7 @@ public class ForgePreferences extends PreferencesStore { UI_CLOSE_ACTION ("NONE"), UI_MANA_LOST_PROMPT ("false"), // Prompt on losing mana when passing priority UI_STACK_EFFECT_NOTIFICATION_POLICY ("Never"), + UI_LAND_PLAYED_NOTIFICATION_POLICY ("Never"), UI_PAUSE_WHILE_MINIMIZED("false"), UI_TOKENS_IN_SEPARATE_ROW("false"), // Display tokens in their own battlefield row. UI_DISPLAY_CURRENT_COLORS(ForgeConstants.DISP_CURRENT_COLORS_NEVER),