diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/src/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 9835e5b75..8b79f0a54 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -87,6 +87,22 @@ public class ShatteredPixelDungeon extends Game { com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile.class, "com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfTeleportation" ); + //0.3.3 + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat.class, + "com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost$FetidRat" ); + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollTrickster.class, + "com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost$GnollTrickster" ); + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GreatCrab.class, + "com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost$GreatCrab" ); + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry.class, + "com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker$Rotberry" ); + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry.Seed.class, + "com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker$Rotberry$Seed" ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index 1dfd1ca5c..da79ef028 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -21,7 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; import com.watabou.utils.Random; public class Bestiary { @@ -184,6 +183,6 @@ public class Bestiary { public static boolean isUnique( Char mob ) { return mob instanceof Goo || mob instanceof Tengu || mob instanceof DM300 || mob instanceof King || mob instanceof Yog.BurningFist || mob instanceof Yog.RottingFist - || mob instanceof Ghost.FetidRat || mob instanceof Ghost.GnollTrickster || mob instanceof Ghost.GreatCrab; + || mob instanceof FetidRat || mob instanceof GnollTrickster || mob instanceof GreatCrab; } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java new file mode 100644 index 000000000..0a23dedde --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java @@ -0,0 +1,102 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2015 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StenchGas; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.FetidRatSprite; +import com.watabou.utils.Random; + +import java.util.HashSet; + +public class FetidRat extends Rat { + + { + name = "fetid rat"; + spriteClass = FetidRatSprite.class; + + HP = HT = 20; + defenseSkill = 5; + + EXP = 4; + + state = WANDERING; + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public int dr() { + return 2; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int(3) == 0) { + Buff.affect(enemy, Ooze.class); + } + + return damage; + } + + @Override + public int defenseProc( Char enemy, int damage ) { + + GameScene.add(Blob.seed(pos, 20, StenchGas.class)); + + return super.defenseProc(enemy, damage); + } + + @Override + public void die( Object cause ) { + super.die( cause ); + + Ghost.Quest.process(); + } + + @Override + public String description() { + return + "Something is clearly wrong with this rat. Its greasy black fur and rotting skin are very " + + "different from the healthy rats you've seen previously. It's pale green eyes " + + "make it seem especially menacing.\n\n" + + "The rat carries a cloud of horrible stench with it, it's overpoweringly strong up close.\n\n" + + "Dark ooze dribbles from the rat's mouth, it eats through the floor but seems to dissolve in water."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( StenchGas.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} \ No newline at end of file diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/GnollTrickster.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/GnollTrickster.java new file mode 100644 index 000000000..3d1e9cca0 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/GnollTrickster.java @@ -0,0 +1,130 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2015 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +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.buffs.Burning; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; +import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.CurareDart; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.GnollTricksterSprite; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class GnollTrickster extends Gnoll { + { + name = "gnoll trickster"; + spriteClass = GnollTricksterSprite.class; + + HP = HT = 20; + defenseSkill = 5; + + EXP = 5; + + state = WANDERING; + + loot = Generator.random(CurareDart.class); + lootChance = 1f; + } + + private int combo = 0; + + @Override + public int attackSkill( Char target ) { + return 16; + } + + @Override + protected boolean canAttack( Char enemy ) { + Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE); + return !Level.adjacent(pos, enemy.pos) && attack.collisionPos == enemy.pos; + } + + @Override + public int attackProc( Char enemy, int damage ) { + //The gnoll's attacks get more severe the more the player lets it hit them + combo++; + int effect = Random.Int(4)+combo; + + if (effect > 2) { + + if (effect >=6 && enemy.buff(Burning.class) == null){ + + if (Level.flamable[enemy.pos]) + GameScene.add(Blob.seed(enemy.pos, 4, Fire.class)); + Buff.affect(enemy, Burning.class).reignite( enemy ); + + } else + Buff.affect( enemy, Poison.class).set((effect-2) * Poison.durationFactor(enemy)); + + } + return damage; + } + + @Override + protected boolean getCloser( int target ) { + combo = 0; //if he's moving, he isn't attacking, reset combo. + if (state == HUNTING) { + return enemySeen && getFurther( target ); + } else { + return super.getCloser( target ); + } + } + + @Override + public void die( Object cause ) { + super.die( cause ); + + Ghost.Quest.process(); + } + + @Override + public String description() { + return + "A strange looking creature, even by gnoll standards. It hunches forward with a wicked grin, " + + "almost cradling the satchel hanging over its shoulder. Its eyes are wide with a strange mix of " + + "fear and excitement.\n\n" + + "There is a large collection of poorly made darts in its satchel, they all seem to be " + + "tipped with various harmful substances."; + } + + private static final String COMBO = "combo"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle(bundle); + bundle.put(COMBO, combo); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + combo = bundle.getInt( COMBO ); + } + +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/GreatCrab.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/GreatCrab.java new file mode 100644 index 000000000..29c968b2d --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/GreatCrab.java @@ -0,0 +1,94 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2015 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; +import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.LightningTrap; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.GreatCrabSprite; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; + +public class GreatCrab extends Crab { + { + name = "great crab"; + spriteClass = GreatCrabSprite.class; + + HP = HT = 25; + defenseSkill = 0; //see damage() + baseSpeed = 1f; + + EXP = 6; + + state = WANDERING; + } + + private int moving = 0; + + @Override + protected boolean getCloser( int target ) { + //this is used so that the crab remains slower, but still detects the player at the expected rate. + moving++; + if (moving < 3) { + return super.getCloser( target ); + } else { + moving = 0; + return true; + } + + } + + @Override + public void damage( int dmg, Object src ){ + //crab blocks all attacks originating from the hero or enemy characters or traps if it is alerted. + //All direct damage from these sources is negated, no exceptions. blob/debuff effects go through as normal. + if (enemySeen && (src instanceof Wand || src instanceof LightningTrap.Electricity || src instanceof Char)){ + GLog.n("The crab notices the attack and blocks with its massive claw."); + sprite.showStatus( CharSprite.NEUTRAL, "blocked" ); + } else { + super.damage( dmg, src ); + } + } + + @Override + public void die( Object cause ) { + super.die( cause ); + + Ghost.Quest.process(); + + Dungeon.level.drop( new MysteryMeat(), pos ); + Dungeon.level.drop( new MysteryMeat(), pos ).sprite.drop(); + } + + @Override + public String description() { + return + "This crab is gigantic, even compared to other sewer crabs. " + + "Its blue shell is covered in cracks and barnacles, showing great age. " + + "It lumbers around slowly, barely keeping balance with its massive claw.\n\n" + + "While the crab only has one claw, its size easily compensates. " + + "The crab holds the claw infront of itself whenever it sees a threat, shielding " + + "itself behind an impenetrable wall of carapace."; + } +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java index ecfe58761..fd7ca8acd 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java @@ -24,8 +24,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.RotHeartSprite; @@ -81,7 +81,7 @@ public class RotHeart extends Mob { @Override public void die(Object cause) { super.die(cause); - Dungeon.level.drop( new Wandmaker.Rotberry.Seed(), pos ).sprite.drop(); + Dungeon.level.drop( new Rotberry.Seed(), pos ).sprite.drop(); } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java index a456f53bb..b4702ac20 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java @@ -23,41 +23,24 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Journal; -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.Fire; -import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StenchGas; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Gnoll; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollTrickster; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GreatCrab; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; -import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat; -import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.CurareDart; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; -import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel; -import com.shatteredpixel.shatteredpixeldungeon.levels.traps.LightningTrap; -import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; -import com.shatteredpixel.shatteredpixeldungeon.sprites.FetidRatSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; -import com.shatteredpixel.shatteredpixeldungeon.sprites.GnollTricksterSprite; -import com.shatteredpixel.shatteredpixeldungeon.sprites.GreatCrabSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; @@ -376,235 +359,4 @@ public class Ghost extends NPC { return spawned && processed; } } - - - - public static class FetidRat extends Rat { - - { - name = "fetid rat"; - spriteClass = FetidRatSprite.class; - - HP = HT = 20; - defenseSkill = 5; - - EXP = 4; - - state = WANDERING; - } - - @Override - public int attackSkill( Char target ) { - return 12; - } - - @Override - public int dr() { - return 2; - } - - @Override - public int attackProc( Char enemy, int damage ) { - if (Random.Int( 3 ) == 0) { - Buff.affect(enemy, Ooze.class); - } - - return damage; - } - - @Override - public int defenseProc( Char enemy, int damage ) { - - GameScene.add( Blob.seed( pos, 20, StenchGas.class ) ); - - return super.defenseProc(enemy, damage); - } - - @Override - public void die( Object cause ) { - super.die( cause ); - - Quest.process(); - } - - @Override - public String description() { - return - "Something is clearly wrong with this rat. Its greasy black fur and rotting skin are very " + - "different from the healthy rats you've seen previously. It's pale green eyes " + - "make it seem especially menacing.\n\n" + - "The rat carries a cloud of horrible stench with it, it's overpoweringly strong up close.\n\n" + - "Dark ooze dribbles from the rat's mouth, it eats through the floor but seems to dissolve in water."; - } - - private static final HashSet> IMMUNITIES = new HashSet>(); - static { - IMMUNITIES.add( StenchGas.class ); - } - - @Override - public HashSet> immunities() { - return IMMUNITIES; - } - } - - - - public static class GnollTrickster extends Gnoll { - { - name = "gnoll trickster"; - spriteClass = GnollTricksterSprite.class; - - HP = HT = 20; - defenseSkill = 5; - - EXP = 5; - - state = WANDERING; - - loot = Generator.random(CurareDart.class); - lootChance = 1f; - } - - private int combo = 0; - - @Override - public int attackSkill( Char target ) { - return 16; - } - - @Override - protected boolean canAttack( Char enemy ) { - Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE); - return !Level.adjacent( pos, enemy.pos ) && attack.collisionPos == enemy.pos; - } - - @Override - public int attackProc( Char enemy, int damage ) { - //The gnoll's attacks get more severe the more the player lets it hit them - combo++; - int effect = Random.Int(4)+combo; - - if (effect > 2) { - - if (effect >=6 && enemy.buff(Burning.class) == null){ - - if (Level.flamable[enemy.pos]) - GameScene.add( Blob.seed( enemy.pos, 4, Fire.class ) ); - Buff.affect( enemy, Burning.class ).reignite( enemy ); - - } else - Buff.affect( enemy, Poison.class).set((effect-2) * Poison.durationFactor(enemy)); - - } - return damage; - } - - @Override - protected boolean getCloser( int target ) { - combo = 0; //if he's moving, he isn't attacking, reset combo. - if (state == HUNTING) { - return enemySeen && getFurther( target ); - } else { - return super.getCloser( target ); - } - } - - @Override - public void die( Object cause ) { - super.die( cause ); - - Quest.process(); - } - - @Override - public String description() { - return - "A strange looking creature, even by gnoll standards. It hunches forward with a wicked grin, " + - "almost cradling the satchel hanging over its shoulder. Its eyes are wide with a strange mix of " + - "fear and excitement.\n\n" + - "There is a large collection of poorly made darts in its satchel, they all seem to be " + - "tipped with various harmful substances."; - } - - private static final String COMBO = "combo"; - - @Override - public void storeInBundle( Bundle bundle ) { - super.storeInBundle(bundle); - bundle.put(COMBO, combo); - } - - @Override - public void restoreFromBundle( Bundle bundle ) { - super.restoreFromBundle( bundle ); - combo = bundle.getInt( COMBO ); - } - - } - - - - public static class GreatCrab extends Crab { - { - name = "great crab"; - spriteClass = GreatCrabSprite.class; - - HP = HT = 25; - defenseSkill = 0; //see damage() - baseSpeed = 1f; - - EXP = 6; - - state = WANDERING; - } - - private int moving = 0; - - @Override - protected boolean getCloser( int target ) { - //this is used so that the crab remains slower, but still detects the player at the expected rate. - moving++; - if (moving < 3) { - return super.getCloser( target ); - } else { - moving = 0; - return true; - } - - } - - @Override - public void damage( int dmg, Object src ){ - //crab blocks all attacks originating from the hero or enemy characters or traps if it is alerted. - //All direct damage from these sources is negated, no exceptions. blob/debuff effects go through as normal. - if (enemySeen && (src instanceof Wand || src instanceof LightningTrap.Electricity || src instanceof Char)){ - GLog.n("The crab notices the attack and blocks with its massive claw."); - sprite.showStatus( CharSprite.NEUTRAL, "blocked" ); - } else { - super.damage( dmg, src ); - } - } - - @Override - public void die( Object cause ) { - super.die( cause ); - - Quest.process(); - - Dungeon.level.drop( new MysteryMeat(), pos ); - Dungeon.level.drop( new MysteryMeat(), pos ).sprite.drop(); - } - - @Override - public String description() { - return - "This crab is gigantic, even compared to other sewer crabs. " + - "Its blue shell is covered in cracks and barnacles, showing great age. " + - "It lumbers around slowly, barely keeping balance with its massive claw.\n\n" + - "While the crab only has one claw, its size easily compensates. " + - "The crab holds the claw infront of itself whenever it sees a threat, shielding " + - "itself behind an impenetrable wall of carapace."; - } - } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java index 1386be55a..864d7122d 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java @@ -20,40 +20,25 @@ */ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; -import java.util.ArrayList; import java.util.Collection; import com.shatteredpixel.shatteredpixeldungeon.Challenges; -import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.quest.CeremonialCandle; import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; -import com.watabou.noosa.audio.Sample; -import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Journal; -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.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; -import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; -import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength; import com.shatteredpixel.shatteredpixeldungeon.items.quest.CorpseDust; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; -import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.WandmakerSprite; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.shatteredpixel.shatteredpixeldungeon.windows.WndWandmaker; @@ -397,53 +382,4 @@ public class Wandmaker extends NPC { Journal.remove( Journal.Feature.WANDMAKER ); } } - - //TODO: externalize this into its own class in 0.3.3 (when merging source) - public static class Rotberry extends Plant { - - private static final String TXT_DESC = - "The berries of a young rotberry shrub taste like sweet, sweet death.\n" + - "\n" + - "Regularly picking the berries of a rotberry shrub is essential, otherwise it will mature"; - - { - image = 7; - plantName = "Rotberry"; - } - - @Override - public void activate() { - Char ch = Actor.findChar(pos); - - GameScene.add( Blob.seed( pos, 100, ToxicGas.class ) ); - - Dungeon.level.drop( new Seed(), pos ).sprite.drop(); - - if (ch != null) { - Buff.prolong( ch, Roots.class, TICK * 3 ); - } - } - - @Override - public String desc() { - return TXT_DESC; - } - - public static class Seed extends Plant.Seed { - { - plantName = "Rotberry"; - - name = "seed of " + plantName; - image = ItemSpriteSheet.SEED_ROTBERRY; - - plantClass = Rotberry.class; - alchemyClass = PotionOfStrength.class; - } - - @Override - public String desc() { - return TXT_DESC; - } - } - } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index 6852c5fa7..bf41c0f2a 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker.Rotberry; import com.shatteredpixel.shatteredpixeldungeon.items.armor.*; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.*; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java index 2167896fe..38cae352c 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java @@ -35,22 +35,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ToxicImbue; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.potions.*; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; -import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed; -import com.shatteredpixel.shatteredpixeldungeon.plants.Dreamfoil; -import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot; -import com.shatteredpixel.shatteredpixeldungeon.plants.Fadeleaf; -import com.shatteredpixel.shatteredpixeldungeon.plants.Firebloom; -import com.shatteredpixel.shatteredpixeldungeon.plants.Icecap; +import com.shatteredpixel.shatteredpixeldungeon.plants.*; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant.Seed; -import com.shatteredpixel.shatteredpixeldungeon.plants.Sorrowmoss; -import com.shatteredpixel.shatteredpixeldungeon.plants.Stormvine; -import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -322,7 +313,7 @@ public class Blandfruit extends Food { if (name.equals("Healthfruit")) cook(new Sungrass.Seed()); else if (name.equals("Powerfruit")) - cook(new Wandmaker.Rotberry.Seed()); + cook(new Rotberry.Seed()); else if (name.equals("Paralyzefruit")) cook(new Earthroot.Seed()); else if (name.equals("Invisifruit")) diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java index a966b6203..a14afae96 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java @@ -26,12 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM300; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Goo; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.King; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Yog; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.*; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; @@ -55,7 +50,7 @@ public class WandOfCorruption extends Wand { //FIXME: sloppy private static HashSet bosses = new HashSet(Arrays.asList( - Ghost.FetidRat.class, Ghost.GnollTrickster.class, Ghost.GreatCrab.class, + FetidRat.class, GnollTrickster.class, GreatCrab.class, Goo.class, Tengu.class, DM300.class, King.class, Yog.class, Yog.BurningFist.class, Yog.RottingFist.class )); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPrismaticLight.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPrismaticLight.java index 033e81ce2..deb34e394 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPrismaticLight.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPrismaticLight.java @@ -30,14 +30,12 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.*; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.RainbowParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Paralysis; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; @@ -66,7 +64,7 @@ public class WandOfPrismaticLight extends Wand { //Any Location Mimic.class, Wraith.class, //Sewers - Ghost.FetidRat.class, + FetidRat.class, Goo.class, //Prison Skeleton.class , Thief.class, Bandit.class, diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java index 5f001f964..6e689b778 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java @@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.*; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; @@ -75,7 +74,7 @@ public class WandOfTransfusion extends Wand { //Any Location Wraith.class, //Sewers - Ghost.FetidRat.class, + FetidRat.class, //Prison Skeleton.class, //City diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/plants/Rotberry.java b/src/com/shatteredpixel/shatteredpixeldungeon/plants/Rotberry.java new file mode 100644 index 000000000..8ab87ab42 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/plants/Rotberry.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2015 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.shatteredpixel.shatteredpixeldungeon.plants; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +public class Rotberry extends Plant { + + private static final String TXT_DESC = + "The berries of a young rotberry shrub taste like sweet, sweet death.\n" + + "\n" + + "Regularly picking the berries of a rotberry shrub is essential, otherwise it will mature"; + + { + image = 7; + plantName = "Rotberry"; + } + + @Override + public void activate() { + Dungeon.level.drop( new Seed(), pos ).sprite.drop(); + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Rotberry"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_ROTBERRY; + + plantClass = Rotberry.class; + alchemyClass = PotionOfStrength.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndWandmaker.java b/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndWandmaker.java index 4538e01c1..e52810019 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndWandmaker.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndWandmaker.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import com.shatteredpixel.shatteredpixeldungeon.items.quest.CorpseDust; import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; +import com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry; import com.watabou.noosa.BitmapTextMultiline; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -70,7 +71,7 @@ public class WndWandmaker extends Window { msg = TXT_DUST; } else if (item instanceof Embers){ msg = TXT_EMBER; - } else if (item instanceof Wandmaker.Rotberry.Seed){ + } else if (item instanceof Rotberry.Seed){ msg = TXT_BERRY; }