import { System } from '@serpentity/serpentity'; const internals = { kForce: 20 }; import DasherNode from '../nodes/dasher'; /** * Applies a dash as a force on an entity. Locks it until the button is released * and a cooldown period has passed * * @extends {external:Serpentity.System} * @class DashSystem * @param {object} config a configuration object to extend. */ export default class DashSystem extends System { constructor(config = {}) { super(); /** * The node collection of dashers * * @property {external:Serpentity.NodeCollection} dashers * @instance * @memberof DashSystem */ this.dashers = null; } /** * Initializes system when added. Requests dasher nodes * * @function added * @memberof DashSystem * @instance * @param {external:Serpentity.Engine} engine the serpentity engine to * which we are getting added */ added(engine) { this.dashers = engine.getNodes(DasherNode); } /** * Clears system resources when removed. * * @function removed * @instance * @memberof DashSystem */ removed() { this.dashers = null; } /** * Runs on every update of the loop. Triggers dash and manages cooldown * * @function update * @instance * @param {Number} currentFrameDuration the duration of the current * frame * @memberof DashSystem */ update(currentFrameDuration) { for (const dasher of this.dashers) { const dash = dasher.dash; if (dash.dashing && !dash.locked) { this._dash(dasher); } if (!dash.dashing && dash.locked && dash.currentCooldown >= dash.cooldown) { this._unlock(dasher); } if (dash.locked) { dash.currentCooldown += currentFrameDuration; } dash.dashing = 0; } } // Executes the dash action _dash(dasher) { const dash = dasher.dash; const force = dasher.force; const angle = force.lastAngle || 0; dash.locked = true; dash.currentCooldown = 0; const xComponent = internals.kForce * Math.cos(angle); const yComponent = internals.kForce * Math.sin(angle); force.x += xComponent; force.y += yComponent; } // Executes the unlock action _unlock(dasher) { dasher.dash.locked = false; } };