From 804a6a88a91c49a6c7d51896d31da0c9c362177b Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 22 Jun 2020 20:04:19 -0400 Subject: [PATCH] v0.8.1: Potion of dragon's breath now uses the new cone AOE logic --- .../potions/exotic/PotionOfDragonsBreath.java | 113 +++++------------- 1 file changed, 32 insertions(+), 81 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java index d5a197acf..b4a584a50 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java @@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.ConeAOE; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -48,20 +49,12 @@ public class PotionOfDragonsBreath extends ExoticPotion { { icon = ItemSpriteSheet.Icons.POTION_DRGBREATH; } - - //a lot of this is copy-paste from wand of fireblast - - //the actual affected cells - private HashSet affectedCells; - //the cells to trace fire shots to, for visual effects. - private HashSet visualCells; - private int direction = 0; - + @Override //need to override drink so that time isn't spent right away protected void drink(final Hero hero) { - curItem = detach( hero.belongings.backpack ); - setKnown(); + curUser = hero; + curItem = this; GameScene.selectCell(targeter); } @@ -69,58 +62,37 @@ public class PotionOfDragonsBreath extends ExoticPotion { private CellSelector.Listener targeter = new CellSelector.Listener() { @Override public void onSelect(final Integer cell) { - - if (cell == null){ - //TODO if this can ever be found un-IDed, need logic for that - curItem.collect(); - } else { + + if (cell == null && !isKnown()){ + setKnown(); + detach(curUser.belongings.backpack); + } else if (cell != null) { + setKnown(); Sample.INSTANCE.play( Assets.Sounds.DRINK ); curUser.sprite.operate(curUser.pos, new Callback() { @Override public void call() { - + + curItem.detach(curUser.belongings.backpack); + curUser.spend(1f); curUser.sprite.idle(); curUser.sprite.zap(cell); - - final Ballistica bolt - = new Ballistica(curUser.pos, cell, Ballistica.MAGIC_BOLT); - - affectedCells = new HashSet<>(); - visualCells = new HashSet<>(); - + Sample.INSTANCE.play( Assets.Sounds.BURNING ); + + final Ballistica bolt = new Ballistica(curUser.pos, cell, Ballistica.STOP_TERRAIN); + int maxDist = 6; int dist = Math.min(bolt.dist, maxDist); - - for (int i = 0; i < PathFinder.CIRCLE8.length; i++) { - if (bolt.sourcePos + PathFinder.CIRCLE8[i] == bolt.path.get(1)) { - direction = i; - break; - } - } - - float strength = maxDist; - for (int c : bolt.subPath(1, dist)) { - strength--; //as we start at dist 1, not 0. - affectedCells.add(c); - if (strength > 1) { - spreadFlames(c + PathFinder.CIRCLE8[left(direction)], strength - 1); - spreadFlames(c + PathFinder.CIRCLE8[direction], strength - 1); - spreadFlames(c + PathFinder.CIRCLE8[right(direction)], strength - 1); - } else { - visualCells.add(c); - } - } - - //going to call this one manually - visualCells.remove(bolt.path.get(dist)); - - for (int c : visualCells) { - //this way we only get the cells at the tip, much better performance. - ((MagicMissile) curUser.sprite.parent.recycle(MagicMissile.class)).reset( + + final ConeAOE cone = new ConeAOE(curUser.pos, bolt.path.get(dist), 6, 60, Ballistica.STOP_TERRAIN | Ballistica.STOP_TARGET ); + + //cast to cells at the tip, rather than all cells, better performance. + for (Ballistica ray : cone.rays){ + ((MagicMissile)curUser.sprite.parent.recycle( MagicMissile.class )).reset( MagicMissile.FIRE_CONE, curUser.sprite, - c, + ray.path.get(ray.dist), null ); } @@ -132,21 +104,25 @@ public class PotionOfDragonsBreath extends ExoticPotion { new Callback() { @Override public void call() { - for (int cell : affectedCells){ + for (int cell : cone.cells){ //ignore caster cell if (cell == bolt.sourcePos){ continue; } - - GameScene.add( Blob.seed( cell, 5, Fire.class ) ); + + //only ignite cells directly near caster if they are flammable + if (!Dungeon.level.adjacent(bolt.sourcePos, cell) || Dungeon.level.flamable[cell]){ + GameScene.add( Blob.seed( cell, 5, Fire.class ) ); + } Char ch = Actor.findChar( cell ); if (ch != null) { Buff.affect( ch, Burning.class ).reignite( ch ); - Buff.affect(ch, Cripple.class, 5f); break; + Buff.affect(ch, Cripple.class, 5f); } } + curUser.next(); } }); @@ -160,29 +136,4 @@ public class PotionOfDragonsBreath extends ExoticPotion { return Messages.get(PotionOfDragonsBreath.class, "prompt"); } }; - - //burn... BURNNNNN!..... - private void spreadFlames(int cell, float strength){ - if (strength >= 0 && (Dungeon.level.passable[cell] || Dungeon.level.flamable[cell])){ - affectedCells.add(cell); - if (strength >= 1.5f) { - visualCells.remove(cell); - spreadFlames(cell + PathFinder.CIRCLE8[left(direction)], strength - 1.5f); - spreadFlames(cell + PathFinder.CIRCLE8[direction], strength - 1.5f); - spreadFlames(cell + PathFinder.CIRCLE8[right(direction)], strength - 1.5f); - } else { - visualCells.add(cell); - } - } else if (!Dungeon.level.passable[cell]) - visualCells.add(cell); - } - - private int left(int direction){ - return direction == 0 ? 7 : direction-1; - } - - private int right(int direction){ - return direction == 7 ? 0 : direction+1; - } - }