v2.0.0: fixed rare cases of darts being lost when merging tipped darts

This commit is contained in:
Evan Debenham
2022-11-22 12:21:31 -05:00
parent 15e68b00e0
commit 5285cc844c
4 changed files with 54 additions and 0 deletions
@@ -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;
}
}
@@ -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 ) {
@@ -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;
}
}
@@ -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