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 0303b0d2a87..ac9739a7e02 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Set; import forge.game.spellability.SpellAbility; +import forge.util.*; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicate; @@ -36,10 +37,6 @@ import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; import forge.trackable.Tracker; -import forge.util.CardTranslation; -import forge.util.Lang; -import forge.util.Localizer; -import forge.util.TextUtil; import forge.util.collect.FCollectionView; public class CardView extends GameEntityView { @@ -311,12 +308,19 @@ public class CardView extends GameEntityView { state.updateLoyalty(c); } + public int getCrackOverlayInt() { + if (get(TrackableProperty.CrackOverlay) == null) + return 0; + return get(TrackableProperty.CrackOverlay); + } public int getDamage() { return get(TrackableProperty.Damage); } void updateDamage(Card c) { set(TrackableProperty.Damage, c.getDamage()); updateLethalDamage(c); + //update CrackOverlay (currently 16 overlays) + set(TrackableProperty.CrackOverlay, c.getDamage() > 0 ? MyRandom.getRandom().nextInt(16) : 0); } public int getAssignedDamage() { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index c9d76447383..1fe0e5074cb 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -79,6 +79,7 @@ public enum TrackableProperty { CloneOrigin(TrackableTypes.CardViewType), ExiledWith(TrackableTypes.CardViewType), WasDestroyed(TrackableTypes.BooleanType), + CrackOverlay(TrackableTypes.IntegerType), ImprintedCards(TrackableTypes.CardViewCollectionType), HauntedBy(TrackableTypes.CardViewCollectionType), diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index 0ef3ba96b19..129b5667ce4 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -719,9 +719,11 @@ public class Graphics { batch.begin(); } } - public void drawCardImage(FImage image, float x, float y, float w, float h, boolean drawGrayscale) { + public void drawCardImage(FImage image, TextureRegion damage_overlay, float x, float y, float w, float h, boolean drawGrayscale, boolean damaged) { if (!drawGrayscale) { image.draw(this, x, y, w, h); + if (damage_overlay != null && damaged) + batch.draw(damage_overlay, adjustX(x), adjustY(y, h), w, h); } else { batch.end(); shaderGrayscale.bind(); @@ -736,9 +738,11 @@ public class Graphics { batch.begin(); } } - public void drawCardImage(Texture image, float x, float y, float w, float h, boolean drawGrayscale) { + public void drawCardImage(Texture image, TextureRegion damage_overlay, float x, float y, float w, float h, boolean drawGrayscale, boolean damaged) { if (!drawGrayscale) { batch.draw(image, adjustX(x), adjustY(y, h), w, h); + if (damage_overlay != null && damaged) + batch.draw(damage_overlay, adjustX(x), adjustY(y, h), w, h); } else { batch.end(); shaderGrayscale.bind(); @@ -753,10 +757,12 @@ public class Graphics { batch.begin(); } } - public void drawCardImage(TextureRegion image, float x, float y, float w, float h, boolean drawGrayscale) { + public void drawCardImage(TextureRegion image, TextureRegion damage_overlay, float x, float y, float w, float h, boolean drawGrayscale, boolean damaged) { if (image != null) { if (!drawGrayscale) { batch.draw(image, adjustX(x), adjustY(y, h), w, h); + if (damage_overlay != null && damaged) + batch.draw(damage_overlay, adjustX(x), adjustY(y, h), w, h); } else { batch.end(); shaderGrayscale.bind(); @@ -772,6 +778,25 @@ public class Graphics { } } } + public void drawGrayTransitionImage(FImage image, float x, float y, float w, float h, boolean withDarkOverlay, float percentage) { + batch.end(); + shaderGrayscale.bind(); + shaderGrayscale.setUniformf("u_grayness", percentage); + batch.setShader(shaderGrayscale); + batch.begin(); + //draw gray + image.draw(this, x, y, w, h); + //reset + batch.end(); + batch.setShader(null); + batch.begin(); + if(withDarkOverlay){ + float oldalpha = alphaComposite; + setAlphaComposite(0.4f); + fillRect(Color.BLACK, x, y, w, h); + setAlphaComposite(oldalpha); + } + } public void drawImage(FImage image, float x, float y, float w, float h) { drawImage(image, x, y, w, h, false); } diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index d055d3b02d3..0f7137db1f5 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -30,6 +30,7 @@ public class FSkin { private static final Map images = new HashMap<>(512); private static final Map avatars = new HashMap<>(150); private static final Map sleeves = new HashMap<>(64); + private static final Map cracks = new HashMap<>(16); private static final Map borders = new HashMap<>(); private static final Map deckbox = new HashMap<>(); @@ -39,7 +40,7 @@ public class FSkin { private static boolean loaded = false; public static Texture hdLogo = null; public static Texture overlay_alpha = null; - public static Texture scratch = null; + public static Texture splatter = null; public static void changeSkin(final String skinName) { final ForgePreferences prefs = FModel.getPreferences(); @@ -143,13 +144,13 @@ public class FSkin { } else { overlay_alpha = null; } - final FileHandle scratch_overlay = getDefaultSkinFile("scratch.png"); - if (scratch_overlay.exists()) { - Texture txScratch = new Texture(scratch_overlay, true); - txScratch.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); - scratch = txScratch; + final FileHandle splatter_overlay = getDefaultSkinFile("splatter.png"); + if (splatter_overlay.exists()) { + Texture txSplatter = new Texture(splatter_overlay, true); + txSplatter.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); + splatter = txSplatter; } else { - scratch = null; + splatter = null; } if (splashScreen != null) { @@ -236,6 +237,7 @@ public class FSkin { final FileHandle f11 = getSkinFile(ForgeConstants.SPRITE_BUTTONS_FILE); final FileHandle f12 = getSkinFile(ForgeConstants.SPRITE_START_FILE); final FileHandle f13 = getDefaultSkinFile(ForgeConstants.SPRITE_DECKBOX_FILE); + final FileHandle f17 = getDefaultSkinFile(ForgeConstants.SPRITE_CRACKS_FILE); /*TODO Themeable final FileHandle f14 = getDefaultSkinFile(ForgeConstants.SPRITE_SETLOGO_FILE); @@ -313,8 +315,8 @@ public class FSkin { int counter = 0; int scount = 0; Color pxTest; - Pixmap pxDefaultAvatars, pxPreferredAvatars, pxDefaultSleeves; - Texture txDefaultAvatars, txPreferredAvatars, txDefaultSleeves; + Pixmap pxDefaultAvatars, pxPreferredAvatars, pxDefaultSleeves, pxCracks; + Texture txDefaultAvatars, txPreferredAvatars, txDefaultSleeves, txCracks; pxDefaultAvatars = new Pixmap(f4); pxDefaultSleeves = new Pixmap(f8); @@ -399,6 +401,21 @@ public class FSkin { FSkin.sleeves.put(scount++, new TextureRegion(txDefaultSleeves, i, j, 360, 500)); } } + //cracks + pxCracks = new Pixmap(f17); + txCracks = new Texture(f17, textureFilter); + int crackCount = 0; + if (textureFilter) + txCracks.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); + + for (int j = 0; j < 4; j++) { + int x = j * 200; + for(int i = 0; i < 4; i++) { + int y = i * 279; + FSkin.cracks.put(crackCount++, new TextureRegion(txCracks, x, y, 200, 279)); + } + } + //borders Texture bordersBW = new Texture(f10); FSkin.borders.put(0, new TextureRegion(bordersBW, 2, 2, 672, 936)); @@ -417,6 +434,7 @@ public class FSkin { preferredIcons.dispose(); pxDefaultAvatars.dispose(); pxDefaultSleeves.dispose(); + pxCracks.dispose(); } catch (final Exception e) { System.err.println("FSkin$loadFull: Missing a sprite (default icons, " @@ -513,6 +531,10 @@ public class FSkin { return sleeves; } + public static Map getCracks() { + return cracks; + } + public static Map getBorders() { return borders; } diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index cbc5ef4e426..ef094994d03 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -486,6 +486,7 @@ public enum FSkinImage implements FImage { MANAICONS(ForgeConstants.SPRITE_MANAICONS_FILE), SETLOGOS(ForgeConstants.SPRITE_SETLOGO_FILE), WATERMARKS(ForgeConstants.SPRITE_WATERMARK_FILE), + CRACKS(ForgeConstants.SPRITE_CRACKS_FILE), CARDBG(ForgeConstants.SPRITE_CARDBG_FILE), PLANAR_CONQUEST(ForgeConstants.SPRITE_PLANAR_CONQUEST_FILE); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 4e3312307cb..9b009eb4e41 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -9,7 +9,7 @@ import java.util.Map; import forge.ImageKeys; import forge.localinstance.properties.ForgeConstants; -import forge.util.FileUtil; +import forge.util.*; import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.Gdx; @@ -57,9 +57,6 @@ import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; import forge.screens.match.MatchController; import forge.toolbox.FList; -import forge.util.CardTranslation; -import forge.util.TextBounds; -import forge.util.Utils; public class CardRenderer { public enum CardStackPosition { @@ -573,6 +570,7 @@ public class CardRenderer { boolean canshow = MatchController.instance.mayView(card); boolean showsleeves = card.isFaceDown() && card.isInZone(EnumSet.of(ZoneType.Exile)); //fix facedown card image ie gonti lord of luxury Texture image = new RendererCachedCardImage(card, false).getImage( showAltState ? card.getAlternateState().getImageKey() : card.getCurrentState().getImageKey()); + TextureRegion crack_overlay = FSkin.getCracks().get(card.getCrackOverlayInt()); FImage sleeves = MatchController.getPlayerSleeve(card.getOwner()); float radius = (h - w)/8; float croppedArea = isModernFrame(card) ? CROP_MULTIPLIER : 0.97f; @@ -590,9 +588,9 @@ public class CardRenderer { g.setAlphaComposite(oldAlpha); } else if (showsleeves) { if (!card.isForeTold()) - g.drawCardImage(sleeves, x, y, w, h, card.wasDestroyed()); + g.drawCardImage(sleeves, crack_overlay, x, y, w, h, card.wasDestroyed(), card.getDamage() > 0); else - g.drawCardImage(image, x, y, w, h, card.wasDestroyed()); + g.drawCardImage(image, crack_overlay, x, y, w, h, card.wasDestroyed(), card.getDamage() > 0); } else { if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON) && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate){ @@ -610,19 +608,19 @@ public class CardRenderer { } else { if (Forge.enableUIMask.equals("Full") && canshow) { if (ImageCache.isBorderlessCardArt(image)) - g.drawCardImage(image, x, y, w, h, card.wasDestroyed()); + g.drawCardImage(image, crack_overlay, x, y, w, h, card.wasDestroyed(), card.getDamage() > 0); else { boolean t = (card.getCurrentState().getOriginalColors() != card.getCurrentState().getColors()) || card.getCurrentState().hasChangeColors(); g.drawBorderImage(ImageCache.getBorderImage(image.toString(), canshow), ImageCache.borderColor(image), ImageCache.getTint(card, image), x, y, w, h, t); //tint check for changed colors - g.drawCardImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea, card.wasDestroyed()); + g.drawCardImage(ImageCache.croppedBorderImage(image), crack_overlay, x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea, card.wasDestroyed(), card.getDamage() > 0); } } else if (Forge.enableUIMask.equals("Crop") && canshow) { - g.drawCardImage(ImageCache.croppedBorderImage(image), x, y, w, h, card.wasDestroyed()); + g.drawCardImage(ImageCache.croppedBorderImage(image), crack_overlay, x, y, w, h, card.wasDestroyed(), card.getDamage() > 0); } else { if (canshow) - g.drawCardImage(image, x, y, w, h, card.wasDestroyed()); + g.drawCardImage(image, crack_overlay, x, y, w, h, card.wasDestroyed(), card.getDamage() > 0); else // draw card back sleeves - g.drawCardImage(sleeves, x, y, w, h, card.wasDestroyed()); + g.drawCardImage(sleeves, crack_overlay, x, y, w, h, card.wasDestroyed(), card.getDamage() > 0); } } } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 70f003fce34..39974d71288 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -580,7 +580,7 @@ public class MatchScreen extends FScreen { } private class BGAnimation extends ForgeAnimation { - private static final float DURATION = 0.2f; + private static final float DURATION = 1.5f; private float progress = 0; private boolean finished; @@ -593,7 +593,7 @@ public class MatchScreen extends FScreen { percentage = 1; } g.setAlphaComposite(percentage); - g.drawImage(image, x, y, w, h, darkoverlay); + g.drawGrayTransitionImage(image, x, y, w, h, darkoverlay, 1-(percentage*1)); g.setAlphaComposite(oldAlpha); } @@ -643,7 +643,7 @@ public class MatchScreen extends FScreen { bgFullWidth = w; bgHeight = scaledbgHeight; } - if (bgAnimation != null && !isGameFast) { + if (bgAnimation != null && !isGameFast && !MatchController.instance.getGameView().isMatchOver()) { bgAnimation.drawBackground(g, FSkinTexture.valueOf(imageName), x + (w - bgFullWidth) / 2, y, bgFullWidth, bgHeight, true); } else { g.drawImage(FSkinTexture.valueOf(imageName), x + (w - bgFullWidth) / 2, y, bgFullWidth, bgHeight, true); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index 66c90351ccf..cbe9473cdaa 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -43,7 +43,7 @@ public class VAvatar extends FDisplayObject { private static final float DURATION = 0.6f; private float progress = 0; private boolean finished; - Texture scratch = FSkin.scratch; + Texture splatter = FSkin.splatter; private void drawAvatar(Graphics g, FImage image, float x, float y, float w, float h) { float percentage = progress / DURATION; @@ -55,14 +55,14 @@ public class VAvatar extends FDisplayObject { player.setAvatarWasDamaged(false); } float mod = w/2f; - if (scratch == null) { + if (splatter == null) { g.setColorRGBA(1, percentage, percentage, g.getfloatAlphaComposite()); g.drawAvatarImage(image, x, y, w, h, player.getHasLost()); g.resetColorRGBA(g.getfloatAlphaComposite()); } else { g.drawAvatarImage(image, x, y, w, h, player.getHasLost()); g.setAlphaComposite(1-(percentage*1)); - g.drawImage(scratch, x-mod/2, y-mod/2, w+mod, h+mod); + g.drawImage(splatter, x-mod/2, y-mod/2, w+mod, h+mod); g.resetAlphaComposite(); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index a5bb861d39d..23a9789c744 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -371,7 +371,7 @@ public class VPlayerPanel extends FContainer { if (!Forge.altZoneTabs) field.setFieldModifier(0); else - field.setFieldModifier(avatarWidth); + field.setFieldModifier(avatarWidth/16); } @Override @@ -546,6 +546,12 @@ public class VPlayerPanel extends FContainer { public void draw(Graphics g) { float x, y, w, h; + if (Forge.altZoneTabs) { + //draw extra + if (isAltZoneDisplay(this) && selectedTab == this) { + g.fillRect(DISPLAY_AREA_BACK_COLOR, 0, isFlipped() ? INFO_TAB_PADDING_Y : 0, getWidth(), getHeight() - INFO_TAB_PADDING_Y); + } + } if (selectedTab == this) { y = 0; w = getWidth(); diff --git a/forge-gui-mobile/src/forge/toolbox/FCardPanel.java b/forge-gui-mobile/src/forge/toolbox/FCardPanel.java index aa248d7609b..5d2e2992e18 100644 --- a/forge-gui-mobile/src/forge/toolbox/FCardPanel.java +++ b/forge-gui-mobile/src/forge/toolbox/FCardPanel.java @@ -92,7 +92,7 @@ public class FCardPanel extends FDisplayObject { private static final float DURATION = 0.6f; private float progress = 0; private boolean finished; - private Texture scratch = FSkin.scratch; + private Texture splatter = FSkin.splatter; private void drawCard(Graphics g, CardView card, float x, float y, float w, float h, float edgeOffset) { float percentage = progress / DURATION; @@ -107,9 +107,9 @@ public class FCardPanel extends FDisplayObject { g.startRotateTransform(x + edgeOffset, y + h - edgeOffset, getTappedAngle()); } CardRenderer.drawCardWithOverlays(g, card, x-mod/2, y-mod/2, w+mod, h+mod, getStackPosition()); - if (scratch != null) { + if (splatter != null) { g.setAlphaComposite(0.6f); - g.drawCardImage(scratch, x-mod/2, y-mod/2, w+mod, h+mod, true); + g.drawCardImage(splatter, null,x-mod/2, y-mod/2, w+mod, h+mod, true, false); g.setAlphaComposite(oldAlpha); } if (tapped) { @@ -230,7 +230,6 @@ public class FCardPanel extends FDisplayObject { if (tapped) { g.endTransform(); } - } else { if (tapped) { //reset untapAnimation diff --git a/forge-gui/res/skins/default/scratch.png b/forge-gui/res/skins/default/splatter.png similarity index 100% rename from forge-gui/res/skins/default/scratch.png rename to forge-gui/res/skins/default/splatter.png diff --git a/forge-gui/res/skins/default/sprite_cracks.png b/forge-gui/res/skins/default/sprite_cracks.png new file mode 100644 index 00000000000..a2c214b4481 Binary files /dev/null and b/forge-gui/res/skins/default/sprite_cracks.png differ diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index 81eded8cce2..4290e824b6d 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -117,6 +117,7 @@ public final class ForgeConstants { public static final String SPRITE_START_FILE = "sprite_start.png"; public static final String SPRITE_MANAICONS_FILE = "sprite_manaicons.png"; public static final String SPRITE_AVATARS_FILE = "sprite_avatars.png"; + public static final String SPRITE_CRACKS_FILE = "sprite_cracks.png"; public static final String SPRITE_SLEEVES_FILE = "sprite_sleeves.png"; public static final String SPRITE_SLEEVES2_FILE = "sprite_sleeves2.png"; public static final String SPRITE_FAVICONS_FILE = "sprite_favicons.png";