Skip to content
Snippets Groups Projects
Select Git revision
  • d0dab0ad7c75ec551f27c7054e35bf1803671985
  • master default
2 results

Enemy.java

Blame
  • 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;
    	}
    }