v2.5.3: stone of aggression rebalanced:

- now has full duration against regular enemies
- bosses still have 1/4 duration, and now also take 1/2 dmg
- Yog specifically takes 1/4 damage
- also fixed a bug where aggro stone would cause Yog minions to turn on each other
This commit is contained in:
Evan Debenham
2024-09-25 12:52:11 -04:00
parent d99a42326a
commit 01a9218ad7
6 changed files with 43 additions and 7 deletions

View File

@@ -1262,7 +1262,7 @@ items.stones.inventorystone.ac_use=USE
items.stones.runestone$placeholder.name=runestone
items.stones.stoneofaggression.name=stone of aggression
items.stones.stoneofaggression.desc=When this stone is thrown at an ally or enemy, all nearby enemies will be forced to attack that character for a short time.\n\nWhen used on enemies, the magic will only last for a few turns, but when used on yourself or allies it will last significantly longer.
items.stones.stoneofaggression.desc=When this stone is thrown at an ally or enemy, all nearby enemies will be forced to attack that character for a short time.\n\nBoss enemies can resist the effect however, reducing the duration significantly and taking less damage from their minion's attacks.
items.stones.stoneofaggression$aggression.name=targeted
items.stones.stoneofaggression$aggression.desc=Manipulative magic is forcing all nearby enemies to attack this character.\n\nTurns remaining: %s.

View File

@@ -86,6 +86,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Elemental;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollGeomancer;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Necromancer;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.YogDzewa;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.MirrorImage;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PrismaticImage;
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
@@ -103,6 +104,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetributio
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfChallenge;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAggression;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
@@ -430,6 +432,17 @@ public abstract class Char extends Actor {
if ( buff(Weakness.class) != null ){
dmg *= 0.67f;
}
//characters influenced by aggression deal 1/2 damage to bosses
if ( enemy.buff(StoneOfAggression.Aggression.class) != null
&& enemy.alignment == alignment
&& (Char.hasProp(enemy, Property.BOSS) || Char.hasProp(enemy, Property.MINIBOSS))){
dmg *= 0.5f;
//yog-dzewa specifically takes 1/4 damage
if (enemy instanceof YogDzewa){
dmg *= 0.5f;
}
}
int effectiveDamage = enemy.defenseProc( this, Math.round(dmg) );
//do not trigger on-hit logic if defenseProc returned a negative value

View File

@@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle
import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAggression;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfDisintegration;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisintegrationTrap;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
@@ -192,6 +193,17 @@ public class Eye extends Mob {
if (hit( this, ch, true )) {
int dmg = Random.NormalIntRange( 30, 50 );
dmg = Math.round(dmg * AscensionChallenge.statModifier(this));
//logic for fists or Yog-Dzewa taking 1/2 or 1/4 damage from aggression stoned minions
if ( ch.buff(StoneOfAggression.Aggression.class) != null
&& ch.alignment == alignment
&& (Char.hasProp(ch, Property.BOSS) || Char.hasProp(ch, Property.MINIBOSS))){
dmg *= 0.5f;
if (ch instanceof YogDzewa){
dmg *= 0.5f;
}
}
ch.damage( dmg, new DeathGaze() );
if (Dungeon.level.heroFOV[pos]) {

View File

@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAggression;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
@@ -117,6 +118,14 @@ public class Warlock extends Mob implements Callback {
int dmg = Random.NormalIntRange( 12, 18 );
dmg = Math.round(dmg * AscensionChallenge.statModifier(this));
//logic for DK taking 1/2 damage from aggression stoned minions
if ( enemy.buff(StoneOfAggression.Aggression.class) != null
&& enemy.alignment == alignment
&& (Char.hasProp(enemy, Property.BOSS) || Char.hasProp(enemy, Property.MINIBOSS))){
dmg *= 0.5f;
}
enemy.damage( dmg, new DarkBolt() );
if (enemy == Dungeon.hero && !enemy.isAlive()) {

View File

@@ -503,10 +503,12 @@ public class YogDzewa extends Mob {
@Override
public void aggro(Char ch) {
for (Mob mob : (Iterable<Mob>)Dungeon.level.mobs.clone()) {
if (mob != ch && Dungeon.level.distance(pos, mob.pos) <= 4 &&
(mob instanceof Larva || mob instanceof YogRipper || mob instanceof YogEye || mob instanceof YogScorpio)) {
mob.aggro(ch);
if (ch.alignment != alignment || !(ch instanceof Larva || ch instanceof YogRipper || ch instanceof YogEye || ch instanceof YogScorpio)) {
for (Mob mob : (Iterable<Mob>) Dungeon.level.mobs.clone()) {
if (mob != ch && Dungeon.level.distance(pos, mob.pos) <= 4 && mob.alignment == alignment &&
(mob instanceof Larva || mob instanceof YogRipper || mob instanceof YogEye || mob instanceof YogScorpio)) {
mob.aggro(ch);
}
}
}
}

View File

@@ -47,7 +47,7 @@ public class StoneOfAggression extends Runestone {
Char ch = Actor.findChar( cell );
if (ch != null) {
if (ch.alignment == Char.Alignment.ENEMY) {
if (Char.hasProp(ch, Char.Property.BOSS) || Char.hasProp(ch, Char.Property.MINIBOSS)) {
Buff.prolong(ch, Aggression.class, Aggression.DURATION / 4f);
} else {
Buff.prolong(ch, Aggression.class, Aggression.DURATION);
@@ -80,7 +80,7 @@ public class StoneOfAggression extends Runestone {
@Override
public float iconFadePercent() {
if (target.alignment == Char.Alignment.ENEMY){
if (Char.hasProp(target, Char.Property.BOSS) || Char.hasProp(target, Char.Property.MINIBOSS)){
return Math.max(0, (DURATION/4f - visualcooldown()) / (DURATION/4f));
} else {
return Math.max(0, (DURATION - visualcooldown()) / DURATION);