From 2974e3375185c9054ea5c0ba2461903165b6b302 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Fri, 18 May 2018 09:57:12 -0400 Subject: [PATCH 1/5] fix error when trying to set up game state and the file doesn't exist --- forge-gui/src/main/java/forge/player/PlayerControllerHuman.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 94f599f8b22..c050ea72183 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1995,6 +1995,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont fstream.close(); } catch (final FileNotFoundException fnfe) { SOptionPane.showErrorDialog("File not found: " + filename); + return; } catch (final Exception e) { SOptionPane.showErrorDialog("Error loading battle setup file!"); return; From 96a7d7d0d28db7468bb8b8cdca98ff297518c5c3 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Fri, 18 May 2018 10:02:16 -0400 Subject: [PATCH 2/5] Prevent views flickering during gameplay when state-based affects change card state (e.g. Painter's Servant, Ambush Commander, etc) --- forge-game/src/main/java/forge/game/GameAction.java | 2 ++ forge-game/src/main/java/forge/game/spellability/Spell.java | 2 ++ forge-game/src/main/java/forge/trackable/TrackableProperty.java | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 87618eaa0eb..58d99a2658a 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -775,6 +775,7 @@ public class GameAction { if (game.isGameOver()) { return; } + game.getTracker().freeze(); //prevent views flickering during while updating for state-based effects // remove old effects game.getStaticEffects().clearStaticEffects(affectedCards); @@ -907,6 +908,7 @@ public class GameAction { if (runEvents && !affectedCards.isEmpty()) { game.fireEvent(new GameEventCardStatsChanged(affectedCards)); } + game.getTracker().unfreeze(); } public final void checkStateEffects(final boolean runEvents) { diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 3c6c94f0394..6b6a0a8c042 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -117,6 +117,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } if (lkicheck) { + game.getTracker().freeze(); //prevent views flickering during while updating for state-based effects game.getAction().checkStaticAbilities(false, Sets.newHashSet(card), new CardCollection(card)); } @@ -125,6 +126,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable // reset static abilities if (lkicheck) { game.getAction().checkStaticAbilities(false); + game.getTracker().unfreeze(); } if (!(isInstant || activator.canCastSorcery() || flash || getRestrictions().isInstantSpeed() diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 86fd384261c..8a524e7c64d 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -57,7 +57,7 @@ public enum TrackableProperty { Haunting(TrackableTypes.CardViewType), MustBlockCards(TrackableTypes.CardViewCollectionType), PairedWith(TrackableTypes.CardViewType), - CurrentState(TrackableTypes.CardStateViewType, false), //can't respect freeze, otherwise card constructor can crash + CurrentState(TrackableTypes.CardStateViewType), AlternateState(TrackableTypes.CardStateViewType), HiddenId(TrackableTypes.IntegerType), ExertedThisTurn(TrackableTypes.BooleanType), From 7071be93f78cb84786336b957fb130882449bc7c Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Fri, 18 May 2018 10:40:30 -0400 Subject: [PATCH 3/5] fix unit tests with anti flicker fixes, by having CurrentState be settable when frozen if it's null --- .../java/forge/trackable/TrackableObject.java | 14 ++++- .../forge/trackable/TrackableProperty.java | 58 ++++++++++--------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/forge-game/src/main/java/forge/trackable/TrackableObject.java b/forge-game/src/main/java/forge/trackable/TrackableObject.java index 78017583334..a4318b4a829 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableObject.java +++ b/forge-game/src/main/java/forge/trackable/TrackableObject.java @@ -65,9 +65,17 @@ public abstract class TrackableObject implements IIdentifiable, Serializable { } protected final void set(final TrackableProperty key, final T value) { - if (tracker != null && tracker.isFrozen() && key.respectFreeze()) { //if trackable objects currently frozen, queue up delayed prop change - tracker.addDelayedPropChange(this, key, value); - return; + if (tracker != null && tracker.isFrozen()) { //if trackable objects currently frozen, queue up delayed prop change + boolean respectsFreeze = false; + if (key.getFreezeMode() == TrackableProperty.FreezeMode.RespectsFreeze) { + respectsFreeze = true; + } else if (key.getFreezeMode() == TrackableProperty.FreezeMode.IgnoresFreezeIfUnset) { + respectsFreeze = (props.get(key) != null); + } + if (respectsFreeze) { + tracker.addDelayedPropChange(this, key, value); + return; + } } if (value == null || value.equals(key.getDefaultValue())) { if (props.remove(key) != null) { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 8a524e7c64d..b7772a50791 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -41,8 +41,8 @@ public enum TrackableProperty { ChosenMode(TrackableTypes.StringType), Remembered(TrackableTypes.StringType), NamedCard(TrackableTypes.StringType), - PlayerMayLook(TrackableTypes.PlayerViewCollectionType, false), - PlayerMayLookTemp(TrackableTypes.PlayerViewCollectionType, false), + PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), + PlayerMayLookTemp(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), Equipping(TrackableTypes.CardViewType), EquippedBy(TrackableTypes.CardViewCollectionType), Enchanting(TrackableTypes.GameEntityViewType), @@ -57,7 +57,7 @@ public enum TrackableProperty { Haunting(TrackableTypes.CardViewType), MustBlockCards(TrackableTypes.CardViewCollectionType), PairedWith(TrackableTypes.CardViewType), - CurrentState(TrackableTypes.CardStateViewType), + CurrentState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreezeIfUnset), AlternateState(TrackableTypes.CardStateViewType), HiddenId(TrackableTypes.IntegerType), ExertedThisTurn(TrackableTypes.BooleanType), @@ -100,19 +100,19 @@ public enum TrackableProperty { MaxHandSize(TrackableTypes.IntegerType), HasUnlimitedHandSize(TrackableTypes.BooleanType), NumDrawnThisTurn(TrackableTypes.IntegerType), - Keywords(TrackableTypes.KeywordCollectionViewType, false), - Commander(TrackableTypes.CardViewCollectionType, false), + Keywords(TrackableTypes.KeywordCollectionViewType, FreezeMode.IgnoresFreeze), + Commander(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), CommanderDamage(TrackableTypes.IntegerMapType), MindSlaveMaster(TrackableTypes.PlayerViewType), - Ante(TrackableTypes.CardViewCollectionType, false), - Battlefield(TrackableTypes.CardViewCollectionType, false), //zones can't respect freeze, otherwise cards that die from state based effects won't have that reflected in the UI - Command(TrackableTypes.CardViewCollectionType, false), - Exile(TrackableTypes.CardViewCollectionType, false), - Flashback(TrackableTypes.CardViewCollectionType, false), - Graveyard(TrackableTypes.CardViewCollectionType, false), - Hand(TrackableTypes.CardViewCollectionType, false), - Library(TrackableTypes.CardViewCollectionType, false), - Mana(TrackableTypes.ManaMapType, false), + Ante(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Battlefield(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), //zones can't respect freeze, otherwise cards that die from state based effects won't have that reflected in the UI + Command(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Exile(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Flashback(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Graveyard(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Hand(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Library(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), + Mana(TrackableTypes.ManaMapType, FreezeMode.IgnoresFreeze), //SpellAbility HostCard(TrackableTypes.CardViewType), @@ -132,12 +132,12 @@ public enum TrackableProperty { OptionalTrigger(TrackableTypes.BooleanType), //Combat - AttackersWithDefenders(TrackableTypes.GenericMapType, false), - AttackersWithBlockers(TrackableTypes.GenericMapType, false), - BandsWithDefenders(TrackableTypes.GenericMapType, false), - BandsWithBlockers(TrackableTypes.GenericMapType, false), - AttackersWithPlannedBlockers(TrackableTypes.GenericMapType, false), - BandsWithPlannedBlockers(TrackableTypes.GenericMapType, false), + AttackersWithDefenders(TrackableTypes.GenericMapType, FreezeMode.IgnoresFreeze), + AttackersWithBlockers(TrackableTypes.GenericMapType, FreezeMode.IgnoresFreeze), + BandsWithDefenders(TrackableTypes.GenericMapType, FreezeMode.IgnoresFreeze), + BandsWithBlockers(TrackableTypes.GenericMapType, FreezeMode.IgnoresFreeze), + AttackersWithPlannedBlockers(TrackableTypes.GenericMapType, FreezeMode.IgnoresFreeze), + BandsWithPlannedBlockers(TrackableTypes.GenericMapType, FreezeMode.IgnoresFreeze), //Game Players(TrackableTypes.PlayerViewCollectionType), @@ -157,19 +157,25 @@ public enum TrackableProperty { PlayerTurn(TrackableTypes.PlayerViewType), Phase(TrackableTypes.EnumType(PhaseType.class)); + public enum FreezeMode { + IgnoresFreeze, + RespectsFreeze, + IgnoresFreezeIfUnset + } + private final TrackableType type; - private final boolean respectFreeze; + private final FreezeMode freezeMode; private TrackableProperty(TrackableType type0) { - this(type0, true); + this(type0, FreezeMode.RespectsFreeze); } - private TrackableProperty(TrackableType type0, boolean respectFreeze0) { + private TrackableProperty(TrackableType type0, FreezeMode freezeMode0) { type = type0; - respectFreeze = respectFreeze0; + freezeMode = freezeMode0; } - public boolean respectFreeze() { - return respectFreeze; + public FreezeMode getFreezeMode() { + return freezeMode; } @SuppressWarnings("unchecked") From 63210a42b0593a0dbf23503484caa57a468968a4 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Fri, 18 May 2018 10:58:02 -0400 Subject: [PATCH 4/5] fix merge --- forge-game/src/main/java/forge/game/spellability/Spell.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 5da66b98f83..bf901763044 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -122,9 +122,8 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable lkicheck = true; } - if (lkicheck) { if (!Spell.performanceMode && lkicheck) { - game.getTracker().freeze(); //prevent views flickering during while updating for state-based effects + game.getTracker().freeze(); //prevent views flickering during while updating for state-based effects game.getAction().checkStaticAbilities(false, Sets.newHashSet(card), new CardCollection(card)); } From 1a81f24c45f526db0ba26e55937bc528c3476481 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Fri, 18 May 2018 10:58:52 -0400 Subject: [PATCH 5/5] remove unrelated changes --- forge-gui-mobile-dev/src/forge/app/Main.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 80d79c9a6ba..85c0ed08db0 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -68,8 +68,6 @@ public class Main { screenHeight = Integer.parseInt(res[1].trim()); } } - screenWidth=500; - screenHeight=900; // Fullscreen width and height for desktop mode (desktopMode = true) // Can be specified inside the file fullscreen_resolution.ini to override default (in the format WxH, e.g. 1920x1080)