API Docs for: 0.1.1
Show:

File: src/components/map/extensions/hexagons/eventListeners/units.js

(function () {
  /*---------------------
  ------- IMPORT --------
  ----------------------*/
  var utils = window.flatworld.utils;
  var mapEvents = window.flatworld.mapEvents;
  var UI = window.flatworld.UI;
  var MapDataManipulator = window.flatworld.MapDataManipulator;
  var eventListeners = window.flatworld.eventListeners;
  var mapStates = window.flatworld.mapStates;
  var mapLog = window.flatworld.log;

  /*---------------------
  --------- API ---------
  ----------------------*/
  window.flatworld.extensions.hexagons.setupHexagonClick = _setupUnitsHexagonClick;

  /*---------------------
  ------- PUBLIC --------
  ----------------------*/
  /**
   * Handles the eventlistner for selecting objects on the map. THe actual logic for detecting the objects under mouse
   * etc. are in selectHexagonPlugin
   *
   * @class extensions.hexagons.setupHexagonClick
   * @requires Hammer.js. Some events are done with Hammer.js, so we need it to handle those events correctly
   * @event                 Mapselect and objectsSelected (objectsSelected will have parameter for the objects that were selected)
   * @param  {Map} map      The currently use Map instance
   * @return {Boolean}      True
   */
  function _setupUnitsHexagonClick(FTW) {
    var ui;

    if (!FTW) {
      throw new Error('eventlisteners initialization requires flatworld instance as a parameter');
    }

    ui = UI();

    eventListeners.on('select', tapListener);
    eventListeners.on('order', orderListener);

    return true;

    /*----------------------
    ------- PUBLIC ---------
    ----------------------*/
    /**
     * the listener that received the event object
     *
     * @private
     * @method tapListener
     * @param  {Event} e      Event object
     */
    function tapListener(e) {
      const globalCoords = utils.mouse.eventData.getHAMMERPointerCoords(e);
      const getData = {
        allData(object) {
          return object.data.typeData;
        },
      };
      const containerFilter = new MapDataManipulator({
        type: 'filter',
        object: 'layer',
        property: 'name',
        value: 'unitLayer',
      });
      var objects;

      mapStates.objectSelect();

      objects = FTW.getObjectsUnderArea(globalCoords, { filters: containerFilter });
      objects = utils.dataManipulation.mapObjectsToArray(objects);
      objects = utils.dataManipulation.flattenArrayBy1Level(objects);

      if (!objects.length) {
        FTW.currentlySelectedObjects = undefined;
        mapLog.debug('No objects found for selection!');
        // Delete the UI objects, as player clicked somewhere that doesn't have any selectable objects
        ui.showSelections([]);
        return;
      }

      FTW.currentlySelectedObjects = objects;
      mapEvents.publish('objectsSelected', objects);
      ui.showSelections(objects, getData);
      FTW.drawOnNextTick();
    }
    /**
     * This listener is for the situation, where we have an object and we issue an order / action to
     * that unit. For example to move from one hexagon to another.
     *
     * @private
     * @method orderListener
     * @param  {Event} e      Event object
     */
    function orderListener(e) {
      const filter = new MapDataManipulator({
        type: 'filter',
        object: 'layer',
        property: 'name',
        value: 'unitLayer',
      });
      var getData = {
        allData(object) {
          return object.data.typeData;
        },
      };
      var globalCoords, selectedObject;

      if (!FTW.currentlySelectedObjects) {
        mapLog.debug('No objects selected for orders! ' + JSON.stringify(selectedObject));
        return;
      } else if (FTW.currentlySelectedObjects.length > 1) {
        mapLog.debug('the selected object is only supported to be one atm.' + JSON.stringify(FTW.currentlySelectedObjects));
        return;
      }

      selectedObject = FTW.currentlySelectedObjects[0];

      mapStates.objectOrder();

      if (FTW.isSupportedTouch) {
        globalCoords = utils.mouse.eventData.getHAMMERPointerCoords(e);
      } else {
        globalCoords = utils.mouse.eventData.getPointerCoords(e);
      }

      selectedObject.move(globalCoords);
      mapEvents.publish('objectMoves', selectedObject);

      ui.showUnitMovement(selectedObject, globalCoords);

      mapStates.objectOrderEnd();
      FTW.drawOnNextTick();
    }
  }
})();