package com.shade.entities.monster; import org.newdawn.slick.Animation; import org.newdawn.slick.Graphics; import org.newdawn.slick.SlickException; import org.newdawn.slick.SpriteSheet; import org.newdawn.slick.state.StateBasedGame; import com.shade.base.Entity; import com.shade.base.util.State; import com.shade.entities.Player; import com.shade.entities.Roles; /** * A mole who has not yet found any mushrooms but is searching for them. * * Idle moles: + Have not identified a target mushroom + Have zero mushrooms * attached + Are checking for line-of-sight with nearby mushrooms + Return * underground after a set amount of time * * @author Alexander Schearer <aschearer@gmail.com> */ public class ChasingMonster implements State { private Monster monster; private Animation idling; private int timer; public ChasingMonster(Monster mole) throws SlickException { this.monster = mole; initResources(); } private void initResources() throws SlickException { SpriteSheet idles = new SpriteSheet("entities/mole/sniff.png", 40, 40); idling = new Animation(idles, 300); idling.setAutoUpdate(false); idling.setPingPong(true); } public void enter() { timer = 0; idling.restart(); } public int getRole() { return Roles.MOLE.ordinal(); } public boolean isNamed(Object o) { return o == Monster.States.CHASING; } public void onCollision(Entity obstacle) { if (obstacle.getRole() == Roles.PLAYER.ordinal()) { monster.manager.enter(Monster.States.WANDERING); } } public void render(StateBasedGame game, Graphics g) { idling.draw(monster.getX(), monster.getY(), monster.getWidth(), monster .getHeight()); } private void chase() { if (monster.playerInSight()) { Player p = (Player) monster.level.getEntitiesByRole(Roles.PLAYER .ordinal())[0]; float distx = p.getXCenter() - monster.getXCenter(); float disty = p.getYCenter() - monster.getYCenter(); monster.heading = (float) (Math.atan2(disty, distx) + Math.PI / 2); monster.move(1); } else monster.manager.enter(Monster.States.LOST); } public void update(StateBasedGame game, int delta) { idling.update(delta); chase(); testTimer(delta); } private void testTimer(int delta) { timer += delta; if (timer > 20000) { monster.manager.enter(Monster.States.PROWLING); } } }