v3.1.0: added unlock logic for hazard badge (debug only atm)

This commit is contained in:
Evan Debenham
2025-04-07 13:49:22 -04:00
parent 2ba18ff9f8
commit 8e4901ac81
36 changed files with 202 additions and 3 deletions

View File

@@ -533,6 +533,14 @@ public class Badges {
displayBadge( badge );
}
public static void validateHazardAssists() {
if (!DeviceCompat.isDebug()) return;
if (!local.contains( Badge.PIRANHAS ) && Statistics.hazardAssistedKills >= 10) {
local.add( Badge.ENEMY_HAZARDS );
displayBadge( Badge.ENEMY_HAZARDS );
}
}
public static void validatePiranhasKilled() {
Badge badge = null;

View File

@@ -36,6 +36,7 @@ public class Statistics {
public static int foodEaten;
public static int itemsCrafted;
public static int piranhasKilled;
public static int hazardAssistedKills;
public static int ankhsUsed;
//tracks every item type 'seen' this run (i.e. would be added to catalogs)
public static HashSet<Class> itemTypesDiscovered = new HashSet<>();
@@ -82,6 +83,7 @@ public class Statistics {
foodEaten = 0;
itemsCrafted = 0;
piranhasKilled = 0;
hazardAssistedKills = 0;
ankhsUsed = 0;
itemTypesDiscovered.clear();
@@ -123,6 +125,7 @@ public class Statistics {
private static final String FOOD = "foodEaten";
private static final String ALCHEMY = "potionsCooked";
private static final String PIRANHAS = "priranhas";
private static final String HAZARD_ASSISTS = "hazard_assists";
private static final String ANKHS = "ankhsUsed";
private static final String PROG_SCORE = "prog_score";
@@ -164,6 +167,7 @@ public class Statistics {
bundle.put( FOOD, foodEaten );
bundle.put( ALCHEMY, itemsCrafted );
bundle.put( PIRANHAS, piranhasKilled );
bundle.put(HAZARD_ASSISTS, hazardAssistedKills);
bundle.put( ANKHS, ankhsUsed );
bundle.put( ITEM_TYPES_DISCOVERED, itemTypesDiscovered.toArray(new Class<?>[0]) );
@@ -209,6 +213,7 @@ public class Statistics {
foodEaten = bundle.getInt( FOOD );
itemsCrafted = bundle.getInt( ALCHEMY );
piranhasKilled = bundle.getInt( PIRANHAS );
hazardAssistedKills = bundle.getInt( HAZARD_ASSISTS );
ankhsUsed = bundle.getInt( ANKHS );
if (bundle.contains( ITEM_TYPES_DISCOVERED )) {

View File

@@ -84,6 +84,7 @@ import com.shatteredpixel.shatteredpixeldungeon.journal.Bestiary;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@@ -875,6 +876,11 @@ public abstract class Mob extends Char {
}
if (alignment == Alignment.ENEMY){
if (buff(Trap.HazardAssistTracker.class) != null){
Statistics.hazardAssistedKills++;
Badges.validateHazardAssists();
}
rollToDropLoot();
if (cause == Dungeon.hero || cause instanceof Weapon || cause instanceof Weapon.Enchantment){

View File

@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM300;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Pylon;
@@ -43,6 +44,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CavesPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
@@ -841,6 +843,11 @@ public class CavesBossLevel extends Level {
Char ch = Actor.findChar(cell);
if (ch != null && !(ch instanceof DM300) && !ch.flying) {
if (ch instanceof Mob){
//incredibly specific but I'll 100% get a bug report in a year if I don't add this
Buff.prolong(ch, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
}
Sample.INSTANCE.play( Assets.Sounds.LIGHTNING );
ch.damage( Random.NormalIntRange(6, 12), new Electricity());
ch.sprite.flash();

View File

@@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.WeakFloorRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
@@ -151,7 +152,10 @@ public class Chasm implements Hero.Doom {
}
public static void mobFall( Mob mob ) {
if (mob.isAlive()) mob.die( Chasm.class );
if (mob.isAlive()) {
Buff.prolong(mob, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
mob.die( Chasm.class );
}
if (mob.sprite != null) ((MobSprite)mob.sprite).fall();
}

View File

@@ -23,8 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@@ -45,11 +48,15 @@ public class BlazingTrap extends Trap {
PathFinder.buildDistanceMap( pos, BArray.not( Dungeon.level.solid, null ), 2 );
for (int i = 0; i < PathFinder.distance.length; i++) {
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
if (Dungeon.level.pit[i] || Dungeon.level.water[i])
if (Dungeon.level.pit[i] || Dungeon.level.water[i]) {
GameScene.add(Blob.seed(i, 1, Fire.class));
else
} else {
GameScene.add(Blob.seed(i, 5, Fire.class));
}
CellEmitter.get(i).burst(FlameParticle.FACTORY, 5);
if (Actor.findChar(i) instanceof Mob){
Buff.prolong(Actor.findChar(i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
Sample.INSTANCE.play(Assets.Sounds.BURNING);

View File

@@ -23,8 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@@ -45,6 +48,9 @@ public class BurningTrap extends Trap {
if (!Dungeon.level.solid[pos + i]) {
GameScene.add( Blob.seed( pos+i, 2, Fire.class ) );
CellEmitter.get( pos+i ).burst( FlameParticle.FACTORY, 5 );
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
Sample.INSTANCE.play(Assets.Sounds.BURNING);

View File

@@ -23,8 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.audio.Sample;
@@ -47,6 +50,9 @@ public class ChillingTrap extends Trap{
for( int i : PathFinder.NEIGHBOURS9) {
if (!Dungeon.level.solid[pos + i]) {
GameScene.add(Blob.seed(pos + i, 10, Freezing.class));
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -22,10 +22,14 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ConfusionGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.PathFinder;
public class ConfusionTrap extends Trap {
@@ -40,5 +44,11 @@ public class ConfusionTrap extends Trap {
GameScene.add(Blob.seed(pos, 300 + 20 * scalingDepth(), ConfusionGas.class));
Sample.INSTANCE.play(Assets.Sounds.GAS);
for( int i : PathFinder.NEIGHBOURS9) {
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -22,10 +22,14 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.PathFinder;
public class CorrosionTrap extends Trap {
@@ -42,6 +46,12 @@ public class CorrosionTrap extends Trap {
corrosiveGas.setStrength(1+scalingDepth()/4);
for( int i : PathFinder.NEIGHBOURS9) {
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
GameScene.add(corrosiveGas);
}

View File

@@ -27,7 +27,9 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
@@ -77,6 +79,9 @@ public class DisintegrationTrap extends Trap {
if (heap != null) heap.explode();
if (target != null) {
if (target instanceof Mob){
Buff.prolong(target, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[target.pos]) {
Sample.INSTANCE.play(Assets.Sounds.RAY);
ShatteredPixelDungeon.scene().add(new Beam.DeathRay(DungeonTilemap.tileCenterToWorld(pos), target.sprite.center()));

View File

@@ -23,7 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
import com.watabou.utils.PathFinder;
public class ExplosiveTrap extends Trap {
@@ -34,6 +38,13 @@ public class ExplosiveTrap extends Trap {
@Override
public void activate() {
for( int i : PathFinder.NEIGHBOURS9) {
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
new Bomb().explode(pos);
if (reclaimed && !Dungeon.hero.isAlive()) {
Badges.validateDeathFromFriendlyMagic();

View File

@@ -55,6 +55,7 @@ public class FlashingTrap extends Trap {
Buff.prolong( c, Cripple.class, Cripple.DURATION*2f );
if (c instanceof Mob) {
Buff.prolong(c, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
if (((Mob)c).state == ((Mob)c).HUNTING) ((Mob)c).state = ((Mob)c).WANDERING;
((Mob)c).beckon( Dungeon.level.randomDestination( c ) );
}

View File

@@ -24,6 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Sheep;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@@ -72,6 +74,8 @@ public class FlockTrap extends Trap {
t.activate();
}
Dungeon.level.occupyCell(sheep);
} else if (Actor.findChar(i) instanceof Mob){
Buff.prolong(Actor.findChar(i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
Sample.INSTANCE.play(Assets.Sounds.PUFF);

View File

@@ -23,8 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.utils.BArray;
@@ -50,6 +53,9 @@ public class FrostTrap extends Trap {
for (int i = 0; i < PathFinder.distance.length; i++) {
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
GameScene.add(Blob.seed(i, 20, Freezing.class));
if (Actor.findChar(i) instanceof Mob){
Buff.prolong(Actor.findChar(i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@@ -61,6 +62,7 @@ public class GatewayTrap extends Trap {
if (ScrollOfTeleportation.teleportChar(ch)) {
if (ch instanceof Mob && ((Mob) ch).state == ((Mob) ch).HUNTING) {
((Mob) ch).state = ((Mob) ch).WANDERING;
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
telePos = ch.pos;
break;

View File

@@ -26,7 +26,9 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
@@ -74,6 +76,10 @@ public class GeyserTrap extends Trap {
Char ch = Actor.findChar(pos + i);
if (ch != null){
if (source == this && ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
//does the equivalent of a bomb's damage against fiery enemies.
if (Char.hasProp(ch, Char.Property.FIERY)){
int dmg = Random.NormalIntRange(5 + scalingDepth(), 10 + scalingDepth()*2);
@@ -100,6 +106,9 @@ public class GeyserTrap extends Trap {
Char ch = Actor.findChar(pos);
if (ch != null){
if (source == this && ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
int targetpos = -1;
if (centerKnockBackDirection != -1){
targetpos = centerKnockBackDirection;

View File

@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollGeomancer;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollGuard;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
@@ -81,6 +82,10 @@ public class GnollRockfallTrap extends RockfallTrap {
Char ch = Actor.findChar( cell );
if (ch != null && ch.isAlive() && !(ch instanceof GnollGeomancer)){
if (ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
//deals notably less damage than a regular rockfall trap, but ignores armor
int damage = Random.NormalIntRange(6, 12);
ch.damage( Math.max(damage, 0) , this);

View File

@@ -26,7 +26,9 @@ 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.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
@@ -85,6 +87,9 @@ public class GrimTrap extends Trap {
}
if (target != null) {
if (target instanceof Mob){
Buff.prolong(target, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
final Char finalTarget = target;
//instant kill, use a mix of current HP and max HP, just like psi blast (for resistances)
int damage = Math.round(finalTarget.HT/2f + finalTarget.HP/2f);

View File

@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Wound;
public class GrippingTrap extends Trap {
@@ -44,6 +45,9 @@ public class GrippingTrap extends Trap {
Char c = Actor.findChar( pos );
if (c != null && !c.flying) {
if (c instanceof Mob) {
Buff.prolong(c, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
int damage = Math.max( 0, (2 + scalingDepth()/2) - c.drRoll()/2 );
Buff.affect( c, Bleeding.class ).set( damage );
Buff.prolong( c, Cripple.class, Cripple.DURATION);

View File

@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.watabou.utils.PathFinder;
@@ -45,6 +46,9 @@ public class OozeTrap extends Trap {
Char ch = Actor.findChar( pos + i );
if (ch != null && !ch.flying){
Buff.affect(ch, Ooze.class).set( Ooze.DURATION );
if (ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.PoisonDart;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@@ -100,6 +101,9 @@ public class PoisonDartTrap extends Trap {
}
if (target != null) {
if (target instanceof Mob){
Buff.prolong(target, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
final Char finalTarget = target;
if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[target.pos]) {
((MissileSprite) ShatteredPixelDungeon.scene().recycle(MissileSprite.class)).

View File

@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
@@ -95,6 +96,9 @@ public class RockfallTrap extends Trap {
Char ch = Actor.findChar( cell );
if (ch != null && ch.isAlive()){
if (ch instanceof Mob) {
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
int damage = Random.NormalIntRange(5+scalingDepth(), 10+scalingDepth()*2);
damage -= ch.drRoll();
ch.damage( Math.max(damage, 0) , this);

View File

@@ -23,8 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.PathFinder;
@@ -47,6 +50,9 @@ public class ShockingTrap extends Trap {
if (!Dungeon.level.solid[pos + i]) {
GameScene.add(Blob.seed(pos + i, 10, Electricity.class));
}
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}

View File

@@ -23,8 +23,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.utils.BArray;
import com.watabou.noosa.audio.Sample;
@@ -48,6 +51,9 @@ public class StormTrap extends Trap {
for (int i = 0; i < PathFinder.distance.length; i++) {
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
GameScene.add(Blob.seed(i, 20, Electricity.class));
if (Actor.findChar(i) instanceof Mob){
Buff.prolong(Actor.findChar(i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@@ -51,6 +52,7 @@ public class TeleportationTrap extends Trap {
if (ScrollOfTeleportation.teleportChar(ch)) {
if (ch instanceof Mob && ((Mob) ch).state == ((Mob) ch).HUNTING) {
((Mob) ch).state = ((Mob) ch).WANDERING;
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}

View File

@@ -22,10 +22,14 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.PathFinder;
public class ToxicTrap extends Trap{
@@ -40,5 +44,11 @@ public class ToxicTrap extends Trap{
GameScene.add( Blob.seed( pos, 300 + 20 * scalingDepth(), ToxicGas.class ) );
Sample.INSTANCE.play(Assets.Sounds.GAS);
for( int i : PathFinder.NEIGHBOURS9) {
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.journal.Bestiary;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@@ -142,4 +143,9 @@ public abstract class Trap implements Bundlable {
bundle.put( VISIBLE, visible );
bundle.put( ACTIVE, active );
}
//this buff is used to keep track of hazards recently affecting a character
public static class HazardAssistTracker extends FlavourBuff{
public static final float DURATION = 50f;
}
}

View File

@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
@@ -49,6 +50,9 @@ public class WeakeningTrap extends Trap{
Buff.prolong( ch, Weakness.class, Weakness.DURATION/2f );
}
Buff.prolong( ch, Weakness.class, Weakness.DURATION*3f );
if (ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -27,7 +27,9 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@@ -85,6 +87,9 @@ public class WornDartTrap extends Trap {
}
if (target != null) {
if (target instanceof Mob){
Buff.prolong(target, Trap.HazardAssistTracker.class, HazardAssistTracker.DURATION);
}
final Char finalTarget = target;
if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[target.pos]) {
((MissileSprite) ShatteredPixelDungeon.scene().recycle(MissileSprite.class)).

View File

@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
public class Blindweed extends Plant {
@@ -51,6 +52,7 @@ public class Blindweed extends Plant {
Buff.prolong(ch, Blindness.class, Blindness.DURATION);
Buff.prolong(ch, Cripple.class, Cripple.DURATION);
if (ch instanceof Mob) {
Buff.prolong(ch, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
if (((Mob) ch).state == ((Mob) ch).HUNTING) ((Mob) ch).state = ((Mob) ch).WANDERING;
((Mob) ch).beckon(Dungeon.level.randomDestination( ch ));
}

View File

@@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.plants;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
@@ -30,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.noosa.Game;
@@ -63,6 +65,7 @@ public class Fadeleaf extends Plant {
} else if (ch instanceof Mob && !ch.properties().contains(Char.Property.IMMOVABLE)) {
Buff.prolong(ch, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
ScrollOfTeleportation.teleportChar(ch, Fadeleaf.class);
}

View File

@@ -29,8 +29,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -47,6 +49,10 @@ public class Firebloom extends Plant {
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN){
Buff.affect(ch, FireImbue.class).set( FireImbue.DURATION*0.3f );
}
if (ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
}
GameScene.add( Blob.seed( pos, 2, Fire.class ) );

View File

@@ -22,12 +22,15 @@
package com.shatteredpixel.shatteredpixeldungeon.plants;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FrostImbue;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.utils.PathFinder;
@@ -48,6 +51,9 @@ public class Icecap extends Plant {
for (int i : PathFinder.NEIGHBOURS9){
if (!Dungeon.level.solid[pos+i]) {
Freezing.affect( pos+i );
if (Actor.findChar(pos+i) instanceof Mob){
Buff.prolong(Actor.findChar(pos+i), Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
}
}
}
}

View File

@@ -28,8 +28,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ToxicImbue;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PoisonParticle;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
public class Sorrowmoss extends Plant {
@@ -46,6 +48,9 @@ public class Sorrowmoss extends Plant {
}
if (ch != null) {
if (ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
}
Buff.affect( ch, Poison.class ).set( 5 + Math.round(2*Dungeon.scalingDepth() / 3f) );
}

View File

@@ -27,6 +27,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Levitation;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
public class Stormvine extends Plant {
@@ -43,6 +45,9 @@ public class Stormvine extends Plant {
if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN){
Buff.affect(ch, Levitation.class, Levitation.DURATION/2f);
} else {
if (ch instanceof Mob){
Buff.prolong(ch, Trap.HazardAssistTracker.class, Trap.HazardAssistTracker.DURATION);
}
Buff.affect(ch, Vertigo.class, Vertigo.DURATION);
}
}