From 49ef8174cf92b7167cd86f9d73799840d78e0f53 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 26 Jul 2021 16:19:47 -0400 Subject: [PATCH] v0.9.4: balance changes to mage abilities/T4 talents: - wild magic now boosts wand levels instead of overriding - conserved magic now has a chance to give a 3rd shot - elemental blast base damage up by 33% - elemental power now boosts by 20%, up from 15% - telefrag self-damage increased at high levels - remote beacon range per level increased to 4 from 3 --- .../assets/messages/actors/actors.properties | 10 +++---- .../assets/messages/items/items.properties | 2 +- .../hero/abilities/mage/ElementalBlast.java | 6 ++--- .../actors/hero/abilities/mage/WildMagic.java | 27 +++++++++++++------ .../items/wands/Wand.java | 11 +++++--- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index f8004ae9f..0b265172c 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -364,7 +364,7 @@ actors.hero.abilities.mage.elementalblast.generic_desc=The effect of elemental b actors.hero.abilities.mage.wildmagic.name=wild magic actors.hero.abilities.mage.wildmagic.no_wands=You have no wands to zap with! actors.hero.abilities.mage.wildmagic.short_desc=The Mage unleashes the _Wild Magic_ contained in his wands, randomly firing them multiple times at a chosen target over a single turn. -actors.hero.abilities.mage.wildmagic.desc=The Mage unleashes the power in his wands, randomly firing them up to 4 times in a single turn. The Mage's staff is not included in this effect.\n\nEach wand is treated as if it was +1, regardless of its actual level. This ability does consume wand charges, and no one wand can be fired more than 2 times. +actors.hero.abilities.mage.wildmagic.desc=The Mage unleashes the power in his wands, randomly firing them up to 4 times in a single turn. The Mage's staff is not included in this effect.\n\nEach wand also has its level boosted by 1, up to +2. This ability does consume wand charges, and no one wand can be fired more than 2 times. actors.hero.abilities.mage.warpbeacon.name=warp beacon actors.hero.abilities.mage.warpbeacon.depths=You can't warp between depths! actors.hero.abilities.mage.warpbeacon.locked_floor=You cannot leave a locked floor! @@ -601,16 +601,16 @@ actors.hero.talent.reactive_barrier.title=reactive barrier actors.hero.talent.reactive_barrier.desc=_+1:_ The Mage gains _2 shielding_ for every character affected by elemental blast, to a max of 5 characters.\n\n_+2:_ The Mage gains _4 shielding_ for every character affected by elemental blast, to a max of 5 characters.\n\n_+3:_ The Mage gains _6 shielding_ for every character affected by elemental blast, to a max of 5 characters.\n\n_+4:_ The Mage gains _8 shielding_ for every character affected by elemental blast, to a max of 5 characters. actors.hero.talent.wild_power.title=wild power -actors.hero.talent.wild_power.desc=_+1:_ When using wild magic, wands will be treated as either _+1 or +2_, instead of +1.\n\n_+2:_ When using wild magic, wands are now treated as if they are _+2_, instead of +1.\n\n_+3:_ When using wild magic, wands will be treated as either _+2 or +3_, instead of +1.\n\n_+4:_ When using wild magic, wands are now treated as if they are _+3_, instead of +1. +actors.hero.talent.wild_power.desc=_+1:_ When using wild magic, wands will be boosted by either _1 or 2, up to +3_.\n\n_+2:_ When using wild magic, wands will be boosted by _2, up to +4_.\n\n_+3:_ When using wild magic, wands will be boosted by either _2 or 3, up to +5_.\n\n_+4:_ When using wild magic, wands will be boosted by _3, up to +6_. actors.hero.talent.fire_everything.title=fire everything actors.hero.talent.fire_everything.desc=_+1:_ Wild magic now fires _5 times_, up from 4.\n\n_+2:_ Wild magic now fires _6 times_, up from 4.\n\n_+3:_ Wild magic now fires _7 times_, up from 4.\n\n_+4:_ Wild magic now fires _8 times_, up from 4. actors.hero.talent.conserved_magic.title=conserved magic -actors.hero.talent.conserved_magic.desc=_+1:_ Each zap from wild magic now uses _0.56 charges_, instead of 1.\n\n_+2:_ Each zap from wild magic now uses _0.31 charges_, instead of 1.\n\n_+3:_ Each zap from wild magic now uses _0.18 charges_, instead of 1.\n\n_+4:_ Each zap from wild magic now uses _0.1 charges_, instead of 1. +actors.hero.talent.conserved_magic.desc=_+1:_ Each zap from wild magic now uses _0.67 charges_ instead of 1, and each wand has a _25% chance_ to be usable 3 times.\n\n_+2:_ Each zap from wild magic now uses _0.45 charges_ instead of 1, and each wand has a _50% chance_ to be usable 3 times.\n\n_+3:_ Each zap from wild magic now uses _0.3 charges_ instead of 1, and each wand has a _75% chance_ to be usable 3 times.\n\n_+4:_ Each zap from wild magic now uses _0.2 charges_ instead of 1, and each wand has a _100% chance_ to be usable 3 times. actors.hero.talent.telefrag.title=Telefrag -actors.hero.talent.telefrag.desc=_+1:_ If the Mage warps into another character he deals _10-15 damage_ to it, but also takes _5 damage_.\n\n_+2:_ If the Mage warps into another character he deals _20-30 damage_ to it, but also takes _8 damage_.\n\n_+3:_ If the Mage warps into another character he deals _30-45 damage_ to it, but also takes _12 damage_.\n\n_+4:_ If the Mage warps into another character he deals _40-60 damage_ to it, but also takes _15 damage_.\n\nThe hero cannot be killed by this talent, the self damage can be reduced by magic resisting effects. +actors.hero.talent.telefrag.desc=_+1:_ If the Mage warps into another character he deals _10-15 damage_ to it, but also takes _5 damage_.\n\n_+2:_ If the Mage warps into another character he deals _20-30 damage_ to it, but also takes _10 damage_.\n\n_+3:_ If the Mage warps into another character he deals _30-45 damage_ to it, but also takes _15 damage_.\n\n_+4:_ If the Mage warps into another character he deals _40-60 damage_ to it, but also takes _20 damage_.\n\nThe hero cannot be killed by this talent, the self damage can be reduced by magic resisting effects. actors.hero.talent.remote_beacon.title=Remote Beacon -actors.hero.talent.remote_beacon.desc=_+1:_ The Mage can place a beacon at any location within _3 tiles_.\n\n_+2:_ The Mage can place a beacon at any location within _6 tiles_.\n\n_+3:_ The Mage can place a beacon at any location within _9 tiles_.\n\n_+4:_ The Mage can place a beacon at any location within _12 tiles_.\n\nThe Mage cannot place beacons in locations that are inaccessible +actors.hero.talent.remote_beacon.desc=_+1:_ The Mage can place a beacon at any location within _4 tiles_.\n\n_+2:_ The Mage can place a beacon at any location within _8 tiles_.\n\n_+3:_ The Mage can place a beacon at any location within _12 tiles_.\n\n_+4:_ The Mage can place a beacon at any location within _16 tiles_.\n\nThe Mage cannot place beacons in locations that are inaccessible. actors.hero.talent.longrange_warp.title=Longrange Warp actors.hero.talent.longrange_warp.desc=_+1:_ The Mage can now warp between floors, at _150% charge cost_.\n\n_+2:_ The Mage can now warp between floors, at _117% charge cost_.\n\n_+3:_ The Mage can now warp between floors, at _83% charge cost_.\n\n_+4:_ The Mage can now warp between floors, at _50% charge cost_.\n\nThe Mage cannot use longrange warp to leave a locked floor. diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 5996b55f4..7c0e278b6 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1161,7 +1161,7 @@ items.wands.wandofcorrosion.staff_name=staff of corrosion items.wands.wandofcorrosion.desc=This wand has an ashen body which opens to a brilliant orange gem. items.wands.wandofcorrosion.stats_desc=This wand shoots a bolt which explodes into a cloud of highly corrosive gas at a targeted location. Anything caught inside this cloud will take increasing damage over time, starting at _%d damage._ items.wands.wandofcorrosion.bmage_desc=When _the Battlemage_ strikes an enemy with a staff of corrosion, the enemy has a chance to become oozed. -items.wands.wandofcorrosion.eleblast_desc=An elemental blast with a staff of corrosion inflicts enemies with 3 turns of corrosion, starting at 6 damage. +items.wands.wandofcorrosion.eleblast_desc=An elemental blast with a staff of corrosion inflicts enemies with 4 turns of corrosion, starting at 6 damage. items.wands.wandofcorruption.name=wand of corruption items.wands.wandofcorruption.staff_name=staff of corruption diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java index 2c9bb4ae2..e2751a5d0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java @@ -252,7 +252,7 @@ public class ElementalBlast extends ArmorAbility { //### Deal damage ### Char mob = Actor.findChar(cell); - int damage = Math.round(Random.NormalIntRange(10, 20) + int damage = Math.round(Random.NormalIntRange(15, 25) * effectMulti * damageFactors.get(finalWandCls)); @@ -278,7 +278,7 @@ public class ElementalBlast extends ArmorAbility { //*** Wand of Corrosion *** } else if (finalWandCls == WandOfCorrosion.class){ if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) { - Buff.affect( mob, Corrosion.class ).set(3, Math.round(6*effectMulti)); + Buff.affect( mob, Corrosion.class ).set(4, Math.round(6*effectMulti)); charsHit++; } @@ -336,7 +336,7 @@ public class ElementalBlast extends ArmorAbility { charm.ignoreHeroAllies = true; mob.sprite.centerEmitter().start(Speck.factory(Speck.HEART), 0.2f, 3); } else { - damage = Math.round(Random.NormalIntRange(10, 20) * effectMulti); + damage = Math.round(Random.NormalIntRange(15, 25) * effectMulti); mob.damage(damage, Reflection.newInstance(finalWandCls)); mob.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/WildMagic.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/WildMagic.java index d2416590f..d19ff0186 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/WildMagic.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/WildMagic.java @@ -65,7 +65,7 @@ public class WildMagic extends ArmorAbility { ArrayList wands = hero.belongings.getAllItems(Wand.class); Random.shuffle(wands); - float chargeUsePerShot = (float)Math.pow(0.563f, hero.pointsInTalent(Talent.CONSERVED_MAGIC)); + float chargeUsePerShot = (float)Math.pow(0.67f, hero.pointsInTalent(Talent.CONSERVED_MAGIC)); for (Wand w : wands.toArray(new Wand[0])){ if (w.curCharges < 1 && w.partialCharge < chargeUsePerShot){ @@ -75,19 +75,30 @@ public class WildMagic extends ArmorAbility { int maxWands = 4 + Dungeon.hero.pointsInTalent(Talent.FIRE_EVERYTHING); + //second and third shots if (wands.size() < maxWands){ - ArrayList dupes = new ArrayList<>(wands); + ArrayList seconds = new ArrayList<>(wands); + ArrayList thirds = new ArrayList<>(wands); - for (Wand w : dupes.toArray(new Wand[0])){ + for (Wand w : wands){ float totalCharge = w.curCharges + w.partialCharge; if (totalCharge < 2*chargeUsePerShot){ - dupes.remove(w); + seconds.remove(w); + } + if (totalCharge < 3*chargeUsePerShot + || Random.Int(4) > Dungeon.hero.pointsInTalent(Talent.CONSERVED_MAGIC)){ + thirds.remove(w); } } - Random.shuffle(dupes); - while (!dupes.isEmpty() && wands.size() < maxWands){ - wands.add(dupes.remove(0)); + Random.shuffle(seconds); + while (!seconds.isEmpty() && wands.size() < maxWands){ + wands.add(seconds.remove(0)); + } + + Random.shuffle(thirds); + while (!thirds.isEmpty() && wands.size() < maxWands){ + wands.add(thirds.remove(0)); } } @@ -121,7 +132,7 @@ public class WildMagic extends ArmorAbility { @Override public void call() { cur.onZap(aim); - cur.partialCharge -= (float)Math.pow(0.563f, hero.pointsInTalent(Talent.CONSERVED_MAGIC)); + cur.partialCharge -= (float)Math.pow(0.67f, hero.pointsInTalent(Talent.CONSERVED_MAGIC)); if (cur.partialCharge < 0){ cur.partialCharge++; cur.curCharges--; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index 68567bd28..13777c939 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -321,9 +321,14 @@ public abstract class Wand extends Item { if (charger != null && charger.target != null) { if (charger.target.buff(WildMagic.WildMagicTracker.class) != null){ - int level = 2 + ((Hero)charger.target).pointsInTalent(Talent.WILD_POWER); - if (Random.Int(2) == 0) level++; - return level/2; // +1/+1.5/+2/+2.5/+3 at 0/1/2/3/4 talent points + int bonus = 2 + ((Hero)charger.target).pointsInTalent(Talent.WILD_POWER); + if (Random.Int(2) == 0) bonus++; + bonus /= 2; // +1/+1.5/+2/+2.5/+3 at 0/1/2/3/4 talent points + + int maxBonusLevel = 2 + ((Hero)charger.target).pointsInTalent(Talent.WILD_POWER); + if (lvl < maxBonusLevel) { + lvl = Math.min(lvl + bonus, maxBonusLevel); + } } if (charger.target.buff(ScrollEmpower.class) != null){