From 7ba15b471216c07990ec66b8189d6879abff07a3 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 29 Sep 2020 20:34:20 -0400 Subject: [PATCH] v0.9.0: overhauled visuals for badges --- core/src/main/assets/interfaces/badges.png | Bin 3275 -> 4328 bytes .../shatteredpixeldungeon/Badges.java | 160 ++++++++------- .../effects/BadgeBanner.java | 192 +++++------------- .../scenes/BadgesScene.java | 2 +- .../windows/WndBadge.java | 2 +- 5 files changed, 140 insertions(+), 216 deletions(-) diff --git a/core/src/main/assets/interfaces/badges.png b/core/src/main/assets/interfaces/badges.png index b6525046233965369387cbd40f27f9c6dff30d3d..1194f286eaaeca89bffaf2b7226534aad3445dae 100644 GIT binary patch literal 4328 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 Ee-ZXPvH$=8 delta 3245 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 highlightPositions = new HashMap<>(); + + //we also hardcode any special cases + static { + //combo master + highlightPositions.put(66, new Point(3, 7)); + } + + //adds a shine to an appropriate pixel on a badge public static void highlight( Image image, int index ) { PointF p = new PointF(); - - switch (index) { - case 0: - case 1: - case 2: - case 3: - p.offset( 7, 3 ); - break; - case 4: - case 5: - case 6: - case 7: - p.offset( 6, 5 ); - break; - case 8: - case 9: - case 10: - case 11: - p.offset( 6, 3 ); - break; - case 12: - case 13: - case 14: - case 15: - p.offset( 7, 4 ); - break; - case 16: - p.offset( 6, 3 ); - break; - case 17: - p.offset( 5, 4 ); - break; - case 18: - p.offset( 7, 3 ); - break; - case 20: - p.offset( 7, 3 ); - break; - case 21: - p.offset( 7, 3 ); - break; - case 22: - p.offset( 6, 4 ); - break; - case 23: - p.offset( 4, 5 ); - break; - case 24: - p.offset( 6, 4 ); - break; - case 25: - p.offset( 6, 5 ); - break; - case 26: - p.offset( 5, 5 ); - break; - case 27: - p.offset( 6, 4 ); - break; - case 28: - p.offset( 3, 5 ); - break; - case 29: - p.offset( 5, 4 ); - break; - case 30: - p.offset( 5, 4 ); - break; - case 31: - p.offset( 5, 5 ); - break; - case 32: - case 33: - p.offset( 7, 4 ); - break; - case 34: - p.offset( 6, 4 ); - break; - case 35: - p.offset( 6, 4 ); - break; - case 36: - p.offset( 6, 5 ); - break; - case 37: - p.offset( 4, 4 ); - break; - case 38: - p.offset( 5, 5 ); - break; - case 39: - p.offset( 5, 4 ); - break; - case 40: - case 41: - case 42: - case 43: - p.offset( 5, 4 ); - break; - case 44: - case 45: - case 46: - case 47: - p.offset( 5, 5 ); - break; - case 48: - case 49: - case 50: - case 51: - p.offset( 7, 4 ); - break; - case 52: - case 53: - case 54: - case 55: - p.offset( 4, 4 ); - break; - case 56: - p.offset( 3, 7 ); - break; - case 57: - p.offset( 4, 5 ); - break; - case 58: - p.offset( 6, 4 ); - break; - case 59: - p.offset( 7, 4 ); - break; - case 60: - case 61: - case 62: - case 63: - p.offset( 4, 4 ); - break; + + if (highlightPositions.containsKey(index)){ + p.x = highlightPositions.get(index).x * image.scale.x; + p.y = highlightPositions.get(index).y * image.scale.y; + } else { + + SmartTexture tx = TextureCache.get(Assets.Interfaces.BADGES); + + int size = 16; + + int cols = tx.width / size; + int row = index / cols; + int col = index % cols; + + int x = 3; + int y = 4; + int bgColor = tx.getPixel(col * size + x, row * size + y); + int curColor = 0; + + for (x = 3; x <= 12; x++) { + curColor = tx.getPixel(col * size + x, row * size + y); + if (curColor != bgColor) break; + } + + if (curColor == bgColor) { + y++; + for (x = 3; x <= 12; x++) { + curColor = tx.getPixel(col * size + x, row * size + y); + if (curColor != bgColor) break; + } + } + + p.x = x * image.scale.x; + p.y = y * image.scale.y; + + highlightPositions.put(index, new Point(x, y)); } - - p.x *= image.scale.x; - p.y *= image.scale.y; + p.offset( -image.origin.x * (image.scale.x - 1), -image.origin.y * (image.scale.y - 1) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java index 1b0ac6287..bd74d9741 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java @@ -144,7 +144,7 @@ public class BadgesScene extends PixelScene { icon = BadgeBanner.image(badge.image); if (!unlocked) { - icon.brightness(0.25f); + icon.brightness(0.4f); } add(icon); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java index 887ccc9c1..2a95919ba 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java @@ -39,7 +39,7 @@ public class WndBadge extends Window { Image icon = BadgeBanner.image( badge.image ); icon.scale.set( 2 ); - if (!unlocked) icon.brightness(0.52f); + if (!unlocked) icon.brightness(0.4f); add( icon ); RenderedTextBlock info = PixelScene.renderTextBlock( badge.desc(), 8 );