Home Reference Source Repository

app/entities/creatures/moves/UseItemMove.js

import PlayableCharacter from '../PlayableCharacter.js';
import GameEvents from '../../../events/GameEvents.js';

import Move from './Move.js';

import Consumable from '../../consumables/Consumable.js';

export default class UseItemMove extends Move {
    constructor(actorTile, position, targetTile) {
        super(actorTile);
        this._position = position;
        if(targetTile) {
            this._target = {
                x: targetTile.getX(),
                y: targetTile.getY()
            };
        }
    }

    getReasonIllegal(dungeon, creature) {
        var position = this.getItemPosition();
        var targetLocation = this.getTargetLocation();
        var tile;
        if(targetLocation && (tile = dungeon.getTile(targetLocation.x, targetLocation.y)) == null) {
            return 'Illegal target tile';
        }
        var inventory = creature.getInventory();
        var item = inventory.getItem(position);
        if(!item) {
            return 'No item at position: ' + position;
        } else {
            if(item.isTargetted && item.isTargetted()) {
                if(targetLocation) {
                    if(item.isTargetCreature && item.isTargetCreature() && !tile.getCreature()) {
                        return 'Target must be a creature';
                    }
                } else {
                    return 'Target not given for targetted item';
                }
            } else if(targetLocation) {
                return 'Target given for untargetted item';
            }
        }
        return null;
    }

    getCostMultiplier() {
        return 1;
    }

    getItemPosition() {
        return this._position;
    }

    getTargetLocation() {
        return this._target;
    }

    execute(dungeon, creature) {
        var reason = this.getReasonIllegal(dungeon, creature);
        if(reason) {
            throw new Error(reason);
        }
        var position = this.getItemPosition();
        var targetLocation = this.getTargetLocation();
        if(targetLocation) {
            var targetTile = dungeon.getTile(targetLocation.x, targetLocation.y);
        }
        var inventory = creature.getInventory();
        var item = inventory.getItem(position);
        if(!item) {
            throw new Error('No item at position: ' + position);
        }
        if(item.isEquipable() && !isNaN(position)) {
            // Equipable items in backpack are used by equipping them
            inventory.equipItem(position);
            dungeon.fireEvent(new GameEvents.EquipItemEvent(dungeon, creature, item));
        } else {
            item.use(dungeon, creature, targetTile);
            dungeon.fireEvent(new GameEvents.UseItemEvent(dungeon, creature, item, targetTile));
            if(item instanceof Consumable) {
                inventory.removeItem(position);
            }
        }
        dungeon.fireEvent(new GameEvents.InventoryChangeEvent(dungeon, creature));
    }

    isSeenBy(dungeon, observer) {
        return observer.canSee(dungeon, dungeon.getTile(this.getActorX(), this.getActorY()));
    }
}