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
|
//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
|
// 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
|
@Override
|
||||||
public boolean attachTo(Char target) {
|
public boolean attachTo(Char target) {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public class Buff extends Actor {
|
|||||||
//whether or not the buff announces its name
|
//whether or not the buff announces its name
|
||||||
public boolean announced = false;
|
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;
|
public boolean revivePersists = false;
|
||||||
|
|
||||||
protected HashSet<Class> resistances = new HashSet<>();
|
protected HashSet<Class> resistances = new HashSet<>();
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ public abstract class ChampionEnemy extends Buff {
|
|||||||
|
|
||||||
{
|
{
|
||||||
type = buffType.POSITIVE;
|
type = buffType.POSITIVE;
|
||||||
|
revivePersists = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int color;
|
protected int color;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.QuickSlot;
|
import com.shatteredpixel.shatteredpixeldungeon.QuickSlot;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
|
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
|
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.Challenge;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Feint;
|
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.DeathMark;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.ShadowClone;
|
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.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.HeroicLeap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Shockwave;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Shockwave;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
|
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
|
||||||
@@ -249,7 +249,7 @@ public enum HeroClass {
|
|||||||
public ArmorAbility[] armorAbilities(){
|
public ArmorAbility[] armorAbilities(){
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case WARRIOR: default:
|
case WARRIOR: default:
|
||||||
return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Endure()};
|
return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Ratmogrify()};
|
||||||
case MAGE:
|
case MAGE:
|
||||||
return new ArmorAbility[]{new ElementalBlast(), new WildMagic(), new WarpBeacon()};
|
return new ArmorAbility[]{new ElementalBlast(), new WildMagic(), new WarpBeacon()};
|
||||||
case ROGUE:
|
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.AllyBuff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
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.buffs.Invisibility;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
|
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.CellEmitter;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor;
|
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.items.scrolls.ScrollOfTeleportation;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.journal.Bestiary;
|
import com.shatteredpixel.shatteredpixeldungeon.journal.Bestiary;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
@@ -140,28 +138,20 @@ public class Ratmogrify extends ArmorAbility {
|
|||||||
rat.setup((Mob)ch);
|
rat.setup((Mob)ch);
|
||||||
rat.pos = ch.pos;
|
rat.pos = ch.pos;
|
||||||
|
|
||||||
//preserve champion enemy buffs
|
//preserve some buffs
|
||||||
HashSet<ChampionEnemy> champBuffs = ch.buffs(ChampionEnemy.class);
|
HashSet<Buff> persistentBuffs = new HashSet<>();
|
||||||
for (ChampionEnemy champ : champBuffs){
|
for (Buff b : ch.buffs()){
|
||||||
if (ch.remove(champ)) {
|
if (b.revivePersists){
|
||||||
ch.sprite.clearAura();
|
persistentBuffs.add(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MasterThievesArmband.StolenTracker stealTracker = ch.buff(MasterThievesArmband.StolenTracker.class);
|
|
||||||
if (stealTracker != null){
|
|
||||||
ch.remove(stealTracker);
|
|
||||||
}
|
|
||||||
|
|
||||||
Actor.remove( ch );
|
Actor.remove( ch );
|
||||||
ch.sprite.killAndErase();
|
ch.sprite.killAndErase();
|
||||||
Dungeon.level.mobs.remove(ch);
|
Dungeon.level.mobs.remove(ch);
|
||||||
|
|
||||||
for (ChampionEnemy champ : champBuffs){
|
for (Buff b : persistentBuffs){
|
||||||
ch.add(champ);
|
ch.add(b);
|
||||||
}
|
|
||||||
if (stealTracker != null) {
|
|
||||||
ch.add(stealTracker);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GameScene.add(rat);
|
GameScene.add(rat);
|
||||||
|
|||||||
@@ -758,6 +758,10 @@ public class DwarfKing extends Mob {
|
|||||||
|
|
||||||
public static class KingDamager extends Buff {
|
public static class KingDamager extends Buff {
|
||||||
|
|
||||||
|
{
|
||||||
|
revivePersists = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean act() {
|
public boolean act() {
|
||||||
if (target.alignment != Alignment.ENEMY){
|
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.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.SacrificialFire;
|
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.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||||
@@ -137,8 +134,11 @@ public class Ghoul extends Mob {
|
|||||||
Actor.add( new Pushing( child, pos, child.pos ) );
|
Actor.add( new Pushing( child, pos, child.pos ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Buff b : buffs(ChampionEnemy.class)){
|
//champion buff, mainly
|
||||||
Buff.affect( child, b.getClass());
|
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){
|
if (buff instanceof SacrificialFire.Marked){
|
||||||
//don't remove and postpone so marked stays on
|
//don't remove and postpone so marked stays on
|
||||||
Buff.prolong(this, SacrificialFire.Marked.class, timesDowned*5);
|
Buff.prolong(this, SacrificialFire.Marked.class, timesDowned*5);
|
||||||
} else if (buff instanceof AllyBuff
|
} else if (buff.revivePersists) {
|
||||||
|| buff instanceof ChampionEnemy
|
|
||||||
|| buff instanceof MasterThievesArmband.StolenTracker
|
|
||||||
|| buff instanceof DwarfKing.KingDamager) {
|
|
||||||
//don't remove
|
//don't remove
|
||||||
} else {
|
} else {
|
||||||
buff.detach();
|
buff.detach();
|
||||||
|
|||||||
@@ -26,9 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline;
|
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.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||||
@@ -247,11 +245,10 @@ public class Necromancer extends Mob {
|
|||||||
Dungeon.level.occupyCell( mySkeleton );
|
Dungeon.level.occupyCell( mySkeleton );
|
||||||
((NecromancerSprite)sprite).finishSummoning();
|
((NecromancerSprite)sprite).finishSummoning();
|
||||||
|
|
||||||
for (Buff b : buffs(AllyBuff.class)){
|
for (Buff b : buffs()){
|
||||||
Buff.affect(mySkeleton, b.getClass());
|
if (b.revivePersists) {
|
||||||
}
|
Buff.affect(mySkeleton, b.getClass());
|
||||||
for (Buff b : buffs(ChampionEnemy.class)){
|
}
|
||||||
Buff.affect( mySkeleton, b.getClass());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
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.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
@@ -160,11 +158,10 @@ public class SpectralNecromancer extends Necromancer {
|
|||||||
Dungeon.level.occupyCell( wraith );
|
Dungeon.level.occupyCell( wraith );
|
||||||
((SpectralNecromancerSprite)sprite).finishSummoning();
|
((SpectralNecromancerSprite)sprite).finishSummoning();
|
||||||
|
|
||||||
for (Buff b : buffs(AllyBuff.class)){
|
for (Buff b : buffs()){
|
||||||
Buff.affect( wraith, b.getClass());
|
if (b.revivePersists) {
|
||||||
}
|
Buff.affect(wraith, b.getClass());
|
||||||
for (Buff b : buffs(ChampionEnemy.class)){
|
}
|
||||||
Buff.affect( wraith, b.getClass());
|
|
||||||
}
|
}
|
||||||
wraithIDs.add(wraith.id());
|
wraithIDs.add(wraith.id());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,10 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
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.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
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.actors.buffs.Poison;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
@@ -136,11 +134,10 @@ public class Swarm extends Mob {
|
|||||||
if (buff( Poison.class ) != null) {
|
if (buff( Poison.class ) != null) {
|
||||||
Buff.affect( clone, Poison.class ).set(2);
|
Buff.affect( clone, Poison.class ).set(2);
|
||||||
}
|
}
|
||||||
for (Buff b : buffs(AllyBuff.class)){
|
for (Buff b : buffs()){
|
||||||
Buff.affect( clone, b.getClass());
|
if (b.revivePersists) {
|
||||||
}
|
Buff.affect(clone, b.getClass());
|
||||||
for (Buff b : buffs(ChampionEnemy.class)){
|
}
|
||||||
Buff.affect( clone, b.getClass());
|
|
||||||
}
|
}
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,6 +207,7 @@ public class MasterThievesArmband extends Artifact {
|
|||||||
|
|
||||||
//counter of 0 for attempt but no success, 1 for success
|
//counter of 0 for attempt but no success, 1 for success
|
||||||
public static class StolenTracker extends CounterBuff {
|
public static class StolenTracker extends CounterBuff {
|
||||||
|
{ revivePersists = true; }
|
||||||
public void setItemStolen(boolean stolen){ if (stolen) countUp(1); }
|
public void setItemStolen(boolean stolen){ if (stolen) countUp(1); }
|
||||||
public boolean itemWasStolen(){ return count() > 0; }
|
public boolean itemWasStolen(){ return count() > 0; }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user