diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index a78fdb4c7..57a4b23ac 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -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. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index d14776409..0976b5e00 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Eye.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Eye.java index 6e5420555..42d8d02db 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Eye.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Eye.java @@ -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]) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java index b3f501c0d..d830256b5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java @@ -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()) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java index 96d26a9f3..c70caad28 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java @@ -503,10 +503,12 @@ public class YogDzewa extends Mob { @Override public void aggro(Char ch) { - for (Mob mob : (Iterable)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) 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); + } } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java index 1d3389917..4307240ff 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java @@ -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);