Home Reference Source Repository

app/entities/creatures/strategies/ChaseStrategy.js

import Strategy from './Strategy.js';
import Creature from '../Creature.js';
import Dungeon from '../../../dungeons/Dungeon.js';

import Moves from '../moves/Moves.js';
import Pather from './Pather.js';

/**
 * @class ChaseStrategy
 * @description Simple strategy for chasing enemies
 */
export default class ChaseStrategy extends Strategy {
    getNextMove(dungeon, creature) {
        if(!(dungeon instanceof Dungeon)) {
            throw new Error('First parameter must be a Dungeon');
        } else if(!(creature instanceof Creature)) {
            throw new Error('Second parameter must be a Creature');
        }
        const tile = dungeon.getTile(creature);
        const meleeWeapon = creature.getMeleeWeapon();
        const rangedWeapon = creature.getRangedWeapon();
        const enemies = creature.getVisibleEnemies(dungeon).sort(function(enemy1, enemy2) {
            const d1 = tile.getDirectDistance(dungeon.getTile(enemy1));
            const d2 = tile.getDirectDistance(dungeon.getTile(enemy2));
            if(d1 < d2) {
                return 1;
            } else if(d1 > d2) {
                return -1;
            } else {
                return 0;
            }
        });

        const attackableEnemy = enemies.find(function(enemy) {
            const move = new Moves.AttackMove(tile, dungeon.getTile(enemy));
            return !move.getReasonIllegal(dungeon, creature);
        });

        if(attackableEnemy) {
            return new Moves.AttackMove(tile, dungeon.getTile(attackableEnemy));
        } else {
            const mark = enemies.find(enemy => dungeon.getTile(enemy).getDirectDistance(tile) > 1);
            const target = mark ? dungeon.getTile(mark) : this._lastKnownEnemyLocation;
            if(target) {
                const move = Pather.getMoveToward(dungeon, creature, target);
                if(move && !move.getReasonIllegal(dungeon, creature)) {
                    return move;
                }
            }
        }

        return null;
    }
}