v2.5.4: buffs on enemies can now also use the revivepersists property
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -41,6 +41,7 @@ public abstract class ChampionEnemy extends Buff {
|
||||
|
||||
{
|
||||
type = buffType.POSITIVE;
|
||||
revivePersists = true;
|
||||
}
|
||||
|
||||
protected int color;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user