From 68f879a4ff9e2662fe1180d782423c59cfb8c3bc Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 17 Mar 2021 17:23:19 -0400 Subject: [PATCH] v0.9.2b: fixed cases where vfx/sfx were playing for non-visible combat --- .../actors/mobs/DM100.java | 14 ++--- .../actors/mobs/Goo.java | 4 +- .../actors/mobs/Guard.java | 49 ++++++++------- .../actors/mobs/Necromancer.java | 37 ++---------- .../actors/mobs/NewTengu.java | 8 --- .../sprites/NecromancerSprite.java | 60 ++++++++++++++++++- 6 files changed, 99 insertions(+), 73 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM100.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM100.java index 46533d752..f80d2f905 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM100.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM100.java @@ -86,18 +86,16 @@ public class DM100 extends Mob implements Callback { } else { - if (sprite != null && (sprite.visible || enemy.sprite.visible)) { - sprite.zap( enemy.pos ); - } - spend( TIME_TO_ZAP ); if (hit( this, enemy, true )) { int dmg = Random.NormalIntRange(3, 10); enemy.damage( dmg, new LightningBolt() ); - - enemy.sprite.centerEmitter().burst( SparkParticle.FACTORY, 3 ); - enemy.sprite.flash(); + + if (enemy.sprite.visible) { + enemy.sprite.centerEmitter().burst(SparkParticle.FACTORY, 3); + enemy.sprite.flash(); + } if (enemy == Dungeon.hero) { @@ -112,7 +110,7 @@ public class DM100 extends Mob implements Callback { enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() ); } - if (sprite != null && sprite.visible) { + if (sprite != null && (sprite.visible || enemy.sprite.visible)) { sprite.zap( enemy.pos ); return false; } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java index 7373a551f..5e0e38f04 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java @@ -158,8 +158,10 @@ public class Goo extends Mob { sprite.attack(enemy.pos); } } else { + if (pumpedUp >= 2){ + ((GooSprite)sprite).triggerEmitters(); + } attack( enemy ); - ((GooSprite)sprite).triggerEmitters(); } spend( attackDelay() ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Guard.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Guard.java index 1cc0daa6b..7acd7cb5e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Guard.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Guard.java @@ -90,32 +90,41 @@ public class Guard extends Mob { } else { final int newPosFinal = newPos; this.target = newPos; - yell( Messages.get(this, "scorpion") ); - new Item().throwSound(); - Sample.INSTANCE.play( Assets.Sounds.CHAINS ); - sprite.parent.add(new Chains(sprite.center(), enemy.sprite.center(), new Callback() { - public void call() { - Actor.addDelayed(new Pushing(enemy, enemy.pos, newPosFinal, new Callback(){ - public void call() { - enemy.pos = newPosFinal; - Dungeon.level.occupyCell(enemy); - Cripple.prolong(enemy, Cripple.class, 4f); - if (enemy == Dungeon.hero) { - Dungeon.hero.interrupt(); - Dungeon.observe(); - GameScene.updateFog(); + + if (sprite.visible || enemy.sprite.visible) { + yell(Messages.get(this, "scorpion")); + new Item().throwSound(); + Sample.INSTANCE.play(Assets.Sounds.CHAINS); + sprite.parent.add(new Chains(sprite.center(), enemy.sprite.center(), new Callback() { + public void call() { + Actor.addDelayed(new Pushing(enemy, enemy.pos, newPosFinal, new Callback() { + public void call() { + pullEnemy(enemy, newPosFinal); } - } - }), -1); - next(); - } - })); + }), -1); + next(); + } + })); + } else { + pullEnemy(enemy, newPos); + } } } chainsUsed = true; return true; } + private void pullEnemy( Char enemy, int pullPos ){ + enemy.pos = pullPos; + Dungeon.level.occupyCell(enemy); + Cripple.prolong(enemy, Cripple.class, 4f); + if (enemy == Dungeon.hero) { + Dungeon.hero.interrupt(); + Dungeon.observe(); + GameScene.updateFog(); + } + } + @Override public int attackSkill( Char target ) { return 12; @@ -167,7 +176,7 @@ public class Guard extends Mob { && Random.Int(3) == 0 && chain(enemy.pos)){ - return false; + return !(sprite.visible || enemy.sprite.visible); } else { return super.act( enemyInFOV, justAlerted ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java index 944aa3377..f8a937b2a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java @@ -21,7 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; -import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -30,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; -import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.Item; @@ -39,8 +37,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportat import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.NecromancerSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SkeletonSprite; -import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; @@ -65,8 +61,7 @@ public class Necromancer extends Mob { } public boolean summoning = false; - private Emitter summoningEmitter = null; - private int summoningPos = -1; + public int summoningPos = -1; private boolean firstSummon = true; @@ -81,20 +76,6 @@ public class Necromancer extends Mob { } return super.act(); } - - @Override - public void updateSpriteState() { - super.updateSpriteState(); - - if (summoning && summoningEmitter == null){ - summoningEmitter = CellEmitter.get( summoningPos ); - summoningEmitter.pour(Speck.factory(Speck.RATTLE), 0.2f); - sprite.zap( summoningPos ); - } else if (!summoning && summoningEmitter != null){ - summoningEmitter.on = false; - summoningEmitter = null; - } - } @Override public int drRoll() { @@ -127,11 +108,6 @@ public class Necromancer extends Mob { mySkeleton.die(null); } - if (summoningEmitter != null){ - summoningEmitter.on = false; - summoningEmitter = null; - } - super.die(cause); } @@ -184,9 +160,9 @@ public class Necromancer extends Mob { } mySkeleton.HP = Math.min(mySkeleton.HP + 5, mySkeleton.HT); - mySkeleton.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + if (mySkeleton.sprite.visible) mySkeleton.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); - //otherwise give it adrenaline + //otherwise give it adrenaline } else if (mySkeleton.buff(Adrenaline.class) == null) { if (sprite.visible || mySkeleton.sprite.visible) { @@ -253,9 +229,7 @@ public class Necromancer extends Mob { mySkeleton.pos = summoningPos; GameScene.add( mySkeleton ); Dungeon.level.occupyCell( mySkeleton ); - Sample.INSTANCE.play(Assets.Sounds.BONES); - summoningEmitter.burst(Speck.factory(Speck.RATTLE), 5); - sprite.idle(); + ((NecromancerSprite)sprite).finishSummoning(); if (buff(Corruption.class) != null){ Buff.affect(mySkeleton, Corruption.class); @@ -291,9 +265,6 @@ public class Necromancer extends Mob { if (summoningPos != -1){ summoning = true; - summoningEmitter = CellEmitter.get(summoningPos); - summoningEmitter.pour(Speck.factory(Speck.RATTLE), 0.2f); - sprite.zap( summoningPos ); spend( firstSummon ? TICK : 2*TICK ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewTengu.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewTengu.java index df33838cf..1aeffa348 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewTengu.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewTengu.java @@ -220,14 +220,6 @@ public class NewTengu extends Mob { return new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos; } - //tengu's attack is always visible - @Override - protected boolean doAttack(Char enemy) { - sprite.attack( enemy.pos ); - spend( attackDelay() ); - return false; - } - private void jump() { //in case tengu hasn't had a chance to act yet 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 2c335b240..a4ab01529 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/NecromancerSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/NecromancerSprite.java @@ -22,13 +22,19 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Necromancer; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.watabou.noosa.TextureFilm; import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.particles.Emitter; public class NecromancerSprite extends MobSprite { private Animation charging; + private Emitter summoningBones; public NecromancerSprite(){ super(); @@ -55,7 +61,49 @@ public class NecromancerSprite extends MobSprite { idle(); } - + + @Override + public void link(Char ch) { + super.link(ch); + if (ch instanceof Necromancer && ((Necromancer) ch).summoning){ + zap(((Necromancer) ch).summoningPos); + } + } + + @Override + public void update() { + super.update(); + if (summoningBones != null){ + summoningBones.visible = Dungeon.level.heroFOV[((Necromancer) ch).summoningPos]; + } + } + + @Override + public void die() { + super.die(); + if (summoningBones != null){ + summoningBones.on = false; + } + } + + @Override + public void kill() { + super.kill(); + if (summoningBones != null){ + summoningBones.killAndErase(); + } + } + + public void finishSummoning(){ + if (summoningBones.visible) { + Sample.INSTANCE.play(Assets.Sounds.BONES); + summoningBones.burst(Speck.factory(Speck.RATTLE), 5); + } else { + summoningBones.on = false; + } + idle(); + } + public void charge(){ play(charging); } @@ -63,8 +111,14 @@ public class NecromancerSprite extends MobSprite { @Override public void zap(int cell) { super.zap(cell); - if (visible && ch instanceof Necromancer && ((Necromancer) ch).summoning){ - Sample.INSTANCE.play( Assets.Sounds.CHARGEUP, 1f, 0.8f ); + if (ch instanceof Necromancer && ((Necromancer) ch).summoning){ + if (summoningBones != null){ + summoningBones.on = false; + } + summoningBones = CellEmitter.get(((Necromancer) ch).summoningPos); + summoningBones.pour(Speck.factory(Speck.RATTLE), 0.2f); + summoningBones.visible = Dungeon.level.heroFOV[((Necromancer) ch).summoningPos]; + if (visible || summoningBones.visible ) Sample.INSTANCE.play( Assets.Sounds.CHARGEUP, 1f, 0.8f ); } }