From fbf3c79c15eaa980b4b67bba3daf2ec74177fac2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 14 Oct 2020 21:30:55 +0800 Subject: [PATCH] Fix Split Cards Display -Shows correct name & colors on card views, choice list and show correct border colors when an effect like Painter's Servant is in play... --- .../main/java/forge/game/card/CardView.java | 29 +++++++++++++++++-- .../forge/trackable/TrackableProperty.java | 4 +++ .../src/forge/assets/ImageCache.java | 2 -- .../src/forge/card/CardRenderer.java | 10 +++---- .../src/forge/screens/match/views/VStack.java | 2 +- .../src/forge/toolbox/FChoiceList.java | 2 +- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 195c98ea936..9718e59b41a 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -691,6 +691,20 @@ public class CardView extends GameEntityView { return get(TrackableProperty.AlternateState); } + public boolean hasLeftSplitState() { + return getLeftSplitState() != null; + } + public CardStateView getLeftSplitState() { + return get(TrackableProperty.LeftSplitState); + } + + public boolean hasRightSplitState() { + return getRightSplitState() != null; + } + public CardStateView getRightSplitState() { + return get(TrackableProperty.RightSplitState); + } + public boolean hasBackSide() { return get(TrackableProperty.HasBackSide); } @@ -731,9 +745,8 @@ public class CardView extends GameEntityView { CardState currentState = c.getCurrentState(); if (isSplitCard) { - if (c.getCurrentStateName() != CardStateName.LeftSplit && c.getCurrentStateName() != CardStateName.RightSplit && c.getCurrentStateName() != CardStateName.FaceDown) { - currentState = c.getState(CardStateName.LeftSplit); - } + set(TrackableProperty.LeftSplitState, c.getState(CardStateName.LeftSplit).getView()); + set(TrackableProperty.RightSplitState, c.getState(CardStateName.RightSplit).getView()); } CardStateView currentStateView = currentState.getView(); @@ -901,6 +914,12 @@ public class CardView extends GameEntityView { public ColorSet getOriginalColors() { return get(TrackableProperty.OriginalColors); } + public ColorSet getLeftSplitColors() { + return get(TrackableProperty.LeftSplitColors); + } + public ColorSet getRightSplitColors() { + return get(TrackableProperty.RightSplitColors); + } void updateColors(Card c) { set(TrackableProperty.Colors, c.determineColor()); } @@ -909,6 +928,10 @@ public class CardView extends GameEntityView { } void setOriginalColors(Card c) { set(TrackableProperty.OriginalColors, c.determineColor()); + if (c.isSplitCard()) { + set(TrackableProperty.LeftSplitColors, c.determineColor(c.getState(CardStateName.LeftSplit))); + set(TrackableProperty.RightSplitColors, c.determineColor(c.getState(CardStateName.RightSplit))); + } } void updateHasChangeColors(boolean hasChangeColor) { set(TrackableProperty.HasChangedColors, hasChangeColor); diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index e8b8348f8a2..ae556c20d51 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -69,6 +69,8 @@ public enum TrackableProperty { PairedWith(TrackableTypes.CardViewType), CurrentState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreeze), AlternateState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreeze), + LeftSplitState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreeze), + RightSplitState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreeze), HiddenId(TrackableTypes.IntegerType), ExertedThisTurn(TrackableTypes.BooleanType), @@ -76,6 +78,8 @@ public enum TrackableProperty { Name(TrackableTypes.StringType), Colors(TrackableTypes.ColorSetType), OriginalColors(TrackableTypes.ColorSetType), + LeftSplitColors(TrackableTypes.ColorSetType), + RightSplitColors(TrackableTypes.ColorSetType), ImageKey(TrackableTypes.StringType), Type(TrackableTypes.CardTypeViewType), ManaCost(TrackableTypes.ManaCostType), diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index d1ad2fda02e..bdaae96ac9a 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -294,8 +294,6 @@ public class ImageCache { if (c.isFaceDown()) return Color.valueOf("#171717"); - //todo: determine correct splitcards colors - CardView.CardStateView state = c.getCurrentState(); if (state.getColors().isColorless()) { //Moonlace -> target spell or permanent becomes colorless. if (state.hasDevoid()) //devoid is colorless at all zones so return its corresponding border color... diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 460412fdb9c..ce122a5e929 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -543,9 +543,9 @@ public class CardRenderer { } public static void drawCardWithOverlays(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos) { - drawCardWithOverlays(g, card, x, y, w, h, pos, false, false); + drawCardWithOverlays(g, card, x, y, w, h, pos, false, false, false); } - public static void drawCardWithOverlays(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean stackview, boolean showAltState) { + public static void drawCardWithOverlays(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean stackview, boolean showAltState, boolean isChoiceList) { boolean canShow = MatchController.instance.mayView(card); float oldAlpha = g.getfloatAlphaComposite(); boolean unselectable = !MatchController.instance.isSelectable(card) && MatchController.instance.isSelecting(); @@ -560,7 +560,7 @@ public class CardRenderer { h -= 2 * padding; // TODO: A hacky workaround is currently used to make the game not leak the color information for Morph cards. - final CardStateView details = showAltState ? card.getAlternateState() : card.getCurrentState(); + final CardStateView details = showAltState ? card.getAlternateState() : isChoiceList && card.isSplitCard() ? card.getLeftSplitState() : card.getCurrentState(); final boolean isFaceDown = card.isFaceDown(); final DetailColors borderColor = isFaceDown ? CardDetailUtil.DetailColors.FACE_DOWN : CardDetailUtil.getBorderColor(details, canShow); // canShow doesn't work here for face down Morphs Color color = FSkinColor.fromRGB(borderColor.r, borderColor.g, borderColor.b); @@ -932,8 +932,8 @@ public class CardRenderer { dy *= -1; // flip card costs for Aftermath cards } - drawManaCost(g, card.getAlternateState().getManaCost(), x - padding, y - dy, w + 2 * padding, h, manaSymbolSize); - drawManaCost(g, card.getCurrentState().getManaCost(), x - padding, y + dy, w + 2 * padding, h, manaSymbolSize); + drawManaCost(g, card.getRightSplitState().getManaCost(), x - padding, y - dy, w + 2 * padding, h, manaSymbolSize); + drawManaCost(g, card.getLeftSplitState().getManaCost(), x - padding, y + dy, w + 2 * padding, h, manaSymbolSize); } } else { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index b3ae6edd666..498f857d045 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -382,7 +382,7 @@ public class VStack extends FDropDown { x += PADDING; y += PADDING; - CardRenderer.drawCardWithOverlays(g, stackInstance.getSourceCard(), x, y, CARD_WIDTH, CARD_HEIGHT, CardStackPosition.Top, true, false); + CardRenderer.drawCardWithOverlays(g, stackInstance.getSourceCard(), x, y, CARD_WIDTH, CARD_HEIGHT, CardStackPosition.Top, true, false, false); x += CARD_WIDTH + PADDING; w -= x + PADDING - BORDER_THICKNESS; diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index cef977a37fb..5cd93132579 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -516,7 +516,7 @@ public class FChoiceList extends FList implements ActivateHandler { public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) { CardView cv = ((IHasCardView)value).getCardView(); boolean showAlternate = showAlternate(cv, value.toString()); - CardRenderer.drawCardWithOverlays(g, cv, x, y, VStack.CARD_WIDTH, VStack.CARD_HEIGHT, CardStackPosition.Top, false, showAlternate); + CardRenderer.drawCardWithOverlays(g, cv, x, y, VStack.CARD_WIDTH, VStack.CARD_HEIGHT, CardStackPosition.Top, false, showAlternate, true); float dx = VStack.CARD_WIDTH + FList.PADDING; x += dx;