v2.4.0: added a minimum duration to brawler's stance charge reduction

This commit is contained in:
Evan Debenham
2024-04-16 11:53:15 -04:00
parent 05ce62915c
commit 25ef7a59ef
4 changed files with 57 additions and 12 deletions
@@ -959,7 +959,7 @@ items.rings.ringofforce.typical_ability_desc=The Duelist can adopt a _brawler's
items.rings.ringofforce.ability_desc=The Duelist can adopt a _brawler's stance_ with this ring, causing her regular attacks to always use this ring even with a weapon equipped. These attacks will deal _%1$d-%2$d damage_ and will also inherit the weapon's enchantment and augmentation. This stance slows weapon recharging speed by 50%%. items.rings.ringofforce.ability_desc=The Duelist can adopt a _brawler's stance_ with this ring, causing her regular attacks to always use this ring even with a weapon equipped. These attacks will deal _%1$d-%2$d damage_ and will also inherit the weapon's enchantment and augmentation. This stance slows weapon recharging speed by 50%%.
items.rings.ringofforce.desc=This ring enhances the force of the wearer's melee blows. This extra power is fairly weak when wielding weapons, but an unarmed attack will be made much stronger. A cursed ring will instead weaken the wearer's blows. items.rings.ringofforce.desc=This ring enhances the force of the wearer's melee blows. This extra power is fairly weak when wielding weapons, but an unarmed attack will be made much stronger. A cursed ring will instead weaken the wearer's blows.
items.rings.ringofforce$brawlersstance.name=brawler's stance items.rings.ringofforce$brawlersstance.name=brawler's stance
items.rings.ringofforce$brawlersstance.desc=While in this stance the Duelist's regular attacks will use an equipped ring of force even when she has a weapon equipped. These attacks gain bonus damage and will still use the weapon's augmentation and enchantment.\n\nMaintaining this stance takes focus however, reducing weapon ability recharge speed by 50%.\n\nThis stance can be toggled on or off by using a ring of force. items.rings.ringofforce$brawlersstance.desc=While in this stance the Duelist's regular attacks will use an equipped ring of force even when she has a weapon equipped. These attacks gain bonus damage and will still use the weapon's augmentation and enchantment.\n\nMaintaining this stance takes focus however, reducing weapon ability recharge speed by 50%.\n\nThis stance can be toggled on or off by using a ring of force, but the reduction in charge speed will persist for a little while if the stance is quickly activated and deactivated.
items.rings.ringoffuror.name=ring of furor items.rings.ringoffuror.name=ring of furor
items.rings.ringoffuror.stats=When worn, this ring will increase the speed of your attacks by _%s%%._ items.rings.ringoffuror.stats=When worn, this ring will increase the speed of your attacks by _%s%%._
@@ -176,7 +176,8 @@ public class MonkEnergy extends Buff implements ActionIndicator.Action {
} }
if (hero.belongings.weapon() instanceof MeleeWeapon if (hero.belongings.weapon() instanceof MeleeWeapon
&& hero.buff(RingOfForce.BrawlersStance.class) == null){ && (hero.buff(RingOfForce.BrawlersStance.class) == null
|| !hero.buff(RingOfForce.BrawlersStance.class).active)){
if (((MeleeWeapon) hero.belongings.weapon()).tier <= 1 && points >= 3){ if (((MeleeWeapon) hero.belongings.weapon()).tier <= 1 && points >= 3){
enGainMulti += 1.20f; enGainMulti += 1.20f;
} else if (((MeleeWeapon) hero.belongings.weapon()).tier <= 2 && points >= 2){ } else if (((MeleeWeapon) hero.belongings.weapon()).tier <= 2 && points >= 2){
@@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
import java.util.ArrayList; import java.util.ArrayList;
@@ -56,7 +57,7 @@ public class RingOfForce extends Ring {
if (super.doUnequip(hero, collect, single)){ if (super.doUnequip(hero, collect, single)){
if (hero.buff(BrawlersStance.class) != null && hero.buff(Force.class) == null){ if (hero.buff(BrawlersStance.class) != null && hero.buff(Force.class) == null){
//clear brawler's stance if no ring of force is equipped //clear brawler's stance if no ring of force is equipped
hero.buff(BrawlersStance.class).detach(); hero.buff(BrawlersStance.class).active = false;
} }
return true; return true;
} else { } else {
@@ -81,7 +82,8 @@ public class RingOfForce extends Ring {
int level = getBuffedBonus(hero, Force.class); int level = getBuffedBonus(hero, Force.class);
float tier = tier(hero.STR()); float tier = tier(hero.STR());
int dmg = Char.combatRoll(min(level, tier), max(level, tier)); int dmg = Char.combatRoll(min(level, tier), max(level, tier));
if (hero.buff(BrawlersStance.class) != null){ if (hero.buff(BrawlersStance.class) != null
&& hero.buff(BrawlersStance.class).active){
// 1+tier base dmg, roughly +35% dmg // 1+tier base dmg, roughly +35% dmg
// lvl*((3+tier)/8) scaling, roughly +30% dmg // lvl*((3+tier)/8) scaling, roughly +30% dmg
dmg += Math.round(1+tier+(level*((3+tier)/8f))); dmg += Math.round(1+tier+(level*((3+tier)/8f)));
@@ -175,13 +177,17 @@ public class RingOfForce extends Ring {
public void execute(Hero hero, String action) { public void execute(Hero hero, String action) {
if (action.equals(AC_ABILITY)){ if (action.equals(AC_ABILITY)){
if (hero.buff(BrawlersStance.class) != null){ if (hero.buff(BrawlersStance.class) != null){
hero.buff(BrawlersStance.class).detach(); if (hero.buff(BrawlersStance.class).active){
hero.buff(BrawlersStance.class).reset();
} else {
hero.buff(BrawlersStance.class).active = false;
}
AttackIndicator.updateState(); AttackIndicator.updateState();
} else if (!isEquipped(hero)) { } else if (!isEquipped(hero)) {
GLog.w(Messages.get(MeleeWeapon.class, "ability_need_equip")); GLog.w(Messages.get(MeleeWeapon.class, "ability_need_equip"));
} else { } else {
Buff.affect(hero, BrawlersStance.class); Buff.affect(hero, BrawlersStance.class).reset();
AttackIndicator.updateState(); AttackIndicator.updateState();
} }
} else { } else {
@@ -218,10 +224,10 @@ public class RingOfForce extends Ring {
return false; return false;
} }
BrawlersStance stance = hero.buff(BrawlersStance.class); BrawlersStance stance = hero.buff(BrawlersStance.class);
if (stance != null){ if (stance != null && stance.active){
//clear the buff if no ring of force is equipped //clear the buff if no ring of force is equipped
if (hero.buff(RingOfForce.Force.class) == null){ if (hero.buff(RingOfForce.Force.class) == null){
stance.detach(); stance.active = false;
AttackIndicator.updateState(); AttackIndicator.updateState();
return false; return false;
} else { } else {
@@ -239,7 +245,7 @@ public class RingOfForce extends Ring {
return hero.buff(MonkEnergy.MonkAbility.FlurryEmpowerTracker.class) != null; return hero.buff(MonkEnergy.MonkAbility.FlurryEmpowerTracker.class) != null;
} }
BrawlersStance stance = hero.buff(BrawlersStance.class); BrawlersStance stance = hero.buff(BrawlersStance.class);
if (stance != null){ if (stance != null && stance.active){
return true; return true;
} }
return false; return false;
@@ -251,7 +257,7 @@ public class RingOfForce extends Ring {
return false; return false;
} }
BrawlersStance stance = hero.buff(BrawlersStance.class); BrawlersStance stance = hero.buff(BrawlersStance.class);
if (stance != null){ if (stance != null && stance.active){
return true; return true;
} }
return false; return false;
@@ -264,9 +270,47 @@ public class RingOfForce extends Ring {
type = buffType.POSITIVE; type = buffType.POSITIVE;
} }
//buff must be active for at least 50 turns, to discourage micro-managing for max charges
public boolean active;
private int minTurnsLeft;
public void reset(){
active = true;
minTurnsLeft = 50;
}
@Override @Override
public int icon() { public int icon() {
return BuffIndicator.DUEL_BRAWL; return active ? BuffIndicator.DUEL_BRAWL : BuffIndicator.NONE;
}
@Override
public boolean act() {
minTurnsLeft --;
if (!active && minTurnsLeft <= 0){
detach();
}
spend(TICK);
return true;
}
public static final String ACTIVE = "active";
public static final String MIN_TURNS_LEFT = "min_turns_left";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(ACTIVE, active);
bundle.put(MIN_TURNS_LEFT, minTurnsLeft);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
active = bundle.getBoolean(ACTIVE);
minTurnsLeft = bundle.getInt(MIN_TURNS_LEFT);
} }
} }
} }
@@ -478,7 +478,7 @@ public class MeleeWeapon extends Weapon {
chargeToGain *= 1.5f; chargeToGain *= 1.5f;
} }
//50% slower charge gain with brawler's stance enabled //50% slower charge gain with brawler's stance enabled, even if buff is inactive
if (Dungeon.hero.buff(RingOfForce.BrawlersStance.class) != null){ if (Dungeon.hero.buff(RingOfForce.BrawlersStance.class) != null){
chargeToGain *= 0.50f; chargeToGain *= 0.50f;
} }