From 4a497633093ad56095b50f7f1c2c1ec9a5c194aa Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 20 Oct 2014 23:51:15 -0400 Subject: [PATCH] Merging Source v1.7.2: actor changes --- .../shatteredpixeldungeon/actors/Actor.java | 18 +- .../shatteredpixeldungeon/actors/Char.java | 28 +- .../actors/blobs/ConfusionGas.java | 52 +++ .../actors/blobs/ToxicGas.java | 31 +- .../actors/buffs/FlavourBuff.java | 2 +- .../actors/buffs/MagicalSleep.java | 2 +- .../actors/buffs/Poison.java | 4 +- .../actors/buffs/Vertigo.java | 41 ++ .../actors/hero/Belongings.java | 23 +- .../actors/hero/Hero.java | 326 ++++++++------- .../actors/hero/HeroAction.java | 6 +- .../actors/hero/HeroClass.java | 191 ++++----- .../actors/hero/HeroSubClass.java | 4 - .../actors/mobs/King.java | 2 +- .../actors/mobs/Mob.java | 395 ++++++++++-------- .../actors/mobs/Scorpio.java | 2 +- .../actors/mobs/Spinner.java | 196 ++++----- .../actors/mobs/Statue.java | 8 +- .../actors/mobs/Swarm.java | 2 +- .../actors/mobs/Thief.java | 210 +++++----- .../actors/mobs/Wraith.java | 4 +- .../actors/mobs/Yog.java | 8 +- .../actors/mobs/npcs/Blacksmith.java | 6 +- .../actors/mobs/npcs/Ghost.java | 18 +- .../actors/mobs/npcs/Imp.java | 2 +- .../actors/mobs/npcs/MirrorImage.java | 17 +- .../actors/mobs/npcs/NPC.java | 52 +++ .../actors/mobs/npcs/RatKing.java | 8 +- .../actors/mobs/npcs/Shopkeeper.java | 2 +- .../actors/mobs/npcs/Wandmaker.java | 2 +- 30 files changed, 980 insertions(+), 682 deletions(-) create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ConfusionGas.java create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Vertigo.java create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NPC.java diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java index a296881c6..ed73834b8 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java @@ -130,10 +130,12 @@ public abstract class Actor implements Bundlable { public static void freeCell( int pos ) { chars[pos] = null; } - - protected static void next() { - current = null; - } + + /*protected*/public void next() { + if (current == this) { + current = null; + } + } public static void process() { @@ -167,6 +169,14 @@ public abstract class Actor implements Bundlable { } if (current != null) { + + if (current instanceof Char && ((Char)current).sprite.isMoving) { + // If it's character's turn to act, but its sprite + // is moving, wait till the movement is over + current = null; + break; + } + doNext = current.act(); if (doNext && !Dungeon.hero.isAlive()) { doNext = false; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 1d17bbf99..280230b8e 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -17,6 +17,7 @@ */ package com.shatteredpixel.shatteredpixeldungeon.actors; +import java.util.ArrayList; import java.util.HashSet; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.*; @@ -120,9 +121,9 @@ public abstract class Char extends Actor { GLog.i( TXT_HIT, name, enemy.name ); } - // Refactoring needed! - int dr = this instanceof Hero && ((Hero)this).usingRanged && ((Hero)this).subClass == HeroSubClass.SNIPER ? - 0 : Random.IntRange( 0, enemy.dr() ); + // FIXME + int dr = this instanceof Hero && ((Hero)this).rangedWeapon != null && ((Hero)this).subClass == + HeroSubClass.SNIPER ? 0 : Random.IntRange( 0, enemy.dr() ); int dmg = damageRoll(); int effectiveDamage = Math.max( dmg - dr, 0 );; @@ -367,8 +368,12 @@ public abstract class Char extends Actor { } else if (buff instanceof Bleeding) { sprite.showStatus( CharSprite.NEGATIVE, "bleeding" ); - - } else if (buff instanceof Sleep) { + + } else if (buff instanceof Vertigo) { + + sprite.showStatus( CharSprite.NEGATIVE, "dizzy" ); + + } else if (buff instanceof Sleep) { sprite.idle(); } @@ -441,6 +446,19 @@ public abstract class Char extends Actor { } public void move( int step ) { + + if (buff( Vertigo.class ) != null) { + ArrayList candidates = new ArrayList(); + for (int dir : Level.NEIGHBOURS8) { + int p = pos + dir; + if ((Level.passable[p] || Level.avoid[p]) && Actor.findChar( p ) == null) { + candidates.add( p ); + } + } + + step = Random.element( candidates ); + } + if (Dungeon.level.map[pos] == Terrain.OPEN_DOOR) { Door.leave( pos ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ConfusionGas.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ConfusionGas.java new file mode 100644 index 000000000..9e91761f0 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ConfusionGas.java @@ -0,0 +1,52 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 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.blobs; + +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.Vertigo; +import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; + +public class ConfusionGas extends Blob { + + @Override + protected void evolve() { + super.evolve(); + + Char ch; + for (int i=0; i < LENGTH; i++) { + if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) { + Buff.prolong( ch, Vertigo.class, Vertigo.duration( ch ) ); + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + + emitter.pour( Speck.factory( Speck.CONFUSION, true ), 0.6f ); + } + + @Override + public String tileDesc() { + return "A cloud of confusion gas is swirling here."; + } +} \ No newline at end of file diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ToxicGas.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ToxicGas.java index b3882e6e8..2ad4aa2b5 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ToxicGas.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/ToxicGas.java @@ -27,23 +27,24 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; +import com.watabou.utils.Random; public class ToxicGas extends Blob implements Hero.Doom { - - @Override - protected void evolve() { - super.evolve(); - - int levelDamage = 5 + Dungeon.depth * 5; - - Char ch; - for (int i=0; i < LENGTH; i++) { - if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) { - - int damage = (ch.HT + levelDamage) / 40; - if (damage < 1) { - damage = 1; - } + + @Override + protected void evolve() { + super.evolve(); + + int levelDamage = 5 + Dungeon.depth * 5; + + Char ch; + for (int i=0; i < LENGTH; i++) { + if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) { + + int damage = (ch.HT + levelDamage) / 40; + if (Random.Int( 40 ) < (ch.HT + levelDamage) % 40) { + damage++; + } ch.damage( damage, this ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FlavourBuff.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FlavourBuff.java index 20c0a2b6c..b4d2f9188 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FlavourBuff.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FlavourBuff.java @@ -17,7 +17,7 @@ */ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; -// Special kind of buff, that doesn't perform any kind actions +//Special kind of buff, that doesn't perform any kind actions public class FlavourBuff extends Buff { @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicalSleep.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicalSleep.java index f9c5f2aa2..d4bc3a33b 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicalSleep.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicalSleep.java @@ -41,7 +41,7 @@ public class MagicalSleep extends Buff { GLog.i("You fall into a deep magical sleep."); } else if (target instanceof Mob) - ((Mob)target).state = Mob.State.SLEEPING; + ((Mob)target).state = ((Mob)target).SLEEPEING; target.paralysed = true; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Poison.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Poison.java index 6e68c5438..125002e1c 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Poison.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Poison.java @@ -30,8 +30,6 @@ import com.watabou.utils.Bundle; public class Poison extends Buff implements Hero.Doom { - public static final int DOT = 2; - protected float left; private static final String LEFT = "left"; @@ -67,7 +65,7 @@ public class Poison extends Buff implements Hero.Doom { public boolean act() { if (target.isAlive()) { - target.damage( DOT, this ); + target.damage( (int)(left / 3) + 1, this ); spend( TICK ); if ((left -= TICK) <= 0) { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Vertigo.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Vertigo.java new file mode 100644 index 000000000..3eb279b83 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Vertigo.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2012-2014 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.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements.Resistance; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; + +public class Vertigo extends FlavourBuff { + + public static final float DURATION = 10f; + + @Override + public int icon() { + return BuffIndicator.VERTIGO; + } + + @Override + public String toString() { + return "Vertigo"; + } + + public static float duration( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() * DURATION : DURATION; + } +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java index b8f126ad5..604e4a0cd 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java @@ -117,18 +117,17 @@ public class Belongings implements Iterable { return null; } - - public void countIronKeys() { - - IronKey.curDepthQunatity = 0; - - for (Item item : backpack) { - if (item instanceof IronKey && ((IronKey)item).depth == Dungeon.depth) { - IronKey.curDepthQunatity = item.quantity(); - return; - } - } - } + + public void countIronKeys() { + + IronKey.curDepthQuantity = 0; + + for (Item item : backpack) { + if (item instanceof IronKey && ((IronKey)item).depth == Dungeon.depth) { + IronKey.curDepthQuantity++; + } + } + } public void identify() { for (Item item : this) { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index a269dd914..7ac21f28d 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -20,12 +20,16 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero; import java.util.ArrayList; import java.util.HashSet; +import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.rings.*; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.audio.Sample; @@ -142,8 +146,8 @@ public class Hero extends Char { private Item theKey; public boolean restoreHealth = false; - - public boolean usingRanged = false; + + public MissileWeapon rangedWeapon = null; public Belongings belongings; public int STR; @@ -224,9 +228,6 @@ public class Hero extends Char { } public static void preview( GamesInProgress.Info info, Bundle bundle ) { - // Refactoring needed! - Armor armor = (Armor)bundle.get( "armor" ); - info.armor = armor == null ? 0 : armor.tier; info.level = bundle.getInt( LEVEL ); } @@ -242,30 +243,29 @@ public class Hero extends Char { public int tier() { return belongings.armor == null ? 0 : belongings.armor.tier; } - - public boolean shoot( Char enemy, Weapon wep ) { - - // Ugly... - usingRanged = true; - - KindOfWeapon curWep = belongings.weapon; - belongings.weapon = wep; - - boolean result = attack( enemy ); - - belongings.weapon = curWep; - usingRanged = false; - - return result; - } + + public boolean shoot( Char enemy, MissileWeapon wep ) { + + rangedWeapon = wep; + boolean result = attack( enemy ); + rangedWeapon = null; + + return result; + } @Override public int attackSkill( Char target ) { - if (belongings.weapon != null) { - return (int) (attackSkill * belongings.weapon.acuracyFactor(this)); + float accuracy = 1; + if (rangedWeapon != null && Level.distance( pos, target.pos ) == 1) { + accuracy *= 0.5f; + } + + KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon; + if (wep != null) { + return (int)(attackSkill * accuracy * wep.acuracyFactor( this )); } else { - return attackSkill; - } + return (int)(attackSkill * accuracy); + } } @Override @@ -312,14 +312,15 @@ public class Hero extends Char { @Override public int damageRoll() { + KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon; int dmg; int bonus = 0; for (Buff buff : buffs( RingOfForce.Force.class )) { bonus += ((RingOfForce.Force)buff).level; } - if (belongings.weapon != null) { - dmg = belongings.weapon.damageRoll( this ) + bonus; + if (wep != null) { + dmg = wep.damageRoll( this ) + bonus; } else { int bonusMax = 1 + (int)(bonus * (lvl/5f)); dmg = Random.NormalIntRange( 1+bonus, Math.max(1+bonus , STR()-9+bonusMax ) ); @@ -353,9 +354,10 @@ public class Hero extends Char { } public float attackDelay() { - if (belongings.weapon != null) { + KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon; + if (wep != null) { - return belongings.weapon.speedFactor( this ); + return wep.speedFactor( this ); } else { //Normally putting furor speed on unarmed attacks would be unnecessary @@ -408,6 +410,7 @@ public class Hero extends Char { } ready(); + return false; } else { @@ -417,52 +420,52 @@ public class Hero extends Char { if (curAction instanceof HeroAction.Move) { - actMove( (HeroAction.Move)curAction ); + return actMove( (HeroAction.Move)curAction ); } else if (curAction instanceof HeroAction.Interact) { - - actInteract( (HeroAction.Interact)curAction ); + + return actInteract( (HeroAction.Interact)curAction ); } else if (curAction instanceof HeroAction.Buy) { - - actBuy( (HeroAction.Buy)curAction ); + + return actBuy( (HeroAction.Buy)curAction ); }else if (curAction instanceof HeroAction.PickUp) { - - actPickUp( (HeroAction.PickUp)curAction ); + + return actPickUp( (HeroAction.PickUp)curAction ); } else if (curAction instanceof HeroAction.OpenChest) { - - actOpenChest( (HeroAction.OpenChest)curAction ); + + return actOpenChest( (HeroAction.OpenChest)curAction ); } else if (curAction instanceof HeroAction.Unlock) { - - actUnlock( (HeroAction.Unlock)curAction ); + + return actUnlock((HeroAction.Unlock) curAction); } else if (curAction instanceof HeroAction.Descend) { - - actDescend( (HeroAction.Descend)curAction ); + + return actDescend( (HeroAction.Descend)curAction ); } else if (curAction instanceof HeroAction.Ascend) { - - actAscend( (HeroAction.Ascend)curAction ); + + return actAscend( (HeroAction.Ascend)curAction ); } else if (curAction instanceof HeroAction.Attack) { - actAttack( (HeroAction.Attack)curAction ); + return actAttack( (HeroAction.Attack)curAction ); } else if (curAction instanceof HeroAction.Cook) { - actCook( (HeroAction.Cook)curAction ); + return actCook( (HeroAction.Cook)curAction ); } } @@ -495,40 +498,47 @@ public class Hero extends Char { act(); } - private void actMove( HeroAction.Move action ) { + private boolean actMove( HeroAction.Move action ) { if (getCloser( action.dst )) { - + + return true; + } else { if (Dungeon.level.map[pos] == Terrain.SIGN) { GameScene.show( new WndMessage( Dungeon.tip() ) ); } ready(); + return false; } } - private void actInteract( HeroAction.Interact action ) { + private boolean actInteract( HeroAction.Interact action ) { - Mob.NPC npc = action.npc; + NPC npc = action.npc; if (Level.adjacent( pos, npc.pos )) { ready(); sprite.turnTo( pos, npc.pos ); npc.interact(); + return false; } else { if (Level.fieldOfView[npc.pos] && getCloser( npc.pos )) { - + + return true; + } else { ready(); + return false; } } } - private void actBuy( HeroAction.Buy action ) { + private boolean actBuy( HeroAction.Buy action ) { int dst = action.dst; if (pos == dst || Level.adjacent( pos, dst )) { @@ -538,29 +548,38 @@ public class Hero extends Char { if (heap != null && heap.type == Type.FOR_SALE && heap.size() == 1) { GameScene.show( new WndTradeItem( heap, true ) ); } - + + return false; + } else if (getCloser( dst )) { - + + return true; + } else { ready(); + return false; } } - - private void actCook( HeroAction.Cook action ) { + + private boolean actCook( HeroAction.Cook action ) { int dst = action.dst; if (Dungeon.visible[dst]) { ready(); AlchemyPot.operate( this, dst ); - + return false; + } else if (getCloser( dst )) { - + + return true; + } else { ready(); + return false; } } - - private void actPickUp( HeroAction.PickUp action ) { + + private boolean actPickUp( HeroAction.PickUp action ) { int dst = action.dst; if (pos == dst) { @@ -597,16 +616,21 @@ public class Hero extends Char { } } else { ready(); - } - - } else if (getCloser( dst )) { - - } else { - ready(); + } + + return false; + + } else if (getCloser( dst )) { + + return true; + + } else { + ready(); + return false; } } - private void actOpenChest( HeroAction.OpenChest action ) { + private boolean actOpenChest( HeroAction.OpenChest action ) { int dst = action.dst; if (Level.adjacent( pos, dst ) || pos == dst) { @@ -624,7 +648,7 @@ public class Hero extends Char { if (theKey == null) { GLog.w( TXT_LOCKED_CHEST ); ready(); - return; + return false; } } @@ -644,16 +668,21 @@ public class Hero extends Char { } else { ready(); - } - - } else if (getCloser( dst )) { - - } else { - ready(); - } + } + + return false; + + } else if (getCloser( dst )) { + + return true; + + } else { + ready(); + return false; + } } - private void actUnlock( HeroAction.Unlock action ) { + private boolean actUnlock( HeroAction.Unlock action ) { int doorCell = action.dst; if (Level.adjacent( pos, doorCell )) { @@ -680,16 +709,21 @@ public class Hero extends Char { } else { GLog.w( TXT_LOCKED_DOOR ); ready(); - } - - } else if (getCloser( doorCell )) { - - } else { - ready(); - } + } + + return false; + + } else if (getCloser( doorCell )) { + + return true; + + } else { + ready(); + return false; + } } - private void actDescend( HeroAction.Descend action ) { + private boolean actDescend( HeroAction.Descend action ) { int stairs = action.dst; if (pos == stairs && pos == Dungeon.level.exit) { @@ -701,16 +735,21 @@ public class Hero extends Char { } InterlevelScene.mode = InterlevelScene.Mode.DESCEND; - Game.switchScene( InterlevelScene.class ); - - } else if (getCloser( stairs )) { - - } else { - ready(); - } + Game.switchScene( InterlevelScene.class ); + + return false; + + } else if (getCloser( stairs )) { + + return true; + + } else { + ready(); + return false; + } } - private void actAscend( HeroAction.Ascend action ) { + private boolean actAscend( HeroAction.Ascend action ) { int stairs = action.dst; if (pos == stairs && pos == Dungeon.level.entrance) { @@ -720,6 +759,7 @@ public class Hero extends Char { GameScene.show( new WndMessage( TXT_LEAVE ) ); ready(); } else { + Dungeon.win( ResultDescriptions.WIN ); Dungeon.deleteGame( Dungeon.hero.heroClass, true ); Game.switchScene( SurfaceScene.class ); } @@ -735,33 +775,43 @@ public class Hero extends Char { InterlevelScene.mode = InterlevelScene.Mode.ASCEND; Game.switchScene( InterlevelScene.class ); - } - - } else if (getCloser( stairs )) { + } - } else { - ready(); - } + return false; + + } else if (getCloser( stairs )) { + + return true; + + } else { + ready(); + return false; + } } - private void actAttack( HeroAction.Attack action ) { + private boolean actAttack( HeroAction.Attack action ) { enemy = action.target; if (Level.adjacent( pos, enemy.pos ) && enemy.isAlive() && !pacified) { spend( attackDelay() ); - sprite.attack( enemy.pos ); - - } else { - - if (Level.fieldOfView[enemy.pos] && getCloser( enemy.pos )) { - - } else { - ready(); - } - - } + sprite.attack( enemy.pos ); + + return false; + + } else { + + if (Level.fieldOfView[enemy.pos] && getCloser( enemy.pos )) { + + return true; + + } else { + ready(); + return false; + } + + } } public void rest( boolean tillHealthy ) { @@ -774,20 +824,20 @@ public class Hero extends Char { @Override public int attackProc( Char enemy, int damage ) { - if (belongings.weapon != null) { - - KindOfWeapon weapon = belongings.weapon; - weapon.proc( this, enemy, damage ); + KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon; + if (wep != null) { + + wep.proc( this, enemy, damage ); switch (subClass) { case GLADIATOR: - if (weapon instanceof MeleeWeapon) { + if (wep instanceof MeleeWeapon) { damage += Buff.affect( this, Combo.class ).hit( enemy, damage ); } break; case BATTLEMAGE: - if (weapon instanceof Wand) { - Wand wand = (Wand)weapon; + if (wep instanceof Wand) { + Wand wand = (Wand)wep; if (wand.curCharges < wand.maxCharges && damage > 0) { wand.curCharges++; @@ -800,7 +850,7 @@ public class Hero extends Char { damage += wand.curCharges; } case SNIPER: - if (usingRanged) { + if (rangedWeapon != null) { Buff.prolong( enemy, SnipersMark.class, attackDelay() * 1.1f ); } break; @@ -859,7 +909,6 @@ public class Hero extends Char { } private void checkVisibleMobs() { - ArrayList visible = new ArrayList(); boolean newMob = false; @@ -886,7 +935,7 @@ public class Hero extends Char { } public Mob visibleEnemy( int index ) { - return visibleEnemies.get( index % visibleEnemies.size() ); + return visibleEnemies.get(index % visibleEnemies.size()); } private boolean getCloser( final int target ) { @@ -925,9 +974,10 @@ public class Hero extends Char { } if (step != -1) { - - sprite.move( pos, step ); - move( step ); + + int oldPos = pos; + move(step); + sprite.move(oldPos, pos); spend( 1 / speed() ); return true; @@ -940,10 +990,10 @@ public class Hero extends Char { } - public void handle( int cell ) { + public boolean handle( int cell ) { if (cell == -1) { - return; + return false; } Char ch; @@ -956,8 +1006,8 @@ public class Hero extends Char { } else if (Level.fieldOfView[cell] && (ch = Actor.findChar( cell )) instanceof Mob) { - if (ch instanceof Mob.NPC) { - curAction = new HeroAction.Interact( (Mob.NPC)ch ); + if (ch instanceof NPC) { + curAction = new HeroAction.Interact( (NPC)ch ); } else { curAction = new HeroAction.Attack( ch ); } @@ -996,7 +1046,7 @@ public class Hero extends Char { } - act(); + return act(); } public void earnExp( int exp ) { @@ -1091,6 +1141,9 @@ public class Hero extends Char { if (((RingOfMight.Might)buff).level > 0) { HT += ((RingOfMight.Might) buff).level * 5; } + } else if (buff instanceof Vertigo) { + GLog.w("Everything is spinning around you!"); + interrupt(); } else if (buff instanceof Light) { @@ -1202,18 +1255,17 @@ public class Hero extends Char { if (!flying) { - if (Level.water[step]) { + if (Level.water[pos]) { Sample.INSTANCE.play( Assets.SND_WATER, 1, 1, Random.Float( 0.8f, 1.25f ) ); } else { Sample.INSTANCE.play( Assets.SND_STEP ); } - Dungeon.level.press(step, this); + Dungeon.level.press(pos, this); } } @Override public void onMotionComplete() { - Dungeon.observe(); search( false ); @@ -1274,22 +1326,10 @@ public class Hero extends Char { int positive = 0; int negative = 0; - //holding onto this code for now as it may be useful in coding the Talisman of Foresight. - /* - for (Buff buff : buffs( RingOfDetection.Detection.class )) { - int bonus = ((RingOfDetection.Detection)buff).level; - if (bonus > positive) { - positive = bonus; - } else if (bonus < 0) { - negative += bonus; - } - } - */ int distance = 1 + positive + negative; float level = intentional ? (2 * awareness - awareness * awareness) : awareness; if (distance <= 0) { - level /= 2 - distance; distance = 1; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroAction.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroAction.java index c4cb8fc29..fdc8c1e5c 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroAction.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroAction.java @@ -18,7 +18,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; public class HeroAction { @@ -50,8 +50,8 @@ public class HeroAction { } public static class Interact extends HeroAction { - public Mob.NPC npc; - public Interact( Mob.NPC npc ) { + public NPC npc; + public Interact( NPC npc ) { this.npc = npc; } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index c09946e93..1be0f7c00 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -77,101 +77,104 @@ public enum HeroClass { "Huntresses gain more health from dewdrops.", "Huntresses sense neighbouring monsters even if they are hidden behind obstacles." }; - - public void initHero( Hero hero ) { - - hero.heroClass = this; - - switch (this) { - case WARRIOR: - initWarrior( hero ); - break; - - case MAGE: - initMage( hero ); - break; - - case ROGUE: - initRogue( hero ); - break; - - case HUNTRESS: - initHuntress( hero ); - break; - } - - hero.updateAwareness(); - } - - private static void initWarrior( Hero hero ) { - hero.STR = hero.STR + 1; - - (hero.belongings.weapon = new ShortSword()).identify(); - (hero.belongings.armor = new ClothArmor()).identify(); - new Dart( 8 ).identify().collect(); - new Food().identify().collect(); - - if (Badges.isUnlocked( Badges.Badge.MASTERY_WARRIOR )) { - new TomeOfMastery().collect(); - } - - Dungeon.quickslot = Dart.class; - - new PotionOfStrength().setKnown(); - } - - private static void initMage( Hero hero ) { - (hero.belongings.weapon = new Knuckles()).identify(); - (hero.belongings.armor = new ClothArmor()).identify(); - new Food().identify().collect(); - - WandOfMagicMissile wand = new WandOfMagicMissile(); - wand.identify().collect(); - - if (Badges.isUnlocked( Badges.Badge.MASTERY_MAGE )) { - new TomeOfMastery().collect(); - } - - Dungeon.quickslot = wand; - - new ScrollOfIdentify().setKnown(); - } - - private static void initRogue( Hero hero ) { - (hero.belongings.weapon = new Dagger()).identify(); - (hero.belongings.armor = new ClothArmor()).identify(); - CloakOfShadows cloak = new CloakOfShadows(); - hero.belongings.misc1 = cloak; - new Dart( 8 ).identify().collect(); - new Food().identify().collect(); - hero.belongings.misc1.activate( hero ); - - if (Badges.isUnlocked( Badges.Badge.MASTERY_ROGUE )) { - new TomeOfMastery().collect(); - } - - Dungeon.quickslot = cloak; - - new ScrollOfMagicMapping().setKnown(); - } - - private static void initHuntress( Hero hero ) { - - hero.HP = (hero.HT -= 5); - - (hero.belongings.weapon = new Dagger()).identify(); - (hero.belongings.armor = new ClothArmor()).identify(); - Boomerang boomerang = new Boomerang(); - boomerang.identify().collect(); - new Food().identify().collect(); - - if (Badges.isUnlocked( Badges.Badge.MASTERY_HUNTRESS )) { - new TomeOfMastery().collect(); - } - - Dungeon.quickslot = boomerang; - } + public void initHero( Hero hero ) { + + hero.heroClass = this; + + initCommon( hero ); + + switch (this) { + case WARRIOR: + initWarrior( hero ); + break; + + case MAGE: + initMage( hero ); + break; + + case ROGUE: + initRogue( hero ); + break; + + case HUNTRESS: + initHuntress( hero ); + break; + } + + if (Badges.isUnlocked( masteryBadge() )) { + new TomeOfMastery().collect(); + } + + hero.updateAwareness(); + } + + private static void initCommon( Hero hero ) { + (hero.belongings.armor = new ClothArmor()).identify(); + new Food().identify().collect(); + } + + public Badges.Badge masteryBadge() { + switch (this) { + case WARRIOR: + return Badges.Badge.MASTERY_WARRIOR; + case MAGE: + return Badges.Badge.MASTERY_MAGE; + case ROGUE: + return Badges.Badge.MASTERY_ROGUE; + case HUNTRESS: + return Badges.Badge.MASTERY_HUNTRESS; + } + return null; + } + + private static void initWarrior( Hero hero ) { + hero.STR = hero.STR + 1; + + (hero.belongings.weapon = new ShortSword()).identify(); + new Dart( 8 ).identify().collect(); + + Dungeon.quickslot = Dart.class; + + new PotionOfStrength().setKnown(); + } + + private static void initMage( Hero hero ) { + (hero.belongings.weapon = new Knuckles()).identify(); + + WandOfMagicMissile wand = new WandOfMagicMissile(); + wand.identify().collect(); + + Dungeon.quickslot = wand; + + new ScrollOfIdentify().setKnown(); + } + + private static void initRogue( Hero hero ) { + (hero.belongings.weapon = new Dagger()).identify(); + + CloakOfShadows cloak = new CloakOfShadows(); + hero.belongings.misc1 = cloak; + hero.belongings.misc1.activate( hero ); + + new Dart( 8 ).identify().collect(); + + + Dungeon.quickslot = cloak; + + new ScrollOfMagicMapping().setKnown(); + } + + private static void initHuntress( Hero hero ) { + + hero.HP = (hero.HT -= 5); + + (hero.belongings.weapon = new Dagger()).identify(); + Boomerang boomerang = new Boomerang(); + boomerang.identify().collect(); + + Dungeon.quickslot = boomerang; + } public String title() { return title; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroSubClass.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroSubClass.java index f0add686d..9235a5e37 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroSubClass.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroSubClass.java @@ -26,7 +26,6 @@ public enum HeroSubClass { GLADIATOR( "gladiator", "A successful attack with a melee weapon allows the _Gladiator_ to start a combo, " + "in which every next successful hit inflicts more damage." ), - BERSERKER( "berserker", "When severely wounded, the _Berserker_ enters a state of wild fury " + "significantly increasing his damage output." ), @@ -34,14 +33,12 @@ public enum HeroSubClass { WARLOCK( "warlock", "After killing an enemy the _Warlock_ consumes its soul. " + "It heals his wounds and satisfies his hunger." ), - BATTLEMAGE( "battlemage", "When fighting with a wand in his hands, the _Battlemage_ inflicts additional damage depending " + "on the current number of charges. Every successful hit restores 1 charge to this wand." ), ASSASSIN( "assassin", "When performing a surprise attack, the _Assassin_ inflicts additional damage to his target." ), - FREERUNNER( "freerunner", "The _Freerunner_ can move almost twice faster, than most of the monsters. When he " + "is running, the Freerunner is much harder to hit. For that he must be unencumbered and not starving." ), @@ -49,7 +46,6 @@ public enum HeroSubClass { SNIPER( "sniper", "_Snipers_ are able to detect weak points in an enemy's armor, " + "effectively ignoring it when using a missile weapon." ), - WARDEN( "warden", "Having a strong connection with forces of nature gives _Wardens_ an ability to gather dewdrops and " + "seeds from plants. Also trampling a high grass grants them a temporary armor buff." ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java index 4d3f688ce..ee91c2d60 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java @@ -246,7 +246,7 @@ public class King extends Mob { EXP = 0; - state = State.WANDERING; + state = WANDERING; } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index 9c5097ba2..fdb7ccdcc 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -20,6 +20,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import java.util.HashSet; import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -31,7 +32,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.effects.Wound; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; -import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfAccuracy; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; @@ -48,15 +48,13 @@ public abstract class Mob extends Char { protected static final String TXT_NOTICE1 = "?!"; protected static final String TXT_RAGE = "#$%^"; protected static final String TXT_EXP = "%+dEXP"; - - public enum State { - SLEEPING, - HUNTING, - WANDERING, - FLEEING, - PASSIVE - } - public State state = State.SLEEPING; + + public AiState SLEEPEING = new Sleeping(); + public AiState HUNTING = new Hunting(); + public AiState WANDERING = new Wandering(); + public AiState FLEEING = new Fleeing(); + public AiState PASSIVE = new Passive(); + public AiState state = SLEEPEING; public Class spriteClass; @@ -90,25 +88,41 @@ public abstract class Mob extends Char { public void storeInBundle( Bundle bundle ) { super.storeInBundle( bundle ); - - bundle.put( STATE, state.toString() ); - bundle.put( SEEN, enemySeen); - if (state != State.SLEEPING) { - bundle.put( TARGET, target ); - } + + if (state == SLEEPEING) { + bundle.put( STATE, Sleeping.TAG ); + } else if (state == WANDERING) { + bundle.put( STATE, Wandering.TAG ); + } else if (state == HUNTING) { + bundle.put( STATE, Hunting.TAG ); + } else if (state == FLEEING) { + bundle.put( STATE, Fleeing.TAG ); + } else if (state == PASSIVE) { + bundle.put( STATE, Passive.TAG ); + } + bundle.put( TARGET, target ); } @Override public void restoreFromBundle( Bundle bundle ) { super.restoreFromBundle( bundle ); - - state = State.valueOf( bundle.getString( STATE ) ); - enemySeen = bundle.getBoolean( SEEN ); - if (state != State.SLEEPING) { - target = bundle.getInt( TARGET ); - } - } + + String state = bundle.getString( STATE ); + if (state.equals( Sleeping.TAG )) { + this.state = SLEEPEING; + } else if (state.equals( Wandering.TAG )) { + this.state = WANDERING; + } else if (state.equals( Hunting.TAG )) { + this.state = HUNTING; + } else if (state.equals( Fleeing.TAG )) { + this.state = FLEEING; + } else if (state.equals( Passive.TAG )) { + this.state = PASSIVE; + } + + target = bundle.getInt( TARGET ); + } public CharSprite sprite() { CharSprite sprite = null; @@ -124,7 +138,7 @@ public abstract class Mob extends Char { super.act(); - boolean alertedNow = alerted; + boolean justAlerted = alerted; alerted = false; sprite.hideAlert(); @@ -138,110 +152,8 @@ public abstract class Mob extends Char { enemy = chooseEnemy(); boolean enemyInFOV = enemy.isAlive() && Level.fieldOfView[enemy.pos] && enemy.invisible <= 0; - - int oldPos = pos; - - switch (state) { - - case SLEEPING: - if (enemyInFOV && - Random.Int( distance( enemy ) + enemy.stealth() + (enemy.flying ? 2 : 0) ) == 0) { - - enemySeen = true; - - notice(); - state = State.HUNTING; - target = enemy.pos; - - spend( TIME_TO_WAKE_UP ); - - } else { - - enemySeen = false; - - spend( TICK ); - - } - return true; - - case WANDERING: - if (enemyInFOV && (alertedNow || Random.Int( distance( enemy ) / 2 + enemy.stealth() ) == 0)) { - - enemySeen = true; - - notice(); - state = State.HUNTING; - target = enemy.pos; - - } else { - - enemySeen = false; - - if (target != -1 && getCloser( target )) { - spend( 1 / speed() ); - return moveSprite( oldPos, pos ); - } else { - target = Dungeon.level.randomDestination(); - spend( TICK ); - } - - } - return true; - - case HUNTING: - enemySeen = enemyInFOV; - if (enemyInFOV && canAttack( enemy )) { - - return doAttack( enemy ); - - } else { - - if (enemyInFOV) { - target = enemy.pos; - } - - if (target != -1 && getCloser( target )) { - - - spend( 1 / speed() ); - return moveSprite( oldPos, pos ); - - } else { - - spend( TICK ); - state = State.WANDERING; - target = Dungeon.level.randomDestination(); // <-------- - return true; - } - } - - case FLEEING: - enemySeen = enemyInFOV; - if (enemyInFOV) { - target = enemy.pos; - } - if (target != -1 && getFurther( target )) { - - spend( 1 / speed() ); - return moveSprite( oldPos, pos ); - - } else { - - spend( TICK ); - nowhereToRun(); - - return true; - } - - case PASSIVE: - enemySeen = false; - spend( TICK ); - return true; - - } - - return true; + return state.act( enemyInFOV, justAlerted ); } protected Char chooseEnemy() { @@ -271,15 +183,12 @@ public abstract class Mob extends Char { return Dungeon.hero; } - - protected void nowhereToRun() { - } - + protected boolean moveSprite( int from, int to ) { if (sprite.isVisible() && (Dungeon.visible[from] || Dungeon.visible[to])) { sprite.move( from, to ); - return false; + return true; } else { sprite.place( to ); return true; @@ -293,11 +202,11 @@ public abstract class Mob extends Char { if (sprite != null) { sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); } - state = State.HUNTING; + state = HUNTING; } else if (buff instanceof Terror) { - state = State.FLEEING; + state = FLEEING; } else if (buff instanceof Sleep) { - state = State.SLEEPING; + state = SLEEPEING; this.sprite().showSleep(); postpone( Sleep.SWS ); } @@ -308,7 +217,7 @@ public abstract class Mob extends Char { super.remove( buff ); if (buff instanceof Terror) { sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); - state = State.HUNTING; + state = HUNTING; } } @@ -408,10 +317,10 @@ public abstract class Mob extends Char { public void damage( int dmg, Object src ) { Terror.recover( this ); - - if (state == State.SLEEPING) { - state = State.WANDERING; - } + + if (state == SLEEPEING) { + state = WANDERING; + } alerted = true; super.damage( dmg, src ); @@ -501,8 +410,8 @@ public abstract class Mob extends Char { notice(); - if (state != State.HUNTING) { - state = State.WANDERING; + if (state != HUNTING) { + state = WANDERING; } target = cell; } @@ -518,32 +427,178 @@ public abstract class Mob extends Char { public void yell( String str ) { GLog.n( "%s: \"%s\" ", name, str ); } - - public static abstract class NPC extends Mob { - - { - HP = HT = 1; - EXP = 0; - - hostile = false; - state = State.PASSIVE; - } - - protected void throwItem() { - Heap heap = Dungeon.level.heaps.get( pos ); - if (heap != null) { - int n; - do { - n = pos + Level.NEIGHBOURS8[Random.Int( 8 )]; - } while (!Level.passable[n] && !Level.avoid[n]); - Dungeon.level.drop( heap.pickUp(), n ).sprite.drop( pos ); - } - } - - @Override - public void beckon( int cell ) { - } - - abstract public void interact(); - } + + public interface AiState { + public boolean act( boolean enemyInFOV, boolean justAlerted ); + public String status(); + } + + private class Sleeping implements AiState { + + public static final String TAG = "SLEEPING"; + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + if (enemyInFOV && Random.Int( distance( enemy ) + enemy.stealth() + (enemy.flying ? 2 : 0) ) == 0) { + + enemySeen = true; + + notice(); + state = HUNTING; + target = enemy.pos; + + if (Dungeon.isChallenged( Challenges.SWARM_INTELLIGENCE )) { + for (Mob mob : Dungeon.level.mobs) { + if (mob != Mob.this) { + mob.beckon( target ); + } + } + } + + spend( TIME_TO_WAKE_UP ); + + } else { + + enemySeen = false; + + spend( TICK ); + + } + return true; + } + + @Override + public String status() { + return String.format( "This %s is sleeping", name ); + } + } + + private class Wandering implements AiState { + + public static final String TAG = "WANDERING"; + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + if (enemyInFOV && (justAlerted || Random.Int( distance( enemy ) / 2 + enemy.stealth() ) == 0)) { + + enemySeen = true; + + notice(); + state = HUNTING; + target = enemy.pos; + + } else { + + enemySeen = false; + + int oldPos = pos; + if (target != -1 && getCloser( target )) { + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + } else { + target = Dungeon.level.randomDestination(); + spend( TICK ); + } + + } + return true; + } + + @Override + public String status() { + return String.format( "This %s is wandering", name ); + } + } + + private class Hunting implements AiState { + + public static final String TAG = "HUNTING"; + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + enemySeen = enemyInFOV; + if (enemyInFOV && canAttack( enemy )) { + + return doAttack( enemy ); + + } else { + + if (enemyInFOV) { + target = enemy.pos; + } + + int oldPos = pos; + if (target != -1 && getCloser( target )) { + + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + + } else { + + spend( TICK ); + state = WANDERING; + target = Dungeon.level.randomDestination(); + return true; + } + } + } + + @Override + public String status() { + return String.format( "This %s is hunting", name ); + } + } + + protected class Fleeing implements AiState { + + public static final String TAG = "FLEEING"; + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + enemySeen = enemyInFOV; + if (enemyInFOV) { + target = enemy.pos; + } + + int oldPos = pos; + if (target != -1 && getFurther( target )) { + + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + + } else { + + spend( TICK ); + nowhereToRun(); + + return true; + } + } + + protected void nowhereToRun() { + } + + @Override + public String status() { + return String.format( "This %s is fleeing", name ); + } + } + + private class Passive implements AiState { + + public static final String TAG = "PASSIVE"; + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + enemySeen = false; + spend( TICK ); + return true; + } + + @Override + public String status() { + return String.format( "This %s is passive", name ); + } + } } + diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Scorpio.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Scorpio.java index 55f57159d..5fafae0c7 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Scorpio.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Scorpio.java @@ -81,7 +81,7 @@ public class Scorpio extends Mob { @Override protected boolean getCloser( int target ) { - if (state == State.HUNTING) { + if (state == HUNTING) { return enemySeen && getFurther( target ); } else { return super.getCloser( target ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java index e3f9a7380..5f11cb3ee 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java @@ -32,99 +32,105 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.SpinnerSprite; import com.watabou.utils.Random; public class Spinner extends Mob { - - { - name = "cave spinner"; - spriteClass = SpinnerSprite.class; - - HP = HT = 50; - defenseSkill = 14; - - EXP = 9; - maxLvl = 16; - - loot = new MysteryMeat(); - lootChance = 0.125f; - } - - @Override - public int damageRoll() { - return Random.NormalIntRange( 12, 16 ); - } - - @Override - protected void nowhereToRun() { - if (buff( Terror.class ) == null) { - state = State.HUNTING; - } else { - super.nowhereToRun(); - } - } - - @Override - public int attackSkill( Char target ) { - return 20; - } - - @Override - public int dr() { - return 6; - } - - @Override - protected boolean act() { - boolean result = super.act(); - - if (state == State.FLEEING && buff( Terror.class ) == null && - enemySeen && enemy.buff( Poison.class ) == null) { - - state = State.HUNTING; - } - return result; - } - - @Override - public int attackProc( Char enemy, int damage ) { - if (Random.Int( 2 ) == 0) { - Buff.affect( enemy, Poison.class ).set( Random.Int( 5, 7 ) * Poison.durationFactor( enemy ) ); - state = State.FLEEING; - } - - return damage; - } - - @Override - public void move( int step ) { - if (state == State.FLEEING) { - GameScene.add( Blob.seed( pos, Random.Int( 5, 7 ), Web.class ) ); - } - super.move( step ); - } - - @Override - public String description() { - return - "These greenish furry cave spiders try to avoid direct combat, preferring to wait in the distance " + - "while their victim, entangled in the spinner's excreted cobweb, slowly dies from their poisonous bite."; - } - - private static final HashSet> RESISTANCES = new HashSet>(); - static { - RESISTANCES.add( Poison.class ); - } - - @Override - public HashSet> resistances() { - return RESISTANCES; - } - - private static final HashSet> IMMUNITIES = new HashSet>(); - static { - IMMUNITIES.add( Roots.class ); - } - - @Override - public HashSet> immunities() { - return IMMUNITIES; - } + + { + name = "cave spinner"; + spriteClass = SpinnerSprite.class; + + HP = HT = 50; + defenseSkill = 14; + + EXP = 9; + maxLvl = 16; + + loot = new MysteryMeat(); + lootChance = 0.125f; + + FLEEING = new Fleeing(); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange(12, 16); + } + + @Override + public int attackSkill(Char target) { + return 20; + } + + @Override + public int dr() { + return 6; + } + + @Override + protected boolean act() { + boolean result = super.act(); + + if (state == FLEEING && buff(Terror.class) == null && + enemySeen && enemy.buff(Poison.class) == null) { + + state = HUNTING; + } + return result; + } + + @Override + public int attackProc(Char enemy, int damage) { + if (Random.Int(2) == 0) { + Buff.affect(enemy, Poison.class).set(Random.Int(7, 9) * Poison.durationFactor(enemy)); + state = FLEEING; + } + + return damage; + } + + @Override + public void move(int step) { + if (state == FLEEING) { + GameScene.add(Blob.seed(pos, Random.Int(5, 7), Web.class)); + } + super.move(step); + } + + @Override + public String description() { + return + "These greenish furry cave spiders try to avoid direct combat, preferring to wait in the distance " + + "while their victim, entangled in the spinner's excreted cobweb, slowly dies from their poisonous bite."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + + static { + RESISTANCES.add(Poison.class); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + + static { + IMMUNITIES.add(Roots.class); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + + private class Fleeing extends Mob.Fleeing { + @Override + protected void nowhereToRun() { + if (buff(Terror.class) == null) { + state = HUNTING; + } else { + super.nowhereToRun(); + } + } + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java index ba3bcd434..4680a2c61 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java @@ -42,7 +42,7 @@ public class Statue extends Mob { spriteClass = StatueSprite.class; EXP = 0; - state = State.PASSIVE; + state = PASSIVE; } private Weapon weapon; @@ -106,8 +106,8 @@ public class Statue extends Mob { @Override public void damage( int dmg, Object src ) { - if (state == State.PASSIVE) { - state = State.HUNTING; + if (state == PASSIVE) { + state = HUNTING; } super.damage( dmg, src ); @@ -137,7 +137,7 @@ public class Statue extends Mob { @Override public boolean reset() { - state = State.PASSIVE; + state = PASSIVE; return true; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java index 099457cd7..590c931df 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java @@ -91,7 +91,7 @@ public class Swarm extends Mob { Swarm clone = split(); clone.HP = (HP - damage) / 2; clone.pos = Random.element( candidates ); - clone.state = State.HUNTING; + clone.state = clone.HUNTING; if (Dungeon.level.map[clone.pos] == Terrain.DOOR) { Door.enter( clone.pos ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java index 95ca71dab..e9ec7a3e9 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java @@ -49,108 +49,112 @@ public class Thief extends Mob { maxLvl = 10; loot = MasterThievesArmband.class; - lootChance = 0.01f; - } - - private static final String ITEM = "item"; - - @Override - public void storeInBundle( Bundle bundle ) { - super.storeInBundle( bundle ); - bundle.put( ITEM, item ); - } - - @Override - public void restoreFromBundle( Bundle bundle ) { - super.restoreFromBundle( bundle ); - item = (Item)bundle.get( ITEM ); - } - - @Override - public int damageRoll() { - return Random.NormalIntRange( 1, 7 ); - } - - @Override - protected float attackDelay() { - return 0.5f; - } - - @Override - protected void nowhereToRun() { - if (buff( Terror.class ) == null) { - sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); - state = State.HUNTING; - } else { - super.nowhereToRun(); - } - } - - @Override - public void die( Object cause ) { + lootChance = 0.01f; - super.die( cause ); - - if (item != null) { - Dungeon.level.drop( item, pos ).sprite.drop(); - } - } - - @Override - public int attackSkill( Char target ) { - return 12; - } - - @Override - public int dr() { - return 3; - } - - @Override - public int attackProc( Char enemy, int damage ) { - if (item == null && enemy instanceof Hero && steal( (Hero)enemy )) { - state = State.FLEEING; - } - - return damage; - } - - @Override - public int defenseProc(Char enemy, int damage) { - if (state == State.FLEEING) { - Dungeon.level.drop( new Gold(), pos ).sprite.drop(); - } - - return damage; - } - - protected boolean steal( Hero hero ) { - - Item item = hero.belongings.randomUnequipped(); - if (item != null) { - - GLog.w( TXT_STOLE, this.name, item.name() ); - - item.detachAll( hero.belongings.backpack ); - this.item = item; - - return true; - } else { - return false; - } - } - - @Override - public String description() { - String desc = - "Deeper levels of the dungeon have always been a hiding place for all kinds of criminals. " + - "Not all of them could keep a clear mind during their extended periods so far from daylight. Long ago, " + - "these crazy thieves and bandits have forgotten who they are and why they steal."; - - if (item != null) { - desc += String.format( TXT_CARRIES, Utils.capitalize( this.name ), item.name() ); - } - - return desc; - } + FLEEING = new Fleeing(); + } + + private static final String ITEM = "item"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( ITEM, item ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + item = (Item)bundle.get( ITEM ); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 1, 7 ); + } + + @Override + protected float attackDelay() { + return 0.5f; + } + + @Override + public void die( Object cause ) { + + super.die( cause ); + + if (item != null) { + Dungeon.level.drop( item, pos ).sprite.drop(); + } + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public int dr() { + return 3; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (item == null && enemy instanceof Hero && steal( (Hero)enemy )) { + state = FLEEING; + } + + return damage; + } + + @Override + public int defenseProc(Char enemy, int damage) { + if (state == FLEEING) { + Dungeon.level.drop( new Gold(), pos ).sprite.drop(); + } + + return damage; + } + + protected boolean steal( Hero hero ) { + + Item item = hero.belongings.randomUnequipped(); + if (item != null) { + + GLog.w( TXT_STOLE, this.name, item.name() ); + + item.detachAll( hero.belongings.backpack ); + this.item = item; + + return true; + } else { + return false; + } + } + + @Override + public String description() { + String desc = + "Deeper levels of the dungeon have always been a hiding place for all kinds of criminals. " + + "Not all of them could keep a clear mind during their extended periods so far from daylight. Long ago, " + + "these crazy thieves and bandits have forgotten who they are and why they steal."; + + if (item != null) { + desc += String.format( TXT_CARRIES, Utils.capitalize( this.name ), item.name() ); + } + + return desc; + } + + private class Fleeing extends Mob.Fleeing { + @Override + protected void nowhereToRun() { + if (buff( Terror.class ) == null) { + sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); + state = HUNTING; + } else { + super.nowhereToRun(); + } + } + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java index 635a8cff8..cf306df68 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java @@ -86,7 +86,7 @@ public class Wraith extends Mob { @Override public boolean reset() { - state = State.WANDERING; + state = WANDERING; return true; } @@ -112,7 +112,7 @@ public class Wraith extends Mob { Wraith w = new Wraith(); w.adjustStats( Dungeon.depth ); w.pos = pos; - w.state = State.HUNTING; + w.state = w.HUNTING; GameScene.add( w, SPAWN_DELAY ); w.sprite.alpha( 0 ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java index 633c298dd..ce4bbfd83 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java @@ -62,7 +62,7 @@ public class Yog extends Mob { EXP = 50; - state = State.PASSIVE; + state = PASSIVE; } private static final String TXT_DESC = @@ -193,7 +193,7 @@ public class Yog extends Mob { EXP = 0; - state = State.WANDERING; + state = WANDERING; } public RottingFist() { @@ -286,7 +286,7 @@ public class Yog extends Mob { EXP = 0; - state = State.WANDERING; + state = WANDERING; } public BurningFist() { @@ -404,7 +404,7 @@ public class Yog extends Mob { EXP = 0; - state = State.HUNTING; + state = HUNTING; } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java index 2993dd117..ef801f787 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java @@ -43,7 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.watabou.utils.Bundle; import com.watabou.utils.Random; -public class Blacksmith extends Mob.NPC { +public class Blacksmith extends NPC { private static final String TXT_GOLD_1 = "Hey human! Wanna be useful, eh? Take dis pickaxe and mine me some _dark gold ore_, _15 pieces_ should be enough. " + @@ -167,8 +167,8 @@ public class Blacksmith extends Mob.NPC { if (item1 == item2) { return "Select 2 different items, not the same item twice!"; } - - if (!item1.isSimilar( item2 )) { + + if (item1.getClass() != item2.getClass()) { return "Select 2 items of the same type!"; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java index 6f73f0174..901fb5a07 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java @@ -19,6 +19,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import java.util.HashSet; +import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StenchGas; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; @@ -27,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Gnoll; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat; import com.shatteredpixel.shatteredpixeldungeon.items.quest.RatSkull; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; @@ -61,7 +63,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndSadGhost; import com.watabou.utils.Bundle; import com.watabou.utils.Random; -public class Ghost extends Mob.NPC { +public class Ghost extends NPC { { name = "sad ghost"; @@ -69,7 +71,7 @@ public class Ghost extends Mob.NPC { flying = true; - state = State.WANDERING; + state = WANDERING; } private static final String TXT_RAT1 = @@ -195,7 +197,6 @@ public class Ghost extends Mob.NPC { txt_quest = TXT_CRAB1; break; } - questBoss.state = Mob.State.WANDERING; questBoss.pos = Dungeon.level.randomRespawnCell(); if (questBoss.pos != -1) { @@ -353,6 +354,10 @@ public class Ghost extends Mob.NPC { } } + //TODO this is silly, why trap the player with bad armour? Just remove the button from the window. + if (Dungeon.isChallenged( Challenges.NO_ARMOR )) + armor = (Armor)new ClothArmor().degrade(); + weapon.identify(); armor.identify(); } @@ -386,6 +391,8 @@ public class Ghost extends Mob.NPC { defenseSkill = 4; EXP = 4; + + state = WANDERING; } @Override @@ -445,6 +452,8 @@ public class Ghost extends Mob.NPC { EXP = 5; + state = WANDERING; + loot = Generator.random(CurareDart.class); lootChance = 1f; } @@ -489,7 +498,7 @@ public class Ghost extends Mob.NPC { @Override protected boolean getCloser( int target ) { combo = 0; //if he's moving, he isn't attacking, reset combo. - if (state == State.HUNTING) { + if (state == HUNTING) { return enemySeen && getFurther( target ); } else { return super.getCloser( target ); @@ -573,6 +582,7 @@ public class Ghost extends Mob.NPC { EXP = 6; + state = WANDERING; } private boolean moving = true; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java index f222c9337..6a90a06f7 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java @@ -38,7 +38,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.watabou.utils.Bundle; import com.watabou.utils.Random; -public class Imp extends Mob.NPC { +public class Imp extends NPC { { name = "ambitious imp"; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java index 5b7bfccfd..85ec57b4c 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java @@ -21,6 +21,8 @@ import java.util.HashSet; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; @@ -29,13 +31,13 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.MirrorSprite; import com.watabou.utils.Bundle; import com.watabou.utils.Random; -public class MirrorImage extends Mob.NPC { +public class MirrorImage extends NPC { { name = "mirror image"; spriteClass = MirrorSprite.class; - state = State.HUNTING; + state = HUNTING; enemy = DUMMY; } @@ -134,5 +136,16 @@ public class MirrorImage extends Mob.NPC { Dungeon.hero.spend( 1 / Dungeon.hero.speed() ); Dungeon.hero.busy(); + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( ToxicGas.class ); + IMMUNITIES.add( Burning.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; } } \ No newline at end of file diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NPC.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NPC.java new file mode 100644 index 000000000..f4b3ac47a --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NPC.java @@ -0,0 +1,52 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 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 com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.items.Heap; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.watabou.utils.Random; + +public abstract class NPC extends Mob { + + { + HP = HT = 1; + EXP = 0; + + hostile = false; + state = PASSIVE; + } + + protected void throwItem() { + Heap heap = Dungeon.level.heaps.get( pos ); + if (heap != null) { + int n; + do { + n = pos + Level.NEIGHBOURS8[Random.Int( 8 )]; + } while (!Level.passable[n] && !Level.avoid[n]); + Dungeon.level.drop( heap.pickUp(), n ).sprite.drop( pos ); + } + } + + @Override + public void beckon( int cell ) { + } + + abstract public void interact(); +} \ No newline at end of file diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java index 31204d2f6..8b2a6af30 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RatKing.java @@ -24,13 +24,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.sprites.RatKingSprite; -public class RatKing extends Mob.NPC { +public class RatKing extends NPC { { name = "rat king"; spriteClass = RatKingSprite.class; - state = State.SLEEPING; + state = SLEEPEING; } @Override @@ -64,10 +64,10 @@ public class RatKing extends Mob.NPC { @Override public void interact() { sprite.turnTo( pos, Dungeon.hero.pos ); - if (state == State.SLEEPING) { + if (state == SLEEPEING) { notice(); yell( "I'm not sleeping!" ); - state = State.WANDERING; + state = WANDERING; } else { yell( "What is it? I have no time for this nonsense. My kingdom won't rule itself!" ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java index d5b1532b4..9a04aa9d8 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java @@ -29,7 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkeeperSprite; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem; -public class Shopkeeper extends Mob.NPC { +public class Shopkeeper extends NPC { public static final String TXT_THIEF = "Thief, Thief!"; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java index a13e7a2fd..018809f2f 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java @@ -63,7 +63,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndWandmaker; import com.watabou.utils.Bundle; import com.watabou.utils.Random; -public class Wandmaker extends Mob.NPC { +public class Wandmaker extends NPC { { name = "old wandmaker";