Home Reference Source Repository

app/views/AbilitiesView.js

import Moves from '../entities/creatures/moves/Moves.js';

export default class AbilitiesView {
    /**
     * @class AbilitiesView
     * @description List view for the player's abilities
     */
    constructor(sharedData) {
        const dom = this._dom = $('<div class="abilities-buttons">');
        this._sharedData = sharedData;

        sharedData.addObserver(()=>this.update());

        $(dom).on('click tap', 'button', function() {
            const index = +$(this).attr('data-index');
            const prevAbility = sharedData.getTargettedAbility();

            if(prevAbility === index) {
                sharedData.unsetTargettedAbility();
            } else {
                const dungeon = sharedData.getDungeon();
                const player = dungeon.getPlayableCharacter();
                const ability = player.getAbilities()[index];
                if(ability.isTargetted()) {
                    sharedData.setTargettedAbility(index);
                } else {
                    player.setNextMove(new Moves.UseAbilityMove(dungeon.getTile(player), index));
                }
            }

            document.querySelector('section.game').focus();
        });

        window.addEventListener('keypress', function(event) {
            const code = event.keyCode;
            if(48 <= code && code <= 57) {
                const index = (code + 1) % 10; // '0' key means 10th index
                $(dom).find('button').eq(index).trigger('click');
            }
        });
    }

    update() {
        const sharedData = this._sharedData;
        const dungeon = sharedData.getDungeon();
        const player = dungeon.getPlayableCharacter();
        const targettedIndex = sharedData.getTargettedAbility();
        const template = $(`
        <h2>Abilities</h2>
        <div class="wrap">
            ${player.getAbilities().map((item, index)=>
                    `<button class="ability" title="${item.getDescription()}" data-index="${index}" data-targetting="${targettedIndex === index}" data-name="${item.getName()}">
                        <div class="inner icon" data-ability-name="${item.toString()}">
                            <span class="name">${item.getName()}</span>
                            <span class="cost">${item.getManaCost()}<span class="screenreader"> mana</span></span>
                            <span class="hotkey">${index + 1}</span>
                        </div>
                    </button>`).join('')}
        </div>`);
        $(this.getDom()).empty().append(template);
    }

    getDom() {
        return this._dom[0];
    }
}