v3.0.0: implemented aura of protection minus the glyph sharing property

This commit is contained in:
Evan Debenham
2025-01-19 22:19:54 -05:00
parent f04482143d
commit d2320e93fd
4 changed files with 46 additions and 3 deletions

View File

@@ -566,7 +566,7 @@ actors.hero.abilities.ratmogrify$transmograt.rankings_desc=Slain by: ratmogrifie
##Cleric Spells
actors.hero.spells.auraofprotection.name=aura of protection
actors.hero.spells.auraofprotection.short_desc=Boosts defence for Paladin and nearby allies.
actors.hero.spells.auraofprotection.desc=The Paladin begins radiating protective energy for 20 turns. Any ally within 2 tiles of the Paladin (including themselves) takes %1$d%% less damage, and gains the effect of the Paladin's armor glyph at +%2$d%% power.\n\nThe power boost will always apply, but this spell cannot cause the Paladin's glyph to apply more than once if a character is already benefitting from it (e.g. the Paladin themselves, or a prismatic image).
actors.hero.spells.auraofprotection.desc=The Paladin begins radiating protective energy in a sparkling aura around themselves for 20 turns. Any ally within 2 tiles of the Paladin (including themselves) takes %1$d%% less damage, and gains the effect of the Paladin's armor glyph at +%2$d%% power.\n\nThis damage reduction takes place before other damage-reducing effects (e.g. armor). The glyph power boost will always apply, but this spell cannot cause the Paladin's glyph to apply more than once if a character is already benefitting from it (e.g. the Paladin themselves, or a prismatic image).
actors.hero.spells.auraofprotection$aurabuff.name=aura of protection
actors.hero.spells.auraofprotection$aurabuff.desc=The Paladin is radiating protective energy around themselves.\n\nAny nearby ally (including the Paladin themselves) takes reduced damage and gains the effect of the Paladin's armor glyph with boosted power.\n\nTurns Remaining: %s.

View File

@@ -80,6 +80,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.DeathMark;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.AuraOfProtection;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.GuidingLight;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.ShieldOfLight;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Brute;
@@ -438,6 +439,12 @@ public abstract class Char extends Actor {
dmg *= 0.67f;
}
if (Dungeon.hero.alignment == enemy.alignment
&& Dungeon.level.distance(enemy.pos, Dungeon.hero.pos) <= 2
&& Dungeon.hero.buff(AuraOfProtection.AuraBuff.class) != null){
dmg *= 0.925f - 0.075f*Dungeon.hero.pointsInTalent(Talent.AURA_OF_PROTECTION);
}
if (enemy.buff(MonkEnergy.MonkAbility.Meditate.MeditateResistance.class) != null){
dmg *= 0.2f;
}
@@ -737,6 +744,15 @@ public abstract class Char extends Actor {
}
}
//if dmg is from a character we already reduced it in defenseProc
if (!(src instanceof Char)) {
if (Dungeon.hero.alignment == alignment
&& Dungeon.level.distance(pos, Dungeon.hero.pos) <= 2
&& Dungeon.hero.buff(AuraOfProtection.AuraBuff.class) != null) {
dmg *= 0.925f - 0.075f*Dungeon.hero.pointsInTalent(Talent.AURA_OF_PROTECTION);
}
}
Terror t = buff(Terror.class);
if (t != null){
t.recover();

View File

@@ -21,15 +21,19 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
public class AuraOfProtection extends ClericSpell {
@@ -57,7 +61,7 @@ public class AuraOfProtection extends ClericSpell {
Buff.affect(hero,AuraBuff.class, AuraBuff.DURATION);
//TODO vfx/sfx
Sample.INSTANCE.play(Assets.Sounds.READ);
hero.spend( 1f );
hero.busy();
@@ -71,6 +75,8 @@ public class AuraOfProtection extends ClericSpell {
public static float DURATION = 20f;
private Emitter particles;
{
type = buffType.POSITIVE;
}
@@ -80,6 +86,18 @@ public class AuraOfProtection extends ClericSpell {
return BuffIndicator.PROT_AURA;
}
@Override
public void fx(boolean on) {
if (on && (particles == null || particles.parent == null)){
particles = target.sprite.emitter(); //emitter is much bigger than char so it needs to manage itself
particles.pos(target.sprite, -32, -32, 80, 80);
particles.fillTarget = false;
particles.pour(Speck.factory(Speck.LIGHT), 0.02f);
} else if (!on && particles != null){
particles.on = false;
}
}
@Override
public float iconFadePercent() {
return Math.max(0, (DURATION - visualcooldown()) / DURATION);

View File

@@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.AuraOfProtection;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HolyWard;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
@@ -757,7 +758,15 @@ public class Armor extends EquipableItem {
}
public static float genericProcChanceMultiplier( Char defender ){
return RingOfArcana.enchantPowerMultiplier(defender);
float multi = RingOfArcana.enchantPowerMultiplier(defender);
if (Dungeon.hero.alignment == defender.alignment
&& Dungeon.level.distance(defender.pos, Dungeon.hero.pos) <= 2
&& Dungeon.hero.buff(AuraOfProtection.AuraBuff.class) != null){
multi += 0.25f + 0.25f*Dungeon.hero.pointsInTalent(Talent.AURA_OF_PROTECTION);
}
return multi;
}
public String name() {