From aa7b17dee0158a4491839a7ea60ffaca994af10a Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Sun, 25 Jul 2021 21:33:56 -0400 Subject: [PATCH] v0.9.4: balance changes to rogue abilities/T4 talents: - Smoke bomb max range down to 6 tiles from 8. - decoy armor per level down to 1-3 from 1-5 - hasty retreat turns of haste/invis reduced by 1 - shadow step charge cost reduction down to 60% from 67% - double mark max charge cost reduction down to 75% from 80% - Shadow Clone now follows the hero at 2x speed - shadow blade bonus damage up to 7.5% from 6.25% - cloned armor bonus DR up to 15% from 12.5% - fixed perfect copy giving a little more HP than intended --- .../assets/messages/actors/actors.properties | 14 +++++++------- .../actors/hero/abilities/rogue/DeathMark.java | 4 ++-- .../hero/abilities/rogue/ShadowClone.java | 18 +++++++++++++++--- .../actors/hero/abilities/rogue/SmokeBomb.java | 10 +++++----- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index f5b97464b..bb2f10f59 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -383,7 +383,7 @@ actors.hero.abilities.rogue.smokebomb.prompt=Choose a location to jump to actors.hero.abilities.rogue.smokebomb$ninjalog.name=wooden decoy actors.hero.abilities.rogue.smokebomb$ninjalog.desc=Somehow, enemies are easily convinced that this wooden decoy is the real Rogue! actors.hero.abilities.rogue.smokebomb.short_desc=The Rogue throws down a _Smoke Bomb_ while blinking away. He becomes temporarily invisible and blinds enemies near his old location. -actors.hero.abilities.rogue.smokebomb.desc=The Rogue throws down a smoke bomb and blinks up to 8 tiles away. He can blink through hazards and enemies, but not through solid terrain like walls.\n\nEnemies that are adjacent to the Rogue's old position will be blinded for 5 turns. +actors.hero.abilities.rogue.smokebomb.desc=The Rogue throws down a smoke bomb and blinks up to 6 tiles away. He can blink through hazards and enemies, but not through solid terrain like walls.\n\nEnemies that are adjacent to the Rogue's old position will be blinded for 5 turns. actors.hero.abilities.rogue.deathmark.name=death mark actors.hero.abilities.rogue.deathmark.ally_target=You can only mark enemies actors.hero.abilities.rogue.deathmark.short_desc=The Rogue places a _Death Mark_ on a chosen enemy. Marked enemies take bonus damage, but cannot die until the mark ends. @@ -655,23 +655,23 @@ actors.hero.talent.speedy_stealth.title=speedy stealth actors.hero.talent.speedy_stealth.desc=_+1:_ The Freerunner gains 2 stacks of momentum per turn while he is invisible.\n\n_+2:_ In addition to the benefits of +1, freerunning no longer counts down while the Freerunner is invisible.\n\n_+3:_ In addition to the benefits of +1 and +2, the Freerunner moves at 2x speed while invisible, regardless of whether he is freerunning or not. actors.hero.talent.hasty_retreat.title=hasty retreat -actors.hero.talent.hasty_retreat.desc=_+1:_ After blinking the Rogue gains _2 turns_ of haste and invisibility.\n\n_+2:_ After blinking the Rogue gains _3 turns_ of haste and invisibility.\n\n_+3:_ After blinking the Rogue gains _4 turns_ of haste and invisibility.\n\n_+4:_ After blinking the Rogue gains _5 turns_ of haste and invisibility. +actors.hero.talent.hasty_retreat.desc=_+1:_ After blinking the Rogue gains _1 turn_ of haste and invisibility.\n\n_+2:_ After blinking the Rogue gains _2 turns_ of haste and invisibility.\n\n_+3:_ After blinking the Rogue gains _3 turns_ of haste and invisibility.\n\n_+4:_ After blinking the Rogue gains _4 turns_ of haste and invisibility. actors.hero.talent.body_replacement.title=body replacement -actors.hero.talent.body_replacement.desc=_+1:_ After blinking, the Rogue leaves a wooden decoy behind that has _20 health and 1-5 armor_.\n\n_+2:_ After blinking, the Rogue leaves a wooden decoy behind that has _40 health and 2-10 armor_.\n\n_+3:_ After blinking, the Rogue leaves a wooden decoy behind that has _60 health and 3-15 armor_.\n\n_+4:_ After blinking, the Rogue leaves a wooden decoy behind that has _80 health and 4-20 armor_.\n\nOnly one decoy can be active at a time. +actors.hero.talent.body_replacement.desc=_+1:_ After blinking, the Rogue leaves a wooden decoy behind that has _20 health and 1-3 armor_.\n\n_+2:_ After blinking, the Rogue leaves a wooden decoy behind that has _40 health and 2-6 armor_.\n\n_+3:_ After blinking, the Rogue leaves a wooden decoy behind that has _60 health and 3-19 armor_.\n\n_+4:_ After blinking, the Rogue leaves a wooden decoy behind that has _80 health and 4-12 armor_.\n\nOnly one decoy can be active at a time. actors.hero.talent.shadow_step.title=shadow step -actors.hero.talent.shadow_step.desc=_+1:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _24% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents.\n\n_+2:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _42% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents.\n\n_+3:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _56% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents.\n\n_+4:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _67% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents. +actors.hero.talent.shadow_step.desc=_+1:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _20% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents.\n\n_+2:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _36% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents.\n\n_+3:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _50% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents.\n\n_+4:_ If the rogue uses smoke bomb while invisible, it occurs instantly and has a _60% reduced_ charge cost, but it also doesn't blind enemies or trigger other talents. actors.hero.talent.fear_the_reaper.title=fear the reaper actors.hero.talent.fear_the_reaper.desc=_+1:_ When a death marked enemy reaches 0 hp, they become _crippled_.\n\n_+2:_ When a death marked enemy reaches 0 hp, they become _feared and crippled_.\n\n_+3:_ When a death marked enemy reaches 0 hp, they become _feared and crippled_ and enemies within 3 tiles become _crippled_.\n\n_+4:_ When a death marked enemy reaches 0 hp, they become _feared and crippled_ and enemies within 3 tiles become _feared and crippled_. actors.hero.talent.deathly_durability.title=deathly durability actors.hero.talent.deathly_durability.desc=_+1:_ Enemies killed by death mark give the rogue shielding equal to _13%_ of their hp when they were marked.\n\n_+2:_ Enemies killed by death mark give the rogue shielding equal to _25%_ of their hp when they were marked.\n\n_+3:_ Enemies killed by death mark give the rogue shielding equal to _38%_ of their hp when they were marked.\n\n_+4:_ Enemies killed by death mark give the rogue shielding equal to _50%_ of their hp when they were marked. actors.hero.talent.double_mark.title=double mark -actors.hero.talent.double_mark.desc=_+1:_ Marking a second target at the same time as the first one has a _33% reduced_ charge cost.\n\n_+2:_ Marking a second target at the same time as the first one has a _55% reduced_ charge cost.\n\n_+3:_ Marking a second target at the same time as the first one has a _70% reduced_ charge cost.\n\n_+4:_ Marking a second target at the same time as the first one has a _80% reduced_ charge cost. +actors.hero.talent.double_mark.desc=_+1:_ Marking a second target at the same time as the first one has a _30% reduced_ charge cost.\n\n_+2:_ Marking a second target at the same time as the first one has a _50% reduced_ charge cost.\n\n_+3:_ Marking a second target at the same time as the first one has a _65% reduced_ charge cost.\n\n_+4:_ Marking a second target at the same time as the first one has a _75% reduced_ charge cost. actors.hero.talent.shadow_blade.title=shadow blade -actors.hero.talent.shadow_blade.desc=_+1:_ The shadow clone gains _6%_ of the hero's damage per turn, and has a _25% chance_ to use the enchantment on the hero's weapon.\n\n_+2:_ The shadow clone gains _13%_ of the hero's damage per turn, and has a _50% chance_ to use the enchantment on the hero's weapon.\n\n_+3:_ The shadow clone gains _18%_ of the hero's damage per turn, and has a _75% chance_ to use the enchantment on the hero's weapon.\n\n_+4:_ The shadow clone gains _25%_ of the hero's damage per turn, and has a _100% chance_ to use the enchantment on the hero's weapon +actors.hero.talent.shadow_blade.desc=_+1:_ The shadow clone gains _8%_ of the hero's damage per turn, and has a _25% chance_ to use the enchantment on the hero's weapon.\n\n_+2:_ The shadow clone gains _15%_ of the hero's damage per turn, and has a _50% chance_ to use the enchantment on the hero's weapon.\n\n_+3:_ The shadow clone gains _23%_ of the hero's damage per turn, and has a _75% chance_ to use the enchantment on the hero's weapon.\n\n_+4:_ The shadow clone gains _30%_ of the hero's damage per turn, and has a _100% chance_ to use the enchantment on the hero's weapon actors.hero.talent.cloned_armor.title=cloned armor -actors.hero.talent.cloned_armor.desc=_+1:_ The shadow clone gains _13%_ of the hero's armor value, and has a _25% chance_ to use the glyph on the hero's armor.\n\n_+2:_ The shadow clone gains _25%_ of the hero's armor value, and has a _50% chance_ to use the glyph on the hero's armor.\n\n_+3:_ The shadow clone gains _38%_ of the hero's armor value, and has a _75% chance_ to use the glyph on the hero's armor.\n\n_+4:_ The shadow clone gains _50%_ of the hero's armor value, and has a _100% chance_ to use the glyph on the hero's armor. +actors.hero.talent.cloned_armor.desc=_+1:_ The shadow clone gains _15%_ of the hero's armor value, and has a _25% chance_ to use the glyph on the hero's armor.\n\n_+2:_ The shadow clone gains _30%_ of the hero's armor value, and has a _50% chance_ to use the glyph on the hero's armor.\n\n_+3:_ The shadow clone gains _45%_ of the hero's armor value, and has a _75% chance_ to use the glyph on the hero's armor.\n\n_+4:_ The shadow clone gains _60%_ of the hero's armor value, and has a _100% chance_ to use the glyph on the hero's armor. actors.hero.talent.perfect_copy.title=perfect copy actors.hero.talent.perfect_copy.desc=_+1:_ The shadow clone gains _10%_ of the hero's max HP, and can instantly swap places with the hero up to _1 tile_ away.\n\n_+2:_ The shadow clone gains _20%_ of the hero's max HP, and can instantly swap places with the hero up to _2 tiles_ away.\n\n_+3:_ The shadow clone gains _30%_ of the hero's max HP, and can instantly swap places with the hero up to _3 tiles_ away.\n\n_+4:_ The shadow clone gains _40%_ of the hero's max HP, and can instantly swap places with the hero up to _4 tiles_ away. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/DeathMark.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/DeathMark.java index 94215daa2..2a3192fc1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/DeathMark.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/DeathMark.java @@ -57,8 +57,8 @@ public class DeathMark extends ArmorAbility { public float chargeUse( Hero hero ) { float chargeUse = super.chargeUse(hero); if (hero.buff(DoubleMarkTracker.class) != null){ - //reduced charge use by 33%/55%/70%/80% - chargeUse *= Math.pow(0.67, hero.pointsInTalent(Talent.DOUBLE_MARK)); + //reduced charge use by 30%/50%/65%/75% + chargeUse *= Math.pow(0.707, hero.pointsInTalent(Talent.DOUBLE_MARK)); } return chargeUse; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java index cd6383ff1..122ecd136 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java @@ -150,7 +150,7 @@ public class ShadowClone extends ArmorAbility { public ShadowAlly( int heroLevel ){ super(); - int hpBonus = 20 + 5*heroLevel; + int hpBonus = 15 + 5*heroLevel; hpBonus = Math.round(0.1f * Dungeon.hero.pointsInTalent(Talent.PERFECT_COPY) * hpBonus); if (hpBonus > 0){ HT += hpBonus; @@ -192,7 +192,7 @@ public class ShadowClone extends ArmorAbility { int damage = Random.NormalIntRange(10, 20); int heroDamage = Dungeon.hero.damageRoll(); heroDamage /= Dungeon.hero.attackDelay(); //normalize hero damage based on atk speed - heroDamage = Math.round(0.0625f * Dungeon.hero.pointsInTalent(Talent.SHADOW_BLADE) * heroDamage); + heroDamage = Math.round(0.075f * Dungeon.hero.pointsInTalent(Talent.SHADOW_BLADE) * heroDamage); if (heroDamage > 0){ damage += heroDamage; } @@ -214,7 +214,7 @@ public class ShadowClone extends ArmorAbility { public int drRoll() { int dr = super.drRoll(); int heroRoll = Dungeon.hero.drRoll(); - heroRoll = Math.round(0.125f * Dungeon.hero.pointsInTalent(Talent.CLONED_ARMOR) * heroRoll); + heroRoll = Math.round(0.15f * Dungeon.hero.pointsInTalent(Talent.CLONED_ARMOR) * heroRoll); if (heroRoll > 0){ dr += heroRoll; } @@ -232,6 +232,18 @@ public class ShadowClone extends ArmorAbility { } } + @Override + public float speed() { + float speed = super.speed(); + + //moves 2 tiles at a time when returning to the hero + if (state == WANDERING && defendingPos == -1){ + speed *= 2; + } + + return speed; + } + @Override public boolean canInteract(Char c) { if (super.canInteract(c)){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/SmokeBomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/SmokeBomb.java index cb9d75c16..e553dd131 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/SmokeBomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/SmokeBomb.java @@ -61,8 +61,8 @@ public class SmokeBomb extends ArmorAbility { if (!hero.hasTalent(Talent.SHADOW_STEP) || hero.invisible <= 0){ return super.chargeUse(hero); } else { - //reduced charge use by 24%/42%/56%/67% - return (float)(super.chargeUse(hero) * Math.pow(0.76, hero.pointsInTalent(Talent.SHADOW_STEP))); + //reduced charge use by 20%/36%/50%/60% + return (float)(super.chargeUse(hero) * Math.pow(0.795, hero.pointsInTalent(Talent.SHADOW_STEP))); } } @@ -70,7 +70,7 @@ public class SmokeBomb extends ArmorAbility { protected void activate(ClassArmor armor, Hero hero, Integer target) { if (target != null) { - PathFinder.buildDistanceMap(hero.pos, BArray.not(Dungeon.level.solid,null), 8); + PathFinder.buildDistanceMap(hero.pos, BArray.not(Dungeon.level.solid,null), 6); if ( PathFinder.distance[target] == Integer.MAX_VALUE || !Dungeon.level.heroFOV[target] || @@ -107,7 +107,7 @@ public class SmokeBomb extends ArmorAbility { } if (hero.hasTalent(Talent.HASTY_RETREAT)){ - int duration = 1+hero.pointsInTalent(Talent.HASTY_RETREAT); + int duration = hero.pointsInTalent(Talent.HASTY_RETREAT); Buff.affect(hero, Haste.class, duration); Buff.affect(hero, Invisibility.class, duration); } @@ -149,7 +149,7 @@ public class SmokeBomb extends ArmorAbility { @Override public int drRoll() { return Random.NormalIntRange(Dungeon.hero.pointsInTalent(Talent.BODY_REPLACEMENT), - 5*Dungeon.hero.pointsInTalent(Talent.BODY_REPLACEMENT)); + 3*Dungeon.hero.pointsInTalent(Talent.BODY_REPLACEMENT)); } }