diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index ebd255203b8..6c189882472 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -48,6 +48,7 @@ import javax.swing.SwingUtilities; import forge.CachedCardImage; import forge.StaticData; import forge.card.CardEdition; +import forge.card.CardStateName; import forge.card.mana.ManaCost; import forge.game.card.Card; import forge.game.card.CardView; @@ -62,9 +63,11 @@ import forge.item.PaperCard; import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgeConstants.CounterDisplayType; import forge.localinstance.properties.ForgePreferences.FPref; +import forge.localinstance.skin.FSkinProp; import forge.model.FModel; import forge.screens.match.CMatchUI; import forge.toolbox.CardFaceSymbols; +import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.IDisposable; import forge.util.CardTranslation; @@ -365,6 +368,17 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } final boolean canShow = matchUI.mayView(card); + if (canShow && ZoneType.Battlefield.equals(card.getZone())) { + CardStateView cardStateView = card.getCurrentState(); + if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && !CardStateName.Original.equals(cardStateView.getState())) { + if (CardStateName.RightSplit.equals(cardStateView.getState())) { + FSkin.drawImage(g, FSkin.getIcon(FSkinProp.ICO_RIGHTLOCK), cardXOffset, cardYOffset, cardWidth, cardHeight); + } else if (CardStateName.LeftSplit.equals(cardStateView.getState())) { + FSkin.drawImage(g, FSkin.getIcon(FSkinProp.ICO_LEFTLOCK), cardXOffset, cardYOffset, cardWidth, cardHeight); + } + } + + } displayIconOverlay(g, canShow); if (canShow) { drawFoilEffect(g, card, cardXOffset, cardYOffset, diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 2b5e42de076..2a2caa222df 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -220,6 +220,8 @@ public enum FSkinImage implements FSkinImageInterface { UNKNOWN (FSkinProp.ICO_UNKNOWN), LOGO (FSkinProp.ICO_LOGO), CARDART (FSkinProp.ICO_CARDART), + LEFTLOCK (FSkinProp.ICO_LEFTLOCK), + RIGHTLOCK (FSkinProp.ICO_RIGHTLOCK), FLIPCARD (FSkinProp.ICO_FLIPCARD), HDFLIPCARD (FSkinProp.ICO_HDFLIPCARD), diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 91253cb501e..040bc33706c 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -37,6 +37,7 @@ import forge.assets.FRotatedImage; import forge.assets.FSkin; import forge.assets.FSkinColor; import forge.assets.FSkinFont; +import forge.assets.FSkinImage; import forge.assets.FSkinImageInterface; import forge.assets.FTextureRegionImage; import forge.assets.ImageCache; @@ -62,6 +63,7 @@ import forge.toolbox.FList; import static forge.assets.FSkin.getDefaultSkinFile; public class CardRenderer { + static boolean drawSpiral = false; public enum CardStackPosition { Top, BehindHorz, @@ -742,6 +744,16 @@ public class CardRenderer { return; } //remaining rendering not needed if card is behind another card in a vertical stack boolean onTop = (pos == CardStackPosition.Top); + if (canShow && ZoneType.Battlefield.equals(card.getZone())) { + //locked room + if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && !CardStateName.Original.equals(details.getState())) { + if (CardStateName.RightSplit.equals(details.getState())) { + g.drawImage(FSkinImage.RIGHTLOCK, cx, cy, cw, ch); + } else if (CardStateName.LeftSplit.equals(details.getState())) { + g.drawImage(FSkinImage.LEFTLOCK, cx, cy, cw, ch); + } + } + } if (canShow && showCardIdOverlay(card)) { FSkinFont idFont = FSkinFont.forHeight(h * 0.11f); @@ -818,7 +830,9 @@ public class CardRenderer { if (unselectable) { g.setAlphaComposite(0.6f); } + boolean drawIcons = false; if (ZoneType.Battlefield.equals(card.getZone()) && onTop) { + drawIcons = true; drawAbilityIcons(g, card, cx, cy, cw, ch, cx + ((cw * 2) / 2.3f), cy, cw / 5.5f, cw / 5.7f, showAbilityIcons(card)); } else if (canShow && !ZoneType.Battlefield.equals(card.getZone()) && showAbilityIcons(card)) { //draw indicator for flash or can be cast at instant speed, enabled if show ability icons is enabled @@ -870,6 +884,16 @@ public class CardRenderer { } } } + //TODO animate rotation inside shader + Texture spiral = Forge.getAssets().getTexture(getDefaultSkinFile("spiral.png"), false); + if (spiral != null && drawIcons) { + drawSpiral = true; + float newX = card.isTapped() ? cx + cw / 4.5f : cx; + float newY = card.isTapped() ? cy + cw / 4.75f : cy; + g.startRotateTransform(newX + cw / 2f, newY + ch / 2, -(Forge.deltaTime * 16f)); + g.drawImage(spiral, newX, newY, cw, ch); + g.endTransform(); + } //reset alpha g.setAlphaComposite(oldAlpha); } @@ -883,15 +907,7 @@ public class CardRenderer { abiCount += 1; } if (card.isSick()) { - Texture spiral = Forge.getAssets().getTexture(getDefaultSkinFile("spiral.png"), false); - if (spiral != null) { - float newX = card.isTapped() ? cx + cw / 4.5f : cx; - float newY = card.isTapped() ? cy + cw / 4.75f : cy; - g.startRotateTransform(newX + cw / 2f, newY + ch / 2, -(Forge.deltaTime * 16f)); - g.drawImage(spiral, newX, newY, cw, ch); - g.endTransform(); - } else { - //old indicator + if (!drawSpiral) { CardFaceSymbols.drawSymbol("summonsick", g, abiX, abiY, cw / 4.7f, cw / 4.7f); abiY += abiSpace + 1.7f; abiCount += 1; diff --git a/forge-gui/res/skins/default/sprite_icons.png b/forge-gui/res/skins/default/sprite_icons.png index 44c1131b9a2..759943cd660 100644 Binary files a/forge-gui/res/skins/default/sprite_icons.png and b/forge-gui/res/skins/default/sprite_icons.png differ diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index 7491d40d5ca..41d0d477423 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -360,6 +360,8 @@ public enum FSkinProp { ICO_UNKNOWN (new int[] {0, 720, 80, 80}, PropType.ICON), ICO_LOGO (new int[] {480, 0, 200, 200}, PropType.ICON), ICO_CARDART (new int[] {0, 1600, 200, 200}, PropType.ICON), + ICO_LEFTLOCK (new int[] {200, 1600, 143, 200}, PropType.ICON), + ICO_RIGHTLOCK (new int[] {343, 1600, 143, 200}, PropType.ICON), ICO_FLIPCARD (new int[] {400, 0, 80, 120}, PropType.ICON), ICO_HDFLIPCARD (new int[] {2, 1268, 387, 500}, PropType.BUTTONS),