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.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; 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.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
@@ -39,6 +41,12 @@ public class PinCushion extends Buff {
for (Item item : items){ for (Item item : items){
if (item.isSimilar(projectile)){ if (item.isSimilar(projectile)){
item.merge(projectile); item.merge(projectile);
if (TippedDart.lostDarts > 0){
Dart d = new Dart();
d.quantity(TippedDart.lostDarts);
TippedDart.lostDarts = 0;
stick(d);
}
return; return;
} }
} }
@@ -42,6 +42,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; 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.journal.Document;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
@@ -167,6 +169,13 @@ public class Heap implements Bundlable {
if (sprite != null) { if (sprite != null) {
sprite.view(this).place( pos ); 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 ) { 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.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; 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.journal.Catalog;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@@ -223,6 +225,23 @@ public class Item implements Bundlable {
Talent.onItemCollected(Dungeon.hero, item); Talent.onItemCollected(Dungeon.hero, item);
if (isIdentified()) Catalog.setSeen(getClass()); 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; 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.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; 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.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed; import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed;
import com.shatteredpixel.shatteredpixeldungeon.plants.Mageroyal; 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; private static int targetPos = -1;
@Override @Override