From caaa820038b09fb9e6735f1e476beb2a4c0d16dd Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 17 Aug 2023 17:22:04 -0400 Subject: [PATCH] v2.2.0: added various safety checks to prevent rare crash errors --- .../src/main/java/com/watabou/noosa/Group.java | 1 + .../java/com/watabou/noosa/audio/Sample.java | 10 +++++++--- .../shatteredpixeldungeon/actors/Char.java | 14 ++++++++++---- .../sprites/NecromancerSprite.java | 14 ++++++++------ .../shatteredpixeldungeon/ui/Toolbar.java | 18 +++++++++--------- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/SPD-classes/src/main/java/com/watabou/noosa/Group.java b/SPD-classes/src/main/java/com/watabou/noosa/Group.java index bc45ae077..f0718d8a5 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Group.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Group.java @@ -280,6 +280,7 @@ public class Group extends Gizmo { } public synchronized void clear() { + if (length == 0) return; for (int i=0; i < length; i++) { Gizmo g = members.get( i ); if (g != null) { diff --git a/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java b/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java index 7112b6bb5..c7d46698b 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java @@ -79,9 +79,13 @@ public enum Sample { @Override public void run() { for (String asset : toLoad) { - Sound newSound = Gdx.audio.newSound(Gdx.files.internal(asset)); - synchronized (INSTANCE) { - ids.put(asset, newSound); + try { + Sound newSound = Gdx.audio.newSound(Gdx.files.internal(asset)); + synchronized (INSTANCE) { + ids.put(asset, newSound); + } + } catch (Exception e){ + Game.reportException(e); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index cce54e095..562236685 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -448,7 +448,9 @@ public abstract class Char extends Actor { enemy.damage(-1, this); DeathMark.processFearTheReaper(enemy); } - enemy.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Preparation.class, "assassinated")); + if (enemy.sprite != null) { + enemy.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Preparation.class, "assassinated")); + } } Talent.CombinedLethalityTriggerTracker combinedLethality = buff(Talent.CombinedLethalityTriggerTracker.class); @@ -464,13 +466,17 @@ public abstract class Char extends Actor { enemy.damage(-1, this); DeathMark.processFearTheReaper(enemy); } - enemy.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Talent.CombinedLethalityTriggerTracker.class, "executed")); + if (enemy.sprite != null) { + enemy.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Talent.CombinedLethalityTriggerTracker.class, "executed")); + } } combinedLethality.detach(); } - enemy.sprite.bloodBurstA( sprite.center(), effectiveDamage ); - enemy.sprite.flash(); + if (enemy.sprite != null) { + enemy.sprite.bloodBurstA(sprite.center(), effectiveDamage); + enemy.sprite.flash(); + } if (!enemy.isAlive() && visibleFight) { if (enemy == Dungeon.hero) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/NecromancerSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/NecromancerSprite.java index 0a9b2a6fb..224253685 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/NecromancerSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/NecromancerSprite.java @@ -104,13 +104,15 @@ public class NecromancerSprite extends MobSprite { } public void finishSummoning(){ - if (summoningBones.visible) { - Sample.INSTANCE.play(Assets.Sounds.BONES); - summoningBones.burst(Speck.factory(Speck.RATTLE), 5); - } else { - summoningBones.on = false; + if (summoningBones != null) { + if (summoningBones.visible) { + Sample.INSTANCE.play(Assets.Sounds.BONES); + summoningBones.burst(Speck.factory(Speck.RATTLE), 5); + } else { + summoningBones.on = false; + } + summoningBones = null; } - summoningBones = null; idle(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java index 5a0fc3cea..e8e41c90b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java @@ -120,7 +120,7 @@ public class Toolbar extends Component { return; } - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { String[] slotNames = new String[6]; Image[] slotIcons = new Image[6]; @@ -199,7 +199,7 @@ public class Toolbar extends Component { add(btnWait = new Tool(24, 0, 20, 26) { @Override protected void onClick() { - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { examining = false; Dungeon.hero.rest(false); } @@ -221,7 +221,7 @@ public class Toolbar extends Component { } protected boolean onLongClick() { - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { examining = false; Dungeon.hero.rest(true); } @@ -234,7 +234,7 @@ public class Toolbar extends Component { add(new Button(){ @Override protected void onClick() { - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { examining = false; Dungeon.hero.rest(true); } @@ -251,7 +251,7 @@ public class Toolbar extends Component { add(new Button(){ @Override protected void onClick() { - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { Dungeon.hero.waitOrPickup = true; if ((Dungeon.level.heaps.get(Dungeon.hero.pos) != null || Dungeon.hero.canSelfTrample()) && Dungeon.hero.handle(Dungeon.hero.pos)){ @@ -271,7 +271,7 @@ public class Toolbar extends Component { } protected boolean onLongClick() { - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { examining = false; Dungeon.hero.rest(true); } @@ -288,7 +288,7 @@ public class Toolbar extends Component { add(btnSearch = new Tool(44, 0, 20, 26) { @Override protected void onClick() { - if (Dungeon.hero.ready) { + if (Dungeon.hero != null && Dungeon.hero.ready) { if (!examining && !GameScene.cancel()) { GameScene.selectCell(informer); examining = true; @@ -324,7 +324,7 @@ public class Toolbar extends Component { @Override protected void onClick() { - if (Dungeon.hero.ready || !Dungeon.hero.isAlive()) { + if (Dungeon.hero != null && (Dungeon.hero.ready || !Dungeon.hero.isAlive())) { if (SPDSettings.interfaceSize() == 2) { GameScene.toggleInvPane(); } else { @@ -394,7 +394,7 @@ public class Toolbar extends Component { add(new Button(){ @Override protected void onClick() { - if (Dungeon.hero.ready && !GameScene.cancel()) { + if (Dungeon.hero != null && Dungeon.hero.ready && !GameScene.cancel()) { ArrayList bags = Dungeon.hero.belongings.getBags(); String[] names = new String[bags.size()]; Image[] images = new Image[bags.size()];