From 2e741a4e2e4619be3e59f3406c954fab41fa8006 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 20 Jan 2022 18:10:58 -0500 Subject: [PATCH] v1.2.0: added functionality for a large status pane --- .../main/assets/interfaces/status_pane.png | Bin 684 -> 1013 bytes .../scenes/GameScene.java | 2 +- .../ui/BuffIndicator.java | 9 +- .../shatteredpixeldungeon/ui/MenuPane.java | 4 +- .../shatteredpixeldungeon/ui/StatusPane.java | 126 ++++++++++++++---- 5 files changed, 106 insertions(+), 35 deletions(-) diff --git a/core/src/main/assets/interfaces/status_pane.png b/core/src/main/assets/interfaces/status_pane.png index 35f9d6c85dc01602ed80729d5c1cbb6cce2dc16b..18fa4b94df5f13295b0372b13429b198f479e5aa 100644 GIT binary patch delta 756 zcmVC0003gktO|JVeI+pQ@$u#5 z<;%;{U#bjxqCx+ayA7cDBK zBpL{(W-t@-Orr&gL|d3p!l0Ay3n{(lNECC3zr zD@q)iKzTr?9GOhBL!i3upl?parym7SIA(fCx$62DKSO;3P3noe@y-;w(}{!TO#m3fA{^6s+&7 zC|KXuQLw&mJEIoR0$M-|=ohSQcmy1O1QKGvBOtJq=G|Fz3E=Wkny-9x3CL`4rw`CH z`UM2vfb|B~E1>=cH@m)1RHxYBruBW^E_}F_#`)Ci`{clwLmC5hhzh6EQH2e{Rr20j zOz+ZIhr#tD@^0+K^zQFi^(yYkIn?wnjkVax$3SJGizq}TN5fPXQCN}_rn-n*(q)q| zpXwr-|JN50{UcXBkDckhGu?Ei?F+Oou(R)K$JoTz6KDF(nO=0J;;aSu2W)?JwQcnH mdg`nl!WN)^w(P}#f@J_}i;qxjO9-(50000{0fAJ^_BYpPCmt2fUArA$^|!hp7ppVME575aa_oQ`4FL6)7PgA7E2sQwTD|!~p~% zWAXsR$^o>17SIA(z}f*LS|#8y0Bi$#tq}0=mHA4WPRj@2gM9Vq4XhA=-vPiDSSi3; z0p5C%fcLck19*V|-8n!lpez(n`pr%LBn!ZQVrH=^Z}`JD%3uH&W)>Y)EQq00000NkvXXu0mjfnhCh; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index dbcd453a7..7559d0724 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -354,7 +354,7 @@ public class GameScene extends PixelScene { menu.setPos( uiCamera.width-50, 1); add(menu); - status = new StatusPane(); + status = new StatusPane( false ); status.camera = uiCamera; status.setRect(0, 0, uiCamera.width, 0 ); add(status); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java index 07534aff0..64dc98cc2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -192,7 +192,7 @@ public class BuffIndicator extends Component { for (BuffButton icon : buffButtons.values()){ icon.updateIcon(); //button areas are slightly oversized, especially on small buttons - icon.setRect(x + pos * (size + 2), y, size + 2, size + (large ? 2 : 5)); + icon.setRect(x + pos * (size + (large ? 1 : 2)), y, size + (large ? 1 : 2), size + (large ? 0 : 5)); PixelScene.align(icon); pos++; } @@ -202,6 +202,8 @@ public class BuffIndicator extends Component { private Buff buff; + private boolean large; + //Todo maybe move into buff icon? public Image grey; @@ -209,6 +211,7 @@ public class BuffIndicator extends Component { public BuffButton( Buff buff, boolean large ){ super( new BuffIcon(buff, large)); this.buff = buff; + this.large = large; bringToFront(grey); } @@ -235,8 +238,8 @@ public class BuffIndicator extends Component { @Override protected void layout() { super.layout(); - grey.x = icon.x = this.x + 1; - grey.y = icon.y = this.y + 2; + grey.x = icon.x = this.x + (large ? 0 : 1); + grey.y = icon.y = this.y + (large ? 0 : 2); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java index 49b1cd107..156a78c03 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java @@ -94,9 +94,9 @@ public class MenuPane extends Component { depth.y = y + 7f - depth.baseLine() / 2f; PixelScene.align(depth); - btnJournal.setPos( x + WIDTH - 42, 1 ); + btnJournal.setPos( x + WIDTH - 42, y ); - btnMenu.setPos( x + WIDTH - btnMenu.width(), 1 ); + btnMenu.setPos( x + WIDTH - btnMenu.width(), y ); version.scale.set(PixelScene.align(0.5f)); version.measure(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java index 53153851e..b65eee19c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java @@ -66,6 +66,7 @@ public class StatusPane extends Component { private BitmapText hpText; private Image exp; + private BitmapText expText; private int lastLvl = -1; @@ -79,10 +80,16 @@ public class StatusPane extends Component { private static String asset = Assets.Interfaces.STATUS; - @Override - protected void createChildren() { + //TODO improve large mode texturing + private boolean large; - bg = new NinePatch( asset, 0, 0, 128, 36, 85, 0, 45, 0 ); + public StatusPane( boolean large ){ + super(); + + this.large = large; + + if (large) bg = new NinePatch( asset, 0, 64, 41, 39, 33, 0, 4, 0 ); + else bg = new NinePatch( asset, 0, 0, 128, 36, 85, 0, 45, 0 ); add( bg ); add( new Button(){ @@ -96,7 +103,7 @@ public class StatusPane extends Component { public GameAction keyAction() { return SPDAction.HERO_INFO; } - }.setRect( 0, 1, 30, 30 )); + }.setRect( x, y+(large ? 0 : 1), 30, 30 )); avatar = HeroSprite.avatar( Dungeon.hero.heroClass, lastTier ); add( avatar ); @@ -106,28 +113,39 @@ public class StatusPane extends Component { compass = new Compass( Statistics.amuletObtained ? Dungeon.level.entrance : Dungeon.level.exit ); add( compass ); - rawShielding = new Image(asset, 0, 40, 50, 4); + if (large) rawShielding = new Image(asset, 0, 112, 128, 9); + else rawShielding = new Image(asset, 0, 40, 50, 4); rawShielding.alpha(0.5f); add(rawShielding); - shieldedHP = new Image(asset, 0, 40, 50, 4); + if (large) shieldedHP = new Image(asset, 0, 112, 128, 9); + else shieldedHP = new Image(asset, 0, 40, 50, 4); add(shieldedHP); - hp = new Image(asset, 0, 36, 50, 4); + if (large) hp = new Image(asset, 0, 103, 128, 9); + else hp = new Image(asset, 0, 36, 50, 4); add( hp ); hpText = new BitmapText(PixelScene.pixelFont); hpText.alpha(0.6f); add(hpText); - exp = new Image(asset, 0, 44, 16, 1); + if (large) exp = new Image(asset, 0, 121, 128, 7); + else exp = new Image(asset, 0, 44, 16, 1); add( exp ); + if (large){ + expText = new BitmapText(PixelScene.pixelFont); + expText.hardlight( 0xFFFFAA ); + expText.alpha(0.6f); + add(expText); + } + level = new BitmapText( PixelScene.pixelFont); level.hardlight( 0xFFFFAA ); add( level ); - buffs = new BuffIndicator( Dungeon.hero, false ); + buffs = new BuffIndicator( Dungeon.hero, large ); add( buffs ); busy = new BusyIndicator(); @@ -141,33 +159,58 @@ public class StatusPane extends Component { @Override protected void layout() { - height = 32; + height = large ? 39 : 32; bg.x = x; bg.y = y; - bg.size( width, bg.height ); + if (large) bg.size( 160, bg.height ); //HP bars must be 128px wide atm + else bg.size( width, bg.height ); - avatar.x = bg.x + 15 - avatar.width / 2f; - avatar.y = bg.y + 16 - avatar.height / 2f; + avatar.x = bg.x - avatar.width / 2f + 15; + avatar.y = bg.y - avatar.height / 2f + (large ? 15 : 16); PixelScene.align(avatar); compass.x = avatar.x + avatar.width / 2f - compass.origin.x; compass.y = avatar.y + avatar.height / 2f - compass.origin.y; PixelScene.align(compass); - hp.x = shieldedHP.x = rawShielding.x = x + 30; - hp.y = shieldedHP.y = rawShielding.y = y + 3; + if (large) { + exp.x = x + 30; + exp.y = y + 30; - hpText.scale.set(PixelScene.align(0.5f)); - hpText.x = hp.x + 1; - hpText.y = hp.y + (hp.height - (hpText.baseLine()+hpText.scale.y))/2f; - hpText.y -= 0.001f; //prefer to be slightly higher - PixelScene.align(hpText); + hp.x = shieldedHP.x = rawShielding.x = x + 30; + hp.y = shieldedHP.y = rawShielding.y = y + 19; - buffs.setPos( x + 31, y + 9 ); + hpText.x = hp.x + (128 - hpText.width())/2f; + hpText.y = hp.y + 1; + PixelScene.align(hpText); - busy.x = x + 1; - busy.y = y + 33; + expText.x = exp.x + (128 - expText.width())/2f; + expText.y = exp.y; + PixelScene.align(expText); + + buffs.setPos( x + 31, y ); + + busy.x = x + bg.width + 1; + busy.y = y + bg.height - 9; + } else { + exp.x = x; + exp.y = y; + + hp.x = shieldedHP.x = rawShielding.x = x + 30; + hp.y = shieldedHP.y = rawShielding.y = y + 3; + + hpText.scale.set(PixelScene.align(0.5f)); + hpText.x = hp.x + 1; + hpText.y = hp.y + (hp.height - (hpText.baseLine()+hpText.scale.y))/2f; + hpText.y -= 0.001f; //prefer to be slightly higher + PixelScene.align(hpText); + + buffs.setPos( x + 31, y + 9 ); + + busy.x = x + 1; + busy.y = y + 33; + } counter.point(busy.center()); } @@ -197,7 +240,12 @@ public class StatusPane extends Component { hp.scale.x = Math.max( 0, (health-shield)/(float)max); shieldedHP.scale.x = health/(float)max; - rawShielding.scale.x = shield/(float)max; + + if (shield > health) { + rawShielding.scale.x = shield / (float) max; + } else { + rawShielding.scale.x = 0; + } if (shield <= 0){ hpText.text(health + "/" + max); @@ -205,7 +253,19 @@ public class StatusPane extends Component { hpText.text(health + "+" + shield + "/" + max); } - exp.scale.x = (width / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp(); + if (large) { + exp.scale.x = (128 / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp(); + + hpText.measure(); + hpText.x = hp.x + (128 - hpText.width())/2f; + + expText.text(Dungeon.hero.exp + "/" + Dungeon.hero.maxExp()); + expText.measure(); + expText.x = hp.x + (128 - expText.width())/2f; + + } else { + exp.scale.x = (width / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp(); + } if (Dungeon.hero.lvl != lastLvl) { @@ -214,10 +274,18 @@ public class StatusPane extends Component { } lastLvl = Dungeon.hero.lvl; - level.text( Integer.toString( lastLvl ) ); - level.measure(); - level.x = x + 27.5f - level.width() / 2f; - level.y = y + 28.0f - level.baseLine() / 2f; + + if (large){ + level.text( "lv. " + lastLvl ); + level.measure(); + level.x = x + (30f - level.width()) / 2f; + level.y = y + 33f - level.baseLine() / 2f; + } else { + level.text( Integer.toString( lastLvl ) ); + level.measure(); + level.x = x + 27.5f - level.width() / 2f; + level.y = y + 28.0f - level.baseLine() / 2f; + } PixelScene.align(level); }