Select Git revision
Enemy.java 2.18 KiB
package world;
import interfaces.IEnemyObserver;
import interfaces.ITickable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
public class Enemy extends Placeable implements ITickable {
private int hp;
private int moveTimeLeft;
private EnemyType type;
private Field prevField;
private int moveTries;
private static HashMap<EnemyType, Integer> moveTimes = new HashMap<EnemyType, Integer>();
public static boolean alwaysSplit = false;
public static boolean randomMovement = true;
static
{
moveTimes.put(EnemyType.HUMAN, 3);
moveTimes.put(EnemyType.DWARF, 4);
moveTimes.put(EnemyType.ELF, 2);
moveTimes.put(EnemyType.HOBBIT, 5);
}
public Enemy(EnemyType p_type) {
type = p_type;
reset();
prevField = null;
hp = 100;
}
public void hurt(int dmg) {
Random rand = new Random();
hp -= dmg;
if(alwaysSplit)
split();
if (hp <= 0) {
field.getWorld().notifyEnemyDied(this);
field.stepOff(this);
} else if (rand.nextInt(15) == 0)
split();
}
public EnemyType getType() {
return type;
}
public Field getField() {
return field;
}
private void move() {
if (field.canStepOff(this)) {
ArrayList<Field> potentials = new ArrayList<Field>();
ArrayList<Field> neighbours = field.getNeighbours();
for (Field field : neighbours) {
if (field != null && field.isRoad() && field != prevField) {
potentials.add(field);
}
}
if(!potentials.isEmpty()){
int index = 0;
if (randomMovement) {
Random rand = new Random();
index = rand.nextInt(potentials.size());
}
field.stepOff(this);
prevField = field;
reset();
potentials.get(index).stepOn(this);
}
} else {
moveTries++;
}
}
public void split() {
hp=hp/2;
field.getWorld().getSpawnManager().spawnEnemy(field, type, Math.round(hp),prevField);
}
private void reset() {
moveTimeLeft = moveTimes.get(getType());
moveTries = 0;
}
public int getMoveTryCount() {
return moveTries;
}
public void tick() {
if (moveTimeLeft <= 0 && hp>0)
move();
else
moveTimeLeft--;
}
public int getHP() {
return hp;
}
public void setHP(int hp) {
this.hp=hp;
}
public void setPrevField(Field f){
prevField=f;
}
}