From f9e6fbc94229863db33771e61af8f9a9bc1c8d05 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 4 Jan 2024 15:27:00 -0500 Subject: [PATCH] v2.3.0: fixed rounding errors in tipped dart durability --- .../items/weapon/missiles/MissileWeapon.java | 21 +++++++++++++------ .../items/weapon/missiles/darts/RotDart.java | 2 +- .../weapon/missiles/darts/TippedDart.java | 11 ++++++---- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java index 565ad84c1..88a238ae0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java @@ -314,6 +314,11 @@ abstract public class MissileWeapon extends Weapon { } public float durabilityPerUse(){ + //classes that override durabilityPerUse can turn rounding off, to do their own rounding after more logic + return durabilityPerUse(true); + } + + protected final float durabilityPerUse( boolean rounded){ float usages = baseUses * (float)(Math.pow(3, level())); //+50%/75% durability @@ -323,16 +328,20 @@ abstract public class MissileWeapon extends Weapon { if (holster) { usages *= MagicalHolster.HOLSTER_DURABILITY_FACTOR; } - + usages *= RingOfSharpshooting.durabilityMultiplier( Dungeon.hero ); - + //at 100 uses, items just last forever. if (usages >= 100f) return 0; - usages = Math.round(usages); - - //add a tiny amount to account for rounding error for calculations like 1/3 - return (MAX_DURABILITY/usages) + 0.001f; + if (rounded){ + usages = Math.round(usages); + //add a tiny amount to account for rounding error for calculations like 1/3 + return (MAX_DURABILITY/usages) + 0.001f; + } else { + //rounding can be disabled for classes that override durability per use + return MAX_DURABILITY/usages; + } } protected void decrementDurability(){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/RotDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/RotDart.java index 61dd46b82..05d178b79 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/RotDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/RotDart.java @@ -52,6 +52,6 @@ public class RotDart extends TippedDart { @Override public float durabilityPerUse() { - return 20f; + return MAX_DURABILITY/5f; //always 5 uses } } 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 164949a0e..c947c5c92 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 @@ -151,7 +151,7 @@ public abstract class TippedDart extends Dart { @Override public float durabilityPerUse() { - float use = super.durabilityPerUse(); + float use = super.durabilityPerUse(false); use /= (1 + Dungeon.hero.pointsInTalent(Talent.DURABLE_TIPS)); @@ -179,12 +179,15 @@ public abstract class TippedDart extends Dart { } use *= (1f - lotusPreserve); + float usages = Math.round(MAX_DURABILITY/use); + //grants 4 extra uses with charged shot if (Dungeon.hero.buff(Crossbow.ChargedShot.class) != null){ - use = 100f/((100f/use) + 4f) + 0.001f; + usages += 4; } - - return use; + + //add a tiny amount to account for rounding error for calculations like 1/3 + return (MAX_DURABILITY/usages) + 0.001f; } @Override