v2.5.0: added a new very rare cursed wand effect: sinkhole

This commit is contained in:
Evan Debenham
2024-08-18 16:19:51 -04:00
parent 82f6bbbc6a
commit aa13606d6d
2 changed files with 52 additions and 1 deletions

View File

@@ -1403,6 +1403,8 @@ items.wands.cursedwand.transmogrify_other=Your item transmogrifies into somethin
items.wands.cursedwand.disguise=Your appearance changes before your eyes!
items.wands.cursedwand.supernova=A blazing ball of energy starts to grow. You might want to run!
items.wands.cursedwand.supernova_positive=A blazing ball of energy starts to grow, but it feels safe somehow.
items.wands.cursedwand.sinkhole=The ground starts to give way around you!
items.wands.cursedwand.sinkhole_positive=The ground starts to give way, but feels solid enough beneath you.
items.wands.damagewand.upgrade_stat_name_1=Magic Damage

View File

@@ -35,13 +35,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ParalyticGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Regrowth;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invulnerability;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HeroDisguise;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invulnerability;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Levitation;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
@@ -64,6 +64,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PitfallParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PoisonParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
@@ -84,6 +85,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ChillingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.FlockTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.GeyserTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.PitfallTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ShockingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.SummoningTrap;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
@@ -1003,6 +1005,7 @@ public class CursedWand {
VERY_RARE_EFFECTS.add(new RandomTransmogrify());
VERY_RARE_EFFECTS.add(new HeroShapeShift());
VERY_RARE_EFFECTS.add(new SuperNova());
VERY_RARE_EFFECTS.add(new SinkHole());
}
public static CursedEffect randomVeryRareEffect(){
@@ -1214,4 +1217,50 @@ public class CursedWand {
}
}
public static class SinkHole extends CursedEffect {
@Override
public boolean valid(Item origin, Char user, Ballistica bolt, boolean positiveOnly) {
//can't happen on floors where chasms aren't allowed
if( Dungeon.bossLevel() || Dungeon.depth > 25 || Dungeon.branch != 0){
return false;
}
return true;
}
@Override
public void FX(Item origin, Char user, Ballistica bolt, Callback callback) {
callback.call(); //no vfx
}
@Override
public boolean effect(Item origin, Char user, Ballistica bolt, boolean positiveOnly) {
boolean[] passable = BArray.not( Dungeon.level.solid, null );
BArray.or(passable, Dungeon.level.passable, passable);
PathFinder.buildDistanceMap( user.pos, passable, 5 );
ArrayList<Integer> positions = new ArrayList<>();
for (int i = 0; i < PathFinder.distance.length; i++) {
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
if (!Dungeon.level.solid[i] || Dungeon.level.passable[i]) {
CellEmitter.floor(i).burst(PitfallParticle.FACTORY4, 8);
positions.add(i);
}
}
}
PitfallTrap.DelayedPit p = Buff.append(Dungeon.hero, PitfallTrap.DelayedPit.class, 1);
p.depth = Dungeon.depth;
p.branch = Dungeon.branch;
p.setPositions(positions);
//effect does not harm hero/allies if positive only
if (positiveOnly){
p.ignoreAllies = true;
GLog.p(Messages.get(CursedWand.class, "sinkhole_positive"));
} else {
GLog.w(Messages.get(CursedWand.class, "sinkhole"));
}
return true;
}
}
}