From 3419bd45402e8c6d47359876080275edd9346363 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 19 Jul 2022 18:51:36 -0400 Subject: [PATCH] v1.3.2: expanded the information shown in boss health bars --- core/src/main/assets/interfaces/boss_hp.png | Bin 439 -> 428 bytes .../actors/hero/Hero.java | 5 + .../ui/BossHealthBar.java | 89 ++++++++++++++++-- .../ui/BuffIndicator.java | 11 +++ 4 files changed, 98 insertions(+), 7 deletions(-) diff --git a/core/src/main/assets/interfaces/boss_hp.png b/core/src/main/assets/interfaces/boss_hp.png index fcec8e0d155b443762dc3bedbf7c8701e58a3590..6d5d4d3866b820149058b40d62ba9605cd10c82f 100644 GIT binary patch delta 324 zcmV-K0lWUU1FQp(K}9(`H6$h=Cn+O1Iy65)IyN{mBPAauC?YB>B{w-UK0rAlBpxX% zBq1XmC@Ld!cx;c8gdiduCn+KyAsZ$rAs!$aB_|+}hBJRhg}V>{0007XQchC<8jJBX zLI3~&$w@>(RCoc@(1At;Q51#YZ|~VtP!Iy(R)F6BNdk05fDqh3Gu=}#RG@Q2`W|4h z{va6FChC| delta 335 zcmV-V0kHn81GfW^K}94cASWp!K0rAmB_AdzA}TB;A|xIuD05zP-gH{4#H!+uQV3}TSO2^hjjsV!$>R2V`pKJk)Y*#&z z34r!}{dNBD1h|ab=nJ?UmEwa?|R_&<-tt|=)1yI|3>`i`*cXteuaSr h!$8siEesfW003AcF|24p+3)}W002ovPDHLkV1jF?gf;*G diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 77cc2d1a8..a8cb32d86 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -746,6 +746,7 @@ public class Hero extends Char { ready = true; AttackIndicator.updateState(); + BuffIndicator.refreshBoss(); GameScene.ready(); } @@ -1332,6 +1333,10 @@ public class Hero extends Char { public Mob visibleEnemy( int index ) { return visibleEnemies.get(index % visibleEnemies.size()); } + + public ArrayList getVisibleEnemies(){ + return new ArrayList<>(visibleEnemies); + } private boolean walkingToVisibleTrapInFog = false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java index cabe14a79..077e74341 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java @@ -25,6 +25,10 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BloodParticle; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoMob; +import com.watabou.noosa.BitmapText; import com.watabou.noosa.Image; import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.ui.Component; @@ -36,6 +40,10 @@ public class BossHealthBar extends Component { private Image rawShielding; private Image shieldedHP; private Image hp; + private BitmapText hpText; + + private Button bossInfo; + private BuffIndicator buffs; private static Mob boss; @@ -53,6 +61,13 @@ public class BossHealthBar extends Component { instance = this; } + @Override + public synchronized void destroy() { + super.destroy(); + if (instance == this) instance = null; + if (buffs != null) BuffIndicator.setBossInstance(null); + } + @Override protected void createChildren() { bar = new Image(asset, 0, 0, 64, 16); @@ -71,6 +86,35 @@ public class BossHealthBar extends Component { hp = new Image(asset, 15, 19, 47, 4); add(hp); + hpText = new BitmapText(PixelScene.pixelFont); + hpText.alpha(0.6f); + add(hpText); + + bossInfo = new Button(){ + @Override + protected void onClick() { + super.onClick(); + if (boss != null){ + GameScene.show(new WndInfoMob(boss)); + } + } + + @Override + protected String hoverText() { + if (boss != null){ + return boss.name(); + } + return super.hoverText(); + } + }; + add(bossInfo); + + if (boss != null) { + buffs = new BuffIndicator(boss, false); + BuffIndicator.setBossInstance(buffs); + add(buffs); + } + skull = new Image(asset, 5, 18, 6, 6); add(skull); @@ -88,7 +132,19 @@ public class BossHealthBar extends Component { bar.y = y; hp.x = shieldedHP.x = rawShielding.x = bar.x+15; - hp.y = shieldedHP.y = rawShielding.y = bar.y+6; + hp.y = shieldedHP.y = rawShielding.y = bar.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); + + bossInfo.setRect(x, y, bar.width, bar.height); + + if (buffs != null) { + buffs.setRect(hp.x, hp.y + 5, 110, 7); + } skull.x = bar.x+5; skull.y = bar.y+5; @@ -103,13 +159,13 @@ public class BossHealthBar extends Component { visible = active = false; } else { - float health = boss.HP; - float shield = boss.shielding(); - float max = boss.HT; + int health = boss.HP; + int shield = boss.shielding(); + int max = boss.HT; - hp.scale.x = Math.max( 0, (health-shield)/max); - shieldedHP.scale.x = health/max; - rawShielding.scale.x = shield/max; + hp.scale.x = Math.max( 0, (health-shield)/(float)max); + shieldedHP.scale.x = health/(float)max; + rawShielding.scale.x = shield/(float)max; if (hp.scale.x < 0.25f) bleed( true ); @@ -118,15 +174,34 @@ public class BossHealthBar extends Component { else skull.resetColor(); blood.on = bleeding; } + + if (shield <= 0){ + hpText.text(health + "/" + max); + } else { + hpText.text(health + "+" + shield + "/" + max); + } + } } } public static void assignBoss(Mob boss){ + if (BossHealthBar.boss == boss) { + return; + } BossHealthBar.boss = boss; bleed(false); if (instance != null) { instance.visible = instance.active = true; + if (boss != null){ + if (instance.buffs != null){ + instance.buffs.killAndErase(); + } + instance.buffs = new BuffIndicator(boss, false); + BuffIndicator.setBossInstance(instance.buffs); + instance.add(instance.buffs); + instance.layout(); + } } } 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 ae6d71d5b..766f2d598 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -115,6 +115,7 @@ public class BuffIndicator extends Component { public static final int SIZE_LARGE = 16; private static BuffIndicator heroInstance; + private static BuffIndicator bossInstance; private LinkedHashMap buffButtons = new LinkedHashMap<>(); private boolean needsRefresh; @@ -302,4 +303,14 @@ public class BuffIndicator extends Component { heroInstance.needsRefresh = true; } } + + public static void refreshBoss(){ + if (bossInstance != null) { + bossInstance.needsRefresh = true; + } + } + + public static void setBossInstance(BuffIndicator boss){ + bossInstance = boss; + } }