From 5285cc844c6f5115cd63b951190fc241a5556d2d Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 22 Nov 2022 12:21:31 -0500 Subject: [PATCH] v2.0.0: fixed rare cases of darts being lost when merging tipped darts --- .../actors/buffs/PinCushion.java | 8 ++++++++ .../shatteredpixeldungeon/items/Heap.java | 9 +++++++++ .../shatteredpixeldungeon/items/Item.java | 19 +++++++++++++++++++ .../weapon/missiles/darts/TippedDart.java | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java index bb9038c5d..9187dda42 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java @@ -24,6 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.watabou.utils.Bundle; @@ -39,6 +41,12 @@ public class PinCushion extends Buff { for (Item item : items){ if (item.isSimilar(projectile)){ item.merge(projectile); + if (TippedDart.lostDarts > 0){ + Dart d = new Dart(); + d.quantity(TippedDart.lostDarts); + TippedDart.lostDarts = 0; + stick(d); + } return; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java index 5a3730dba..a6bd62fd0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java @@ -42,6 +42,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; @@ -167,6 +169,13 @@ public class Heap implements Bundlable { if (sprite != null) { sprite.view(this).place( pos ); } + + if (TippedDart.lostDarts > 0){ + Dart d = new Dart(); + d.quantity(TippedDart.lostDarts); + TippedDart.lostDarts = 0; + drop(d); + } } public void replace( Item a, Item b ) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java index 40c74e7c2..67f6b136d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -34,6 +34,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -223,6 +225,23 @@ public class Item implements Bundlable { Talent.onItemCollected(Dungeon.hero, item); if (isIdentified()) Catalog.setSeen(getClass()); } + if (TippedDart.lostDarts > 0){ + Dart d = new Dart(); + d.quantity(TippedDart.lostDarts); + TippedDart.lostDarts = 0; + if (!d.collect()){ + //have to handle this in an actor as we can't manipulate the heap during pickup + Actor.add(new Actor() { + { actPriority = VFX_PRIO; } + @Override + protected boolean act() { + Dungeon.level.drop(d, Dungeon.hero.pos).sprite.drop(); + Actor.remove(this); + return true; + } + }); + } + } return true; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java index c174b651f..01a38aec8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java @@ -29,7 +29,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed; import com.shatteredpixel.shatteredpixeldungeon.plants.Mageroyal; @@ -129,6 +131,22 @@ public abstract class TippedDart extends Dart { } } + //the number of regular darts lost due to merge being called + public static int lostDarts = 0; + + @Override + public Item merge(Item other) { + int total = quantity() + other.quantity(); + super.merge(other); + int extra = total - quantity(); + + //need to spawn waste tipped darts as regular darts + if (extra > 0){ + lostDarts += extra; + } + return this; + } + private static int targetPos = -1; @Override