diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Bee.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Bee.java new file mode 100644 index 000000000..40930be4d --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Bee.java @@ -0,0 +1,183 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * 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.npcs; + +import java.util.HashSet; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.sprites.BeeSprite; +import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +//todo: given the plan for this in shattered, should probably 'bee' a mob. +public class Bee extends NPC { + + { + name = "golden bee"; + spriteClass = BeeSprite.class; + + viewDistance = 4; + + WANDERING = new Wandering(); + + flying = true; + state = WANDERING; + } + + private int level; + + private static final String LEVEL = "level"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEVEL, level ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + spawn( bundle.getInt( LEVEL ) ); + } + + public void spawn( int level ) { + this.level = level; + + HT = (3 + level) * 5; + defenseSkill = 9 + level; + } + + @Override + public int attackSkill( Char target ) { + return defenseSkill; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( HT / 10, HT / 4 ); + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (enemy instanceof Mob) { + ((Mob)enemy).aggro( this ); + } + return damage; + } + + @Override + protected boolean act() { + HP--; + if (HP <= 0) { + die( null ); + return true; + } else { + return super.act(); + } + } + + protected Char chooseEnemy() { + + if (enemy == null || !enemy.isAlive()) { + HashSet enemies = new HashSet(); + for (Mob mob:Dungeon.level.mobs) { + if (mob.hostile && Level.fieldOfView[mob.pos]) { + enemies.add( mob ); + } + } + + return enemies.size() > 0 ? Random.element( enemies ) : null; + + } else { + + return enemy; + + } + } + + @Override + public String description() { + return + "Despite their small size, golden bees tend " + + "to protect their master fiercely. They don't live long though."; + } + + @Override + public void interact() { + + int curPos = pos; + + moveSprite( pos, Dungeon.hero.pos ); + move( Dungeon.hero.pos ); + + Dungeon.hero.sprite.move( Dungeon.hero.pos, curPos ); + Dungeon.hero.move( curPos ); + + Dungeon.hero.spend( 1 / Dungeon.hero.speed() ); + Dungeon.hero.busy(); + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Poison.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + + private class Wandering implements AiState { + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + if (enemyInFOV) { + + enemySeen = true; + + notice(); + state = HUNTING; + target = enemy.pos; + + } else { + + enemySeen = false; + + int oldPos = pos; + if (getCloser( Dungeon.hero.pos )) { + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + } else { + spend( TICK ); + } + + } + return true; + } + + @Override + public String status() { + return Utils.format( "This %s is wandering", name ); + } + } +} \ No newline at end of file diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java index 92f437e72..e520d8c30 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java @@ -132,7 +132,7 @@ public class Ghost extends NPC { @Override protected Char chooseEnemy() { - return DUMMY; + return null; } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java index 4c78e2261..af8345537 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java @@ -47,7 +47,7 @@ public class Imp extends NPC { private static final String TXT_GOLEMS1 = "Are you an adventurer? I love adventurers! You can always rely on them " + - "if something needs to be killed. Am I right? For bounty of course ;)\n" + + "if something needs to be killed. Am I right? For a bounty of course ;)\n" + "In my case this is _golems_ who need to be killed. You see, I'm going to start a " + "little business here, but these stupid golems are bad for business! " + "It's very hard to negotiate with wandering lumps of granite, damn them! " + @@ -55,7 +55,7 @@ public class Imp extends NPC { private static final String TXT_MONKS1 = "Are you an adventurer? I love adventurers! You can always rely on them " + - "if something needs to be killed. Am I right? For bounty of course ;)\n" + + "if something needs to be killed. Am I right? For a bounty of course ;)\n" + "In my case this is _monks_ who need to be killed. You see, I'm going to start a " + "little business here, but these lunatics don't buy anything themselves and " + "will scare away other customers. " + diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java index 85ec57b4c..7cffd7d33 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java @@ -38,8 +38,7 @@ public class MirrorImage extends NPC { spriteClass = MirrorSprite.class; state = HUNTING; - - enemy = DUMMY; + } public int tier; @@ -95,7 +94,7 @@ public class MirrorImage extends NPC { protected Char chooseEnemy() { - if (enemy == DUMMY || !enemy.isAlive()) { + if (enemy == null || !enemy.isAlive()) { HashSet enemies = new HashSet(); for (Mob mob:Dungeon.level.mobs) { if (mob.hostile && Level.fieldOfView[mob.pos]) { @@ -103,7 +102,7 @@ public class MirrorImage extends NPC { } } - enemy = enemies.size() > 0 ? Random.element( enemies ) : DUMMY; + enemy = enemies.size() > 0 ? Random.element( enemies ) : null; } return enemy; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java index aa2935aca..d23e93044 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java @@ -44,7 +44,7 @@ public class RatKing extends NPC { @Override protected Char chooseEnemy() { - return DUMMY; + return null; } @Override