v2.5.4: buffs on enemies can now also use the revivepersists property

This commit is contained in:
Evan Debenham
2024-10-07 12:22:43 -04:00
parent 8a143658fb
commit bf4fd5c66f
11 changed files with 39 additions and 51 deletions

View File

@@ -34,7 +34,11 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
//generic class for buffs which convert an enemy into an ally
// There is a decent amount of logic that ties into this, which is why it has its own abstract class
public abstract class AllyBuff extends Buff{
public abstract class AllyBuff extends Buff {
{
revivePersists = true;
}
@Override
public boolean attachTo(Char target) {

View File

@@ -45,7 +45,7 @@ public class Buff extends Actor {
//whether or not the buff announces its name
public boolean announced = false;
//whether a buff should persist through revive effects for the hero
//whether a buff should persist through revive effects or similar (e.g. transmogrify)
public boolean revivePersists = false;
protected HashSet<Class> resistances = new HashSet<>();

View File

@@ -41,6 +41,7 @@ public abstract class ChampionEnemy extends Buff {
{
type = buffType.POSITIVE;
revivePersists = true;
}
protected int color;

View File

@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.Ratmogrify;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Feint;
@@ -40,7 +41,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.mage.WildM
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.DeathMark;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.ShadowClone;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.SmokeBomb;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.HeroicLeap;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Shockwave;
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
@@ -249,7 +249,7 @@ public enum HeroClass {
public ArmorAbility[] armorAbilities(){
switch (this) {
case WARRIOR: default:
return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Endure()};
return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Ratmogrify()};
case MAGE:
return new ArmorAbility[]{new ElementalBlast(), new WildMagic(), new WarpBeacon()};
case ROGUE:

View File

@@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
@@ -38,7 +37,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.journal.Bestiary;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@@ -140,28 +138,20 @@ public class Ratmogrify extends ArmorAbility {
rat.setup((Mob)ch);
rat.pos = ch.pos;
//preserve champion enemy buffs
HashSet<ChampionEnemy> champBuffs = ch.buffs(ChampionEnemy.class);
for (ChampionEnemy champ : champBuffs){
if (ch.remove(champ)) {
ch.sprite.clearAura();
//preserve some buffs
HashSet<Buff> persistentBuffs = new HashSet<>();
for (Buff b : ch.buffs()){
if (b.revivePersists){
persistentBuffs.add(b);
}
}
MasterThievesArmband.StolenTracker stealTracker = ch.buff(MasterThievesArmband.StolenTracker.class);
if (stealTracker != null){
ch.remove(stealTracker);
}
Actor.remove( ch );
ch.sprite.killAndErase();
Dungeon.level.mobs.remove(ch);
for (ChampionEnemy champ : champBuffs){
ch.add(champ);
}
if (stealTracker != null) {
ch.add(stealTracker);
for (Buff b : persistentBuffs){
ch.add(b);
}
GameScene.add(rat);

View File

@@ -758,6 +758,10 @@ public class DwarfKing extends Mob {
public static class KingDamager extends Buff {
{
revivePersists = true;
}
@Override
public boolean act() {
if (target.alignment != Alignment.ENEMY){

View File

@@ -25,14 +25,11 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.SacrificialFire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge;
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
@@ -137,8 +134,11 @@ public class Ghoul extends Mob {
Actor.add( new Pushing( child, pos, child.pos ) );
}
for (Buff b : buffs(ChampionEnemy.class)){
Buff.affect( child, b.getClass());
//champion buff, mainly
for (Buff b : buffs()){
if (b.revivePersists) {
Buff.affect(child, b.getClass());
}
}
}
@@ -184,10 +184,7 @@ public class Ghoul extends Mob {
if (buff instanceof SacrificialFire.Marked){
//don't remove and postpone so marked stays on
Buff.prolong(this, SacrificialFire.Marked.class, timesDowned*5);
} else if (buff instanceof AllyBuff
|| buff instanceof ChampionEnemy
|| buff instanceof MasterThievesArmband.StolenTracker
|| buff instanceof DwarfKing.KingDamager) {
} else if (buff.revivePersists) {
//don't remove
} else {
buff.detach();

View File

@@ -26,9 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
@@ -247,11 +245,10 @@ public class Necromancer extends Mob {
Dungeon.level.occupyCell( mySkeleton );
((NecromancerSprite)sprite).finishSummoning();
for (Buff b : buffs(AllyBuff.class)){
Buff.affect(mySkeleton, b.getClass());
}
for (Buff b : buffs(ChampionEnemy.class)){
Buff.affect( mySkeleton, b.getClass());
for (Buff b : buffs()){
if (b.revivePersists) {
Buff.affect(mySkeleton, b.getClass());
}
}
}

View File

@@ -25,9 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@@ -160,11 +158,10 @@ public class SpectralNecromancer extends Necromancer {
Dungeon.level.occupyCell( wraith );
((SpectralNecromancerSprite)sprite).finishSummoning();
for (Buff b : buffs(AllyBuff.class)){
Buff.affect( wraith, b.getClass());
}
for (Buff b : buffs(ChampionEnemy.class)){
Buff.affect( wraith, b.getClass());
for (Buff b : buffs()){
if (b.revivePersists) {
Buff.affect(wraith, b.getClass());
}
}
wraithIDs.add(wraith.id());
}

View File

@@ -24,10 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
@@ -136,11 +134,10 @@ public class Swarm extends Mob {
if (buff( Poison.class ) != null) {
Buff.affect( clone, Poison.class ).set(2);
}
for (Buff b : buffs(AllyBuff.class)){
Buff.affect( clone, b.getClass());
}
for (Buff b : buffs(ChampionEnemy.class)){
Buff.affect( clone, b.getClass());
for (Buff b : buffs()){
if (b.revivePersists) {
Buff.affect(clone, b.getClass());
}
}
return clone;
}

View File

@@ -207,6 +207,7 @@ public class MasterThievesArmband extends Artifact {
//counter of 0 for attempt but no success, 1 for success
public static class StolenTracker extends CounterBuff {
{ revivePersists = true; }
public void setItemStolen(boolean stolen){ if (stolen) countUp(1); }
public boolean itemWasStolen(){ return count() > 0; }
}