From 22e04f5d113442abb22a5c4e7496d8f42eb8b7f3 Mon Sep 17 00:00:00 2001 From: eonarheim Date: Sun, 3 Jan 2016 15:09:20 -0600 Subject: [PATCH 1/9] Fix lerp --- src/engine/Camera.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/engine/Camera.ts b/src/engine/Camera.ts index 287912802..1f2fa10c1 100644 --- a/src/engine/Camera.ts +++ b/src/engine/Camera.ts @@ -232,18 +232,18 @@ module ex { if (this._currentLerpTime < this._lerpDuration && this._cameraMoving) { if (this._lerpEnd.x < this._lerpStart.x) { - this.focus.x = this._lerpStart.x - (this._easeInOutCubic(this._currentLerpTime, + this.x = this._lerpStart.x - (this._easeInOutCubic(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x); } else { - this.focus.x = this._easeInOutCubic(this._currentLerpTime, + this.x = this._easeInOutCubic(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration); } if (this._lerpEnd.y < this._lerpStart.y) { - this.focus.y = this._lerpStart.y - (this._easeInOutCubic(this._currentLerpTime, + this.y = this._lerpStart.y - (this._easeInOutCubic(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y); } else { - this.focus.y = this._easeInOutCubic(this._currentLerpTime, + this.y = this._easeInOutCubic(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration); } this._currentLerpTime += delta; From a2ff1e12c70907742b3beef06a6b50f18e67a8eb Mon Sep 17 00:00:00 2001 From: eonarheim Date: Sun, 3 Jan 2016 15:35:45 -0600 Subject: [PATCH 2/9] Compile visual tests on build now with grunt --- GruntFile.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/GruntFile.js b/GruntFile.js index 7b06665d9..71572ce69 100644 --- a/GruntFile.js +++ b/GruntFile.js @@ -131,6 +131,20 @@ module.exports = function (grunt) { stdout: true, failOnError: true } + }, + + // + // Compile visual tests + // + visual: { + command: function() { + var files = grunt.file.expand("./sandbox/web/tests/*/*.ts"); + return 'tsc ' + files.join(' '); + }, + options: { + stdout: true, + failOnError: true + } } }, @@ -208,9 +222,11 @@ module.exports = function (grunt) { // Compile sample game grunt.registerTask('sample', ['shell:sample']); + + grunt.registerTask('visual', ['shell:visual']); // Default task - compile, test, build dists - grunt.registerTask('default', ['tslint:src', 'tests', 'coveralls', 'shell:tsc', 'minified', 'concat', 'copy', 'sample', 'shell:nuget']); + grunt.registerTask('default', ['tslint:src', 'tests', 'coveralls', 'shell:tsc', 'minified', 'concat', 'copy', 'sample', 'visual', 'shell:nuget']); grunt.registerTask('compile', ['shell:tsc', 'minified', 'concat', 'copy', 'shell:nuget']) From b8b5c5e7a873a25215044046581c458b70b4a958 Mon Sep 17 00:00:00 2001 From: eonarheim Date: Sun, 3 Jan 2016 15:36:26 -0600 Subject: [PATCH 3/9] Update visual tests after compile --- sandbox/web/Excalibur.js | 18294 +++++++++++---------- sandbox/web/src/game.js | 96 +- sandbox/web/tests/animation/animation.js | 1 - sandbox/web/tests/audio/index.js | 3 +- sandbox/web/tests/collision/index.js | 5 +- sandbox/web/tests/culling/culling.js | 19 +- sandbox/web/tests/group/group.js | 5 +- sandbox/web/tests/input/gamepad.js | 4 +- sandbox/web/tests/input/gamepad.ts | 4 +- sandbox/web/tests/input/index.js | 17 +- sandbox/web/tests/input/keyboard.js | 3 +- sandbox/web/tests/input/pointer.js | 5 +- sandbox/web/tests/label/label.js | 1 - sandbox/web/tests/rotation/rotation.js | 74 +- sandbox/web/tests/scene/lifecycle.js | 3 +- sandbox/web/tests/zoom/zoom.js | 13 +- 16 files changed, 9304 insertions(+), 9243 deletions(-) diff --git a/sandbox/web/Excalibur.js b/sandbox/web/Excalibur.js index 9730fd49e..25c92855e 100644 --- a/sandbox/web/Excalibur.js +++ b/sandbox/web/Excalibur.js @@ -1,885 +1,889 @@ -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; +/*! excalibur - v0.6.0 - 2016-01-03 +* https://github.com/excaliburjs/Excalibur +* Copyright (c) 2016 ; Licensed BSD-2-Clause*/ +if (typeof window === 'undefined') { + window = { audioContext: function () { return; } }; +} +if (typeof window !== 'undefined' && !window.requestAnimationFrame) { + window.requestAnimationFrame = + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function (callback) { window.setInterval(callback, 1000 / 60); }; +} +if (typeof window !== 'undefined' && !window.cancelAnimationFrame) { + window.cancelAnimationFrame = + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + function (callback) { return; }; +} +if (typeof window !== 'undefined' && !window.AudioContext) { + window.AudioContext = window.AudioContext || + window.webkitAudioContext || + window.mozAudioContext || + window.msAudioContext || + window.oAudioContext; +} +// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach +// Production steps of ECMA-262, Edition 5, 15.4.4.18 +// Reference: http://es5.github.io/#x15.4.4.18 +if (!Array.prototype.forEach) { + Array.prototype.forEach = function (callback, thisArg) { + var T, k; + if (this == null) { + throw new TypeError(' this is null or not defined'); + } + // 1. Let O be the result of calling ToObject passing the |this| value as the argument. + var O = Object(this); + // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". + // 3. Let len be ToUint32(lenValue). + var len = O.length >>> 0; + // 4. If IsCallable(callback) is false, throw a TypeError exception. + // See: http://es5.github.com/#x9.11 + if (typeof callback !== 'function') { + throw new TypeError(callback + ' is not a function'); + } + // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. + if (arguments.length > 1) { + T = thisArg; + } + // 6. Let k be 0 + k = 0; + // 7. Repeat, while k < len + while (k < len) { + var kValue; + // a. Let Pk be ToString(k). + // This is implicit for LHS operands of the in operator + // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. + // This step can be combined with c + // c. If kPresent is true, then + if (k in O) { + // i. Let kValue be the result of calling the Get internal method of O with argument Pk. + kValue = O[k]; + // ii. Call the Call internal method of callback with T as the this value and + // argument list containing kValue, k, and O. + callback.call(T, kValue, k, O); + } + // d. Increase k by 1. + k++; + } + // 8. return undefined + }; +} +// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some +if (!Array.prototype.some) { + Array.prototype.some = function (fun /*, thisArg */) { + 'use strict'; + if (this === void 0 || this === null) { + throw new TypeError(); + } + var t = Object(this); + var len = t.length >>> 0; + if (typeof fun !== 'function') { + throw new TypeError(); + } + var thisArg = arguments.length >= 2 ? arguments[1] : void 0; + for (var i = 0; i < len; i++) { + if (i in t && fun.call(thisArg, t[i], i, t)) { + return true; + } + } + return false; + }; +} +// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill +if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () { return; }, fBound = function () { + return fToBind.apply(this instanceof fNOP && oThis + ? this + : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); + }; + fNOP.prototype = this.prototype; + fBound.prototype = new fNOP(); + return fBound; + }; +} var ex; (function (ex) { /** - * A simple 2D point on a plane + * Effects + * + * These effects can be applied to any bitmap image but are mainly used + * for [[Sprite]] effects or [[Animation]] effects. + * + * Because these manipulate raw pixels, there is a performance impact to applying + * too many effects. Excalibur tries its best to by using caching to mitigate + * performance issues. + * + * Create your own effects by implementing [[ISpriteEffect]]. */ - var Point = (function () { - /** - * @param x X coordinate of the point - * @param y Y coordinate of the point - */ - function Point(x, y) { - this.x = x; - this.y = y; - } + var Effects; + (function (Effects) { /** - * Convert this point to a vector + * Applies the "Grayscale" effect to a sprite, removing color information. */ - Point.prototype.toVector = function () { - return new Vector(this.x, this.y); - }; + var Grayscale = (function () { + function Grayscale() { + } + Grayscale.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + var avg = (pixel[firstPixel + 0] + pixel[firstPixel + 1] + pixel[firstPixel + 2]) / 3; + pixel[firstPixel + 0] = avg; + pixel[firstPixel + 1] = avg; + pixel[firstPixel + 2] = avg; + }; + return Grayscale; + })(); + Effects.Grayscale = Grayscale; /** - * Rotates the current point around another by a certain number of - * degrees in radians - * @param angle The angle in radians - * @param anchor The point to rotate around + * Applies the "Invert" effect to a sprite, inverting the pixel colors. */ - Point.prototype.rotate = function (angle, anchor) { - if (!anchor) { - anchor = new ex.Point(0, 0); + var Invert = (function () { + function Invert() { } - var sinAngle = Math.sin(angle); - var cosAngle = Math.cos(angle); - var x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x; - var y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y; - return new Point(x, y); - }; + Invert.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + pixel[firstPixel + 0] = 255 - pixel[firstPixel + 0]; + pixel[firstPixel + 1] = 255 - pixel[firstPixel + 1]; + pixel[firstPixel + 2] = 255 - pixel[firstPixel + 2]; + }; + return Invert; + })(); + Effects.Invert = Invert; /** - * Translates the current point by a vector - * @param vector The other vector to add to + * Applies the "Opacity" effect to a sprite, setting the alpha of all pixels to a given value. */ - Point.prototype.add = function (vector) { - return new Point(this.x + vector.x, this.y + vector.y); - }; + var Opacity = (function () { + /** + * @param opacity The new opacity of the sprite from 0-1.0 + */ + function Opacity(opacity) { + this.opacity = opacity; + } + Opacity.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + if (pixel[firstPixel + 3] !== 0) { + pixel[firstPixel + 3] = Math.round(this.opacity * 255); + } + }; + return Opacity; + })(); + Effects.Opacity = Opacity; /** - * Sets the x and y components at once + * Applies the "Colorize" effect to a sprite, changing the color channels of all the pixels to an + * average of the original color and the provided color */ - Point.prototype.setTo = function (x, y) { - this.x = x; - this.y = y; - }; + var Colorize = (function () { + /** + * @param color The color to apply to the sprite + */ + function Colorize(color) { + this.color = color; + } + Colorize.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + if (pixel[firstPixel + 3] !== 0) { + pixel[firstPixel + 0] = (pixel[firstPixel + 0] + this.color.r) / 2; + pixel[firstPixel + 1] = (pixel[firstPixel + 1] + this.color.g) / 2; + pixel[firstPixel + 2] = (pixel[firstPixel + 2] + this.color.b) / 2; + } + }; + return Colorize; + })(); + Effects.Colorize = Colorize; /** - * Clones a new point that is a copy of this one. + * Applies the "Lighten" effect to a sprite, changes the lightness of the color according to HSL */ - Point.prototype.clone = function () { - return new Point(this.x, this.y); - }; + var Lighten = (function () { + /** + * @param factor The factor of the effect between 0-1 + */ + function Lighten(factor) { + if (factor === void 0) { factor = 0.1; } + this.factor = factor; + } + Lighten.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).lighten(this.factor); + pixel[firstPixel + 0] = color.r; + pixel[firstPixel + 1] = color.g; + pixel[firstPixel + 2] = color.b; + pixel[firstPixel + 3] = color.a; + }; + return Lighten; + })(); + Effects.Lighten = Lighten; /** - * Compares this point against another and tests for equality - * @param point The other point to compare to + * Applies the "Darken" effect to a sprite, changes the darkness of the color according to HSL */ - Point.prototype.equals = function (point) { - return this.x === point.x && this.y === point.y; - }; - return Point; - })(); - ex.Point = Point; - /** - * A 2D vector on a plane. - */ - var Vector = (function (_super) { - __extends(Vector, _super); - /** - * @param x X component of the Vector - * @param y Y component of the Vector - */ - function Vector(x, y) { - _super.call(this, x, y); - this.x = x; - this.y = y; - } - /** - * Returns a vector of unit length in the direction of the specified angle. - * @param angle The angle to generate the vector - */ - Vector.fromAngle = function (angle) { - return new Vector(Math.cos(angle), Math.sin(angle)); - }; - /** - * The distance to another vector - * @param v The other vector - */ - Vector.prototype.distance = function (v) { - if (!v) { - v = new Vector(0.0, 0.0); + var Darken = (function () { + /** + * @param factor The factor of the effect between 0-1 + */ + function Darken(factor) { + if (factor === void 0) { factor = 0.1; } + this.factor = factor; } - return Math.sqrt(Math.pow(this.x - v.x, 2) + Math.pow(this.y - v.y, 2)); - }; + Darken.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).darken(this.factor); + pixel[firstPixel + 0] = color.r; + pixel[firstPixel + 1] = color.g; + pixel[firstPixel + 2] = color.b; + pixel[firstPixel + 3] = color.a; + }; + return Darken; + })(); + Effects.Darken = Darken; /** - * Normalizes a vector to have a magnitude of 1. + * Applies the "Saturate" effect to a sprite, saturates the color acccording to HSL */ - Vector.prototype.normalize = function () { - var d = this.distance(); - if (d > 0) { - return new Vector(this.x / d, this.y / d); - } - else { - return new Vector(0, 1); + var Saturate = (function () { + /** + * @param factor The factor of the effect between 0-1 + */ + function Saturate(factor) { + if (factor === void 0) { factor = 0.1; } + this.factor = factor; } - }; - /** - * Scales a vector's by a factor of size - * @param size The factor to scale the magnitude by - */ - Vector.prototype.scale = function (size) { - return new Vector(this.x * size, this.y * size); - }; - /** - * Adds one vector to another, alias for add - * @param v The vector to add - */ - Vector.prototype.plus = function (v) { - return this.add(v); - }; - /** - * Adds one vector to another - * @param v The vector to add - */ - Vector.prototype.add = function (v) { - return new Vector(this.x + v.x, this.y + v.y); - }; - /** - * Subtracts a vector from another, alias for minus - * @param v The vector to subtract - */ - Vector.prototype.subtract = function (v) { - return this.minus(v); - }; - /** - * Subtracts a vector from the current vector - * @param v The vector to subtract - */ - Vector.prototype.minus = function (v) { - return new Vector(this.x - v.x, this.y - v.y); - }; - /** - * Performs a dot product with another vector - * @param v The vector to dot - */ - Vector.prototype.dot = function (v) { - return this.x * v.x + this.y * v.y; - }; - /** - * Performs a 2D cross product with another vector. 2D cross products return a scalar value not a vector. - * @param v The vector to cross - */ - Vector.prototype.cross = function (v) { - return this.x * v.y - this.y * v.x; - }; - /** - * Returns the perpendicular vector to this one - */ - Vector.prototype.perpendicular = function () { - return new Vector(this.y, -this.x); - }; - /** - * Returns the normal vector to this one - */ - Vector.prototype.normal = function () { - return this.perpendicular().normalize(); - }; - /** - * Returns the angle of this vector. - */ - Vector.prototype.toAngle = function () { - return Math.atan2(this.y, this.x); - }; - /** - * Returns the point represention of this vector - */ - Vector.prototype.toPoint = function () { - return new Point(this.x, this.y); - }; - /** - * Rotates the current vector around a point by a certain number of - * degrees in radians - */ - Vector.prototype.rotate = function (angle, anchor) { - return _super.prototype.rotate.call(this, angle, anchor).toVector(); - }; - /** - * Creates new vector that has the same values as the previous. - */ - Vector.prototype.clone = function () { - return new Vector(this.x, this.y); - }; - /** - * A (0, 0) vector - */ - Vector.Zero = new Vector(0, 0); - return Vector; - })(Point); - ex.Vector = Vector; - /** - * A 2D ray that can be cast into the scene to do collision detection - */ - var Ray = (function () { + Saturate.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).saturate(this.factor); + pixel[firstPixel + 0] = color.r; + pixel[firstPixel + 1] = color.g; + pixel[firstPixel + 2] = color.b; + pixel[firstPixel + 3] = color.a; + }; + return Saturate; + })(); + Effects.Saturate = Saturate; /** - * @param pos The starting position for the ray - * @param dir The vector indicating the direction of the ray + * Applies the "Desaturate" effect to a sprite, desaturates the color acccording to HSL */ - function Ray(pos, dir) { - this.pos = pos; - this.dir = dir.normalize(); - } + var Desaturate = (function () { + /** + * @param factor The factor of the effect between 0-1 + */ + function Desaturate(factor) { + if (factor === void 0) { factor = 0.1; } + this.factor = factor; + } + Desaturate.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).desaturate(this.factor); + pixel[firstPixel + 0] = color.r; + pixel[firstPixel + 1] = color.g; + pixel[firstPixel + 2] = color.b; + pixel[firstPixel + 3] = color.a; + }; + return Desaturate; + })(); + Effects.Desaturate = Desaturate; /** - * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success. - * This number indicates the mathematical intersection time. - * @param line The line to test + * Applies the "Fill" effect to a sprite, changing the color channels of all non-transparent pixels to match + * a given color */ - Ray.prototype.intersect = function (line) { - var numerator = line.begin.toVector().minus(this.pos.toVector()); - // Test is line and ray are parallel and non intersecting - if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) { - return -1; - } - // Lines are parallel - var divisor = (this.dir.cross(line.getSlope())); - if (divisor === 0) { - return -1; + var Fill = (function () { + /** + * @param color The color to apply to the sprite + */ + function Fill(color) { + this.color = color; } - var t = numerator.cross(line.getSlope()) / divisor; - if (t >= 0) { - var u = (numerator.cross(this.dir) / divisor) / line.getLength(); - if (u >= 0 && u <= 1) { - return t; + Fill.prototype.updatePixel = function (x, y, imageData) { + var firstPixel = (x + y * imageData.width) * 4; + var pixel = imageData.data; + if (pixel[firstPixel + 3] !== 0) { + pixel[firstPixel + 0] = this.color.r; + pixel[firstPixel + 1] = this.color.g; + pixel[firstPixel + 2] = this.color.b; } + }; + return Fill; + })(); + Effects.Fill = Fill; + })(Effects = ex.Effects || (ex.Effects = {})); +})(ex || (ex = {})); +/// +/// +var ex; +(function (ex) { + var Traits; + (function (Traits) { + var Movement = (function () { + function Movement() { } - return -1; - }; - /** - * Returns the point of intersection given the intersection time - */ - Ray.prototype.getPoint = function (time) { - return this.pos.toVector().add(this.dir.scale(time)).toPoint(); - }; - return Ray; - })(); - ex.Ray = Ray; - /** - * A 2D line segment - */ - var Line = (function () { - /** - * @param begin The starting point of the line segment - * @param end The ending point of the line segment - */ - function Line(begin, end) { - this.begin = begin; - this.end = end; + Movement.prototype.update = function (actor, engine, delta) { + // Update placements based on linear algebra + actor.x += actor.dx * delta / 1000; + actor.y += actor.dy * delta / 1000; + actor.dx += actor.ax * delta / 1000; + actor.dy += actor.ay * delta / 1000; + actor.rotation += actor.rx * delta / 1000; + actor.scale.x += actor.sx * delta / 1000; + actor.scale.y += actor.sy * delta / 1000; + }; + return Movement; + })(); + Traits.Movement = Movement; + })(Traits = ex.Traits || (ex.Traits = {})); +})(ex || (ex = {})); +var ex; +(function (ex) { + var CullingBox = (function () { + function CullingBox() { + this._topLeft = new ex.Point(0, 0); + this._topRight = new ex.Point(0, 0); + this._bottomLeft = new ex.Point(0, 0); + this._bottomRight = new ex.Point(0, 0); } - /** - * Returns the slope of the line in the form of a vector - */ - Line.prototype.getSlope = function () { - var begin = this.begin.toVector(); - var end = this.end.toVector(); - var distance = begin.distance(end); - return end.minus(begin).scale(1 / distance); + CullingBox.prototype.isSpriteOffScreen = function (actor, engine) { + var drawingWidth = actor.currentDrawing.width * actor.currentDrawing.scale.x; + var drawingHeight = actor.currentDrawing.height * actor.currentDrawing.scale.y; + var rotation = actor.rotation; + var anchor = actor.getCenter().toPoint(); + this._topLeft.x = actor.getWorldX() - (drawingWidth / 2); + this._topLeft.y = actor.getWorldY() - (drawingHeight / 2); + this._topLeft = this._topLeft.rotate(rotation, anchor); + this._topRight.x = actor.getWorldX() + (drawingWidth / 2); + this._topRight.y = actor.getWorldY() - (drawingHeight / 2); + this._topRight = this._topRight.rotate(rotation, anchor); + this._bottomLeft.x = actor.getWorldX() - (drawingWidth / 2); + this._bottomLeft.y = actor.getWorldY() + (drawingHeight / 2); + this._bottomLeft = this._bottomLeft.rotate(rotation, anchor); + this._bottomRight.x = actor.getWorldX() + (drawingWidth / 2); + this._bottomRight.y = actor.getWorldY() + (drawingHeight / 2); + this._bottomRight = this._bottomRight.rotate(rotation, anchor); + /// + var topLeftScreen = engine.worldToScreenCoordinates(this._topLeft); + var topRightScreen = engine.worldToScreenCoordinates(this._topRight); + var bottomLeftScreen = engine.worldToScreenCoordinates(this._bottomLeft); + var bottomRightScreen = engine.worldToScreenCoordinates(this._bottomRight); + this._xCoords = []; + this._yCoords = []; + this._xCoords.push(topLeftScreen.x, topRightScreen.x, bottomLeftScreen.x, bottomRightScreen.x); + this._yCoords.push(topLeftScreen.y, topRightScreen.y, bottomLeftScreen.y, bottomRightScreen.y); + this._xMin = Math.min.apply(null, this._xCoords); + this._yMin = Math.min.apply(null, this._yCoords); + this._xMax = Math.max.apply(null, this._xCoords); + this._yMax = Math.max.apply(null, this._yCoords); + var minWorld = engine.screenToWorldCoordinates(new ex.Point(this._xMin, this._yMin)); + var maxWorld = engine.screenToWorldCoordinates(new ex.Point(this._xMax, this._yMax)); + this._xMinWorld = minWorld.x; + this._yMinWorld = minWorld.y; + this._xMaxWorld = maxWorld.x; + this._yMaxWorld = maxWorld.y; + var boundingPoints = new Array(); + boundingPoints.push(new ex.Point(this._xMin, this._yMin), new ex.Point(this._xMax, this._yMin), new ex.Point(this._xMin, this._yMax), new ex.Point(this._xMax, this._yMax)); + for (var i = 0; i < boundingPoints.length; i++) { + if (boundingPoints[i].x > 0 && + boundingPoints[i].y > 0 && + boundingPoints[i].x < engine.canvas.clientWidth && + boundingPoints[i].y < engine.canvas.clientHeight) { + return false; + } + } + return true; }; - /** - * Returns the length of the line segment in pixels - */ - Line.prototype.getLength = function () { - var begin = this.begin.toVector(); - var end = this.end.toVector(); - var distance = begin.distance(end); - return distance; + CullingBox.prototype.debugDraw = function (ctx) { + // bounding rectangle + ctx.beginPath(); + ctx.strokeStyle = ex.Color.White.toString(); + ctx.rect(this._xMinWorld, this._yMinWorld, this._xMaxWorld - this._xMinWorld, this._yMaxWorld - this._yMinWorld); + ctx.stroke(); + ctx.fillStyle = ex.Color.Red.toString(); + ctx.beginPath(); + ctx.arc(this._topLeft.x, this._topLeft.y, 5, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + ctx.fillStyle = ex.Color.Green.toString(); + ctx.beginPath(); + ctx.arc(this._topRight.x, this._topRight.y, 5, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + ctx.fillStyle = ex.Color.Blue.toString(); + ctx.beginPath(); + ctx.arc(this._bottomLeft.x, this._bottomLeft.y, 5, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + ctx.fillStyle = ex.Color.Magenta.toString(); + ctx.beginPath(); + ctx.arc(this._bottomRight.x, this._bottomRight.y, 5, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); }; - return Line; + return CullingBox; })(); - ex.Line = Line; - /** - * A projection - * @todo - */ - var Projection = (function () { - function Projection(min, max) { - this.min = min; - this.max = max; - } - Projection.prototype.overlaps = function (projection) { - return this.max > projection.min && projection.max > this.min; - }; - Projection.prototype.getOverlap = function (projection) { - if (this.overlaps(projection)) { - if (this.max > projection.max) { - return projection.max - this.min; + ex.CullingBox = CullingBox; +})(ex || (ex = {})); +/// +/// +var ex; +(function (ex) { + var Traits; + (function (Traits) { + var OffscreenCulling = (function () { + function OffscreenCulling() { + this.cullingBox = new ex.CullingBox(); + } + OffscreenCulling.prototype.update = function (actor, engine, delta) { + var eventDispatcher = actor.eventDispatcher; + var anchor = actor.anchor; + var globalScale = actor.getGlobalScale(); + var width = globalScale.x * actor.getWidth() / actor.scale.x; + var height = globalScale.y * actor.getHeight() / actor.scale.y; + var actorScreenCoords = engine.worldToScreenCoordinates(new ex.Point(actor.getWorldX() - anchor.x * width, actor.getWorldY() - anchor.y * height)); + var zoom = 1.0; + if (actor.scene && actor.scene.camera) { + zoom = actor.scene.camera.getZoom(); + } + var isSpriteOffScreen = true; + if (actor.currentDrawing != null) { + isSpriteOffScreen = this.cullingBox.isSpriteOffScreen(actor, engine); + } + if (!actor.isOffScreen) { + if ((actorScreenCoords.x + width * zoom < 0 || + actorScreenCoords.y + height * zoom < 0 || + actorScreenCoords.x > engine.width || + actorScreenCoords.y > engine.height) && + isSpriteOffScreen) { + eventDispatcher.emit('exitviewport', new ex.ExitViewPortEvent()); + actor.isOffScreen = true; + } } else { - return this.max - projection.min; + if ((actorScreenCoords.x + width * zoom > 0 && + actorScreenCoords.y + height * zoom > 0 && + actorScreenCoords.x < engine.width && + actorScreenCoords.y < engine.height) || + !isSpriteOffScreen) { + eventDispatcher.emit('enterviewport', new ex.EnterViewPortEvent()); + actor.isOffScreen = false; + } } + }; + return OffscreenCulling; + })(); + Traits.OffscreenCulling = OffscreenCulling; + })(Traits = ex.Traits || (ex.Traits = {})); +})(ex || (ex = {})); +/// +var ex; +(function (ex) { + var Traits; + (function (Traits) { + /** + * Propogates pointer events to the actor + */ + var CapturePointer = (function () { + function CapturePointer() { } - return 0; - }; - return Projection; - })(); - ex.Projection = Projection; + CapturePointer.prototype.update = function (actor, engine, delta) { + if (!actor.enableCapturePointer) { + return; + } + if (actor.isKilled()) { + return; + } + engine.input.pointers.propogate(actor); + }; + return CapturePointer; + })(); + Traits.CapturePointer = CapturePointer; + })(Traits = ex.Traits || (ex.Traits = {})); })(ex || (ex = {})); -if (typeof window === 'undefined') { - window = { audioContext: function () { return; } }; -} -if (typeof window !== 'undefined' && !window.requestAnimationFrame) { - window.requestAnimationFrame = - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - function (callback) { window.setInterval(callback, 1000 / 60); }; -} -if (typeof window !== 'undefined' && !window.cancelAnimationFrame) { - window.cancelAnimationFrame = - window.webkitCancelAnimationFrame || - window.mozCancelAnimationFrame || - function (callback) { return; }; -} -if (typeof window !== 'undefined' && !window.AudioContext) { - window.AudioContext = window.AudioContext || - window.webkitAudioContext || - window.mozAudioContext || - window.msAudioContext || - window.oAudioContext; -} -// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach -// Production steps of ECMA-262, Edition 5, 15.4.4.18 -// Reference: http://es5.github.io/#x15.4.4.18 -if (!Array.prototype.forEach) { - Array.prototype.forEach = function (callback, thisArg) { - var T, k; - if (this == null) { - throw new TypeError(' this is null or not defined'); - } - // 1. Let O be the result of calling ToObject passing the |this| value as the argument. - var O = Object(this); - // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". - // 3. Let len be ToUint32(lenValue). - var len = O.length >>> 0; - // 4. If IsCallable(callback) is false, throw a TypeError exception. - // See: http://es5.github.com/#x9.11 - if (typeof callback !== 'function') { - throw new TypeError(callback + ' is not a function'); - } - // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. - if (arguments.length > 1) { - T = thisArg; - } - // 6. Let k be 0 - k = 0; - // 7. Repeat, while k < len - while (k < len) { - var kValue; - // a. Let Pk be ToString(k). - // This is implicit for LHS operands of the in operator - // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. - // This step can be combined with c - // c. If kPresent is true, then - if (k in O) { - // i. Let kValue be the result of calling the Get internal method of O with argument Pk. - kValue = O[k]; - // ii. Call the Call internal method of callback with T as the this value and - // argument list containing kValue, k, and O. - callback.call(T, kValue, k, O); - } - // d. Increase k by 1. - k++; - } - // 8. return undefined - }; -} -// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some -if (!Array.prototype.some) { - Array.prototype.some = function (fun /*, thisArg */) { - 'use strict'; - if (this === void 0 || this === null) { - throw new TypeError(); - } - var t = Object(this); - var len = t.length >>> 0; - if (typeof fun !== 'function') { - throw new TypeError(); - } - var thisArg = arguments.length >= 2 ? arguments[1] : void 0; - for (var i = 0; i < len; i++) { - if (i in t && fun.call(thisArg, t[i], i, t)) { - return true; +/// +var ex; +(function (ex) { + var Traits; + (function (Traits) { + var CollisionDetection = (function () { + function CollisionDetection() { } - } - return false; - }; -} -// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill -if (!Function.prototype.bind) { - Function.prototype.bind = function (oThis) { - if (typeof this !== 'function') { - // closest thing possible to the ECMAScript 5 - // internal IsCallable function - throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); - } - var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () { return; }, fBound = function () { - return fToBind.apply(this instanceof fNOP && oThis - ? this - : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); - }; - fNOP.prototype = this.prototype; - fBound.prototype = new fNOP(); - return fBound; - }; -} + CollisionDetection.prototype.update = function (actor, engine, delta) { + var eventDispatcher = actor.eventDispatcher; + if (actor.collisionType !== ex.CollisionType.PreventCollision && engine.currentScene && engine.currentScene.tileMaps) { + for (var j = 0; j < engine.currentScene.tileMaps.length; j++) { + var map = engine.currentScene.tileMaps[j]; + var intersectMap; + var side = ex.Side.None; + var max = 2; + var hasBounced = false; + while (intersectMap = map.collides(actor)) { + if (max-- < 0) { + break; + } + side = actor.getSideFromIntersect(intersectMap); + eventDispatcher.emit('collision', new ex.CollisionEvent(actor, null, side, intersectMap)); + if ((actor.collisionType === ex.CollisionType.Active || actor.collisionType === ex.CollisionType.Elastic)) { + actor.y += intersectMap.y; + actor.x += intersectMap.x; + // Naive elastic bounce + if (actor.collisionType === ex.CollisionType.Elastic && !hasBounced) { + hasBounced = true; + if (side === ex.Side.Left) { + actor.dx = Math.abs(actor.dx); + } + else if (side === ex.Side.Right) { + actor.dx = -Math.abs(actor.dx); + } + else if (side === ex.Side.Top) { + actor.dy = Math.abs(actor.dy); + } + else if (side === ex.Side.Bottom) { + actor.dy = -Math.abs(actor.dy); + } + } + } + } + } + } + }; + return CollisionDetection; + })(); + Traits.CollisionDetection = CollisionDetection; + })(Traits = ex.Traits || (ex.Traits = {})); +})(ex || (ex = {})); var ex; (function (ex) { /** - * Effects - * - * These effects can be applied to any bitmap image but are mainly used - * for [[Sprite]] effects or [[Animation]] effects. - * - * Because these manipulate raw pixels, there is a performance impact to applying - * too many effects. Excalibur tries its best to by using caching to mitigate - * performance issues. - * - * Create your own effects by implementing [[ISpriteEffect]]. + * An enum that describes the sides of an Actor for collision */ - var Effects; - (function (Effects) { + (function (Side) { + Side[Side["None"] = 0] = "None"; + Side[Side["Top"] = 1] = "Top"; + Side[Side["Bottom"] = 2] = "Bottom"; + Side[Side["Left"] = 3] = "Left"; + Side[Side["Right"] = 4] = "Right"; + })(ex.Side || (ex.Side = {})); + var Side = ex.Side; +})(ex || (ex = {})); +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var ex; +(function (ex) { + /** + * A simple 2D point on a plane + * @obsolete Use [[Vector|vector]]s instead of [[Point|points]] + */ + var Point = (function () { /** - * Applies the "Grayscale" effect to a sprite, removing color information. + * @param x X coordinate of the point + * @param y Y coordinate of the point */ - var Grayscale = (function () { - function Grayscale() { - } - Grayscale.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - var avg = (pixel[firstPixel + 0] + pixel[firstPixel + 1] + pixel[firstPixel + 2]) / 3; - pixel[firstPixel + 0] = avg; - pixel[firstPixel + 1] = avg; - pixel[firstPixel + 2] = avg; - }; - return Grayscale; - })(); - Effects.Grayscale = Grayscale; + function Point(x, y) { + this.x = x; + this.y = y; + } /** - * Applies the "Invert" effect to a sprite, inverting the pixel colors. + * Convert this point to a vector */ - var Invert = (function () { - function Invert() { - } - Invert.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - pixel[firstPixel + 0] = 255 - pixel[firstPixel + 0]; - pixel[firstPixel + 1] = 255 - pixel[firstPixel + 1]; - pixel[firstPixel + 2] = 255 - pixel[firstPixel + 2]; - }; - return Invert; - })(); - Effects.Invert = Invert; + Point.prototype.toVector = function () { + return new Vector(this.x, this.y); + }; /** - * Applies the "Opacity" effect to a sprite, setting the alpha of all pixels to a given value. + * Rotates the current point around another by a certain number of + * degrees in radians + * @param angle The angle in radians + * @param anchor The point to rotate around */ - var Opacity = (function () { - /** - * @param opacity The new opacity of the sprite from 0-1.0 - */ - function Opacity(opacity) { - this.opacity = opacity; + Point.prototype.rotate = function (angle, anchor) { + if (!anchor) { + anchor = new ex.Point(0, 0); } - Opacity.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - if (pixel[firstPixel + 3] !== 0) { - pixel[firstPixel + 3] = Math.round(this.opacity * 255); - } - }; - return Opacity; - })(); - Effects.Opacity = Opacity; + var sinAngle = Math.sin(angle); + var cosAngle = Math.cos(angle); + var x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x; + var y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y; + return new Point(x, y); + }; /** - * Applies the "Colorize" effect to a sprite, changing the color channels of all the pixels to an - * average of the original color and the provided color + * Translates the current point by a vector + * @param vector The other vector to add to */ - var Colorize = (function () { - /** - * @param color The color to apply to the sprite - */ - function Colorize(color) { - this.color = color; - } - Colorize.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - if (pixel[firstPixel + 3] !== 0) { - pixel[firstPixel + 0] = (pixel[firstPixel + 0] + this.color.r) / 2; - pixel[firstPixel + 1] = (pixel[firstPixel + 1] + this.color.g) / 2; - pixel[firstPixel + 2] = (pixel[firstPixel + 2] + this.color.b) / 2; - } - }; - return Colorize; - })(); - Effects.Colorize = Colorize; + Point.prototype.add = function (vector) { + return new Point(this.x + vector.x, this.y + vector.y); + }; /** - * Applies the "Lighten" effect to a sprite, changes the lightness of the color according to HSL + * Sets the x and y components at once */ - var Lighten = (function () { - /** - * @param factor The factor of the effect between 0-1 - */ - function Lighten(factor) { - if (factor === void 0) { factor = 0.1; } - this.factor = factor; - } - Lighten.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).lighten(this.factor); - pixel[firstPixel + 0] = color.r; - pixel[firstPixel + 1] = color.g; - pixel[firstPixel + 2] = color.b; - pixel[firstPixel + 3] = color.a; - }; - return Lighten; - })(); - Effects.Lighten = Lighten; + Point.prototype.setTo = function (x, y) { + this.x = x; + this.y = y; + }; /** - * Applies the "Darken" effect to a sprite, changes the darkness of the color according to HSL + * Clones a new point that is a copy of this one. */ - var Darken = (function () { - /** - * @param factor The factor of the effect between 0-1 - */ - function Darken(factor) { - if (factor === void 0) { factor = 0.1; } - this.factor = factor; - } - Darken.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).darken(this.factor); - pixel[firstPixel + 0] = color.r; - pixel[firstPixel + 1] = color.g; - pixel[firstPixel + 2] = color.b; - pixel[firstPixel + 3] = color.a; - }; - return Darken; - })(); - Effects.Darken = Darken; + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; /** - * Applies the "Saturate" effect to a sprite, saturates the color acccording to HSL + * Compares this point against another and tests for equality + * @param point The other point to compare to */ - var Saturate = (function () { - /** - * @param factor The factor of the effect between 0-1 - */ - function Saturate(factor) { - if (factor === void 0) { factor = 0.1; } - this.factor = factor; - } - Saturate.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).saturate(this.factor); - pixel[firstPixel + 0] = color.r; - pixel[firstPixel + 1] = color.g; - pixel[firstPixel + 2] = color.b; - pixel[firstPixel + 3] = color.a; - }; - return Saturate; - })(); - Effects.Saturate = Saturate; + Point.prototype.equals = function (point) { + return this.x === point.x && this.y === point.y; + }; + return Point; + })(); + ex.Point = Point; + /** + * A 2D vector on a plane. + */ + var Vector = (function (_super) { + __extends(Vector, _super); /** - * Applies the "Desaturate" effect to a sprite, desaturates the color acccording to HSL + * @param x X component of the Vector + * @param y Y component of the Vector */ - var Desaturate = (function () { - /** - * @param factor The factor of the effect between 0-1 - */ - function Desaturate(factor) { - if (factor === void 0) { factor = 0.1; } - this.factor = factor; - } - Desaturate.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - var color = ex.Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).desaturate(this.factor); - pixel[firstPixel + 0] = color.r; - pixel[firstPixel + 1] = color.g; - pixel[firstPixel + 2] = color.b; - pixel[firstPixel + 3] = color.a; - }; - return Desaturate; - })(); - Effects.Desaturate = Desaturate; + function Vector(x, y) { + _super.call(this, x, y); + this.x = x; + this.y = y; + } /** - * Applies the "Fill" effect to a sprite, changing the color channels of all non-transparent pixels to match - * a given color + * Returns a vector of unit length in the direction of the specified angle. + * @param angle The angle to generate the vector */ - var Fill = (function () { - /** - * @param color The color to apply to the sprite - */ - function Fill(color) { - this.color = color; + Vector.fromAngle = function (angle) { + return new Vector(Math.cos(angle), Math.sin(angle)); + }; + /** + * The distance to another vector + * @param v The other vector + */ + Vector.prototype.distance = function (v) { + if (!v) { + v = new Vector(0.0, 0.0); } - Fill.prototype.updatePixel = function (x, y, imageData) { - var firstPixel = (x + y * imageData.width) * 4; - var pixel = imageData.data; - if (pixel[firstPixel + 3] !== 0) { - pixel[firstPixel + 0] = this.color.r; - pixel[firstPixel + 1] = this.color.g; - pixel[firstPixel + 2] = this.color.b; - } - }; - return Fill; - })(); - Effects.Fill = Fill; - })(Effects = ex.Effects || (ex.Effects = {})); -})(ex || (ex = {})); -/// -/// -var ex; -(function (ex) { - var Traits; - (function (Traits) { - var Movement = (function () { - function Movement() { + return Math.sqrt(Math.pow(this.x - v.x, 2) + Math.pow(this.y - v.y, 2)); + }; + /** + * Normalizes a vector to have a magnitude of 1. + */ + Vector.prototype.normalize = function () { + var d = this.distance(); + if (d > 0) { + return new Vector(this.x / d, this.y / d); } - Movement.prototype.update = function (actor, engine, delta) { - // Update placements based on linear algebra - actor.x += actor.dx * delta / 1000; - actor.y += actor.dy * delta / 1000; - actor.dx += actor.ax * delta / 1000; - actor.dy += actor.ay * delta / 1000; - actor.rotation += actor.rx * delta / 1000; - actor.scale.x += actor.sx * delta / 1000; - actor.scale.y += actor.sy * delta / 1000; - }; - return Movement; - })(); - Traits.Movement = Movement; - })(Traits = ex.Traits || (ex.Traits = {})); -})(ex || (ex = {})); -var ex; -(function (ex) { - var CullingBox = (function () { - function CullingBox() { - this._topLeft = new ex.Point(0, 0); - this._topRight = new ex.Point(0, 0); - this._bottomLeft = new ex.Point(0, 0); - this._bottomRight = new ex.Point(0, 0); - } - CullingBox.prototype.isSpriteOffScreen = function (actor, engine) { - var drawingWidth = actor.currentDrawing.width * actor.currentDrawing.scale.x; - var drawingHeight = actor.currentDrawing.height * actor.currentDrawing.scale.y; - var rotation = actor.rotation; - var anchor = actor.getCenter().toPoint(); - this._topLeft.x = actor.getWorldX() - (drawingWidth / 2); - this._topLeft.y = actor.getWorldY() - (drawingHeight / 2); - this._topLeft = this._topLeft.rotate(rotation, anchor); - this._topRight.x = actor.getWorldX() + (drawingWidth / 2); - this._topRight.y = actor.getWorldY() - (drawingHeight / 2); - this._topRight = this._topRight.rotate(rotation, anchor); - this._bottomLeft.x = actor.getWorldX() - (drawingWidth / 2); - this._bottomLeft.y = actor.getWorldY() + (drawingHeight / 2); - this._bottomLeft = this._bottomLeft.rotate(rotation, anchor); - this._bottomRight.x = actor.getWorldX() + (drawingWidth / 2); - this._bottomRight.y = actor.getWorldY() + (drawingHeight / 2); - this._bottomRight = this._bottomRight.rotate(rotation, anchor); - /// - var topLeftScreen = engine.worldToScreenCoordinates(this._topLeft); - var topRightScreen = engine.worldToScreenCoordinates(this._topRight); - var bottomLeftScreen = engine.worldToScreenCoordinates(this._bottomLeft); - var bottomRightScreen = engine.worldToScreenCoordinates(this._bottomRight); - this._xCoords = []; - this._yCoords = []; - this._xCoords.push(topLeftScreen.x, topRightScreen.x, bottomLeftScreen.x, bottomRightScreen.x); - this._yCoords.push(topLeftScreen.y, topRightScreen.y, bottomLeftScreen.y, bottomRightScreen.y); - this._xMin = Math.min.apply(null, this._xCoords); - this._yMin = Math.min.apply(null, this._yCoords); - this._xMax = Math.max.apply(null, this._xCoords); - this._yMax = Math.max.apply(null, this._yCoords); - var minWorld = engine.screenToWorldCoordinates(new ex.Point(this._xMin, this._yMin)); - var maxWorld = engine.screenToWorldCoordinates(new ex.Point(this._xMax, this._yMax)); - this._xMinWorld = minWorld.x; - this._yMinWorld = minWorld.y; - this._xMaxWorld = maxWorld.x; - this._yMaxWorld = maxWorld.y; - var boundingPoints = new Array(); - boundingPoints.push(new ex.Point(this._xMin, this._yMin), new ex.Point(this._xMax, this._yMin), new ex.Point(this._xMin, this._yMax), new ex.Point(this._xMax, this._yMax)); - for (var i = 0; i < boundingPoints.length; i++) { - if (boundingPoints[i].x > 0 && - boundingPoints[i].y > 0 && - boundingPoints[i].x < engine.canvas.clientWidth && - boundingPoints[i].y < engine.canvas.clientHeight) { - return false; - } + else { + return new Vector(0, 1); } - return true; }; - CullingBox.prototype.debugDraw = function (ctx) { - // bounding rectangle - ctx.beginPath(); - ctx.strokeStyle = ex.Color.White.toString(); - ctx.rect(this._xMinWorld, this._yMinWorld, this._xMaxWorld - this._xMinWorld, this._yMaxWorld - this._yMinWorld); - ctx.stroke(); - ctx.fillStyle = ex.Color.Red.toString(); - ctx.beginPath(); - ctx.arc(this._topLeft.x, this._topLeft.y, 5, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - ctx.fillStyle = ex.Color.Green.toString(); - ctx.beginPath(); - ctx.arc(this._topRight.x, this._topRight.y, 5, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - ctx.fillStyle = ex.Color.Blue.toString(); - ctx.beginPath(); - ctx.arc(this._bottomLeft.x, this._bottomLeft.y, 5, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - ctx.fillStyle = ex.Color.Magenta.toString(); - ctx.beginPath(); - ctx.arc(this._bottomRight.x, this._bottomRight.y, 5, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); + /** + * Scales a vector's by a factor of size + * @param size The factor to scale the magnitude by + */ + Vector.prototype.scale = function (size) { + return new Vector(this.x * size, this.y * size); }; - return CullingBox; - })(); - ex.CullingBox = CullingBox; -})(ex || (ex = {})); -/// -/// -var ex; -(function (ex) { - var Traits; - (function (Traits) { - var OffscreenCulling = (function () { - function OffscreenCulling() { - this.cullingBox = new ex.CullingBox(); + /** + * Adds one vector to another, alias for add + * @param v The vector to add + */ + Vector.prototype.plus = function (v) { + return this.add(v); + }; + /** + * Adds one vector to another + * @param v The vector to add + */ + Vector.prototype.add = function (v) { + return new Vector(this.x + v.x, this.y + v.y); + }; + /** + * Subtracts a vector from another, alias for minus + * @param v The vector to subtract + */ + Vector.prototype.subtract = function (v) { + return this.minus(v); + }; + /** + * Subtracts a vector from the current vector + * @param v The vector to subtract + */ + Vector.prototype.minus = function (v) { + return new Vector(this.x - v.x, this.y - v.y); + }; + /** + * Performs a dot product with another vector + * @param v The vector to dot + */ + Vector.prototype.dot = function (v) { + return this.x * v.x + this.y * v.y; + }; + /** + * Performs a 2D cross product with another vector. 2D cross products return a scalar value not a vector. + * @param v The vector to cross + */ + Vector.prototype.cross = function (v) { + return this.x * v.y - this.y * v.x; + }; + /** + * Returns the perpendicular vector to this one + */ + Vector.prototype.perpendicular = function () { + return new Vector(this.y, -this.x); + }; + /** + * Returns the normal vector to this one + */ + Vector.prototype.normal = function () { + return this.perpendicular().normalize(); + }; + /** + * Returns the angle of this vector. + */ + Vector.prototype.toAngle = function () { + return Math.atan2(this.y, this.x); + }; + /** + * Returns the point represention of this vector + */ + Vector.prototype.toPoint = function () { + return new Point(this.x, this.y); + }; + /** + * Rotates the current vector around a point by a certain number of + * degrees in radians + */ + Vector.prototype.rotate = function (angle, anchor) { + return _super.prototype.rotate.call(this, angle, anchor).toVector(); + }; + /** + * Creates new vector that has the same values as the previous. + */ + Vector.prototype.clone = function () { + return new Vector(this.x, this.y); + }; + /** + * A (0, 0) vector + */ + Vector.Zero = new Vector(0, 0); + return Vector; + })(Point); + ex.Vector = Vector; + /** + * A 2D ray that can be cast into the scene to do collision detection + */ + var Ray = (function () { + /** + * @param pos The starting position for the ray + * @param dir The vector indicating the direction of the ray + */ + function Ray(pos, dir) { + this.pos = pos; + this.dir = dir.normalize(); + } + /** + * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success. + * This number indicates the mathematical intersection time. + * @param line The line to test + */ + Ray.prototype.intersect = function (line) { + var numerator = line.begin.toVector().minus(this.pos.toVector()); + // Test is line and ray are parallel and non intersecting + if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) { + return -1; } - OffscreenCulling.prototype.update = function (actor, engine, delta) { - var eventDispatcher = actor.eventDispatcher; - var anchor = actor.anchor; - var globalScale = actor.getGlobalScale(); - var width = globalScale.x * actor.getWidth() / actor.scale.x; - var height = globalScale.y * actor.getHeight() / actor.scale.y; - var actorScreenCoords = engine.worldToScreenCoordinates(new ex.Point(actor.getWorldX() - anchor.x * width, actor.getWorldY() - anchor.y * height)); - var zoom = 1.0; - if (actor.scene && actor.scene.camera) { - zoom = actor.scene.camera.getZoom(); - } - var isSpriteOffScreen = true; - if (actor.currentDrawing != null) { - isSpriteOffScreen = this.cullingBox.isSpriteOffScreen(actor, engine); + // Lines are parallel + var divisor = (this.dir.cross(line.getSlope())); + if (divisor === 0) { + return -1; + } + var t = numerator.cross(line.getSlope()) / divisor; + if (t >= 0) { + var u = (numerator.cross(this.dir) / divisor) / line.getLength(); + if (u >= 0 && u <= 1) { + return t; } - if (!actor.isOffScreen) { - if ((actorScreenCoords.x + width * zoom < 0 || - actorScreenCoords.y + height * zoom < 0 || - actorScreenCoords.x > engine.width || - actorScreenCoords.y > engine.height) && - isSpriteOffScreen) { - eventDispatcher.emit('exitviewport', new ex.ExitViewPortEvent()); - actor.isOffScreen = true; - } + } + return -1; + }; + /** + * Returns the point of intersection given the intersection time + */ + Ray.prototype.getPoint = function (time) { + return this.pos.toVector().add(this.dir.scale(time)).toPoint(); + }; + return Ray; + })(); + ex.Ray = Ray; + /** + * A 2D line segment + */ + var Line = (function () { + /** + * @param begin The starting point of the line segment + * @param end The ending point of the line segment + */ + function Line(begin, end) { + this.begin = begin; + this.end = end; + } + /** + * Returns the slope of the line in the form of a vector + */ + Line.prototype.getSlope = function () { + var begin = this.begin.toVector(); + var end = this.end.toVector(); + var distance = begin.distance(end); + return end.minus(begin).scale(1 / distance); + }; + /** + * Returns the length of the line segment in pixels + */ + Line.prototype.getLength = function () { + var begin = this.begin.toVector(); + var end = this.end.toVector(); + var distance = begin.distance(end); + return distance; + }; + return Line; + })(); + ex.Line = Line; + /** + * A projection + * @todo + */ + var Projection = (function () { + function Projection(min, max) { + this.min = min; + this.max = max; + } + Projection.prototype.overlaps = function (projection) { + return this.max > projection.min && projection.max > this.min; + }; + Projection.prototype.getOverlap = function (projection) { + if (this.overlaps(projection)) { + if (this.max > projection.max) { + return projection.max - this.min; } else { - if ((actorScreenCoords.x + width * zoom > 0 && - actorScreenCoords.y + height * zoom > 0 && - actorScreenCoords.x < engine.width && - actorScreenCoords.y < engine.height) || - !isSpriteOffScreen) { - eventDispatcher.emit('enterviewport', new ex.EnterViewPortEvent()); - actor.isOffScreen = false; - } + return this.max - projection.min; } - }; - return OffscreenCulling; - })(); - Traits.OffscreenCulling = OffscreenCulling; - })(Traits = ex.Traits || (ex.Traits = {})); -})(ex || (ex = {})); -/// -var ex; -(function (ex) { - var Traits; - (function (Traits) { - /** - * Propogates pointer events to the actor - */ - var CapturePointer = (function () { - function CapturePointer() { } - CapturePointer.prototype.update = function (actor, engine, delta) { - if (!actor.enableCapturePointer) { - return; - } - if (actor.isKilled()) { - return; - } - engine.input.pointers.propogate(actor); - }; - return CapturePointer; - })(); - Traits.CapturePointer = CapturePointer; - })(Traits = ex.Traits || (ex.Traits = {})); -})(ex || (ex = {})); -/// -var ex; -(function (ex) { - var Traits; - (function (Traits) { - var CollisionDetection = (function () { - function CollisionDetection() { - } - CollisionDetection.prototype.update = function (actor, engine, delta) { - var eventDispatcher = actor.eventDispatcher; - if (actor.collisionType !== ex.CollisionType.PreventCollision) { - for (var j = 0; j < engine.currentScene.tileMaps.length; j++) { - var map = engine.currentScene.tileMaps[j]; - var intersectMap; - var side = ex.Side.None; - var max = 2; - var hasBounced = false; - while (intersectMap = map.collides(actor)) { - if (max-- < 0) { - break; - } - side = actor.getSideFromIntersect(intersectMap); - eventDispatcher.emit('collision', new ex.CollisionEvent(actor, null, side, intersectMap)); - if ((actor.collisionType === ex.CollisionType.Active || actor.collisionType === ex.CollisionType.Elastic)) { - actor.y += intersectMap.y; - actor.x += intersectMap.x; - // Naive elastic bounce - if (actor.collisionType === ex.CollisionType.Elastic && !hasBounced) { - hasBounced = true; - if (side === ex.Side.Left) { - actor.dx = Math.abs(actor.dx); - } - else if (side === ex.Side.Right) { - actor.dx = -Math.abs(actor.dx); - } - else if (side === ex.Side.Top) { - actor.dy = Math.abs(actor.dy); - } - else if (side === ex.Side.Bottom) { - actor.dy = -Math.abs(actor.dy); - } - } - } - } - } - } - }; - return CollisionDetection; - })(); - Traits.CollisionDetection = CollisionDetection; - })(Traits = ex.Traits || (ex.Traits = {})); -})(ex || (ex = {})); -var ex; -(function (ex) { - /** - * An enum that describes the sides of an Actor for collision - */ - (function (Side) { - Side[Side["None"] = 0] = "None"; - Side[Side["Top"] = 1] = "Top"; - Side[Side["Bottom"] = 2] = "Bottom"; - Side[Side["Left"] = 3] = "Left"; - Side[Side["Right"] = 4] = "Right"; - })(ex.Side || (ex.Side = {})); - var Side = ex.Side; + return 0; + }; + return Projection; + })(); + ex.Projection = Projection; })(ex || (ex = {})); /// /// @@ -1207,10 +1211,38 @@ var ex; * * Excalibur offers many sprite effects such as [[Effects.Colorize]] to let you manipulate * sprites. Keep in mind, more effects requires more power and can lead to memory or CPU - * constraints and hurt performance. + * constraints and hurt performance. Each effect must be reprocessed every frame for each sprite. * * It's still recommended to create an [[Animation]] or build in your effects to the sprites * for optimal performance. + * + * There are a number of convenience methods available to perform sprite effects. Sprite effects are + * side-effecting. + * + * ```typescript + * + * var playerSprite = new ex.Sprite(txPlayer, 0, 0, 80, 80); + * + * // darken a sprite by a percentage + * playerSprite.darken(.2); // 20% + * + * // lighten a sprite by a percentage + * playerSprite.lighten(.2); // 20% + * + * // saturate a sprite by a percentage + * playerSprite.saturate(.2); // 20% + * + * // implement a custom effect + * class CustomEffect implements ex.EffectsISpriteEffect { + * + * updatePixel(x: number, y: number, imageData: ImageData) { + * // modify ImageData + * } + * } + * + * playerSprite.addEffect(new CustomEffect()); + * + * ``` */ var Sprite = (function () { /** @@ -2608,6 +2640,14 @@ var ex; Class.prototype.off = function (eventName, handler) { this.eventDispatcher.unsubscribe(eventName, handler); }; + /** + * Emits a new event + * @param eventName Name of the event to emit + * @param eventObject Data associated with this event + */ + Class.prototype.emit = function (eventName, eventObject) { + this.eventDispatcher.emit(eventName, eventObject); + }; /** * You may wish to extend native Excalibur functionality in vanilla Javascript. * Any method on a class inheriting [[Class]] may be extended to support @@ -3410,8 +3450,20 @@ var ex; */ var BaseCamera = (function () { function BaseCamera() { - this._focus = new ex.Point(0, 0); - this._lerp = false; + this.focus = new ex.Point(0, 0); + this.lerp = false; + // camera physical quantities + this.x = 0; + this.y = 0; + this.z = 1; + this.dx = 0; + this.dy = 0; + this.dz = 0; + this.ax = 0; + this.ay = 0; + this.az = 0; + this.rotation = 0; + this.rx = 0; this._cameraMoving = false; this._currentLerpTime = 0; this._lerpDuration = 1 * 1000; // 5 seconds @@ -3448,23 +3500,24 @@ var ex; this._follow = actor; }; /** - * Returns the focal point of the camera + * Returns the focal point of the camera, a new point giving the x and y position of the camera */ BaseCamera.prototype.getFocus = function () { - return this._focus; + return new ex.Point(this.x, this.y); }; /** * Sets the focal point of the camera. This value can only be set if there is no actor to be followed. * @param x The x coordinate of the focal point * @param y The y coordinate of the focal point + * @deprecated */ BaseCamera.prototype.setFocus = function (x, y) { - if (!this._follow && !this._lerp) { - this._focus.x = x; - this._focus.y = y; + if (!this._follow && !this.lerp) { + this.x = x; + this.y = y; } - if (this._lerp) { - this._lerpStart = this._focus.clone(); + if (this.lerp) { + this._lerpStart = this.getFocus().clone(); this._lerpEnd = new ex.Point(x, y); this._currentLerpTime = 0; this._cameraMoving = true; @@ -3516,16 +3569,24 @@ var ex; * Gets the current zoom scale */ BaseCamera.prototype.getZoom = function () { - return this._currentZoomScale; + return this.z; }; BaseCamera.prototype._setCurrentZoomScale = function (zoomScale) { - this._currentZoomScale = zoomScale; + this.z = zoomScale; }; /** * Applies the relevant transformations to the game canvas to "move" or apply effects to the Camera * @param delta The number of milliseconds since the last update */ BaseCamera.prototype.update = function (ctx, delta) { + // Update placements based on linear algebra + this.x += this.dx * delta / 1000; + this.y += this.dy * delta / 1000; + this.z += this.dz * delta / 1000; + this.dx += this.ax * delta / 1000; + this.dy += this.ay * delta / 1000; + this.dz += this.az * delta / 1000; + this.rotation += this.rx * delta / 1000; var focus = this.getFocus(); var xShake = 0; var yShake = 0; @@ -3535,19 +3596,19 @@ var ex; // if zoom is .5x then canvas is 2x as high var newCanvasWidth = canvasWidth / this.getZoom(); var newCanvasHeight = canvasHeight / this.getZoom(); - if (this._lerp) { + if (this.lerp) { if (this._currentLerpTime < this._lerpDuration && this._cameraMoving) { if (this._lerpEnd.x < this._lerpStart.x) { - this._focus.x = this._lerpStart.x - (this._easeInOutCubic(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x); + this.x = this._lerpStart.x - (this._easeInOutCubic(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x); } else { - this._focus.x = this._easeInOutCubic(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration); + this.x = this._easeInOutCubic(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration); } if (this._lerpEnd.y < this._lerpStart.y) { - this._focus.y = this._lerpStart.y - (this._easeInOutCubic(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y); + this.y = this._lerpStart.y - (this._easeInOutCubic(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y); } else { - this._focus.y = this._easeInOutCubic(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration); + this.y = this._easeInOutCubic(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration); } this._currentLerpTime += delta; } @@ -3570,16 +3631,17 @@ var ex; xShake = (Math.random() * this._shakeMagnitudeX | 0) + 1; yShake = (Math.random() * this._shakeMagnitudeY | 0) + 1; } - if (this._isDoneZooming()) { - this._isZooming = false; - this._elapsedZoomTime = 0; - this._zoomDuration = 0; - this._setCurrentZoomScale(this._maxZoomScale); - } - else { - this._elapsedZoomTime += delta; - this._setCurrentZoomScale(this.getZoom() + this._zoomIncrement * delta / 1000); - } + /*if (this._isDoneZooming()) { + this._isZooming = false; + this._elapsedZoomTime = 0; + this._zoomDuration = 0; + this._setCurrentZoomScale(this._maxZoomScale); + + } else { + this._elapsedZoomTime += delta; + + this._setCurrentZoomScale(this.getZoom() + this._zoomIncrement * delta / 1000); + }*/ ctx.scale(this.getZoom(), this.getZoom()); ctx.translate(-focus.x + newCanvasWidth / 2 + xShake, -focus.y + newCanvasHeight / 2 + yShake); }; @@ -3628,10 +3690,10 @@ var ex; } SideCamera.prototype.getFocus = function () { if (this._follow) { - return new ex.Point(this._follow.x + this._follow.getWidth() / 2, this._focus.y); + return new ex.Point(this._follow.x + this._follow.getWidth() / 2, this.focus.y); } else { - return this._focus; + return this.focus; } }; return SideCamera; @@ -3654,9077 +3716,9023 @@ var ex; return new ex.Point(this._follow.x + this._follow.getWidth() / 2, this._follow.y + this._follow.getHeight() / 2); } else { - return this._focus; + return this.focus; } }; return LockedCamera; })(BaseCamera); ex.LockedCamera = LockedCamera; })(ex || (ex = {})); -/// var ex; (function (ex) { /** - * Action API - * - * The fluent Action API allows you to perform "actions" on - * [[Actor|Actors]] such as following, moving, rotating, and - * more. You can implement your own actions by implementing - * the [[IAction]] interface. - * - * Actions can be chained together and can be set to repeat, - * or can be interrupted to change. - * - * ## Chaining Actions - * - * You can chain actions to create a script because the action - * methods return the context, allowing you to build a queue of - * actions that get executed as part of an [[ActionQueue]]. - * - * ```ts - * class Enemy extends ex.Actor { - * - * public patrol() { - * - * // clear existing queue - * this.clearActions(); - * - * // guard a choke point - * // move to 100, 100 and take 1.2s - * // wait for 3s - * // move back to 0, 100 and take 1.2s - * // wait for 3s - * // repeat - * this.moveTo(100, 100, 1200) - * .delay(3000) - * .moveTo(0, 100, 1200) - * .delay(3000) - * .repeatForever(); - * } - * } - * ``` - * - * ## Example: Follow a Path - * - * You can use [[Actor.moveTo]] to move to a specific point, - * allowing you to chain together actions to form a path. - * - * This example has a `Ship` follow a path that it guards by - * spawning at the start point, moving to the end, then reversing - * itself and repeating that forever. - * - * ```ts - * public Ship extends ex.Actor { - * - * public onInitialize() { - * var path = [ - * new ex.Point(20, 20), - * new ex.Point(50, 40), - * new ex.Point(25, 30), - * new ex.Point(75, 80) - * ]; - * - * // spawn at start point - * this.x = path[0].x; - * this.y = path[0].y; - * - * // create action queue - * - * // forward path (skip first spawn point) - * for (var i = 1; i < path.length; i++) { - * this.moveTo(path[i].x, path[i].y, 300); - * } - * - * // reverse path (skip last point) - * for (var j = path.length - 2; j >= 0; j--) { - * this.moveTo(path[j].x, path[j].y, 300); - * } - * - * // repeat - * this.repeatForever(); - * } - * } - * ``` - * - * While this is a trivial example, the Action API allows complex - * routines to be programmed for Actors. For example, using the - * [Tiled Map Editor](http://mapeditor.org) you can create a map that - * uses polylines to create paths, load in the JSON using a - * [[Resource|Generic Resource]], create a [[TileMap]], - * and spawn ships programmatically while utilizing the polylines - * to automatically generate the actions needed to do pathing. - * - * ## Custom Actions - * - * The API does allow you to implement new actions by implementing the [[IAction]] - * interface, but this will be improved in future versions as right now it - * is meant for the Excalibur team and can be advanced to implement. - * - * You can manually manipulate an Actor's [[ActionQueue]] using - * [[Actor.actionQueue]]. For example, using [[ActionQueue.add]] for - * custom actions. - * - * ## Future Plans - * - * The Excalibur team is working on extending and rebuilding the Action API - * in future versions to support multiple timelines/scripts, better eventing, - * and a more robust API to allow for complex and customized actions. - * - * ## Known Issues - * - * **Rotation actions do not use shortest angle** - * [Issue #282](https://github.com/excaliburjs/Excalibur/issues/282) - * + * An enum that describes the strategies that rotation actions can use */ - var ActionContext = (function () { - function ActionContext() { - this._actors = []; - this._queues = []; - if (arguments !== null) { - this._actors = Array.prototype.slice.call(arguments, 0); - this._queues = this._actors.map(function (a) { - return a.actionQueue; - }); - } - } + (function (RotationType) { /** - * Clears all queued actions from the Actor + * Rotation via `ShortestPath` will use the smallest angle + * between the starting and ending points. This strategy is the default behavior. */ - ActionContext.prototype.clearActions = function () { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].clearActions(); - } - }; - ActionContext.prototype.addActorToContext = function (actor) { - this._actors.push(actor); - // if we run into problems replace the line below with: - this._queues.push(actor.actionQueue); - }; - ActionContext.prototype.removeActorFromContext = function (actor) { - var index = this._actors.indexOf(actor); - if (index > -1) { - this._actors.splice(index, 1); - this._queues.splice(index, 1); - } - }; - /** - * This method will move an actor to the specified x and y position at the - * speed specified (in pixels per second) and return back the actor. This - * method is part of the actor 'Action' fluent API allowing action chaining. - * @param x The x location to move the actor to - * @param y The y location to move the actor to - * @param speed The speed in pixels per second to move - */ - ActionContext.prototype.moveTo = function (x, y, speed) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.MoveTo(this._actors[i], x, y, speed)); - } - return this; - }; - /** - * This method will move an actor to the specified x and y position by a - * certain time (in milliseconds). This method is part of the actor - * 'Action' fluent API allowing action chaining. - * @param x The x location to move the actor to - * @param y The y location to move the actor to - * @param time The time it should take the actor to move to the new location in milliseconds - */ - ActionContext.prototype.moveBy = function (x, y, time) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.MoveBy(this._actors[i], x, y, time)); - } - return this; - }; - /** - * This method will rotate an actor to the specified angle at the speed - * specified (in radians per second) and return back the actor. This - * method is part of the actor 'Action' fluent API allowing action chaining. - * @param angleRadians The angle to rotate to in radians - * @param speed The angular velocity of the rotation specified in radians per second - */ - ActionContext.prototype.rotateTo = function (angleRadians, speed) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.RotateTo(this._actors[i], angleRadians, speed)); - } - return this; - }; - /** - * This method will rotate an actor to the specified angle by a certain - * time (in milliseconds) and return back the actor. This method is part - * of the actor 'Action' fluent API allowing action chaining. - * @param angleRadians The angle to rotate to in radians - * @param time The time it should take the actor to complete the rotation in milliseconds - */ - ActionContext.prototype.rotateBy = function (angleRadians, time) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.RotateBy(this._actors[i], angleRadians, time)); - } - return this; - }; - /** - * This method will scale an actor to the specified size at the speed - * specified (in magnitude increase per second) and return back the - * actor. This method is part of the actor 'Action' fluent API allowing - * action chaining. - * @param size The scaling factor to apply - * @param speed The speed of scaling specified in magnitude increase per second - */ - ActionContext.prototype.scaleTo = function (sizeX, sizeY, speedX, speedY) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.ScaleTo(this._actors[i], sizeX, sizeY, speedX, speedY)); - } - return this; - }; - /** - * This method will scale an actor to the specified size by a certain time - * (in milliseconds) and return back the actor. This method is part of the - * actor 'Action' fluent API allowing action chaining. - * @param size The scaling factor to apply - * @param time The time it should take to complete the scaling in milliseconds - */ - ActionContext.prototype.scaleBy = function (sizeX, sizeY, time) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.ScaleBy(this._actors[i], sizeX, sizeY, time)); - } - return this; - }; - /** - * This method will cause an actor to blink (become visible and not - * visible). Optionally, you may specify the number of blinks. Specify the amount of time - * the actor should be visible per blink, and the amount of time not visible. - * This method is part of the actor 'Action' fluent API allowing action chaining. - * @param timeVisible The amount of time to stay visible per blink in milliseconds - * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds - * @param numBlinks The number of times to blink - */ - ActionContext.prototype.blink = function (timeVisible, timeNotVisible, numBlinks) { - if (numBlinks === void 0) { numBlinks = 1; } - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.Blink(this._actors[i], timeVisible, timeNotVisible, numBlinks)); - } - return this; - }; - /** - * This method will cause an actor's opacity to change from its current value - * to the provided value by a specified time (in milliseconds). This method is - * part of the actor 'Action' fluent API allowing action chaining. - * @param opacity The ending opacity - * @param time The time it should take to fade the actor (in milliseconds) - */ - ActionContext.prototype.fade = function (opacity, time) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.Fade(this._actors[i], opacity, time)); - } - return this; - }; - /** - * This method will delay the next action from executing for a certain - * amount of time (in milliseconds). This method is part of the actor - * 'Action' fluent API allowing action chaining. - * @param time The amount of time to delay the next action in the queue from executing in milliseconds - */ - ActionContext.prototype.delay = function (time) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.Delay(this._actors[i], time)); - } - return this; - }; - /** - * This method will add an action to the queue that will remove the actor from the - * scene once it has completed its previous actions. Any actions on the - * action queue after this action will not be executed. - */ - ActionContext.prototype.die = function () { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.Die(this._actors[i])); - } - return this; - }; - /** - * This method allows you to call an arbitrary method as the next action in the - * action queue. This is useful if you want to execute code in after a specific - * action, i.e An actor arrives at a destinatino after traversing a path - */ - ActionContext.prototype.callMethod = function (method) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.CallMethod(this._actors[i], method)); - } - return this; - }; - /** - * This method will cause the actor to repeat all of the previously - * called actions a certain number of times. If the number of repeats - * is not specified it will repeat forever. This method is part of - * the actor 'Action' fluent API allowing action chaining - * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions - * will repeat forever - */ - ActionContext.prototype.repeat = function (times) { - if (!times) { - this.repeatForever(); - return this; - } - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.Repeat(this._actors[i], times, this._actors[i].actionQueue.getActions())); - } - return this; - }; - /** - * This method will cause the actor to repeat all of the previously - * called actions forever. This method is part of the actor 'Action' - * fluent API allowing action chaining. - */ - ActionContext.prototype.repeatForever = function () { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - this._queues[i].add(new ex.Internal.Actions.RepeatForever(this._actors[i], this._actors[i].actionQueue.getActions())); - } - return this; - }; + RotationType[RotationType["ShortestPath"] = 0] = "ShortestPath"; /** - * This method will cause the actor to follow another at a specified distance - * @param actor The actor to follow - * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance. + * Rotation via `LongestPath` will use the largest angle + * between the starting and ending points. */ - ActionContext.prototype.follow = function (actor, followDistance) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - if (followDistance === undefined) { - this._queues[i].add(new ex.Internal.Actions.Follow(this._actors[i], actor)); - } - else { - this._queues[i].add(new ex.Internal.Actions.Follow(this._actors[i], actor, followDistance)); - } - } - return this; - }; + RotationType[RotationType["LongestPath"] = 1] = "LongestPath"; /** - * This method will cause the actor to move towards another until they - * collide "meet" at a specified speed. - * @param actor The actor to meet - * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor + * Rotation via `Clockwise` will travel in a clockwise direction, + * regardless of the starting and ending points. */ - ActionContext.prototype.meet = function (actor, speed) { - var i = 0, len = this._queues.length; - for (i; i < len; i++) { - if (speed === undefined) { - this._queues[i].add(new ex.Internal.Actions.Meet(this._actors[i], actor)); - } - else { - this._queues[i].add(new ex.Internal.Actions.Meet(this._actors[i], actor, speed)); - } - } - return this; - }; + RotationType[RotationType["Clockwise"] = 2] = "Clockwise"; /** - * Returns a promise that resolves when the current action queue up to now - * is finished. + * Rotation via `CounterClockwise` will travel in a counterclockwise direction, + * regardless of the starting and ending points. */ - ActionContext.prototype.asPromise = function () { - var _this = this; - var promises = this._queues.map(function (q, i) { - var temp = new ex.Promise(); - q.add(new ex.Internal.Actions.CallMethod(_this._actors[i], function () { - temp.resolve(); - })); - return temp; - }); - return ex.Promise.join.apply(this, promises); - }; - return ActionContext; - })(); - ex.ActionContext = ActionContext; -})(ex || (ex = {})); -/// -/// -/// -var ex; -(function (ex) { - /** - * Grouping - * - * Groups are used for logically grouping Actors so they can be acted upon - * in bulk. - * - * @todo Document this - */ - var Group = (function (_super) { - __extends(Group, _super); - function Group(name, scene) { - _super.call(this); - this.name = name; - this.scene = scene; - this._logger = ex.Logger.getInstance(); - this._members = []; - this.actions = new ex.ActionContext(); - if (scene == null) { - this._logger.error('Invalid constructor arguments passed to Group: ', name, ', scene must not be null!'); - } - else { - var existingGroup = scene.groups[name]; - if (existingGroup) { - this._logger.warn('Group with name', name, 'already exists. This new group will replace it.'); - } - scene.groups[name] = this; - } - } - Group.prototype.add = function (actorOrActors) { - if (actorOrActors instanceof ex.Actor) { - actorOrActors = [].concat(actorOrActors); - } - var i = 0, len = actorOrActors.length, groupIdx; - for (i; i < len; i++) { - groupIdx = this.getMembers().indexOf(actorOrActors[i]); - if (groupIdx === -1) { - this._members.push(actorOrActors[i]); - this.scene.add(actorOrActors[i]); - this.actions.addActorToContext(actorOrActors[i]); - this.eventDispatcher.wire(actorOrActors[i].eventDispatcher); - } - } - }; - Group.prototype.remove = function (actor) { - var index = this._members.indexOf(actor); - if (index > -1) { - this._members.splice(index, 1); - this.actions.removeActorFromContext(actor); - this.eventDispatcher.unwire(actor.eventDispatcher); - } - }; - Group.prototype.move = function (args) { - var i = 0, members = this.getMembers(), len = members.length; - if (arguments.length === 1 && args instanceof ex.Vector) { - for (i; i < len; i++) { - members[i].x += args.x; - members[i].y += args.y; - } - } - else if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') { - var x = arguments[0]; - var y = arguments[1]; - for (i; i < len; i++) { - members[i].x += x; - members[i].y += y; - } - } - else { - this._logger.error('Invalid arguments passed to group move', this.name, 'args:', arguments); - } - }; - Group.prototype.rotate = function (angle) { - if (typeof arguments[0] === 'number') { - var r = arguments[0], i = 0, members = this.getMembers(), len = members.length; - for (i; i < len; i++) { - members[i].rotation += r; - } - } - else { - this._logger.error('Invalid arguments passed to group rotate', this.name, 'args:', arguments); - } - }; - Group.prototype.on = function (eventName, handler) { - this.eventDispatcher.subscribe(eventName, handler); - }; - Group.prototype.off = function (eventName, handler) { - this.eventDispatcher.unsubscribe(eventName, handler); - }; - Group.prototype.emit = function (topic, event) { - this.eventDispatcher.emit(topic, event); - }; - Group.prototype.contains = function (actor) { - return this.getMembers().indexOf(actor) > -1; - }; - Group.prototype.getMembers = function () { - return this._members; - }; - Group.prototype.getRandomMember = function () { - return this._members[Math.floor(Math.random() * this._members.length)]; - }; - Group.prototype.getBounds = function () { - return this.getMembers().map(function (a) { return a.getBounds(); }).reduce(function (prev, curr) { - return prev.combine(curr); - }); - }; - return Group; - })(ex.Class); - ex.Group = Group; + RotationType[RotationType["CounterClockwise"] = 3] = "CounterClockwise"; + })(ex.RotationType || (ex.RotationType = {})); + var RotationType = ex.RotationType; })(ex || (ex = {})); +/// +/// +/// +/// +/** + * See [[ActionContext|Action API]] for more information about Actions. + */ var ex; (function (ex) { - // NOTE: this implementation is not self-balancing - var SortedList = (function () { - function SortedList(getComparable) { - this._getComparable = getComparable; - } - SortedList.prototype.find = function (element) { - return this._find(this._root, element); - }; - SortedList.prototype._find = function (node, element) { - if (node == null) { - return false; - } - else if (this._getComparable.call(element) === node.getKey()) { - if (node.getData().indexOf(element) > -1) { - return true; - } - else { - return false; + var Internal; + (function (Internal) { + var Actions; + (function (Actions) { + var EaseTo = (function () { + function EaseTo(actor, x, y, duration, easingFcn) { + this.actor = actor; + this.easingFcn = easingFcn; + this._currentLerpTime = 0; + this._lerpDuration = 1 * 1000; // 5 seconds + this._lerpStart = new ex.Point(0, 0); + this._lerpEnd = new ex.Point(0, 0); + this._initialized = false; + this._stopped = false; + this._distance = 0; + this._lerpDuration = duration; + this._lerpEnd = new ex.Point(x, y); } - } - else if (this._getComparable.call(element) < node.getKey()) { - return this._find(node.getLeft(), element); - } - else { - return this._find(node.getRight(), element); - } - }; - // returns the array of elements at a specific key value - SortedList.prototype.get = function (key) { - return this._get(this._root, key); - }; - SortedList.prototype._get = function (node, key) { - if (node == null) { - return []; - } - else if (key === node.getKey()) { - return node.getData(); - } - else if (key < node.getKey()) { - return this._get(node.getLeft(), key); - } - else { - return this._get(node.getRight(), key); - } - }; - SortedList.prototype.add = function (element) { - if (this._root == null) { - this._root = new BinaryTreeNode(this._getComparable.call(element), [element], null, null); - return true; - } - else { - return this._insert(this._root, element); - } - return false; - }; - SortedList.prototype._insert = function (node, element) { - if (node != null) { - if (this._getComparable.call(element) === node.getKey()) { - if (node.getData().indexOf(element) > -1) { - return false; // the element we're trying to insert already exists - } - else { - node.getData().push(element); - return true; + EaseTo.prototype._initialize = function () { + this._lerpStart = new ex.Point(this.actor.x, this.actor.y); + this._currentLerpTime = 0; + this._distance = this._lerpStart.toVector().distance(this._lerpEnd.toVector()); + }; + EaseTo.prototype.update = function (delta) { + if (!this._initialized) { + this._initialize(); + this._initialized = true; } - } - else if (this._getComparable.call(element) < node.getKey()) { - if (node.getLeft() == null) { - node.setLeft(new BinaryTreeNode(this._getComparable.call(element), [element], null, null)); - return true; + var newX = this.actor.x; + var newY = this.actor.y; + if (this._currentLerpTime < this._lerpDuration) { + if (this._lerpEnd.x < this._lerpStart.x) { + newX = this._lerpStart.x - (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x); + } + else { + newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration); + } + if (this._lerpEnd.y < this._lerpStart.y) { + newY = this._lerpStart.y - (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y); + } + else { + newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration); + } + this.actor.x = newX; + this.actor.y = newY; + this._currentLerpTime += delta; } else { - return this._insert(node.getLeft(), element); + this.actor.x = this._lerpEnd.x; + this.actor.y = this._lerpEnd.y; } + }; + EaseTo.prototype.isComplete = function (actor) { + return this._stopped || (new ex.Vector(actor.x, actor.y)).distance(this._lerpStart.toVector()) >= this._distance; + }; + EaseTo.prototype.reset = function () { + this._initialized = false; + }; + EaseTo.prototype.stop = function () { + this._stopped = true; + }; + return EaseTo; + })(); + Actions.EaseTo = EaseTo; + var MoveTo = (function () { + function MoveTo(actor, destx, desty, speed) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._end = new ex.Vector(destx, desty); + this._speed = speed; } - else { - if (node.getRight() == null) { - node.setRight(new BinaryTreeNode(this._getComparable.call(element), [element], null, null)); - return true; + MoveTo.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._start = new ex.Vector(this._actor.x, this._actor.y); + this._distance = this._start.distance(this._end); + this._dir = this._end.minus(this._start).normalize(); } - else { - return this._insert(node.getRight(), element); + var m = this._dir.scale(this._speed); + this._actor.dx = m.x; + this._actor.dy = m.y; + if (this.isComplete(this._actor)) { + this._actor.x = this._end.x; + this._actor.y = this._end.y; + this._actor.dy = 0; + this._actor.dx = 0; + } + }; + MoveTo.prototype.isComplete = function (actor) { + return this._stopped || (new ex.Vector(actor.x, actor.y)).distance(this._start) >= this._distance; + }; + MoveTo.prototype.stop = function () { + this._actor.dy = 0; + this._actor.dx = 0; + this._stopped = true; + }; + MoveTo.prototype.reset = function () { + this._started = false; + }; + return MoveTo; + })(); + Actions.MoveTo = MoveTo; + var MoveBy = (function () { + function MoveBy(actor, destx, desty, time) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._end = new ex.Vector(destx, desty); + if (time <= 0) { + ex.Logger.getInstance().error('Attempted to moveBy time less than or equal to zero : ' + time); + throw new Error('Cannot move in time <= 0'); } + this._time = time; } - } - return false; - }; - SortedList.prototype.removeByComparable = function (element) { - this._root = this._remove(this._root, element); - }; - SortedList.prototype._remove = function (node, element) { - if (node == null) { - return null; - } - else if (this._getComparable.call(element) === node.getKey()) { - var elementIndex = node.getData().indexOf(element); - // if the node contains the element, remove the element - if (elementIndex > -1) { - node.getData().splice(elementIndex, 1); - // if we have removed the last element at this node, remove the node - if (node.getData().length === 0) { - // if the node is a leaf - if (node.getLeft() == null && node.getRight() == null) { - return null; - } - else if (node.getLeft() == null) { - return node.getRight(); - } - else if (node.getRight() == null) { - return node.getLeft(); - } - // if node has 2 children - var temp = this._findMinNode(node.getRight()); - node.setKey(temp.getKey()); - node.setData(temp.getData()); - node.setRight(this._cleanup(node.getRight(), temp)); //"cleanup nodes" (move them up recursively) - return node; + MoveBy.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._start = new ex.Vector(this._actor.x, this._actor.y); + this._distance = this._start.distance(this._end); + this._dir = this._end.minus(this._start).normalize(); + this._speed = this._distance / (this._time / 1000); } - else { - // this prevents the node from being removed since it still contains elements - return node; + var m = this._dir.scale(this._speed); + this._actor.dx = m.x; + this._actor.dy = m.y; + if (this.isComplete(this._actor)) { + this._actor.x = this._end.x; + this._actor.y = this._end.y; + this._actor.dy = 0; + this._actor.dx = 0; } + }; + MoveBy.prototype.isComplete = function (actor) { + return this._stopped || (new ex.Vector(actor.x, actor.y)).distance(this._start) >= this._distance; + }; + MoveBy.prototype.stop = function () { + this._actor.dy = 0; + this._actor.dx = 0; + this._stopped = true; + }; + MoveBy.prototype.reset = function () { + this._started = false; + }; + return MoveBy; + })(); + Actions.MoveBy = MoveBy; + var Follow = (function () { + function Follow(actor, actorToFollow, followDistance) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._actorToFollow = actorToFollow; + this._current = new ex.Vector(this._actor.x, this._actor.y); + this._end = new ex.Vector(actorToFollow.x, actorToFollow.y); + this._maximumDistance = (followDistance !== undefined) ? followDistance : this._current.distance(this._end); + this._speed = 0; } - } - else if (this._getComparable.call(element) < node.getKey()) { - node.setLeft(this._remove(node.getLeft(), element)); - return node; - } - else { - node.setRight(this._remove(node.getRight(), element)); - return node; - } - }; - // called once we have successfully removed the element we wanted, recursively corrects the part of the tree below the removed node - SortedList.prototype._cleanup = function (node, element) { - var comparable = element.getKey(); - if (node == null) { - return null; - } - else if (comparable === node.getKey()) { - // if the node is a leaf - if (node.getLeft() == null && node.getRight() == null) { - return null; - } - else if (node.getLeft() == null) { - return node.getRight(); + Follow.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._distanceBetween = this._current.distance(this._end); + this._dir = this._end.minus(this._current).normalize(); + } + var actorToFollowSpeed = Math.sqrt(Math.pow(this._actorToFollow.dx, 2) + Math.pow(this._actorToFollow.dy, 2)); + if (actorToFollowSpeed !== 0) { + this._speed = actorToFollowSpeed; + } + this._current.x = this._actor.x; + this._current.y = this._actor.y; + this._end.x = this._actorToFollow.x; + this._end.y = this._actorToFollow.y; + this._distanceBetween = this._current.distance(this._end); + this._dir = this._end.minus(this._current).normalize(); + if (this._distanceBetween >= this._maximumDistance) { + var m = this._dir.scale(this._speed); + this._actor.dx = m.x; + this._actor.dy = m.y; + } + else { + this._actor.dx = 0; + this._actor.dy = 0; + } + if (this.isComplete(this._actor)) { + // TODO this should never occur + this._actor.x = this._end.x; + this._actor.y = this._end.y; + this._actor.dy = 0; + this._actor.dx = 0; + } + }; + Follow.prototype.stop = function () { + this._actor.dy = 0; + this._actor.dx = 0; + this._stopped = true; + }; + Follow.prototype.isComplete = function (actor) { + // the actor following should never stop unless specified to do so + return this._stopped; + }; + Follow.prototype.reset = function () { + this._started = false; + }; + return Follow; + })(); + Actions.Follow = Follow; + var Meet = (function () { + function Meet(actor, actorToMeet, speed) { + this._started = false; + this._stopped = false; + this._speedWasSpecified = false; + this._actor = actor; + this._actorToMeet = actorToMeet; + this._current = new ex.Vector(this._actor.x, this._actor.y); + this._end = new ex.Vector(actorToMeet.x, actorToMeet.y); + this._speed = speed || 0; + if (speed !== undefined) { + this._speedWasSpecified = true; + } } - else if (node.getRight() == null) { - return node.getLeft(); + Meet.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._distanceBetween = this._current.distance(this._end); + this._dir = this._end.minus(this._current).normalize(); + } + var actorToMeetSpeed = Math.sqrt(Math.pow(this._actorToMeet.dx, 2) + Math.pow(this._actorToMeet.dy, 2)); + if ((actorToMeetSpeed !== 0) && (!this._speedWasSpecified)) { + this._speed = actorToMeetSpeed; + } + this._current.x = this._actor.x; + this._current.y = this._actor.y; + this._end.x = this._actorToMeet.x; + this._end.y = this._actorToMeet.y; + this._distanceBetween = this._current.distance(this._end); + this._dir = this._end.minus(this._current).normalize(); + var m = this._dir.scale(this._speed); + this._actor.dx = m.x; + this._actor.dy = m.y; + if (this.isComplete(this._actor)) { + this._actor.x = this._end.x; + this._actor.y = this._end.y; + this._actor.dy = 0; + this._actor.dx = 0; + } + }; + Meet.prototype.isComplete = function (actor) { + return this._stopped || (this._distanceBetween <= 1); + }; + Meet.prototype.stop = function () { + this._actor.dy = 0; + this._actor.dx = 0; + this._stopped = true; + }; + Meet.prototype.reset = function () { + this._started = false; + }; + return Meet; + })(); + Actions.Meet = Meet; + var RotateTo = (function () { + function RotateTo(actor, angleRadians, speed, rotationType) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._end = angleRadians; + this._speed = speed; + this._rotationType = rotationType || ex.RotationType.ShortestPath; } - // if node has 2 children - var temp = this._findMinNode(node.getRight()); - node.setKey(temp.getKey()); - node.setData(temp.getData()); - node.setRight(this._cleanup(node.getRight(), temp)); - return node; - } - else if (this._getComparable.call(element) < node.getKey()) { - node.setLeft(this._cleanup(node.getLeft(), element)); - return node; - } - else { - node.setRight(this._cleanup(node.getRight(), element)); - return node; - } - }; - SortedList.prototype._findMinNode = function (node) { - var current = node; - while (current.getLeft() != null) { - current = current.getLeft(); - } - return current; - }; - SortedList.prototype.list = function () { - var results = new Array(); - this._list(this._root, results); - return results; - }; - SortedList.prototype._list = function (treeNode, results) { - if (treeNode != null) { - this._list(treeNode.getLeft(), results); - treeNode.getData().forEach(function (element) { - results.push(element); - }); - this._list(treeNode.getRight(), results); - } - }; - return SortedList; - })(); - ex.SortedList = SortedList; - var BinaryTreeNode = (function () { - function BinaryTreeNode(key, data, left, right) { - this._key = key; - this._data = data; - this._left = left; - this._right = right; - } - BinaryTreeNode.prototype.getKey = function () { - return this._key; - }; - BinaryTreeNode.prototype.setKey = function (key) { - this._key = key; - }; - BinaryTreeNode.prototype.getData = function () { - return this._data; - }; - BinaryTreeNode.prototype.setData = function (data) { - this._data = data; - }; - BinaryTreeNode.prototype.getLeft = function () { - return this._left; - }; - BinaryTreeNode.prototype.setLeft = function (left) { - this._left = left; - }; - BinaryTreeNode.prototype.getRight = function () { - return this._right; - }; - BinaryTreeNode.prototype.setRight = function (right) { - this._right = right; - }; - return BinaryTreeNode; - })(); - ex.BinaryTreeNode = BinaryTreeNode; - var MockedElement = (function () { - function MockedElement(key) { - this._key = 0; - this._key = key; - } - MockedElement.prototype.getTheKey = function () { - return this._key; - }; - MockedElement.prototype.setKey = function (key) { - this._key = key; - }; - return MockedElement; - })(); - ex.MockedElement = MockedElement; -})(ex || (ex = {})); -/// -/// -/// -/// -/// -/// -/// -/// -var ex; -(function (ex) { - /** - * Scenes - * - * [[Actor|Actors]] are composed together into groupings called Scenes in - * Excalibur. The metaphor models the same idea behind real world - * actors in a scene. Only actors in scenes will be updated and drawn. - * - * Typical usages of a scene include: levels, menus, loading screens, etc. - * - * ## Adding actors to the scene - * - * For an [[Actor]] to be drawn and updated, it needs to be part of the "scene graph". - * The [[Engine]] provides several easy ways to quickly add/remove actors from the - * current scene. - * - * ```js - * var game = new ex.Engine(...); - * - * var player = new ex.Actor(); - * var enemy = new ex.Actor(); - * - * // add them to the "root" scene - * - * game.add(player); - * game.add(enemy); - * - * // start game - * game.start(); - * ``` - * - * You can also add actors to a [[Scene]] instance specifically. - * - * ```js - * var game = new ex.Engine(); - * var level1 = new ex.Scene(); - * - * var player = new ex.Actor(); - * var enemy = new ex.Actor(); - * - * // add actors to level1 - * level1.add(player); - * level1.add(enemy); - * - * // add level1 to the game - * game.add("level1", level1); - * - * // start the game - * game.start(); - * - * // after player clicks start game, for example - * game.goToScene("level1"); - * - * ``` - * - * ## Extending scenes - * - * For more complex games, you might want more control over a scene in which - * case you can extend [[Scene]]. This is useful for menus, custom loaders, - * and levels. - * - * Just use [[Engine.add]] to add a new scene to the game. You can then use - * [[Engine.goToScene]] to switch scenes which calls [[Scene.onActivate]] for the - * new scene and [[Scene.onDeactivate]] for the old scene. Use [[Scene.onInitialize]] - * to perform any start-up logic, which is called once. - * - * **TypeScript** - * - * ```ts - * class MainMenu extends ex.Scene { - * - * // start-up logic, called once - * public onInitialize(engine: ex.Engine) { } - * - * // each time the scene is entered (Engine.goToScene) - * public onActivate() { } - * - * // each time the scene is exited (Engine.goToScene) - * public onDeactivate() { } - * } - * - * // add to game and activate it - * game.add("mainmenu", new MainMenu()); - * game.goToScene("mainmenu"); - * ``` - * - * **Javascript** - * - * ```js - * var MainMenu = ex.Scene.extend({ - * // start-up logic, called once - * onInitialize: function (engine) { }, - * - * // each time the scene is activated by Engine.goToScene - * onActivate: function () { }, - * - * // each time the scene is deactivated by Engine.goToScene - * onDeactivate: function () { } - * }); - * - * game.add("mainmenu", new MainMenu()); - * game.goToScene("mainmenu"); - * ``` - * - * ## Scene camera - * - * By default, a [[Scene]] is initialized with a [[BaseCamera]] which - * does not move and centers the game world. - * - * Learn more about [[BaseCamera|Cameras]] and how to modify them to suit - * your game. - */ - var Scene = (function (_super) { - __extends(Scene, _super); - function Scene(engine) { - _super.call(this); - /** - * The actors in the current scene - */ - this.children = []; - /** - * The [[TileMap]]s in the scene, if any - */ - this.tileMaps = []; - /** - * The [[Group]]s in the scene, if any - */ - this.groups = {}; - /** - * The [[UIActor]]s in a scene, if any; these are drawn last - */ - this.uiActors = []; - /** - * Whether or the [[Scene]] has been initialized - */ - this.isInitialized = false; - this._sortedDrawingTree = new ex.SortedList(ex.Actor.prototype.getZIndex); - this._collisionResolver = new ex.DynamicTreeCollisionResolver(); - this._killQueue = []; - this._timers = []; - this._cancelQueue = []; - this._logger = ex.Logger.getInstance(); - this.camera = new ex.BaseCamera(); - if (engine) { - this.camera.setFocus(engine.width / 2, engine.height / 2); - } - } - /** - * This is called before the first update of the [[Scene]]. Initializes scene members like the camera. This method is meant to be - * overridden. This is where initialization of child actors should take place. - */ - Scene.prototype.onInitialize = function (engine) { - // will be overridden - if (this.camera) { - this.camera.setFocus(engine.width / 2, engine.height / 2); - } - this._logger.debug('Scene.onInitialize', this, engine); - }; - /** - * This is called when the scene is made active and started. It is meant to be overriden, - * this is where you should setup any DOM UI or event handlers needed for the scene. - */ - Scene.prototype.onActivate = function () { - // will be overridden - this._logger.debug('Scene.onActivate', this); - }; - /** - * This is called when the scene is made transitioned away from and stopped. It is meant to be overriden, - * this is where you should cleanup any DOM UI or event handlers needed for the scene. - */ - Scene.prototype.onDeactivate = function () { - // will be overridden - this._logger.debug('Scene.onDeactivate', this); - }; - /** - * Publish an event to all actors in the scene - * @param eventType The name of the event to publish - * @param event The event object to send - * - * @obsolete Use [[emit]] instead. - */ - Scene.prototype.publish = function (eventType, event) { - var i = 0, len = this.children.length; - for (i; i < len; i++) { - this.children[i].emit(eventType, event); - } - }; - /** - * Alias for `emit`. Publish an event to all actors in the scene - * @param eventType The name of the event to publish - * @param event The event object to send - */ - Scene.prototype.emit = function (eventType, event) { - this.publish(eventType, event); - }; - /** - * Updates all the actors and timers in the scene. Called by the [[Engine]]. - * @param engine Reference to the current Engine - * @param delta The number of milliseconds since the last update - */ - Scene.prototype.update = function (engine, delta) { - var i, len; - // Cycle through actors updating UI actors - for (i = 0, len = this.uiActors.length; i < len; i++) { - this.uiActors[i].update(engine, delta); - } - // Cycle through actors updating tile maps - for (i = 0, len = this.tileMaps.length; i < len; i++) { - this.tileMaps[i].update(engine, delta); - } - // Cycle through actors updating actors - for (i = 0, len = this.children.length; i < len; i++) { - this.children[i].update(engine, delta); - } - // Run collision resolution strategy - if (this._collisionResolver) { - this._collisionResolver.update(this.children); - this._collisionResolver.evaluate(this.children); - } - // Remove actors from scene graph after being killed - var actorIndex; - for (i = 0, len = this._killQueue.length; i < len; i++) { - actorIndex = this.children.indexOf(this._killQueue[i]); - if (actorIndex > -1) { - this._sortedDrawingTree.removeByComparable(this._killQueue[i]); - this.children.splice(actorIndex, 1); - } - } - this._killQueue.length = 0; - // Remove timers in the cancel queue before updating them - for (i = 0, len = this._cancelQueue.length; i < len; i++) { - this.removeTimer(this._cancelQueue[i]); - } - this._cancelQueue.length = 0; - // Cycle through timers updating timers - this._timers = this._timers.filter(function (timer) { - timer.update(delta); - return !timer.complete; - }); - }; - /** - * Draws all the actors in the Scene. Called by the [[Engine]]. - * @param ctx The current rendering context - * @param delta The number of milliseconds since the last draw - */ - Scene.prototype.draw = function (ctx, delta) { - ctx.save(); - if (this.camera) { - this.camera.update(ctx, delta); - } - var i, len; - for (i = 0, len = this.tileMaps.length; i < len; i++) { - this.tileMaps[i].draw(ctx, delta); - } - var sortedChildren = this._sortedDrawingTree.list(); - for (i = 0, len = sortedChildren.length; i < len; i++) { - // only draw actors that are visible and on screen - if (sortedChildren[i].visible && !sortedChildren[i].isOffScreen) { - sortedChildren[i].draw(ctx, delta); - } - } - if (this.engine && this.engine.isDebug) { - ctx.strokeStyle = 'yellow'; - this.debugDraw(ctx); - } - ctx.restore(); - for (i = 0, len = this.uiActors.length; i < len; i++) { - // only draw ui actors that are visible and on screen - if (this.uiActors[i].visible) { - this.uiActors[i].draw(ctx, delta); - } - } - if (this.engine && this.engine.isDebug) { - for (i = 0, len = this.uiActors.length; i < len; i++) { - this.uiActors[i].debugDraw(ctx); - } - } - }; - /** - * Draws all the actors' debug information in the Scene. Called by the [[Engine]]. - * @param ctx The current rendering context - */ - Scene.prototype.debugDraw = function (ctx) { - var i, len; - for (i = 0, len = this.tileMaps.length; i < len; i++) { - this.tileMaps[i].debugDraw(ctx); - } - for (i = 0, len = this.children.length; i < len; i++) { - this.children[i].debugDraw(ctx); - } - // todo possibly enable this with excalibur flags features? - //this._collisionResolver.debugDraw(ctx, 20); - this.camera.debugDraw(ctx); - }; - /** - * Checks whether an actor is contained in this scene or not - */ - Scene.prototype.contains = function (actor) { - return this.children.indexOf(actor) > -1; - }; - Scene.prototype.add = function (entity) { - if (entity instanceof ex.UIActor) { - if (!ex.Util.contains(this.uiActors, entity)) { - this.addUIActor(entity); - } - return; - } - if (entity instanceof ex.Actor) { - if (!ex.Util.contains(this.children, entity)) { - this.addChild(entity); - this._sortedDrawingTree.add(entity); - } - return; - } - if (entity instanceof ex.Timer) { - if (!ex.Util.contains(this._timers, entity)) { - this.addTimer(entity); - } - return; - } - if (entity instanceof ex.TileMap) { - if (!ex.Util.contains(this.tileMaps, entity)) { - this.addTileMap(entity); - } - } - }; - Scene.prototype.remove = function (entity) { - if (entity instanceof ex.UIActor) { - this.removeUIActor(entity); - return; - } - if (entity instanceof ex.Actor) { - this._collisionResolver.remove(entity); - this.removeChild(entity); - } - if (entity instanceof ex.Timer) { - this.removeTimer(entity); - } - if (entity instanceof ex.TileMap) { - this.removeTileMap(entity); - } - }; - /** - * Adds (any) actor to act as a piece of UI, meaning it is always positioned - * in screen coordinates. UI actors do not participate in collisions. - * @todo Should this be `UIActor` only? - */ - Scene.prototype.addUIActor = function (actor) { - this.uiActors.push(actor); - actor.scene = this; - }; - /** - * Removes an actor as a piece of UI - */ - Scene.prototype.removeUIActor = function (actor) { - var index = this.uiActors.indexOf(actor); - if (index > -1) { - this.uiActors.splice(index, 1); - } - }; - /** - * Adds an actor to the scene, once this is done the actor will be drawn and updated. - * - * @obsolete Use [[add]] instead. - */ - Scene.prototype.addChild = function (actor) { - this._collisionResolver.register(actor); - actor.scene = this; - this.children.push(actor); - this._sortedDrawingTree.add(actor); - actor.parent = this.actor; - }; - /** - * Adds a [[TileMap]] to the scene, once this is done the TileMap will be drawn and updated. - */ - Scene.prototype.addTileMap = function (tileMap) { - this.tileMaps.push(tileMap); - }; - /** - * Removes a [[TileMap]] from the scene, it will no longer be drawn or updated. - */ - Scene.prototype.removeTileMap = function (tileMap) { - var index = this.tileMaps.indexOf(tileMap); - if (index > -1) { - this.tileMaps.splice(index, 1); - } - }; - /** - * Removes an actor from the scene, it will no longer be drawn or updated. - */ - Scene.prototype.removeChild = function (actor) { - this._collisionResolver.remove(actor); - this._killQueue.push(actor); - actor.parent = null; - }; - /** - * Adds a [[Timer]] to the scene - * @param timer The timer to add - */ - Scene.prototype.addTimer = function (timer) { - this._timers.push(timer); - timer.scene = this; - return timer; - }; - /** - * Removes a [[Timer]] from the scene. - * @warning Can be dangerous, use [[cancelTimer]] instead - * @param timer The timer to remove - */ - Scene.prototype.removeTimer = function (timer) { - var i = this._timers.indexOf(timer); - if (i !== -1) { - this._timers.splice(i, 1); - } - return timer; - }; - /** - * Cancels a [[Timer]], removing it from the scene nicely - * @param timer The timer to cancel - */ - Scene.prototype.cancelTimer = function (timer) { - this._cancelQueue.push(timer); - return timer; - }; - /** - * Tests whether a [[Timer]] is active in the scene - */ - Scene.prototype.isTimerActive = function (timer) { - return (this._timers.indexOf(timer) > -1); - }; - /** - * Creates and adds a [[Group]] to the scene with a name - */ - Scene.prototype.createGroup = function (name) { - return new ex.Group(name, this); - }; - /** - * Returns a [[Group]] by name - */ - Scene.prototype.getGroup = function (name) { - return this.groups[name]; - }; - Scene.prototype.removeGroup = function (group) { - if (typeof group === 'string') { - delete this.groups[group]; - } - else if (group instanceof ex.Group) { - delete this.groups[group.name]; - } - else { - this._logger.error('Invalid arguments to removeGroup', group); - } - }; - /** - * Removes the given actor from the sorted drawing tree - */ - Scene.prototype.cleanupDrawTree = function (actor) { - this._sortedDrawingTree.removeByComparable(actor); - }; - /** - * Updates the given actor's position in the sorted drawing tree - */ - Scene.prototype.updateDrawTree = function (actor) { - this._sortedDrawingTree.add(actor); - }; - return Scene; - })(ex.Class); - ex.Scene = Scene; -})(ex || (ex = {})); -var ex; -(function (ex) { - /** - * Standard easing functions for motion in Excalibur - * - * easeInQuad: function (t) { return t * t }, - * // decelerating to zero velocity - * easeOutQuad: function (t) { return t * (2 - t) }, - * // acceleration until halfway, then deceleration - * easeInOutQuad: function (t) { return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t }, - * // accelerating from zero velocity - * easeInCubic: function (t) { return t * t * t }, - * // decelerating to zero velocity - * easeOutCubic: function (t) { return (--t) * t * t + 1 }, - * // acceleration until halfway, then deceleration - * easeInOutCubic: function (t) { return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1 }, - * // accelerating from zero velocity - * easeInQuart: function (t) { return t * t * t * t }, - * // decelerating to zero velocity - * easeOutQuart: function (t) { return 1 - (--t) * t * t * t }, - * // acceleration until halfway, then deceleration - * easeInOutQuart: function (t) { return t < .5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t }, - * // accelerating from zero velocity - * easeInQuint: function (t) { return t * t * t * t * t }, - * // decelerating to zero velocity - * easeOutQuint: function (t) { return 1 + (--t) * t * t * t * t }, - * // acceleration until halfway, then deceleration - * easeInOutQuint: function (t) { return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t } - * - */ - var EasingFunctions = (function () { - function EasingFunctions() { - } - EasingFunctions.Linear = function (currentTime, startValue, endValue, duration) { - endValue = (endValue - startValue); - return endValue * currentTime / duration + startValue; - }; - EasingFunctions.EaseInQuad = function (currentTime, startValue, endValue, duration) { - //endValue = (endValue - startValue); - currentTime /= duration; - }; - EasingFunctions.EaseOutQuad = function (currentTime, startValue, endValue, duration) { - //endValue = (endValue - startValue); - currentTime /= duration; - return -endValue * currentTime * (currentTime - 2) + startValue; - }; - EasingFunctions.EaseInOutQuad = function (currentTime, startValue, endValue, duration) { - endValue = (endValue - startValue); - currentTime /= duration / 2; - if (currentTime < 1) { - return endValue / 2 * currentTime * currentTime + startValue; - } - currentTime--; - return -endValue / 2 * (currentTime * (currentTime - 2) - 1) + startValue; - }; - EasingFunctions.EaseInCubic = function (currentTime, startValue, endValue, duration) { - endValue = (endValue - startValue); - currentTime /= duration; - return endValue * currentTime * currentTime * currentTime + startValue; - }; - EasingFunctions.EaseOutCubic = function (currentTime, startValue, endValue, duration) { - endValue = (endValue - startValue); - currentTime /= duration; - return endValue * (currentTime * currentTime * currentTime + 1) + startValue; - }; - EasingFunctions.EaseInOutCubic = function (currentTime, startValue, endValue, duration) { - endValue = (endValue - startValue); - currentTime /= duration / 2; - if (currentTime < 1) { - return endValue / 2 * currentTime * currentTime * currentTime + startValue; - } - currentTime -= 2; - return endValue / 2 * (currentTime * currentTime * currentTime + 2) + startValue; - }; - return EasingFunctions; - })(); - ex.EasingFunctions = EasingFunctions; -})(ex || (ex = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -var ex; -(function (ex) { - /** - * Actors - * - * The most important primitive in Excalibur is an `Actor`. Anything that - * can move on the screen, collide with another `Actor`, respond to events, - * or interact with the current scene, must be an actor. An `Actor` **must** - * be part of a [[Scene]] for it to be drawn to the screen. - * - * ## Basic actors - * - * For quick and dirty games, you can just create an instance of an `Actor` - * and manipulate it directly. - * - * Actors (and other entities) must be added to a [[Scene]] to be drawn - * and updated on-screen. - * - * ```ts - * var player = new ex.Actor(); - * - * // move the player - * player.dx = 5; - * - * // add player to the current scene - * game.add(player); - * ``` - * - * ## Extending actors - * - * For "real-world" games, you'll want to `extend` the `Actor` class. - * This gives you much greater control and encapsulates logic for that - * actor. - * - * You can override the [[onInitialize]] method to perform any startup logic - * for an actor (such as configuring state). [[onInitialize]] gets called - * **once** before the first frame an actor is drawn/updated. It is passed - * an instance of [[Engine]] to access global state or perform coordinate math. - * - * **TypeScript** - * - * ```ts - * class Player extends ex.Actor { - * - * public level = 1; - * public endurance = 0; - * public fortitude = 0; - * - * constructor() { - * super(); - * } - * - * public onInitialize(engine: ex.Engine) { - * this.endurance = 20; - * this.fortitude = 16; - * } - * - * public getMaxHealth() { - * return (0.4 * this.endurance) + (0.9 * this.fortitude) + (this.level * 1.2); - * } - * } - * ``` - * - * **Javascript** - * - * In Javascript you can use the [[extend]] method to override or add - * methods to an `Actor`. - * - * ```js - * var Player = ex.Actor.extend({ - * - * level: 1, - * endurance: 0, - * fortitude: 0, - * - * onInitialize: function (engine) { - * this.endurance = 20; - * this.fortitude = 16; - * }, - * - * getMaxHealth: function () { - * return (0.4 * this.endurance) + (0.9 * this.fortitude) + (this.level * 1.2); - * } - * }); - * ``` - * - * ## Updating actors - * - * Override the [[update]] method to update the state of your actor each frame. - * Typically things that need to be updated include state, drawing, or position. - * - * Remember to call `super.update` to ensure the base update logic is performed. - * You can then write your own logic for what happens after that. - * - * The [[update]] method is passed an instance of the Excalibur engine, which - * can be used to perform coordinate math or access global state. It is also - * passed `delta` which is the time since the last frame, which can be used - * to perform time-based movement or time-based math (such as a timer). - * - * **TypeScript** - * - * ```ts - * class Player extends Actor { - * public update(engine: ex.Engine, delta: number) { - * super.update(engine, delta); // call base update logic - * - * // check if player died - * if (this.health <= 0) { - * this.emit("death"); - * this.onDeath(); - * return; - * } - * } - * } - * ``` - * - * **Javascript** - * - * ```js - * var Player = ex.Actor.extend({ - * update: function (engine, delta) { - * ex.Actor.prototype.update.call(this, engine, delta); // call base update logic - * - * // check if player died - * if (this.health <= 0) { - * this.emit("death"); - * this.onDeath(); - * return; - * } - * } - * }); - * ``` - * - * ## Drawing actors - * - * Override the [[draw]] method to perform any custom drawing. For simple games, - * you don't need to override `draw`, instead you can use [[addDrawing]] and [[setDrawing]] - * to manipulate the textures/animations that the actor is using. - * - * ### Working with Textures & Sprites - * - * A common usage is to use a [[Texture]] or [[Sprite]] for an actor. If you are using the [[Loader]] to - * pre-load assets, you can simply assign an actor a [[Texture]] to draw. You can - * also create a [[Texture.asSprite|sprite from a Texture]] to quickly create a [[Sprite]] instance. - * - * ```ts - * // assume Resources.TxPlayer is a 80x80 png image - * - * public onInitialize(engine: ex.Engine) { - * - * // set as the "default" drawing - * this.addDrawing(Resources.TxPlayer); - * - * // you can also set a Sprite instance to draw - * this.addDrawing(Resources.TxPlayer.asSprite()); - * } - * ``` - * - * ### Working with Animations - * - * A [[SpriteSheet]] holds a collection of sprites from a single [[Texture]]. - * Use [[SpriteSheet.getAnimationForAll]] to easily generate an [[Animation]]. - * - * ```ts - * // assume Resources.TxPlayerIdle is a texture containing several frames of an animation - * - * public onInitialize(engine: ex.Engine) { - * - * // create a SpriteSheet for the animation - * var playerIdleSheet = new ex.SpriteSheet(Resources.TxPlayerIdle, 5, 1, 80, 80); - * - * // create an animation - * var playerIdleAnimation = playerIdleSheet.getAnimationForAll(engine, 120); - * - * // the first drawing is always the current - * this.addDrawing("idle", playerIdleAnimation); - * } - * ``` - * - * ### Custom drawing - * - * You can always override the default drawing logic for an actor in the [[draw]] method, - * for example, to draw complex shapes or to use the raw Canvas API. - * - * Usually you should call `super.draw` to perform the base drawing logic, but other times - * you may want to take over the drawing completely. - * - * ```ts - * public draw(ctx: Canvas2DRenderingContext, delta: number) { - * - * super.draw(ctx, delta); // perform base drawing logic - * - * // custom drawing - * ctx.lineTo(...); - * } - * ``` - * - * ## Actions - * - * You can use the [[ActionContext|Action API]] to create chains of - * actions and script actors into doing your bidding for your game. - * - * Actions can be simple or can be chained together to create complex - * AI routines. In the future, it will be easier to create timelines or - * scripts to run depending on the state of your actor, such as an - * enemy ship that is Guarding a path and then is Alerted when a Player - * draws near. - * - * Learn more about the [[ActionContext|Action API]]. - * - * ## Collision Detection - * - * By default Actors do not participate in collisions. If you wish to make - * an actor participate, you need to enable the [[CollisionDetectionModule]] - * - * ```ts - * public Player extends ex.Actor { - * constructor() { - * super(); - * - * // enable the pipeline - * this.pipelines.push(new ex.CollisionDetectionModule()); - * - * // set preferred CollisionType - * this.collisionType = ex.CollisionType.Active; - * } - * } - * ``` - * - * ### Collision Groups - * - * TODO, needs more information. - * - * ## Known Issues - * - * **Actor bounding boxes do not rotate** - * [Issue #68](https://github.com/excaliburjs/Excalibur/issues/68) - * - * **Setting opacity when using a color doesn't do anything** - * [Issue #364](https://github.com/excaliburjs/Excalibur/issues/364) - */ - var Actor = (function (_super) { - __extends(Actor, _super); - /** - * @param x The starting x coordinate of the actor - * @param y The starting y coordinate of the actor - * @param width The starting width of the actor - * @param height The starting height of the actor - * @param color The starting color of the actor. Leave null to draw a transparent actor. The opacity of the color will be used as the - * initial [[opacity]]. - */ - function Actor(x, y, width, height, color) { - _super.call(this); - /** - * The unique identifier for the actor - */ - this.id = Actor.maxId++; - /** - * The x coordinate of the actor (left edge) - */ - this.x = 0; - /** - * The y coordinate of the actor (top edge) - */ - this.y = 0; - this._height = 0; - this._width = 0; - /** - * The rotation of the actor in radians - */ - this.rotation = 0; // radians - /** - * The rotational velocity of the actor in radians/second - */ - this.rx = 0; //radions/sec - /** - * The scale vector of the actor - */ - this.scale = new ex.Vector(1, 1); - /** - * The x scalar velocity of the actor in scale/second - */ - this.sx = 0; //scale/sec - /** - * The y scalar velocity of the actor in scale/second - */ - this.sy = 0; //scale/sec - /** - * The x velocity of the actor in pixels/second - */ - this.dx = 0; // pixels/sec - /** - * The x velocity of the actor in pixels/second - */ - this.dy = 0; - /** - * The x acceleration of the actor in pixels/second^2 - */ - this.ax = 0; // pixels/sec/sec - /** - * The y acceleration of the actor in pixels/second^2 - */ - this.ay = 0; - /** - * Indicates whether the actor is physically in the viewport - */ - this.isOffScreen = false; - /** - * The visibility of an actor - */ - this.visible = true; - /** - * The opacity of an actor. Passing in a color in the [[constructor]] will use the - * color's opacity. - */ - this.opacity = 1; - this.previousOpacity = 1; - this.actions = new ex.ActionContext(this); - /** - * Convenience reference to the global logger - */ - this.logger = ex.Logger.getInstance(); - /** - * The scene that the actor is in - */ - this.scene = null; - /** - * The parent of this actor - */ - this.parent = null; - // TODO: Replace this with the new actor collection once z-indexing is built - /** - * The children of this actor - */ - this.children = []; - /** - * Gets or sets the current collision type of this actor. By - * default it is ([[CollisionType.PreventCollision]]). - */ - this.collisionType = CollisionType.PreventCollision; - this.collisionGroups = []; - this._collisionHandlers = {}; - this._isInitialized = false; - this.frames = {}; - /** - * Access to the current drawing for the actor, this can be - * an [[Animation]], [[Sprite]], or [[Polygon]]. - * Set drawings with [[setDrawing]]. - */ - this.currentDrawing = null; - this.centerDrawingX = true; - this.centerDrawingY = true; - /** - * Modify the current actor update pipeline. - */ - this.traits = []; - /** - * Whether or not to enable the [[CapturePointer]] trait that propogates - * pointer events to this actor - */ - this.enableCapturePointer = false; - /** - * Configuration for [[CapturePointer]] trait - */ - this.capturePointer = { - captureMoveEvents: false - }; - this._zIndex = 0; - this._isKilled = false; - this.x = x || 0; - this.y = y || 0; - this._width = width || 0; - this._height = height || 0; - if (color) { - this.color = color.clone(); - // set default opacity of an actor to the color - this.opacity = color.a; - } - // Build default pipeline - this.traits.push(new ex.Traits.Movement()); - //this.pipeline.push(new ex.CollisionDetectionModule()); - this.traits.push(new ex.Traits.OffscreenCulling()); - this.traits.push(new ex.Traits.CapturePointer()); - this.actionQueue = new ex.Internal.Actions.ActionQueue(this); - this.anchor = new ex.Point(.5, .5); - } - /** - * This is called before the first update of the actor. This method is meant to be - * overridden. This is where initialization of child actors should take place. - */ - Actor.prototype.onInitialize = function (engine) { - // Override me - }; - Actor.prototype._checkForPointerOptIn = function (eventName) { - if (eventName && (eventName.toLowerCase() === 'pointerdown' || - eventName.toLowerCase() === 'pointerdown' || - eventName.toLowerCase() === 'pointermove')) { - this.enableCapturePointer = true; - if (eventName.toLowerCase() === 'pointermove') { - this.capturePointer.captureMoveEvents = true; - } - } - }; - /** - * Add an event listener. You can listen for a variety of - * events off of the engine; see [[GameEvent]] - * @param eventName Name of the event to listen for - * @param handler Event handler for the thrown event - * @obsolete Use [[on]] instead. - */ - Actor.prototype.addEventListener = function (eventName, handler) { - this._checkForPointerOptIn(eventName); - _super.prototype.addEventListener.call(this, eventName, handler); - }; - /** - * Alias for `addEventListener`. You can listen for a variety of - * events off of the engine; see [[GameEvent]] - * @param eventName Name of the event to listen for - * @param handler Event handler for the thrown event - */ - Actor.prototype.on = function (eventName, handler) { - this._checkForPointerOptIn(eventName); - this.eventDispatcher.subscribe(eventName, handler); - }; - /** - * If the current actor is a member of the scene, this will remove - * it from the scene graph. It will no longer be drawn or updated. - */ - Actor.prototype.kill = function () { - if (this.scene) { - this.scene.remove(this); - this._isKilled = true; - } - else { - this.logger.warn('Cannot kill actor, it was never added to the Scene'); - } - }; - /** - * Indicates wether the actor has been killed. - */ - Actor.prototype.isKilled = function () { - return this._isKilled; - }; - /** - * Adds a child actor to this actor. All movement of the child actor will be - * relative to the parent actor. Meaning if the parent moves the child will - * move with it. - * @param actor The child actor to add - */ - Actor.prototype.add = function (actor) { - actor.collisionType = CollisionType.PreventCollision; - if (ex.Util.addItemToArray(actor, this.children)) { - actor.parent = this; - } - }; - /** - * Removes a child actor from this actor. - * @param actor The child actor to remove - */ - Actor.prototype.remove = function (actor) { - if (ex.Util.removeItemToArray(actor, this.children)) { - actor.parent = null; - } - }; - Actor.prototype.setDrawing = function (key) { - key = key.toString(); - if (this.currentDrawing !== this.frames[key]) { - if (this.frames[key] != null) { - this.frames[key].reset(); - this.currentDrawing = this.frames[key]; - } - else { - ex.Logger.getInstance().error('the specified drawing key \'' + key + '\' does not exist'); - } - } - }; - Actor.prototype.addDrawing = function (args) { - if (arguments.length === 2) { - this.frames[arguments[0]] = arguments[1]; - if (!this.currentDrawing) { - this.currentDrawing = arguments[1]; - } - } - else { - if (arguments[0] instanceof ex.Sprite) { - this.addDrawing('default', arguments[0]); - } - if (arguments[0] instanceof ex.Texture) { - this.addDrawing('default', arguments[0].asSprite()); - } - } - }; - /** - * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in. - * Actors with a higher z-index are drawn on top of actors with a lower z-index - */ - Actor.prototype.getZIndex = function () { - return this._zIndex; - }; - /** - * Sets the z-index of an actor and updates it in the drawing list for the scene. - * The z-index determines the relative order an actor is drawn in. - * Actors with a higher z-index are drawn on top of actors with a lower z-index - * @param actor The child actor to remove - */ - Actor.prototype.setZIndex = function (newIndex) { - this.scene.cleanupDrawTree(this); - this._zIndex = newIndex; - this.scene.updateDrawTree(this); - }; - /** - * Artificially trigger an event on an actor, useful when creating custom events. - * @param eventName The name of the event to trigger - * @param event The event object to pass to the callback - * - * @obsolete Use [[emit]] instead. - */ - Actor.prototype.triggerEvent = function (eventName, event) { - this.eventDispatcher.emit(eventName, event); - }; - /** - * Alias for `emit`. Artificially trigger an event on an actor, useful when creating custom events. - * @param eventName The name of the event to trigger - * @param event The event object to pass to the callback - */ - Actor.prototype.emit = function (eventName, event) { - this.eventDispatcher.emit(eventName, event); - }; - /** - * Adds an actor to a collision group. Actors with no named collision groups are - * considered to be in every collision group. - * - * Once in a collision group(s) actors will only collide with other actors in - * that group. - * - * @param name The name of the collision group - */ - Actor.prototype.addCollisionGroup = function (name) { - this.collisionGroups.push(name); - }; - /** - * Removes an actor from a collision group. - * @param name The name of the collision group - */ - Actor.prototype.removeCollisionGroup = function (name) { - var index = this.collisionGroups.indexOf(name); - if (index !== -1) { - this.collisionGroups.splice(index, 1); - } - }; - /** - * Get the center point of an actor - */ - Actor.prototype.getCenter = function () { - return new ex.Vector(this.x + this.getWidth() / 2 - this.anchor.x * this.getWidth(), this.y + this.getHeight() / 2 - this.anchor.y * this.getHeight()); - }; - /** - * Gets the calculated width of an actor, factoring in scale - */ - Actor.prototype.getWidth = function () { - return this._width * this.scale.x; - }; - /** - * Sets the width of an actor, factoring in the current scale - */ - Actor.prototype.setWidth = function (width) { - this._width = width / this.scale.x; - }; - /** - * Gets the calculated height of an actor, factoring in scale - */ - Actor.prototype.getHeight = function () { - return this._height * this.scale.y; - }; - /** - * Sets the height of an actor, factoring in the current scale - */ - Actor.prototype.setHeight = function (height) { - this._height = height / this.scale.y; - }; - /** - * Centers the actor's drawing around the center of the actor's bounding box - * @param center Indicates to center the drawing around the actor - */ - Actor.prototype.setCenterDrawing = function (center) { - this.centerDrawingY = center; - this.centerDrawingX = center; - }; - /** - * Gets the left edge of the actor - */ - Actor.prototype.getLeft = function () { - return this.x; - }; - /** - * Gets the right edge of the actor - */ - Actor.prototype.getRight = function () { - return this.x + this.getWidth(); - }; - /** - * Gets the top edge of the actor - */ - Actor.prototype.getTop = function () { - return this.y; - }; - /** - * Gets the bottom edge of the actor - */ - Actor.prototype.getBottom = function () { - return this.y + this.getHeight(); - }; - /** - * Gets the x value of the Actor in global coordinates - */ - Actor.prototype.getWorldX = function () { - if (!this.parent) { - return this.x; - } - return this.x * this.parent.scale.x + this.parent.getWorldX(); - }; - /** - * Gets the y value of the Actor in global coordinates - */ - Actor.prototype.getWorldY = function () { - if (!this.parent) { - return this.y; - } - return this.y * this.parent.scale.y + this.parent.getWorldY(); - }; - /** - * Gets the global scale of the Actor - */ - Actor.prototype.getGlobalScale = function () { - if (!this.parent) { - return new ex.Point(this.scale.x, this.scale.y); - } - var parentScale = this.parent.getGlobalScale(); - return new ex.Point(this.scale.x * parentScale.x, this.scale.y * parentScale.y); - }; - /** - * Returns the actor's [[BoundingBox]] calculated for this instant. - */ - Actor.prototype.getBounds = function () { - var anchor = this._getCalculatedAnchor(); - return new ex.BoundingBox(this.getWorldX() - anchor.x, this.getWorldY() - anchor.y, this.getWorldX() + this.getWidth() - anchor.x, this.getWorldY() + this.getHeight() - anchor.y); - }; - /** - * Tests whether the x/y specified are contained in the actor - * @param x X coordinate to test (in world coordinates) - * @param y Y coordinate to test (in world coordinates) - * @param recurse checks whether the x/y are contained in any child actors (if they exist). - */ - Actor.prototype.contains = function (x, y, recurse) { - if (recurse === void 0) { recurse = false; } - var containment = this.getBounds().contains(new ex.Point(x, y)); - if (recurse) { - return containment || this.children.some(function (child) { - return child.contains(x, y, true); - }); - } - return containment; - }; - /** - * Returns the side of the collision based on the intersection - * @param intersect The displacement vector returned by a collision - */ - Actor.prototype.getSideFromIntersect = function (intersect) { - if (intersect) { - if (Math.abs(intersect.x) > Math.abs(intersect.y)) { - if (intersect.x < 0) { - return ex.Side.Right; - } - return ex.Side.Left; - } - else { - if (intersect.y < 0) { - return ex.Side.Bottom; - } - return ex.Side.Top; - } - } - return ex.Side.None; - }; - /** - * Test whether the actor has collided with another actor, returns the side of the current actor that collided. - * @param actor The other actor to test - */ - Actor.prototype.collidesWithSide = function (actor) { - var separationVector = this.collides(actor); - if (!separationVector) { - return ex.Side.None; - } - if (Math.abs(separationVector.x) > Math.abs(separationVector.y)) { - if (this.x < actor.x) { - return ex.Side.Right; - } - else { - return ex.Side.Left; - } - } - else { - if (this.y < actor.y) { - return ex.Side.Bottom; - } - else { - return ex.Side.Top; - } - } - return ex.Side.None; - }; - /** - * Test whether the actor has collided with another actor, returns the intersection vector on collision. Returns - * `null` when there is no collision; - * @param actor The other actor to test - */ - Actor.prototype.collides = function (actor) { - var bounds = this.getBounds(); - var otherBounds = actor.getBounds(); - var intersect = bounds.collides(otherBounds); - return intersect; - }; - /** - * Register a handler to fire when this actor collides with another in a specified group - * @param group The group name to listen for - * @param func The callback to fire on collision with another actor from the group. The callback is passed the other actor. - */ - Actor.prototype.onCollidesWith = function (group, func) { - if (!this._collisionHandlers[group]) { - this._collisionHandlers[group] = []; - } - this._collisionHandlers[group].push(func); - }; - Actor.prototype.getCollisionHandlers = function () { - return this._collisionHandlers; - }; - /** - * Removes all collision handlers for this group on this actor - * @param group Group to remove all handlers for on this actor. - */ - Actor.prototype.removeCollidesWith = function (group) { - this._collisionHandlers[group] = []; - }; - /** - * Returns true if the two actors are less than or equal to the distance specified from each other - * @param actor Actor to test - * @param distance Distance in pixels to test - */ - Actor.prototype.within = function (actor, distance) { - return Math.sqrt(Math.pow(this.x - actor.x, 2) + Math.pow(this.y - actor.y, 2)) <= distance; - }; - /** - * Clears all queued actions from the Actor - */ - Actor.prototype.clearActions = function () { - this.actionQueue.clearActions(); - }; - /** - * This method will move an actor to the specified `x` and `y` position over the - * specified duration using a given [[EasingFunctions]] and return back the actor. This - * method is part of the actor 'Action' fluent API allowing action chaining. - * @param x The x location to move the actor to - * @param y The y location to move the actor to - * @param duration The time it should take the actor to move to the new location in milliseconds - * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position - */ - Actor.prototype.easeTo = function (x, y, duration, easingFcn) { - if (easingFcn === void 0) { easingFcn = ex.EasingFunctions.Linear; } - this.actionQueue.add(new ex.Internal.Actions.EaseTo(this, x, y, duration, easingFcn)); - return this; - }; - /** - * This method will move an actor to the specified `x` and `y` position at the - * `speed` specified (in pixels per second) and return back the actor. This - * method is part of the actor 'Action' fluent API allowing action chaining. - * @param x The x location to move the actor to - * @param y The y location to move the actor to - * @param speed The speed in pixels per second to move - */ - Actor.prototype.moveTo = function (x, y, speed) { - this.actionQueue.add(new ex.Internal.Actions.MoveTo(this, x, y, speed)); - return this; - }; - /** - * This method will move an actor to the specified `x` and `y` position by a - * certain `duration` (in milliseconds). This method is part of the actor - * 'Action' fluent API allowing action chaining. - * @param x The x location to move the actor to - * @param y The y location to move the actor to - * @param duration The time it should take the actor to move to the new location in milliseconds - */ - Actor.prototype.moveBy = function (x, y, duration) { - this.actionQueue.add(new ex.Internal.Actions.MoveBy(this, x, y, duration)); - return this; - }; - /** - * This method will rotate an actor to the specified angle (in radians) at the `speed` - * specified (in radians per second) and return back the actor. This - * method is part of the actor 'Action' fluent API allowing action chaining. - * @param angleRadians The angle to rotate to in radians - * @param speed The angular velocity of the rotation specified in radians per second - */ - Actor.prototype.rotateTo = function (angleRadians, speed, rotationType) { - this.actionQueue.add(new ex.Internal.Actions.RotateTo(this, angleRadians, speed, rotationType)); - return this; - }; - /** - * This method will rotate an actor to the specified angle by a certain - * `duration` (in milliseconds) and return back the actor. This method is part - * of the actor 'Action' fluent API allowing action chaining. - * @param angleRadians The angle to rotate to in radians - * @param duration The time it should take the actor to complete the rotation in milliseconds - */ - Actor.prototype.rotateBy = function (angleRadians, duration, rotationType) { - this.actionQueue.add(new ex.Internal.Actions.RotateBy(this, angleRadians, duration, rotationType)); - return this; - }; - /** - * This method will scale an actor to the specified size at the speed - * specified (in magnitude increase per second) and return back the - * actor. This method is part of the actor 'Action' fluent API allowing - * action chaining. - * @param sizeX The scaling factor in the x direction to apply - * @param sizeY The scaling factor in the y direction to apply - * @param speedX The speed of scaling in the x direction specified in magnitude increase per second - * @param speedY The speed of scaling in the y direction specified in magnitude increase per second - */ - Actor.prototype.scaleTo = function (sizeX, sizeY, speedX, speedY) { - this.actionQueue.add(new ex.Internal.Actions.ScaleTo(this, sizeX, sizeY, speedX, speedY)); - return this; - }; - /** - * This method will scale an actor to the specified size by a certain duration - * (in milliseconds) and return back the actor. This method is part of the - * actor 'Action' fluent API allowing action chaining. - * @param sizeX The scaling factor in the x direction to apply - * @param sizeY The scaling factor in the y direction to apply - * @param duration The time it should take to complete the scaling in milliseconds - */ - Actor.prototype.scaleBy = function (sizeX, sizeY, duration) { - this.actionQueue.add(new ex.Internal.Actions.ScaleBy(this, sizeX, sizeY, duration)); - return this; - }; - /** - * This method will cause an actor to blink (become visible and not - * visible). Optionally, you may specify the number of blinks. Specify the amount of time - * the actor should be visible per blink, and the amount of time not visible. - * This method is part of the actor 'Action' fluent API allowing action chaining. - * @param timeVisible The amount of time to stay visible per blink in milliseconds - * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds - * @param numBlinks The number of times to blink - */ - Actor.prototype.blink = function (timeVisible, timeNotVisible, numBlinks) { - if (numBlinks === void 0) { numBlinks = 1; } - this.actionQueue.add(new ex.Internal.Actions.Blink(this, timeVisible, timeNotVisible, numBlinks)); - return this; - }; - /** - * This method will cause an actor's opacity to change from its current value - * to the provided value by a specified `duration` (in milliseconds). This method is - * part of the actor 'Action' fluent API allowing action chaining. - * @param opacity The ending opacity - * @param duration The time it should take to fade the actor (in milliseconds) - */ - Actor.prototype.fade = function (opacity, duration) { - this.actionQueue.add(new ex.Internal.Actions.Fade(this, opacity, duration)); - return this; - }; - /** - * This method will delay the next action from executing for the specified - * `duration` (in milliseconds). This method is part of the actor - * 'Action' fluent API allowing action chaining. - * @param duration The amount of time to delay the next action in the queue from executing in milliseconds - */ - Actor.prototype.delay = function (duration) { - this.actionQueue.add(new ex.Internal.Actions.Delay(this, duration)); - return this; - }; - /** - * This method will add an action to the queue that will remove the actor from the - * scene once it has completed its previous actions. Any actions on the - * action queue after this action will not be executed. - */ - Actor.prototype.die = function () { - this.actionQueue.add(new ex.Internal.Actions.Die(this)); - return this; - }; - /** - * This method allows you to call an arbitrary method as the next action in the - * action queue. This is useful if you want to execute code in after a specific - * action, i.e An actor arrives at a destination after traversing a path - */ - Actor.prototype.callMethod = function (method) { - this.actionQueue.add(new ex.Internal.Actions.CallMethod(this, method)); - return this; - }; - /** - * This method will cause the actor to repeat all of the previously - * called actions a certain number of times. If the number of repeats - * is not specified it will repeat forever. This method is part of - * the actor 'Action' fluent API allowing action chaining - * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions will - * repeat forever - */ - Actor.prototype.repeat = function (times) { - if (!times) { - this.repeatForever(); - return this; - } - this.actionQueue.add(new ex.Internal.Actions.Repeat(this, times, this.actionQueue.getActions())); - return this; - }; - /** - * This method will cause the actor to repeat all of the previously - * called actions forever. This method is part of the actor 'Action' - * fluent API allowing action chaining. - */ - Actor.prototype.repeatForever = function () { - this.actionQueue.add(new ex.Internal.Actions.RepeatForever(this, this.actionQueue.getActions())); - return this; - }; - /** - * This method will cause the actor to follow another at a specified distance - * @param actor The actor to follow - * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance. - */ - Actor.prototype.follow = function (actor, followDistance) { - if (typeof followDistance === 'undefined') { - this.actionQueue.add(new ex.Internal.Actions.Follow(this, actor)); - } - else { - this.actionQueue.add(new ex.Internal.Actions.Follow(this, actor, followDistance)); - } - return this; - }; - /** - * This method will cause the actor to move towards another Actor until they - * collide ("meet") at a specified speed. - * @param actor The actor to meet - * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor - */ - Actor.prototype.meet = function (actor, speed) { - if (typeof speed === 'undefined') { - this.actionQueue.add(new ex.Internal.Actions.Meet(this, actor)); - } - else { - this.actionQueue.add(new ex.Internal.Actions.Meet(this, actor, speed)); - } - return this; - }; - /** - * Returns a promise that resolves when the current action queue up to now - * is finished. - */ - Actor.prototype.asPromise = function () { - var complete = new ex.Promise(); - this.callMethod(function () { - complete.resolve(); - }); - return complete; - }; - Actor.prototype._getCalculatedAnchor = function () { - return new ex.Point(this.getWidth() * this.anchor.x, this.getHeight() * this.anchor.y); - }; - /** - * Called by the Engine, updates the state of the actor - * @param engine The reference to the current game engine - * @param delta The time elapsed since the last update in milliseconds - */ - Actor.prototype.update = function (engine, delta) { - if (!this._isInitialized) { - this.onInitialize(engine); - this.eventDispatcher.emit('initialize', new ex.InitializeEvent(engine)); - this._isInitialized = true; - } - var eventDispatcher = this.eventDispatcher; - // Update action queue - this.actionQueue.update(delta); - // Update color only opacity - if (this.color) { - this.color.a = this.opacity; - } - // Update actor pipeline (movement, collision detection, event propagation, offscreen culling) - for (var i = 0; i < this.traits.length; i++) { - this.traits[i].update(this, engine, delta); - } - eventDispatcher.emit(ex.EventType[ex.EventType.Update], new ex.UpdateEvent(delta)); - }; - /** - * Called by the Engine, draws the actor to the screen - * @param ctx The rendering context - * @param delta The time since the last draw in milliseconds - */ - Actor.prototype.draw = function (ctx, delta) { - var anchorPoint = this._getCalculatedAnchor(); - ctx.save(); - ctx.scale(this.scale.x, this.scale.y); - ctx.translate(this.x, this.y); - ctx.rotate(this.rotation); - // calculate changing opacity - if (this.previousOpacity !== this.opacity) { - for (var drawing in this.frames) { - this.frames[drawing].addEffect(new ex.Effects.Opacity(this.opacity)); - } - this.previousOpacity = this.opacity; - } - if (this.currentDrawing) { - var xDiff = 0; - var yDiff = 0; - if (this.centerDrawingX) { - xDiff = (this.currentDrawing.naturalWidth * this.currentDrawing.scale.x - this.getWidth()) / 2 - - this.currentDrawing.naturalWidth * this.currentDrawing.scale.x * this.currentDrawing.anchor.x; - } - if (this.centerDrawingY) { - yDiff = (this.currentDrawing.naturalHeight * this.currentDrawing.scale.y - this.getHeight()) / 2 - - this.currentDrawing.naturalHeight * this.currentDrawing.scale.y * this.currentDrawing.anchor.y; - } - this.currentDrawing.draw(ctx, -anchorPoint.x - xDiff, -anchorPoint.y - yDiff); - } - else { - if (this.color) { - ctx.fillStyle = this.color.toString(); - ctx.fillRect(-anchorPoint.x, -anchorPoint.y, this._width, this._height); - } - } - // Draw child actors - for (var i = 0; i < this.children.length; i++) { - if (this.children[i].visible) { - this.children[i].draw(ctx, delta); - } - } - ctx.restore(); - }; - /** - * Called by the Engine, draws the actors debugging to the screen - * @param ctx The rendering context - */ - Actor.prototype.debugDraw = function (ctx) { - // Draw actor bounding box - var bb = this.getBounds(); - bb.debugDraw(ctx); - // Draw actor Id - ctx.fillText('id: ' + this.id, bb.left + 3, bb.top + 10); - // Draw actor anchor point - ctx.fillStyle = ex.Color.Yellow.toString(); - ctx.beginPath(); - ctx.arc(this.getWorldX(), this.getWorldY(), 3, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - // Culling Box debug draw - for (var j = 0; j < this.traits.length; j++) { - if (this.traits[j] instanceof ex.Traits.OffscreenCulling) { - this.traits[j].cullingBox.debugDraw(ctx); - } - } - // Unit Circle debug draw - ctx.strokeStyle = ex.Color.Yellow.toString(); - ctx.beginPath(); - var radius = Math.min(this.getWidth(), this.getHeight()); - ctx.arc(this.getWorldX(), this.getWorldY(), radius, 0, Math.PI * 2); - ctx.closePath(); - ctx.stroke(); - var ticks = { '0 Pi': 0, - 'Pi/2': Math.PI / 2, - 'Pi': Math.PI, - '3/2 Pi': 3 * Math.PI / 2 }; - var oldFont = ctx.font; - for (var tick in ticks) { - ctx.fillStyle = ex.Color.Yellow.toString(); - ctx.font = '14px'; - ctx.textAlign = 'center'; - ctx.fillText(tick, this.getWorldX() + Math.cos(ticks[tick]) * (radius + 10), this.getWorldY() + Math.sin(ticks[tick]) * (radius + 10)); - } - ctx.font = oldFont; - // Draw child actors - ctx.save(); - ctx.translate(this.x, this.y); - ctx.rotate(this.rotation); - // Draw child actors - for (var i = 0; i < this.children.length; i++) { - this.children[i].debugDraw(ctx); - } - ctx.restore(); - }; - /** - * Indicates the next id to be set - */ - Actor.maxId = 0; - return Actor; - })(ex.Class); - ex.Actor = Actor; - /** - * An enum that describes the types of collisions actors can participate in - */ - (function (CollisionType) { - /** - * Actors with the `PreventCollision` setting do not participate in any - * collisions and do not raise collision events. - */ - CollisionType[CollisionType["PreventCollision"] = 0] = "PreventCollision"; - /** - * Actors with the `Passive` setting only raise collision events, but are not - * influenced or moved by other actors and do not influence or move other actors. - */ - CollisionType[CollisionType["Passive"] = 1] = "Passive"; - /** - * Actors with the `Active` setting raise collision events and participate - * in collisions with other actors and will be push or moved by actors sharing - * the `Active` or `Fixed` setting. - */ - CollisionType[CollisionType["Active"] = 2] = "Active"; - /** - * Actors with the `Elastic` setting will behave the same as `Active`, except that they will - * "bounce" in the opposite direction given their velocity dx/dy. This is a naive implementation meant for - * prototyping, for a more robust elastic collision listen to the "collision" event and perform your custom logic. - */ - CollisionType[CollisionType["Elastic"] = 3] = "Elastic"; - /** - * Actors with the `Fixed` setting raise collision events and participate in - * collisions with other actors. Actors with the `Fixed` setting will not be - * pushed or moved by other actors sharing the `Fixed`. Think of Fixed - * actors as "immovable/onstoppable" objects. If two `Fixed` actors meet they will - * not be pushed or moved by each other, they will not interact except to throw - * collision events. - */ - CollisionType[CollisionType["Fixed"] = 4] = "Fixed"; - })(ex.CollisionType || (ex.CollisionType = {})); - var CollisionType = ex.CollisionType; -})(ex || (ex = {})); -var ex; -(function (ex) { - /** - * Logging level that Excalibur will tag - */ - (function (LogLevel) { - LogLevel[LogLevel["Debug"] = 0] = "Debug"; - LogLevel[LogLevel["Info"] = 1] = "Info"; - LogLevel[LogLevel["Warn"] = 2] = "Warn"; - LogLevel[LogLevel["Error"] = 3] = "Error"; - LogLevel[LogLevel["Fatal"] = 4] = "Fatal"; - })(ex.LogLevel || (ex.LogLevel = {})); - var LogLevel = ex.LogLevel; - /** - * Static singleton that represents the logging facility for Excalibur. - * Excalibur comes built-in with a [[ConsoleAppender]] and [[ScreenAppender]]. - * Derive from [[IAppender]] to create your own logging appenders. - * - * ## Example: Logging - * - * ```js - * // set default log level (default: Info) - * ex.Logger.getInstance().defaultLevel = ex.LogLevel.Warn; - * - * // this will not be shown because it is below Warn - * ex.Logger.getInstance().info("This will be logged as Info"); - * // this will show because it is Warn - * ex.Logger.getInstance().warn("This will be logged as Warn"); - * // this will show because it is above Warn - * ex.Logger.getInstance().error("This will be logged as Error"); - * // this will show because it is above Warn - * ex.Logger.getInstance().fatal("This will be logged as Fatal"); - * ``` - */ - var Logger = (function () { - function Logger() { - this._appenders = []; - /** - * Gets or sets the default logging level. Excalibur will only log - * messages if equal to or above this level. Default: [[LogLevel.Info]] - */ - this.defaultLevel = LogLevel.Info; - if (Logger._instance) { - throw new Error('Logger is a singleton'); - } - Logger._instance = this; - // Default console appender - Logger._instance.addAppender(new ConsoleAppender()); - return Logger._instance; - } - /** - * Gets the current static instance of Logger - */ - Logger.getInstance = function () { - if (Logger._instance == null) { - Logger._instance = new Logger(); - } - return Logger._instance; - }; - /** - * Adds a new [[IAppender]] to the list of appenders to write to - */ - Logger.prototype.addAppender = function (appender) { - this._appenders.push(appender); - }; - /** - * Clears all appenders from the logger - */ - Logger.prototype.clearAppenders = function () { - this._appenders.length = 0; - }; - /** - * Logs a message at a given LogLevel - * @param level The LogLevel`to log the message at - * @param args An array of arguments to write to an appender - */ - Logger.prototype._log = function (level, args) { - if (level == null) { - level = this.defaultLevel; - } - var i = 0, len = this._appenders.length; - for (i; i < len; i++) { - if (level >= this.defaultLevel) { - this._appenders[i].log(level, args); - } - } - }; - /** - * Writes a log message at the [[LogLevel.Debug]] level - * @param args Accepts any number of arguments - */ - Logger.prototype.debug = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - this._log(LogLevel.Debug, args); - }; - /** - * Writes a log message at the [[LogLevel.Info]] level - * @param args Accepts any number of arguments - */ - Logger.prototype.info = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - this._log(LogLevel.Info, args); - }; - /** - * Writes a log message at the [[LogLevel.Warn]] level - * @param args Accepts any number of arguments - */ - Logger.prototype.warn = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - this._log(LogLevel.Warn, args); - }; - /** - * Writes a log message at the [[LogLevel.Error]] level - * @param args Accepts any number of arguments - */ - Logger.prototype.error = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - this._log(LogLevel.Error, args); - }; - /** - * Writes a log message at the [[LogLevel.Fatal]] level - * @param args Accepts any number of arguments - */ - Logger.prototype.fatal = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - this._log(LogLevel.Fatal, args); - }; - Logger._instance = null; - return Logger; - })(); - ex.Logger = Logger; - /** - * Console appender for browsers (i.e. `console.log`) - */ - var ConsoleAppender = (function () { - function ConsoleAppender() { - } - /** - * Logs a message at the given [[LogLevel]] - * @param level Level to log at - * @param args Arguments to log - */ - ConsoleAppender.prototype.log = function (level, args) { - // Check for console support - if (!console && !console.log && console.warn && console.error) { - // todo maybe do something better than nothing - return; - } - // Create a new console args array - var consoleArgs = []; - consoleArgs.unshift.apply(consoleArgs, args); - consoleArgs.unshift('[' + LogLevel[level] + '] : '); - if (level < LogLevel.Warn) { - // Call .log for Debug/Info - if (console.log.apply) { - // this is required on some older browsers that don't support apply on console.log :( - console.log.apply(console, consoleArgs); - } - else { - console.log(consoleArgs.join(' ')); + RotateTo.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._start = this._actor.rotation; + var distance1 = Math.abs(this._end - this._start); + var distance2 = ex.Util.TwoPI - distance1; + if (distance1 > distance2) { + this._shortDistance = distance2; + this._longDistance = distance1; + } + else { + this._shortDistance = distance1; + this._longDistance = distance2; + } + this._shortestPathIsPositive = (this._start - this._end + ex.Util.TwoPI) % ex.Util.TwoPI >= Math.PI; + switch (this._rotationType) { + case ex.RotationType.ShortestPath: + this._distance = this._shortDistance; + if (this._shortestPathIsPositive) { + this._direction = 1; + } + else { + this._direction = -1; + } + break; + case ex.RotationType.LongestPath: + this._distance = this._longDistance; + if (this._shortestPathIsPositive) { + this._direction = -1; + } + else { + this._direction = 1; + } + break; + case ex.RotationType.Clockwise: + this._direction = 1; + if (this._shortestPathIsPositive) { + this._distance = this._shortDistance; + } + else { + this._distance = this._longDistance; + } + break; + case ex.RotationType.CounterClockwise: + this._direction = -1; + if (!this._shortestPathIsPositive) { + this._distance = this._shortDistance; + } + else { + this._distance = this._longDistance; + } + break; + } + } + this._actor.rx = this._direction * this._speed; + if (this.isComplete(this._actor)) { + this._actor.rotation = this._end; + this._actor.rx = 0; + this._stopped = true; + } + }; + RotateTo.prototype.isComplete = function (actor) { + var distanceTravelled = Math.abs(this._actor.rotation - this._start); + return this._stopped || (distanceTravelled >= Math.abs(this._distance)); + }; + RotateTo.prototype.stop = function () { + this._actor.rx = 0; + this._stopped = true; + }; + RotateTo.prototype.reset = function () { + this._started = false; + }; + return RotateTo; + })(); + Actions.RotateTo = RotateTo; + var RotateBy = (function () { + function RotateBy(actor, angleRadians, time, rotationType) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._end = angleRadians; + this._time = time; + this._rotationType = rotationType || ex.RotationType.ShortestPath; } - } - else if (level < LogLevel.Error) { - // Call .warn for Warn - if (console.warn.apply) { - console.warn.apply(console, consoleArgs); + RotateBy.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._start = this._actor.rotation; + var distance1 = Math.abs(this._end - this._start); + var distance2 = ex.Util.TwoPI - distance1; + if (distance1 > distance2) { + this._shortDistance = distance2; + this._longDistance = distance1; + } + else { + this._shortDistance = distance1; + this._longDistance = distance2; + } + this._shortestPathIsPositive = (this._start - this._end + ex.Util.TwoPI) % ex.Util.TwoPI >= Math.PI; + switch (this._rotationType) { + case ex.RotationType.ShortestPath: + this._distance = this._shortDistance; + if (this._shortestPathIsPositive) { + this._direction = 1; + } + else { + this._direction = -1; + } + break; + case ex.RotationType.LongestPath: + this._distance = this._longDistance; + if (this._shortestPathIsPositive) { + this._direction = -1; + } + else { + this._direction = 1; + } + break; + case ex.RotationType.Clockwise: + this._direction = 1; + if (this._shortDistance >= 0) { + this._distance = this._shortDistance; + } + else { + this._distance = this._longDistance; + } + break; + case ex.RotationType.CounterClockwise: + this._direction = -1; + if (this._shortDistance <= 0) { + this._distance = this._shortDistance; + } + else { + this._distance = this._longDistance; + } + break; + } + this._speed = Math.abs(this._distance / this._time * 1000); + } + this._actor.rx = this._direction * this._speed; + if (this.isComplete(this._actor)) { + this._actor.rotation = this._end; + this._actor.rx = 0; + this._stopped = true; + } + }; + RotateBy.prototype.isComplete = function (actor) { + var distanceTravelled = Math.abs(this._actor.rotation - this._start); + return this._stopped || (distanceTravelled >= Math.abs(this._distance)); + }; + RotateBy.prototype.stop = function () { + this._actor.rx = 0; + this._stopped = true; + }; + RotateBy.prototype.reset = function () { + this._started = false; + }; + return RotateBy; + })(); + Actions.RotateBy = RotateBy; + var ScaleTo = (function () { + function ScaleTo(actor, scaleX, scaleY, speedX, speedY) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._endX = scaleX; + this._endY = scaleY; + this._speedX = speedX; + this._speedY = speedY; } - else { - console.warn(consoleArgs.join(' ')); + ScaleTo.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._startX = this._actor.scale.x; + this._startY = this._actor.scale.y; + this._distanceX = Math.abs(this._endX - this._startX); + this._distanceY = Math.abs(this._endY - this._startY); + } + if (!(Math.abs(this._actor.scale.x - this._startX) >= this._distanceX)) { + var directionX = this._endY < this._startY ? -1 : 1; + this._actor.sx = this._speedX * directionX; + } + else { + this._actor.sx = 0; + } + if (!(Math.abs(this._actor.scale.y - this._startY) >= this._distanceY)) { + var directionY = this._endY < this._startY ? -1 : 1; + this._actor.sy = this._speedY * directionY; + } + else { + this._actor.sy = 0; + } + if (this.isComplete(this._actor)) { + this._actor.scale.x = this._endX; + this._actor.scale.y = this._endY; + this._actor.sx = 0; + this._actor.sy = 0; + } + }; + ScaleTo.prototype.isComplete = function (actor) { + return this._stopped || ((Math.abs(this._actor.scale.y - this._startX) >= this._distanceX) && + (Math.abs(this._actor.scale.y - this._startY) >= this._distanceY)); + }; + ScaleTo.prototype.stop = function () { + this._actor.sx = 0; + this._actor.sy = 0; + this._stopped = true; + }; + ScaleTo.prototype.reset = function () { + this._started = false; + }; + return ScaleTo; + })(); + Actions.ScaleTo = ScaleTo; + var ScaleBy = (function () { + function ScaleBy(actor, scaleX, scaleY, time) { + this._started = false; + this._stopped = false; + this._actor = actor; + this._endX = scaleX; + this._endY = scaleY; + this._time = time; + this._speedX = (this._endX - this._actor.scale.x) / time * 1000; + this._speedY = (this._endY - this._actor.scale.y) / time * 1000; } - } - else { - // Call .error for Error/Fatal - if (console.error.apply) { - console.error.apply(console, consoleArgs); + ScaleBy.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + this._startX = this._actor.scale.x; + this._startY = this._actor.scale.y; + this._distanceX = Math.abs(this._endX - this._startX); + this._distanceY = Math.abs(this._endY - this._startY); + } + var directionX = this._endX < this._startX ? -1 : 1; + var directionY = this._endY < this._startY ? -1 : 1; + this._actor.sx = this._speedX * directionX; + this._actor.sy = this._speedY * directionY; + if (this.isComplete(this._actor)) { + this._actor.scale.x = this._endX; + this._actor.scale.y = this._endY; + this._actor.sx = 0; + this._actor.sy = 0; + } + }; + ScaleBy.prototype.isComplete = function (actor) { + return this._stopped || ((Math.abs(this._actor.scale.x - this._startX) >= this._distanceX) && + (Math.abs(this._actor.scale.y - this._startY) >= this._distanceY)); + }; + ScaleBy.prototype.stop = function () { + this._actor.sx = 0; + this._actor.sy = 0; + this._stopped = true; + }; + ScaleBy.prototype.reset = function () { + this._started = false; + }; + return ScaleBy; + })(); + Actions.ScaleBy = ScaleBy; + var Delay = (function () { + function Delay(actor, delay) { + this._elapsedTime = 0; + this._started = false; + this._stopped = false; + this._actor = actor; + this._delay = delay; } - else { - console.error(consoleArgs.join(' ')); + Delay.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + } + this.x = this._actor.x; + this.y = this._actor.y; + this._elapsedTime += delta; + }; + Delay.prototype.isComplete = function (actor) { + return this._stopped || (this._elapsedTime >= this._delay); + }; + Delay.prototype.stop = function () { + this._stopped = true; + }; + Delay.prototype.reset = function () { + this._elapsedTime = 0; + this._started = false; + }; + return Delay; + })(); + Actions.Delay = Delay; + var Blink = (function () { + function Blink(actor, timeVisible, timeNotVisible, numBlinks) { + if (numBlinks === void 0) { numBlinks = 1; } + this._timeVisible = 0; + this._timeNotVisible = 0; + this._elapsedTime = 0; + this._totalTime = 0; + this._stopped = false; + this._started = false; + this._actor = actor; + this._timeVisible = timeVisible; + this._timeNotVisible = timeNotVisible; + this._duration = (timeVisible + timeNotVisible) * numBlinks; } - } - }; - return ConsoleAppender; - })(); - ex.ConsoleAppender = ConsoleAppender; - /** - * On-screen (canvas) appender - */ - var ScreenAppender = (function () { - /** - * @param width Width of the screen appender in pixels - * @param height Height of the screen appender in pixels - */ - function ScreenAppender(width, height) { - // @todo Clean this up - this._messages = []; - this._canvas = document.createElement('canvas'); - this._canvas.width = width || window.innerWidth; - this._canvas.height = height || window.innerHeight; - this._canvas.style.position = 'absolute'; - this._ctx = this._canvas.getContext('2d'); - document.body.appendChild(this._canvas); - } - /** - * Logs a message at the given [[LogLevel]] - * @param level Level to log at - * @param args Arguments to log - */ - ScreenAppender.prototype.log = function (level, args) { - var message = args.join(','); - this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); - this._messages.unshift('[' + LogLevel[level] + '] : ' + message); - var pos = 10; - var opacity = 1.0; - for (var i = 0; i < this._messages.length; i++) { - this._ctx.fillStyle = 'rgba(255,255,255,' + opacity.toFixed(2) + ')'; - this._ctx.fillText(this._messages[i], 200, pos); - pos += 10; - opacity = opacity > 0 ? opacity - .05 : 0; - } - }; - return ScreenAppender; - })(); - ex.ScreenAppender = ScreenAppender; -})(ex || (ex = {})); -/// -/// -/// -var ex; -(function (ex) { - /** - * An enum representing all of the built in event types for Excalibur - * @obsolete Phasing this out in favor of classes - */ - (function (EventType) { - EventType[EventType["Collision"] = 0] = "Collision"; - EventType[EventType["EnterViewPort"] = 1] = "EnterViewPort"; - EventType[EventType["ExitViewPort"] = 2] = "ExitViewPort"; - EventType[EventType["Blur"] = 3] = "Blur"; - EventType[EventType["Focus"] = 4] = "Focus"; - EventType[EventType["Update"] = 5] = "Update"; - EventType[EventType["Activate"] = 6] = "Activate"; - EventType[EventType["Deactivate"] = 7] = "Deactivate"; - EventType[EventType["Initialize"] = 8] = "Initialize"; - })(ex.EventType || (ex.EventType = {})); - var EventType = ex.EventType; - /** - * Base event type in Excalibur that all other event types derive from. - */ - var GameEvent = (function () { - function GameEvent() { - } - return GameEvent; - })(); - ex.GameEvent = GameEvent; - /** - * Subscribe event thrown when handlers for events other than subscribe are added - */ - var SubscribeEvent = (function (_super) { - __extends(SubscribeEvent, _super); - function SubscribeEvent(topic, handler) { - _super.call(this); - this.topic = topic; - this.handler = handler; - } - return SubscribeEvent; - })(GameEvent); - ex.SubscribeEvent = SubscribeEvent; - /** - * Unsubscribe event thrown when handlers for events other than unsubscribe are removed - */ - var UnsubscribeEvent = (function (_super) { - __extends(UnsubscribeEvent, _super); - function UnsubscribeEvent(topic, handler) { - _super.call(this); - this.topic = topic; - this.handler = handler; - } - return UnsubscribeEvent; - })(GameEvent); - ex.UnsubscribeEvent = UnsubscribeEvent; - /** - * Event received by the Engine when the browser window is visible - */ - var VisibleEvent = (function (_super) { - __extends(VisibleEvent, _super); - function VisibleEvent() { - _super.call(this); - } - return VisibleEvent; - })(GameEvent); - ex.VisibleEvent = VisibleEvent; - /** - * Event received by the Engine when the browser window is hidden - */ - var HiddenEvent = (function (_super) { - __extends(HiddenEvent, _super); - function HiddenEvent() { - _super.call(this); - } - return HiddenEvent; - })(GameEvent); - ex.HiddenEvent = HiddenEvent; - /** - * Event thrown on an actor when a collision has occured - */ - var CollisionEvent = (function (_super) { - __extends(CollisionEvent, _super); - /** - * @param actor The actor the event was thrown on - * @param other The actor that was collided with - * @param side The side that was collided with - */ - function CollisionEvent(actor, other, side, intersection) { - _super.call(this); - this.actor = actor; - this.other = other; - this.side = side; - this.intersection = intersection; - } - return CollisionEvent; - })(GameEvent); - ex.CollisionEvent = CollisionEvent; - /** - * Event thrown on a game object on Excalibur update - */ - var UpdateEvent = (function (_super) { - __extends(UpdateEvent, _super); - /** - * @param delta The number of milliseconds since the last update - */ - function UpdateEvent(delta) { - _super.call(this); - this.delta = delta; - } - return UpdateEvent; - })(GameEvent); - ex.UpdateEvent = UpdateEvent; - /** - * Event thrown on an Actor only once before the first update call - */ - var InitializeEvent = (function (_super) { - __extends(InitializeEvent, _super); - /** - * @param engine The reference to the current engine - */ - function InitializeEvent(engine) { - _super.call(this); - this.engine = engine; - } - return InitializeEvent; - })(GameEvent); - ex.InitializeEvent = InitializeEvent; - /** - * Event thrown on a Scene on activation - */ - var ActivateEvent = (function (_super) { - __extends(ActivateEvent, _super); - /** - * @param oldScene The reference to the old scene - */ - function ActivateEvent(oldScene) { - _super.call(this); - this.oldScene = oldScene; - } - return ActivateEvent; - })(GameEvent); - ex.ActivateEvent = ActivateEvent; - /** - * Event thrown on a Scene on deactivation - */ - var DeactivateEvent = (function (_super) { - __extends(DeactivateEvent, _super); - /** - * @param newScene The reference to the new scene - */ - function DeactivateEvent(newScene) { - _super.call(this); - this.newScene = newScene; - } - return DeactivateEvent; - })(GameEvent); - ex.DeactivateEvent = DeactivateEvent; - /** - * Event thrown on an Actor when it completely leaves the screen. - */ - var ExitViewPortEvent = (function (_super) { - __extends(ExitViewPortEvent, _super); - function ExitViewPortEvent() { - _super.call(this); - } - return ExitViewPortEvent; - })(GameEvent); - ex.ExitViewPortEvent = ExitViewPortEvent; - /** - * Event thrown on an Actor when it completely leaves the screen. - */ - var EnterViewPortEvent = (function (_super) { - __extends(EnterViewPortEvent, _super); - function EnterViewPortEvent() { - _super.call(this); - } - return EnterViewPortEvent; - })(GameEvent); - ex.EnterViewPortEvent = EnterViewPortEvent; + Blink.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + } + this._elapsedTime += delta; + this._totalTime += delta; + if (this._actor.visible && this._elapsedTime >= this._timeVisible) { + this._actor.visible = false; + this._elapsedTime = 0; + } + if (!this._actor.visible && this._elapsedTime >= this._timeNotVisible) { + this._actor.visible = true; + this._elapsedTime = 0; + } + if (this.isComplete(this._actor)) { + this._actor.visible = true; + } + }; + Blink.prototype.isComplete = function (actor) { + return this._stopped || (this._totalTime >= this._duration); + }; + Blink.prototype.stop = function () { + this._actor.visible = true; + this._stopped = true; + }; + Blink.prototype.reset = function () { + this._started = false; + this._elapsedTime = 0; + this._totalTime = 0; + }; + return Blink; + })(); + Actions.Blink = Blink; + var Fade = (function () { + function Fade(actor, endOpacity, speed) { + this._multiplyer = 1; + this._started = false; + this._stopped = false; + this._actor = actor; + this._endOpacity = endOpacity; + this._speed = speed; + if (endOpacity < actor.opacity) { + this._multiplyer = -1; + } + } + Fade.prototype.update = function (delta) { + if (!this._started) { + this._started = true; + } + if (this._speed > 0) { + this._actor.opacity += this._multiplyer * (Math.abs(this._actor.opacity - this._endOpacity) * delta) / this._speed; + } + this._speed -= delta; + ex.Logger.getInstance().debug('actor opacity: ' + this._actor.opacity); + if (this.isComplete(this._actor)) { + this._actor.opacity = this._endOpacity; + } + }; + Fade.prototype.isComplete = function (actor) { + return this._stopped || (Math.abs(this._actor.opacity - this._endOpacity) < 0.05); + }; + Fade.prototype.stop = function () { + this._stopped = true; + }; + Fade.prototype.reset = function () { + this._started = false; + }; + return Fade; + })(); + Actions.Fade = Fade; + var Die = (function () { + function Die(actor) { + this._started = false; + this._stopped = false; + this._actor = actor; + } + Die.prototype.update = function (delta) { + this._actor.actionQueue.clearActions(); + this._actor.kill(); + this._stopped = true; + }; + Die.prototype.isComplete = function () { + return this._stopped; + }; + Die.prototype.stop = function () { return; }; + Die.prototype.reset = function () { return; }; + return Die; + })(); + Actions.Die = Die; + var CallMethod = (function () { + function CallMethod(actor, method) { + this._method = null; + this._actor = null; + this._hasBeenCalled = false; + this._actor = actor; + this._method = method; + } + CallMethod.prototype.update = function (delta) { + this._method.call(this._actor); + this._hasBeenCalled = true; + }; + CallMethod.prototype.isComplete = function (actor) { + return this._hasBeenCalled; + }; + CallMethod.prototype.reset = function () { + this._hasBeenCalled = false; + }; + CallMethod.prototype.stop = function () { + this._hasBeenCalled = true; + }; + return CallMethod; + })(); + Actions.CallMethod = CallMethod; + var Repeat = (function () { + function Repeat(actor, repeat, actions) { + this._stopped = false; + this._actor = actor; + this._actionQueue = new ActionQueue(actor); + this._repeat = repeat; + this._originalRepeat = repeat; + var i = 0, len = actions.length; + for (i; i < len; i++) { + actions[i].reset(); + this._actionQueue.add(actions[i]); + } + ; + } + Repeat.prototype.update = function (delta) { + this.x = this._actor.x; + this.y = this._actor.y; + if (!this._actionQueue.hasNext()) { + this._actionQueue.reset(); + this._repeat--; + } + this._actionQueue.update(delta); + }; + Repeat.prototype.isComplete = function () { + return this._stopped || (this._repeat <= 0); + }; + Repeat.prototype.stop = function () { + this._stopped = true; + }; + Repeat.prototype.reset = function () { + this._repeat = this._originalRepeat; + }; + return Repeat; + })(); + Actions.Repeat = Repeat; + var RepeatForever = (function () { + function RepeatForever(actor, actions) { + this._stopped = false; + this._actor = actor; + this._actionQueue = new ActionQueue(actor); + var i = 0, len = actions.length; + for (i; i < len; i++) { + actions[i].reset(); + this._actionQueue.add(actions[i]); + } + ; + } + RepeatForever.prototype.update = function (delta) { + this.x = this._actor.x; + this.y = this._actor.y; + if (this._stopped) { + return; + } + if (!this._actionQueue.hasNext()) { + this._actionQueue.reset(); + } + this._actionQueue.update(delta); + }; + RepeatForever.prototype.isComplete = function () { + return this._stopped; + }; + RepeatForever.prototype.stop = function () { + this._stopped = true; + this._actionQueue.clearActions(); + }; + RepeatForever.prototype.reset = function () { return; }; + return RepeatForever; + })(); + Actions.RepeatForever = RepeatForever; + /** + * Action Queues + * + * Action queues are part of the [[ActionContext|Action API]] and + * store the list of actions to be executed for an [[Actor]]. + * + * Actors implement [[Action.actionQueue]] which can be manipulated by + * advanced users to adjust the actions currently being executed in the + * queue. + */ + var ActionQueue = (function () { + function ActionQueue(actor) { + this._actions = []; + this._completedActions = []; + this._actor = actor; + } + ActionQueue.prototype.add = function (action) { + this._actions.push(action); + }; + ActionQueue.prototype.remove = function (action) { + var index = this._actions.indexOf(action); + this._actions.splice(index, 1); + }; + ActionQueue.prototype.clearActions = function () { + this._actions.length = 0; + this._completedActions.length = 0; + if (this._currentAction) { + this._currentAction.stop(); + } + }; + ActionQueue.prototype.getActions = function () { + return this._actions.concat(this._completedActions); + }; + ActionQueue.prototype.hasNext = function () { + return this._actions.length > 0; + }; + ActionQueue.prototype.reset = function () { + this._actions = this.getActions(); + var i = 0, len = this._actions.length; + for (i; i < len; i++) { + this._actions[i].reset(); + } + this._completedActions = []; + }; + ActionQueue.prototype.update = function (delta) { + if (this._actions.length > 0) { + this._currentAction = this._actions[0]; + this._currentAction.update(delta); + if (this._currentAction.isComplete(this._actor)) { + this._completedActions.push(this._actions.shift()); + } + } + }; + return ActionQueue; + })(); + Actions.ActionQueue = ActionQueue; + })(Actions = Internal.Actions || (Internal.Actions = {})); + })(Internal = ex.Internal || (ex.Internal = {})); })(ex || (ex = {})); -/// +/// var ex; (function (ex) { /** - * Excalibur's internal event dispatcher implementation. - * Callbacks are fired immediately after an event is published. - * Typically you'd use [[Class.eventDispatcher]] since most classes in - * Excalibur inherit from [[Class]]. You'd rarely create an `EventDispatcher` - * yourself. - * - * When working with events, be sure to keep in mind the order of subscriptions - * and try not to create a situation that requires specific things to happen in - * order. Events are best used for input events, tying together disparate objects, - * or for UI updates. - * - * ## Example: Actor events - * - * Actors implement an EventDispatcher ([[Actor.eventDispatcher]]) so they can - * send and receive events. For example, they can enable Pointer events (mouse/touch) - * and you can respond to them by subscribing to the event names. + * Action API * - * You can also emit any other kind of event for your game just by using a custom - * `string` value and implementing a class that inherits from [[GameEvent]]. + * The fluent Action API allows you to perform "actions" on + * [[Actor|Actors]] such as following, moving, rotating, and + * more. You can implement your own actions by implementing + * the [[IAction]] interface. * - * ```js - * var player = new ex.Actor(...); + * Actions can be chained together and can be set to repeat, + * or can be interrupted to change. * - * // Enable pointer events for this actor - * player.enableCapturePointer = true; + * ## Chaining Actions * - * // subscribe to pointerdown event - * player.on("pointerdown", function (evt: ex.Input.PointerEvent) { - * console.log("Player was clicked!"); - * }); + * You can chain actions to create a script because the action + * methods return the context, allowing you to build a queue of + * actions that get executed as part of an [[ActionQueue]]. * - * // turn off subscription - * player.off("pointerdown"); + * ```ts + * class Enemy extends ex.Actor { * - * // subscribe to custom event - * player.on("death", function (evt) { - * console.log("Player died:", evt); - * }); + * public patrol() { * - * // trigger custom event - * player.emit("death", new DeathEvent()); + * // clear existing queue + * this.clearActions(); * + * // guard a choke point + * // move to 100, 100 and take 1.2s + * // wait for 3s + * // move back to 0, 100 and take 1.2s + * // wait for 3s + * // repeat + * this.moveTo(100, 100, 1200) + * .delay(3000) + * .moveTo(0, 100, 1200) + * .delay(3000) + * .repeatForever(); + * } + * } * ``` * - * ## Example: Pub/Sub with Excalibur - * - * You can also create an EventDispatcher for any arbitrary object, for example - * a global game event aggregator (`vent`). Anything in your game can subscribe to - * it, if the event aggregator is in the global scope. + * ## Example: Follow a Path * - * *Warning:* This can easily get out of hand. Avoid this usage, it just serves as - * an example. + * You can use [[Actor.moveTo]] to move to a specific point, + * allowing you to chain together actions to form a path. * - * ```js - * // create a publisher on an empty object - * var vent = new ex.EventDispatcher({}); + * This example has a `Ship` follow a path that it guards by + * spawning at the start point, moving to the end, then reversing + * itself and repeating that forever. * - * // handler for an event - * var subscription = function (event) { - * console.log(event); - * } + * ```ts + * public Ship extends ex.Actor { * - * // add a subscription - * vent.subscribe("someevent", subscription); + * public onInitialize() { + * var path = [ + * new ex.Point(20, 20), + * new ex.Point(50, 40), + * new ex.Point(25, 30), + * new ex.Point(75, 80) + * ]; * - * // publish an event somewhere in the game - * vent.emit("someevent", new ex.GameEvent()); - * ``` - */ - var EventDispatcher = (function () { - /** - * @param target The object that will be the recipient of events from this event dispatcher - */ - function EventDispatcher(target) { - this._handlers = {}; - this._wiredEventDispatchers = []; - this._log = ex.Logger.getInstance(); - this._target = target; - } - /** - * Publish an event for target - * @param eventName The name of the event to publish - * @param event Optionally pass an event data object to the handler - * - * @obsolete Use [[emit]] instead. - */ - EventDispatcher.prototype.publish = function (eventName, event) { - if (!eventName) { - // key not mapped - return; - } - eventName = eventName.toLowerCase(); - var target = this._target; - if (!event) { - event = new ex.GameEvent(); - } - event.target = target; - var i, len; - if (this._handlers[eventName]) { - i = 0; - len = this._handlers[eventName].length; - for (i; i < len; i++) { - this._handlers[eventName][i].call(target, event); - } - } - i = 0; - len = this._wiredEventDispatchers.length; - for (i; i < len; i++) { - this._wiredEventDispatchers[i].emit(eventName, event); - } - }; - /** - * Alias for [[publish]], publishes an event for target - * @param eventName The name of the event to publish - * @param event Optionally pass an event data object to the handler - */ - EventDispatcher.prototype.emit = function (eventName, event) { - this.publish(eventName, event); - }; - /** - * Subscribe an event handler to a particular event name, multiple handlers per event name are allowed. - * @param eventName The name of the event to subscribe to - * @param handler The handler callback to fire on this event - */ - EventDispatcher.prototype.subscribe = function (eventName, handler) { - eventName = eventName.toLowerCase(); - if (!this._handlers[eventName]) { - this._handlers[eventName] = []; - } - this._handlers[eventName].push(handler); - // meta event handlers - if (eventName !== 'unsubscribe' && eventName !== 'subscribe') { - this.emit('subscribe', new ex.SubscribeEvent(eventName, handler)); - } - }; - /** - * Unsubscribe an event handler(s) from an event. If a specific handler - * is specified for an event, only that handler will be unsubscribed. - * Otherwise all handlers will be unsubscribed for that event. - * - * @param eventName The name of the event to unsubscribe - * @param handler Optionally the specific handler to unsubscribe - * - */ - EventDispatcher.prototype.unsubscribe = function (eventName, handler) { - eventName = eventName.toLowerCase(); - var eventHandlers = this._handlers[eventName]; - if (eventHandlers) { - // if no explicit handler is give with the event name clear all handlers - if (!handler) { - this._handlers[eventName].length = 0; - } - else { - var index = eventHandlers.indexOf(handler); - this._handlers[eventName].splice(index, 1); - } - } - // meta event handlers - if (eventName !== 'unsubscribe' && eventName !== 'subscribe') { - this.emit('unsubscribe', new ex.UnsubscribeEvent(eventName, handler)); - } - }; - /** - * Wires this event dispatcher to also recieve events from another - */ - EventDispatcher.prototype.wire = function (eventDispatcher) { - eventDispatcher._wiredEventDispatchers.push(this); - }; - /** - * Unwires this event dispatcher from another - */ - EventDispatcher.prototype.unwire = function (eventDispatcher) { - var index = eventDispatcher._wiredEventDispatchers.indexOf(this); - if (index > -1) { - eventDispatcher._wiredEventDispatchers.splice(index, 1); - } - }; - return EventDispatcher; - })(); - ex.EventDispatcher = EventDispatcher; -})(ex || (ex = {})); -var ex; -(function (ex) { - /** - * Provides standard colors (e.g. [[Color.Black]]) - * but you can also create custom colors using RGB, HSL, or Hex. Also provides - * useful color operations like [[Color.lighten]], [[Color.darken]], and more. + * // spawn at start point + * this.x = path[0].x; + * this.y = path[0].y; * - * ## Creating colors + * // create action queue * - * ```js - * // RGBA - * new ex.Color(r, g, b, a); - * ex.Color.fromRGB(r, g, b, a); + * // forward path (skip first spawn point) + * for (var i = 1; i < path.length; i++) { + * this.moveTo(path[i].x, path[i].y, 300); + * } * - * // HSLA - * ex.Color.fromHSL(h, s, l, a); + * // reverse path (skip last point) + * for (var j = path.length - 2; j >= 0; j--) { + * this.moveTo(path[j].x, path[j].y, 300); + * } * - * // Hex, alpha optional - * ex.Color.fromHex("#000000"); - * ex.Color.fromHex("#000000FF"); + * // repeat + * this.repeatForever(); + * } + * } * ``` * - * ## Working with colors + * While this is a trivial example, the Action API allows complex + * routines to be programmed for Actors. For example, using the + * [Tiled Map Editor](http://mapeditor.org) you can create a map that + * uses polylines to create paths, load in the JSON using a + * [[Resource|Generic Resource]], create a [[TileMap]], + * and spawn ships programmatically while utilizing the polylines + * to automatically generate the actions needed to do pathing. * - * Since Javascript does not support structs, if you change a color "constant" like [[Color.Black]] - * it will change it across the entire game. You can safely use the color operations - * like [[Color.lighten]] and [[Color.darken]] because they `clone` the color to - * return a new color. However, be aware that this can use up memory if used excessively. + * ## Custom Actions * - * Just be aware that if you directly alter properties (i.e. [[Color.r]], etc.) , this will change it - * for all the code that uses that instance of Color. - */ - var Color = (function () { - /** - * Creates a new instance of Color from an r, g, b, a - * - * @param r The red component of color (0-255) - * @param g The green component of color (0-255) - * @param b The blue component of color (0-255) - * @param a The alpha component of color (0-1.0) - */ - function Color(r, g, b, a) { - this.r = r; - this.g = g; - this.b = b; - this.a = (a != null ? a : 1); + * The API does allow you to implement new actions by implementing the [[IAction]] + * interface, but this will be improved in future versions as right now it + * is meant for the Excalibur team and can be advanced to implement. + * + * You can manually manipulate an Actor's [[ActionQueue]] using + * [[Actor.actionQueue]]. For example, using [[ActionQueue.add]] for + * custom actions. + * + * ## Future Plans + * + * The Excalibur team is working on extending and rebuilding the Action API + * in future versions to support multiple timelines/scripts, better eventing, + * and a more robust API to allow for complex and customized actions. + * + */ + var ActionContext = (function () { + function ActionContext() { + this._actors = []; + this._queues = []; + if (arguments !== null) { + this._actors = Array.prototype.slice.call(arguments, 0); + this._queues = this._actors.map(function (a) { + return a.actionQueue; + }); + } } /** - * Creates a new instance of Color from an r, g, b, a - * - * @param r The red component of color (0-255) - * @param g The green component of color (0-255) - * @param b The blue component of color (0-255) - * @param a The alpha component of color (0-1.0) - */ - Color.fromRGB = function (r, g, b, a) { - return new Color(r, g, b, a); - }; - /** - * Creates a new inscance of Color from a hex string - * - * @param hex CSS color string of the form #ffffff, the alpha component is optional + * Clears all queued actions from the Actor */ - Color.fromHex = function (hex) { - var hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i; - var match = null; - if (match = hex.match(hexRegEx)) { - var r = parseInt(match[1], 16); - var g = parseInt(match[2], 16); - var b = parseInt(match[3], 16); - var a = 1; - if (match[4]) { - a = parseInt(match[4], 16) / 255; - } - return new Color(r, g, b, a); - } - else { - throw new Error('Invalid hex string: ' + hex); + ActionContext.prototype.clearActions = function () { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].clearActions(); } }; - /** - * Creats a new instance of Color from hsla values - * - * @param h Hue is represented [0-1] - * @param s Saturation is represented [0-1] - * @param l Luminance is represented [0-1] - * @param a Alpha is represented [0-1] - */ - Color.fromHSL = function (h, s, l, a) { - if (a === void 0) { a = 1.0; } - var temp = new HSLColor(h, s, l, a); - return temp.toRGBA(); - }; - /** - * Lightens the current color by a specified amount - * - * @param factor The amount to lighten by [0-1] - */ - Color.prototype.lighten = function (factor) { - if (factor === void 0) { factor = 0.1; } - var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); - temp.l += (temp.l * factor); - return temp.toRGBA(); - }; - /** - * Darkens the current color by a specified amount - * - * @param factor The amount to darken by [0-1] - */ - Color.prototype.darken = function (factor) { - if (factor === void 0) { factor = 0.1; } - var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); - temp.l -= (temp.l * factor); - return temp.toRGBA(); - }; - /** - * Saturates the current color by a specified amount - * - * @param factor The amount to saturate by [0-1] - */ - Color.prototype.saturate = function (factor) { - if (factor === void 0) { factor = 0.1; } - var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); - temp.s += (temp.s * factor); - return temp.toRGBA(); - }; - /** - * Desaturates the current color by a specified amount - * - * @param factor The amount to desaturate by [0-1] - */ - Color.prototype.desaturate = function (factor) { - if (factor === void 0) { factor = 0.1; } - var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); - temp.s -= (temp.s * factor); - return temp.toRGBA(); - }; - /** - * Multiplies a color by another, results in a darker color - * - * @param color The other color - */ - Color.prototype.mulitiply = function (color) { - var newR = ((color.r / 255 * this.r / 255) * 255); - var newG = ((color.g / 255 * this.g / 255) * 255); - var newB = ((color.b / 255 * this.b / 255) * 255); - var newA = (color.a * this.a); - return new Color(newR, newG, newB, newA); + ActionContext.prototype.addActorToContext = function (actor) { + this._actors.push(actor); + // if we run into problems replace the line below with: + this._queues.push(actor.actionQueue); }; - /** - * Screens a color by another, results in a lighter color - * - * @param color The other color - */ - Color.prototype.screen = function (color) { - var color1 = color.invert(); - var color2 = color.invert(); - return color1.mulitiply(color2).invert(); + ActionContext.prototype.removeActorFromContext = function (actor) { + var index = this._actors.indexOf(actor); + if (index > -1) { + this._actors.splice(index, 1); + this._queues.splice(index, 1); + } }; /** - * Inverts the current color + * This method will move an actor to the specified `x` and `y` position over the + * specified duration using a given [[EasingFunctions]] and return back the actor. This + * method is part of the actor 'Action' fluent API allowing action chaining. + * @param x The x location to move the actor to + * @param y The y location to move the actor to + * @param duration The time it should take the actor to move to the new location in milliseconds + * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position */ - Color.prototype.invert = function () { - return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a); + ActionContext.prototype.easeTo = function (x, y, duration, easingFcn) { + if (easingFcn === void 0) { easingFcn = ex.EasingFunctions.Linear; } + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.EaseTo(this._actors[i], x, y, duration, easingFcn)); + } + return this; }; /** - * Averages the current color with another - * - * @param color The other color + * This method will move an actor to the specified x and y position at the + * speed specified (in pixels per second) and return back the actor. This + * method is part of the actor 'Action' fluent API allowing action chaining. + * @param x The x location to move the actor to + * @param y The y location to move the actor to + * @param speed The speed in pixels per second to move */ - Color.prototype.average = function (color) { - var newR = (color.r + this.r) / 2; - var newG = (color.g + this.g) / 2; - var newB = (color.b + this.b) / 2; - var newA = (color.a + this.a) / 2; - return new Color(newR, newG, newB, newA); + ActionContext.prototype.moveTo = function (x, y, speed) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.MoveTo(this._actors[i], x, y, speed)); + } + return this; }; /** - * Returns a CSS string representation of a color. + * This method will move an actor to the specified x and y position by a + * certain time (in milliseconds). This method is part of the actor + * 'Action' fluent API allowing action chaining. + * @param x The x location to move the actor to + * @param y The y location to move the actor to + * @param time The time it should take the actor to move to the new location in milliseconds */ - Color.prototype.toString = function () { - var result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0)); - if (this.a !== undefined || this.a !== null) { - return 'rgba(' + result + ', ' + String(this.a) + ')'; + ActionContext.prototype.moveBy = function (x, y, time) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.MoveBy(this._actors[i], x, y, time)); } - return 'rgb(' + result + ')'; + return this; }; /** - * Returns a CSS string representation of a color. + * This method will rotate an actor to the specified angle at the speed + * specified (in radians per second) and return back the actor. This + * method is part of the actor 'Action' fluent API allowing action chaining. + * @param angleRadians The angle to rotate to in radians + * @param speed The angular velocity of the rotation specified in radians per second */ - Color.prototype.fillStyle = function () { - return this.toString(); + ActionContext.prototype.rotateTo = function (angleRadians, speed) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.RotateTo(this._actors[i], angleRadians, speed)); + } + return this; }; /** - * Returns a clone of the current color. + * This method will rotate an actor to the specified angle by a certain + * time (in milliseconds) and return back the actor. This method is part + * of the actor 'Action' fluent API allowing action chaining. + * @param angleRadians The angle to rotate to in radians + * @param time The time it should take the actor to complete the rotation in milliseconds */ - Color.prototype.clone = function () { - return new Color(this.r, this.g, this.b, this.a); + ActionContext.prototype.rotateBy = function (angleRadians, time) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.RotateBy(this._actors[i], angleRadians, time)); + } + return this; }; /** - * Black (#000000) - */ - Color.Black = Color.fromHex('#000000'); - /** - * White (#FFFFFF) - */ - Color.White = Color.fromHex('#FFFFFF'); - /** - * Gray (#808080) - */ - Color.Gray = Color.fromHex('#808080'); - /** - * Light gray (#D3D3D3) - */ - Color.LightGray = Color.fromHex('#D3D3D3'); - /** - * Dark gray (#A9A9A9) - */ - Color.DarkGray = Color.fromHex('#A9A9A9'); - /** - * Yellow (#FFFF00) - */ - Color.Yellow = Color.fromHex('#FFFF00'); - /** - * Orange (#FFA500) - */ - Color.Orange = Color.fromHex('#FFA500'); - /** - * Red (#FF0000) + * This method will scale an actor to the specified size at the speed + * specified (in magnitude increase per second) and return back the + * actor. This method is part of the actor 'Action' fluent API allowing + * action chaining. + * @param size The scaling factor to apply + * @param speed The speed of scaling specified in magnitude increase per second */ - Color.Red = Color.fromHex('#FF0000'); + ActionContext.prototype.scaleTo = function (sizeX, sizeY, speedX, speedY) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.ScaleTo(this._actors[i], sizeX, sizeY, speedX, speedY)); + } + return this; + }; /** - * Vermillion (#FF5B31) + * This method will scale an actor to the specified size by a certain time + * (in milliseconds) and return back the actor. This method is part of the + * actor 'Action' fluent API allowing action chaining. + * @param size The scaling factor to apply + * @param time The time it should take to complete the scaling in milliseconds */ - Color.Vermillion = Color.fromHex('#FF5B31'); + ActionContext.prototype.scaleBy = function (sizeX, sizeY, time) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.ScaleBy(this._actors[i], sizeX, sizeY, time)); + } + return this; + }; /** - * Rose (#FF007F) + * This method will cause an actor to blink (become visible and not + * visible). Optionally, you may specify the number of blinks. Specify the amount of time + * the actor should be visible per blink, and the amount of time not visible. + * This method is part of the actor 'Action' fluent API allowing action chaining. + * @param timeVisible The amount of time to stay visible per blink in milliseconds + * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds + * @param numBlinks The number of times to blink */ - Color.Rose = Color.fromHex('#FF007F'); + ActionContext.prototype.blink = function (timeVisible, timeNotVisible, numBlinks) { + if (numBlinks === void 0) { numBlinks = 1; } + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.Blink(this._actors[i], timeVisible, timeNotVisible, numBlinks)); + } + return this; + }; /** - * Magenta (#FF00FF) + * This method will cause an actor's opacity to change from its current value + * to the provided value by a specified time (in milliseconds). This method is + * part of the actor 'Action' fluent API allowing action chaining. + * @param opacity The ending opacity + * @param time The time it should take to fade the actor (in milliseconds) */ - Color.Magenta = Color.fromHex('#FF00FF'); + ActionContext.prototype.fade = function (opacity, time) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.Fade(this._actors[i], opacity, time)); + } + return this; + }; /** - * Violet (#7F00FF) + * This method will delay the next action from executing for a certain + * amount of time (in milliseconds). This method is part of the actor + * 'Action' fluent API allowing action chaining. + * @param time The amount of time to delay the next action in the queue from executing in milliseconds */ - Color.Violet = Color.fromHex('#7F00FF'); + ActionContext.prototype.delay = function (time) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.Delay(this._actors[i], time)); + } + return this; + }; /** - * Blue (#0000FF) + * This method will add an action to the queue that will remove the actor from the + * scene once it has completed its previous actions. Any actions on the + * action queue after this action will not be executed. */ - Color.Blue = Color.fromHex('#0000FF'); + ActionContext.prototype.die = function () { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.Die(this._actors[i])); + } + return this; + }; /** - * Azure (#007FFF) + * This method allows you to call an arbitrary method as the next action in the + * action queue. This is useful if you want to execute code in after a specific + * action, i.e An actor arrives at a destinatino after traversing a path */ - Color.Azure = Color.fromHex('#007FFF'); + ActionContext.prototype.callMethod = function (method) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.CallMethod(this._actors[i], method)); + } + return this; + }; /** - * Cyan (#00FFFF) + * This method will cause the actor to repeat all of the previously + * called actions a certain number of times. If the number of repeats + * is not specified it will repeat forever. This method is part of + * the actor 'Action' fluent API allowing action chaining + * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions + * will repeat forever */ - Color.Cyan = Color.fromHex('#00FFFF'); + ActionContext.prototype.repeat = function (times) { + if (!times) { + this.repeatForever(); + return this; + } + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.Repeat(this._actors[i], times, this._actors[i].actionQueue.getActions())); + } + return this; + }; /** - * Viridian (#59978F) + * This method will cause the actor to repeat all of the previously + * called actions forever. This method is part of the actor 'Action' + * fluent API allowing action chaining. */ - Color.Viridian = Color.fromHex('#59978F'); + ActionContext.prototype.repeatForever = function () { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + this._queues[i].add(new ex.Internal.Actions.RepeatForever(this._actors[i], this._actors[i].actionQueue.getActions())); + } + return this; + }; /** - * Green (#00FF00) + * This method will cause the actor to follow another at a specified distance + * @param actor The actor to follow + * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance. */ - Color.Green = Color.fromHex('#00FF00'); + ActionContext.prototype.follow = function (actor, followDistance) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + if (followDistance === undefined) { + this._queues[i].add(new ex.Internal.Actions.Follow(this._actors[i], actor)); + } + else { + this._queues[i].add(new ex.Internal.Actions.Follow(this._actors[i], actor, followDistance)); + } + } + return this; + }; /** - * Chartreuse (#7FFF00) + * This method will cause the actor to move towards another until they + * collide "meet" at a specified speed. + * @param actor The actor to meet + * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor */ - Color.Chartreuse = Color.fromHex('#7FFF00'); + ActionContext.prototype.meet = function (actor, speed) { + var i = 0, len = this._queues.length; + for (i; i < len; i++) { + if (speed === undefined) { + this._queues[i].add(new ex.Internal.Actions.Meet(this._actors[i], actor)); + } + else { + this._queues[i].add(new ex.Internal.Actions.Meet(this._actors[i], actor, speed)); + } + } + return this; + }; /** - * Transparent (#FFFFFF00) + * Returns a promise that resolves when the current action queue up to now + * is finished. */ - Color.Transparent = Color.fromHex('#FFFFFF00'); - return Color; + ActionContext.prototype.asPromise = function () { + var _this = this; + var promises = this._queues.map(function (q, i) { + var temp = new ex.Promise(); + q.add(new ex.Internal.Actions.CallMethod(_this._actors[i], function () { + temp.resolve(); + })); + return temp; + }); + return ex.Promise.join.apply(this, promises); + }; + return ActionContext; })(); - ex.Color = Color; + ex.ActionContext = ActionContext; +})(ex || (ex = {})); +/// +/// +/// +var ex; +(function (ex) { /** - * Internal HSL Color representation + * Grouping * - * http://en.wikipedia.org/wiki/HSL_and_HSV - * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c + * Groups are used for logically grouping Actors so they can be acted upon + * in bulk. + * + * ## Using Groups + * + * Groups can be used to detect collisions across a large nubmer of actors. For example + * perhaps a large group of "enemy" actors. + * + * ```typescript + * var enemyShips = engine.currentScene.createGroup("enemy"); + * var enemies = [...]; // Large array of enemies; + * enemyShips.add(enemies); + * + * var player = new Actor(); + * engine.currentScene.add(player); + * + * enemyShips.on('collision', function(ev: CollisionEvent){ + * if (e.other === player) { + * //console.log("collision with player!"); + * } + * }); + * + * ``` */ - var HSLColor = (function () { - function HSLColor(h, s, l, a) { - this.h = h; - this.s = s; - this.l = l; - this.a = a; + var Group = (function (_super) { + __extends(Group, _super); + function Group(name, scene) { + _super.call(this); + this.name = name; + this.scene = scene; + this._logger = ex.Logger.getInstance(); + this._members = []; + this.actions = new ex.ActionContext(); + if (scene == null) { + this._logger.error('Invalid constructor arguments passed to Group: ', name, ', scene must not be null!'); + } + else { + var existingGroup = scene.groups[name]; + if (existingGroup) { + this._logger.warn('Group with name', name, 'already exists. This new group will replace it.'); + } + scene.groups[name] = this; + } } - HSLColor.fromRGBA = function (r, g, b, a) { - r /= 255; - g /= 255; - b /= 255; - var max = Math.max(r, g, b), min = Math.min(r, g, b); - var h, s, l = (max + min) / 2; - if (max === min) { - h = s = 0; // achromatic + Group.prototype.add = function (actorOrActors) { + if (actorOrActors instanceof ex.Actor) { + actorOrActors = [].concat(actorOrActors); + } + var i = 0, len = actorOrActors.length, groupIdx; + for (i; i < len; i++) { + groupIdx = this.getMembers().indexOf(actorOrActors[i]); + if (groupIdx === -1) { + this._members.push(actorOrActors[i]); + this.scene.add(actorOrActors[i]); + this.actions.addActorToContext(actorOrActors[i]); + this.eventDispatcher.wire(actorOrActors[i].eventDispatcher); + } + } + }; + Group.prototype.remove = function (actor) { + var index = this._members.indexOf(actor); + if (index > -1) { + this._members.splice(index, 1); + this.actions.removeActorFromContext(actor); + this.eventDispatcher.unwire(actor.eventDispatcher); + } + }; + Group.prototype.move = function (args) { + var i = 0, members = this.getMembers(), len = members.length; + if (arguments.length === 1 && args instanceof ex.Vector) { + for (i; i < len; i++) { + members[i].x += args.x; + members[i].y += args.y; + } + } + else if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') { + var x = arguments[0]; + var y = arguments[1]; + for (i; i < len; i++) { + members[i].x += x; + members[i].y += y; + } } else { - var d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; + this._logger.error('Invalid arguments passed to group move', this.name, 'args:', arguments); + } + }; + Group.prototype.rotate = function (angle) { + if (typeof arguments[0] === 'number') { + var r = arguments[0], i = 0, members = this.getMembers(), len = members.length; + for (i; i < len; i++) { + members[i].rotation += r; } - h /= 6; } - return new HSLColor(h, s, l, a); + else { + this._logger.error('Invalid arguments passed to group rotate', this.name, 'args:', arguments); + } }; - HSLColor.prototype.toRGBA = function () { - var r, g, b; - if (this.s === 0) { - r = g = b = this.l; // achromatic + Group.prototype.on = function (eventName, handler) { + this.eventDispatcher.subscribe(eventName, handler); + }; + Group.prototype.off = function (eventName, handler) { + this.eventDispatcher.unsubscribe(eventName, handler); + }; + Group.prototype.emit = function (topic, event) { + this.eventDispatcher.emit(topic, event); + }; + Group.prototype.contains = function (actor) { + return this.getMembers().indexOf(actor) > -1; + }; + Group.prototype.getMembers = function () { + return this._members; + }; + Group.prototype.getRandomMember = function () { + return this._members[Math.floor(Math.random() * this._members.length)]; + }; + Group.prototype.getBounds = function () { + return this.getMembers().map(function (a) { return a.getBounds(); }).reduce(function (prev, curr) { + return prev.combine(curr); + }); + }; + return Group; + })(ex.Class); + ex.Group = Group; +})(ex || (ex = {})); +var ex; +(function (ex) { + // NOTE: this implementation is not self-balancing + var SortedList = (function () { + function SortedList(getComparable) { + this._getComparable = getComparable; + } + SortedList.prototype.find = function (element) { + return this._find(this._root, element); + }; + SortedList.prototype._find = function (node, element) { + if (node == null) { + return false; + } + else if (this._getComparable.call(element) === node.getKey()) { + if (node.getData().indexOf(element) > -1) { + return true; + } + else { + return false; + } + } + else if (this._getComparable.call(element) < node.getKey()) { + return this._find(node.getLeft(), element); } else { - function hue2rgb(p, q, t) { - if (t < 0) { - t += 1; + return this._find(node.getRight(), element); + } + }; + // returns the array of elements at a specific key value + SortedList.prototype.get = function (key) { + return this._get(this._root, key); + }; + SortedList.prototype._get = function (node, key) { + if (node == null) { + return []; + } + else if (key === node.getKey()) { + return node.getData(); + } + else if (key < node.getKey()) { + return this._get(node.getLeft(), key); + } + else { + return this._get(node.getRight(), key); + } + }; + SortedList.prototype.add = function (element) { + if (this._root == null) { + this._root = new BinaryTreeNode(this._getComparable.call(element), [element], null, null); + return true; + } + else { + return this._insert(this._root, element); + } + return false; + }; + SortedList.prototype._insert = function (node, element) { + if (node != null) { + if (this._getComparable.call(element) === node.getKey()) { + if (node.getData().indexOf(element) > -1) { + return false; // the element we're trying to insert already exists } - if (t > 1) { - t -= 1; + else { + node.getData().push(element); + return true; } - if (t < 1 / 6) { - return p + (q - p) * 6 * t; + } + else if (this._getComparable.call(element) < node.getKey()) { + if (node.getLeft() == null) { + node.setLeft(new BinaryTreeNode(this._getComparable.call(element), [element], null, null)); + return true; } - if (t < 1 / 2) { - return q; + else { + return this._insert(node.getLeft(), element); } - if (t < 2 / 3) { - return p + (q - p) * (2 / 3 - t) * 6; + } + else { + if (node.getRight() == null) { + node.setRight(new BinaryTreeNode(this._getComparable.call(element), [element], null, null)); + return true; + } + else { + return this._insert(node.getRight(), element); } - return p; } - var q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s; - var p = 2 * this.l - q; - r = hue2rgb(p, q, this.h + 1 / 3); - g = hue2rgb(p, q, this.h); - b = hue2rgb(p, q, this.h - 1 / 3); } - return new Color(r * 255, g * 255, b * 255, this.a); + return false; + }; + SortedList.prototype.removeByComparable = function (element) { + this._root = this._remove(this._root, element); + }; + SortedList.prototype._remove = function (node, element) { + if (node == null) { + return null; + } + else if (this._getComparable.call(element) === node.getKey()) { + var elementIndex = node.getData().indexOf(element); + // if the node contains the element, remove the element + if (elementIndex > -1) { + node.getData().splice(elementIndex, 1); + // if we have removed the last element at this node, remove the node + if (node.getData().length === 0) { + // if the node is a leaf + if (node.getLeft() == null && node.getRight() == null) { + return null; + } + else if (node.getLeft() == null) { + return node.getRight(); + } + else if (node.getRight() == null) { + return node.getLeft(); + } + // if node has 2 children + var temp = this._findMinNode(node.getRight()); + node.setKey(temp.getKey()); + node.setData(temp.getData()); + node.setRight(this._cleanup(node.getRight(), temp)); //"cleanup nodes" (move them up recursively) + return node; + } + else { + // this prevents the node from being removed since it still contains elements + return node; + } + } + } + else if (this._getComparable.call(element) < node.getKey()) { + node.setLeft(this._remove(node.getLeft(), element)); + return node; + } + else { + node.setRight(this._remove(node.getRight(), element)); + return node; + } + }; + // called once we have successfully removed the element we wanted, recursively corrects the part of the tree below the removed node + SortedList.prototype._cleanup = function (node, element) { + var comparable = element.getKey(); + if (node == null) { + return null; + } + else if (comparable === node.getKey()) { + // if the node is a leaf + if (node.getLeft() == null && node.getRight() == null) { + return null; + } + else if (node.getLeft() == null) { + return node.getRight(); + } + else if (node.getRight() == null) { + return node.getLeft(); + } + // if node has 2 children + var temp = this._findMinNode(node.getRight()); + node.setKey(temp.getKey()); + node.setData(temp.getData()); + node.setRight(this._cleanup(node.getRight(), temp)); + return node; + } + else if (this._getComparable.call(element) < node.getKey()) { + node.setLeft(this._cleanup(node.getLeft(), element)); + return node; + } + else { + node.setRight(this._cleanup(node.getRight(), element)); + return node; + } + }; + SortedList.prototype._findMinNode = function (node) { + var current = node; + while (current.getLeft() != null) { + current = current.getLeft(); + } + return current; + }; + SortedList.prototype.list = function () { + var results = new Array(); + this._list(this._root, results); + return results; + }; + SortedList.prototype._list = function (treeNode, results) { + if (treeNode != null) { + this._list(treeNode.getLeft(), results); + treeNode.getData().forEach(function (element) { + results.push(element); + }); + this._list(treeNode.getRight(), results); + } }; - return HSLColor; + return SortedList; })(); -})(ex || (ex = {})); -/// -var ex; -(function (ex) { - /** - * Helper [[Actor]] primitive for drawing UI's, optimized for UI drawing. Does - * not participate in collisions. Drawn on top of all other actors. - */ - var UIActor = (function (_super) { - __extends(UIActor, _super); - /** - * @param x The starting x coordinate of the actor - * @param y The starting y coordinate of the actor - * @param width The starting width of the actor - * @param height The starting height of the actor - */ - function UIActor(x, y, width, height) { - _super.call(this, x, y, width, height); - this.traits = []; - this.traits.push(new ex.Traits.Movement()); - this.traits.push(new ex.Traits.CapturePointer()); - this.anchor.setTo(0, 0); - this.collisionType = ex.CollisionType.PreventCollision; - this.enableCapturePointer = true; + ex.SortedList = SortedList; + var BinaryTreeNode = (function () { + function BinaryTreeNode(key, data, left, right) { + this._key = key; + this._data = data; + this._left = left; + this._right = right; } - UIActor.prototype.onInitialize = function (engine) { - this._engine = engine; + BinaryTreeNode.prototype.getKey = function () { + return this._key; }; - UIActor.prototype.contains = function (x, y, useWorld) { - if (useWorld === void 0) { useWorld = true; } - if (useWorld) { - return _super.prototype.contains.call(this, x, y); - } - var coords = this._engine.worldToScreenCoordinates(new ex.Point(x, y)); - return _super.prototype.contains.call(this, coords.x, coords.y); + BinaryTreeNode.prototype.setKey = function (key) { + this._key = key; }; - return UIActor; - })(ex.Actor); - ex.UIActor = UIActor; + BinaryTreeNode.prototype.getData = function () { + return this._data; + }; + BinaryTreeNode.prototype.setData = function (data) { + this._data = data; + }; + BinaryTreeNode.prototype.getLeft = function () { + return this._left; + }; + BinaryTreeNode.prototype.setLeft = function (left) { + this._left = left; + }; + BinaryTreeNode.prototype.getRight = function () { + return this._right; + }; + BinaryTreeNode.prototype.setRight = function (right) { + this._right = right; + }; + return BinaryTreeNode; + })(); + ex.BinaryTreeNode = BinaryTreeNode; + var MockedElement = (function () { + function MockedElement(key) { + this._key = 0; + this._key = key; + } + MockedElement.prototype.getTheKey = function () { + return this._key; + }; + MockedElement.prototype.setKey = function (key) { + this._key = key; + }; + return MockedElement; + })(); + ex.MockedElement = MockedElement; })(ex || (ex = {})); -/// -/// +/// +/// +/// +/// +/// +/// +/// +/// var ex; (function (ex) { /** - * Triggers + * Scenes * - * Triggers are a method of firing arbitrary code on collision. These are useful - * as 'buttons', 'switches', or to trigger effects in a game. By default triggers - * are invisible, and can only be seen when [[Engine.isDebug]] is set to `true`. + * [[Actor|Actors]] are composed together into groupings called Scenes in + * Excalibur. The metaphor models the same idea behind real world + * actors in a scene. Only actors in scenes will be updated and drawn. * - * ## Creating a trigger + * Typical usages of a scene include: levels, menus, loading screens, etc. + * + * ## Adding actors to the scene + * + * For an [[Actor]] to be drawn and updated, it needs to be part of the "scene graph". + * The [[Engine]] provides several easy ways to quickly add/remove actors from the + * current scene. * * ```js - * var game = new ex.Game(); + * var game = new ex.Engine(...); * - * // create a handler - * function onTrigger() { + * var player = new ex.Actor(); + * var enemy = new ex.Actor(); * - * // `this` will be the Trigger instance - * ex.Logger.getInstance().info("Trigger was triggered!", this); - * } + * // add them to the "root" scene * - * // set a trigger at (100, 100) that is 40x40px - * var trigger = new ex.Trigger(100, 100, 40, 40, onTrigger, 1); + * game.add(player); + * game.add(enemy); * - * // create an actor across from the trigger - * var actor = new ex.Actor(100, 0, 40, 40, ex.Color.Red); + * // start game + * game.start(); + * ``` * - * // tell the actor to move towards the trigger over 3 seconds - * actor.moveTo(100, 200, 3000); + * You can also add actors to a [[Scene]] instance specifically. * - * game.add(trigger); - * game.add(actor); + * ```js + * var game = new ex.Engine(); + * var level1 = new ex.Scene(); + * + * var player = new ex.Actor(); + * var enemy = new ex.Actor(); * + * // add actors to level1 + * level1.add(player); + * level1.add(enemy); + * + * // add level1 to the game + * game.add("level1", level1); + * + * // start the game * game.start(); + * + * // after player clicks start game, for example + * game.goToScene("level1"); + * + * ``` + * + * ## Scene Lifecycle + * + * A [[Scene|scene]] has a basic lifecycle that dictacts how it is initialized, updated, and drawn. Once a [[Scene|scene]] is added to + * the [[Engine|engine]] it will follow this lifecycle. + * + * ![Scene Lifecycle](/assets/images/docs/SceneLifeCycle.png) + * + * ## Extending scenes + * + * For more complex games, you might want more control over a scene in which + * case you can extend [[Scene]]. This is useful for menus, custom loaders, + * and levels. + * + * Just use [[Engine.add]] to add a new scene to the game. You can then use + * [[Engine.goToScene]] to switch scenes which calls [[Scene.onActivate]] for the + * new scene and [[Scene.onDeactivate]] for the old scene. Use [[Scene.onInitialize]] + * to perform any start-up logic, which is called once. + * + * **TypeScript** + * + * ```ts + * class MainMenu extends ex.Scene { + * + * // start-up logic, called once + * public onInitialize(engine: ex.Engine) { } + * + * // each time the scene is entered (Engine.goToScene) + * public onActivate() { } + * + * // each time the scene is exited (Engine.goToScene) + * public onDeactivate() { } + * } + * + * // add to game and activate it + * game.add("mainmenu", new MainMenu()); + * game.goToScene("mainmenu"); + * ``` + * + * **Javascript** + * + * ```js + * var MainMenu = ex.Scene.extend({ + * // start-up logic, called once + * onInitialize: function (engine) { }, + * + * // each time the scene is activated by Engine.goToScene + * onActivate: function () { }, + * + * // each time the scene is deactivated by Engine.goToScene + * onDeactivate: function () { } + * }); + * + * game.add("mainmenu", new MainMenu()); + * game.goToScene("mainmenu"); * ``` + * + * ## Scene camera + * + * By default, a [[Scene]] is initialized with a [[BaseCamera]] which + * does not move and centers the game world. + * + * Learn more about [[BaseCamera|Cameras]] and how to modify them to suit + * your game. */ - var Trigger = (function (_super) { - __extends(Trigger, _super); + var Scene = (function (_super) { + __extends(Scene, _super); + function Scene(engine) { + _super.call(this); + /** + * The actors in the current scene + */ + this.children = []; + /** + * The [[TileMap]]s in the scene, if any + */ + this.tileMaps = []; + /** + * The [[Group]]s in the scene, if any + */ + this.groups = {}; + /** + * The [[UIActor]]s in a scene, if any; these are drawn last + */ + this.uiActors = []; + /** + * Whether or the [[Scene]] has been initialized + */ + this.isInitialized = false; + this._sortedDrawingTree = new ex.SortedList(ex.Actor.prototype.getZIndex); + this._collisionResolver = new ex.DynamicTreeCollisionResolver(); + this._killQueue = []; + this._timers = []; + this._cancelQueue = []; + this._logger = ex.Logger.getInstance(); + this.camera = new ex.BaseCamera(); + if (engine) { + this.camera.setFocus(engine.width / 2, engine.height / 2); + } + } /** - * @param x The x position of the trigger - * @param y The y position of the trigger - * @param width The width of the trigger - * @param height The height of the trigger - * @param action Callback to fire when trigger is activated, `this` will be bound to the Trigger instance - * @param repeats The number of times that this trigger should fire, by default it is 1, if -1 is supplied it will fire indefinitely + * This is called before the first update of the [[Scene]]. Initializes scene members like the camera. This method is meant to be + * overridden. This is where initialization of child actors should take place. */ - function Trigger(x, y, width, height, action, repeats) { - _super.call(this, x, y, width, height); - this._action = function () { return; }; - this.repeats = 1; - this.target = null; - this.repeats = repeats || this.repeats; - this._action = action || this._action; - this.collisionType = ex.CollisionType.PreventCollision; - this.eventDispatcher = new ex.EventDispatcher(this); - this.actionQueue = new ex.Internal.Actions.ActionQueue(this); - } - Trigger.prototype.update = function (engine, delta) { - // Update action queue - this.actionQueue.update(delta); - // Update placements based on linear algebra - this.x += this.dx * delta / 1000; - this.y += this.dy * delta / 1000; - this.rotation += this.rx * delta / 1000; - this.scale.x += this.sx * delta / 1000; - this.scale.y += this.sy * delta / 1000; - // check for trigger collisions - if (this.target) { - if (this.collides(this.target)) { - this._dispatchAction(); - } + Scene.prototype.onInitialize = function (engine) { + // will be overridden + if (this.camera) { + this.camera.setFocus(engine.width / 2, engine.height / 2); } - else { - for (var i = 0; i < engine.currentScene.children.length; i++) { - var other = engine.currentScene.children[i]; - if (other !== this && - other.collisionType !== ex.CollisionType.PreventCollision && - this.collides(other)) { - this._dispatchAction(); - } + this._logger.debug('Scene.onInitialize', this, engine); + }; + /** + * This is called when the scene is made active and started. It is meant to be overriden, + * this is where you should setup any DOM UI or event handlers needed for the scene. + */ + Scene.prototype.onActivate = function () { + // will be overridden + this._logger.debug('Scene.onActivate', this); + }; + /** + * This is called when the scene is made transitioned away from and stopped. It is meant to be overriden, + * this is where you should cleanup any DOM UI or event handlers needed for the scene. + */ + Scene.prototype.onDeactivate = function () { + // will be overridden + this._logger.debug('Scene.onDeactivate', this); + }; + /** + * Updates all the actors and timers in the scene. Called by the [[Engine]]. + * @param engine Reference to the current Engine + * @param delta The number of milliseconds since the last update + */ + Scene.prototype.update = function (engine, delta) { + this.emit('preupdate', new ex.PreUpdateEvent(engine, delta, this)); + var i, len; + // Cycle through actors updating UI actors + for (i = 0, len = this.uiActors.length; i < len; i++) { + this.uiActors[i].update(engine, delta); + } + // Cycle through actors updating tile maps + for (i = 0, len = this.tileMaps.length; i < len; i++) { + this.tileMaps[i].update(engine, delta); + } + // Cycle through actors updating actors + for (i = 0, len = this.children.length; i < len; i++) { + this.children[i].update(engine, delta); + } + // Run collision resolution strategy + if (this._collisionResolver) { + this._collisionResolver.update(this.children); + this._collisionResolver.evaluate(this.children); + } + // Remove actors from scene graph after being killed + var actorIndex; + for (i = 0, len = this._killQueue.length; i < len; i++) { + actorIndex = this.children.indexOf(this._killQueue[i]); + if (actorIndex > -1) { + this._sortedDrawingTree.removeByComparable(this._killQueue[i]); + this.children.splice(actorIndex, 1); } } - // remove trigger if its done, -1 repeat forever - if (this.repeats === 0) { - this.kill(); + this._killQueue.length = 0; + // Remove timers in the cancel queue before updating them + for (i = 0, len = this._cancelQueue.length; i < len; i++) { + this.removeTimer(this._cancelQueue[i]); } + this._cancelQueue.length = 0; + // Cycle through timers updating timers + this._timers = this._timers.filter(function (timer) { + timer.update(delta); + return !timer.complete; + }); + this.emit('postupdate', new ex.PostUpdateEvent(engine, delta, this)); }; - Trigger.prototype._dispatchAction = function () { - this._action.call(this); - this.repeats--; - }; - Trigger.prototype.draw = function (ctx, delta) { - // does not draw - return; - }; - Trigger.prototype.debugDraw = function (ctx) { - _super.prototype.debugDraw.call(this, ctx); - // Meant to draw debug information about actors + /** + * Draws all the actors in the Scene. Called by the [[Engine]]. + * @param ctx The current rendering context + * @param delta The number of milliseconds since the last draw + */ + Scene.prototype.draw = function (ctx, delta) { + this.emit('predraw', new ex.PreDrawEvent(ctx, delta, this)); ctx.save(); - ctx.translate(this.x, this.y); - var bb = this.getBounds(); - bb.left = bb.left - this.getWorldX(); - bb.right = bb.right - this.getWorldX(); - bb.top = bb.top - this.getWorldY(); - bb.bottom = bb.bottom - this.getWorldY(); - // Currently collision primitives cannot rotate - // ctx.rotate(this.rotation); - ctx.fillStyle = ex.Color.Violet.toString(); - ctx.strokeStyle = ex.Color.Violet.toString(); - ctx.fillText('Trigger', 10, 10); - bb.debugDraw(ctx); + if (this.camera) { + this.camera.update(ctx, delta); + } + var i, len; + for (i = 0, len = this.tileMaps.length; i < len; i++) { + this.tileMaps[i].draw(ctx, delta); + } + var sortedChildren = this._sortedDrawingTree.list(); + for (i = 0, len = sortedChildren.length; i < len; i++) { + // only draw actors that are visible and on screen + if (sortedChildren[i].visible && !sortedChildren[i].isOffScreen) { + sortedChildren[i].draw(ctx, delta); + } + } + if (this.engine && this.engine.isDebug) { + ctx.strokeStyle = 'yellow'; + this.debugDraw(ctx); + } ctx.restore(); + for (i = 0, len = this.uiActors.length; i < len; i++) { + // only draw ui actors that are visible and on screen + if (this.uiActors[i].visible) { + this.uiActors[i].draw(ctx, delta); + } + } + if (this.engine && this.engine.isDebug) { + for (i = 0, len = this.uiActors.length; i < len; i++) { + this.uiActors[i].debugDraw(ctx); + } + } + this.emit('postdraw', new ex.PreDrawEvent(ctx, delta, this)); }; - return Trigger; - })(ex.Actor); - ex.Trigger = Trigger; -})(ex || (ex = {})); -/// -/// -/// -/// -var ex; -(function (ex) { - /** - * An enum that represents the types of emitter nozzles - */ - (function (EmitterType) { /** - * Constant for the circular emitter type + * Draws all the actors' debug information in the Scene. Called by the [[Engine]]. + * @param ctx The current rendering context */ - EmitterType[EmitterType["Circle"] = 0] = "Circle"; + Scene.prototype.debugDraw = function (ctx) { + this.emit('predebugdraw', new ex.PreDebugDrawEvent(ctx, this)); + var i, len; + for (i = 0, len = this.tileMaps.length; i < len; i++) { + this.tileMaps[i].debugDraw(ctx); + } + for (i = 0, len = this.children.length; i < len; i++) { + this.children[i].debugDraw(ctx); + } + // todo possibly enable this with excalibur flags features? + //this._collisionResolver.debugDraw(ctx, 20); + this.camera.debugDraw(ctx); + this.emit('postdebugdraw', new ex.PostDebugDrawEvent(ctx, this)); + }; /** - * Constant for the rectangular emitter type + * Checks whether an actor is contained in this scene or not */ - EmitterType[EmitterType["Rectangle"] = 1] = "Rectangle"; - })(ex.EmitterType || (ex.EmitterType = {})); - var EmitterType = ex.EmitterType; - /** - * Particle is used in a [[ParticleEmitter]] - */ - var Particle = (function () { - function Particle(emitter, life, opacity, beginColor, endColor, position, velocity, acceleration, startSize, endSize) { - this.position = new ex.Vector(0, 0); - this.velocity = new ex.Vector(0, 0); - this.acceleration = new ex.Vector(0, 0); - this.particleRotationalVelocity = 0; - this.currentRotation = 0; - this.focus = null; - this.focusAccel = 0; - this.opacity = 1; - this.beginColor = ex.Color.White.clone(); - this.endColor = ex.Color.White.clone(); - // Life is counted in ms - this.life = 300; - this.fadeFlag = false; - // Color transitions - this._rRate = 1; - this._gRate = 1; - this._bRate = 1; - this._aRate = 0; - this._currentColor = ex.Color.White.clone(); - this.emitter = null; - this.particleSize = 5; - this.particleSprite = null; - this.sizeRate = 0; - this.elapsedMultiplier = 0; - this.emitter = emitter; - this.life = life || this.life; - this.opacity = opacity || this.opacity; - this.endColor = endColor || this.endColor.clone(); - this.beginColor = beginColor || this.beginColor.clone(); - this._currentColor = this.beginColor.clone(); - this.position = position || this.position; - this.velocity = velocity || this.velocity; - this.acceleration = acceleration || this.acceleration; - this._rRate = (this.endColor.r - this.beginColor.r) / this.life; - this._gRate = (this.endColor.g - this.beginColor.g) / this.life; - this._bRate = (this.endColor.b - this.beginColor.b) / this.life; - this._aRate = this.opacity / this.life; - this.startSize = startSize || 0; - this.endSize = endSize || 0; - if ((this.endSize > 0) && (this.startSize > 0)) { - this.sizeRate = (this.endSize - this.startSize) / this.life; - this.particleSize = this.startSize; - } - } - Particle.prototype.kill = function () { - this.emitter.removeParticle(this); + Scene.prototype.contains = function (actor) { + return this.children.indexOf(actor) > -1; }; - Particle.prototype.update = function (delta) { - this.life = this.life - delta; - this.elapsedMultiplier = this.elapsedMultiplier + delta; - if (this.life < 0) { - this.kill(); + Scene.prototype.add = function (entity) { + if (entity instanceof ex.UIActor) { + if (!ex.Util.contains(this.uiActors, entity)) { + this.addUIActor(entity); + } + return; } - if (this.fadeFlag) { - this.opacity = ex.Util.clamp(this._aRate * this.life, 0.0001, 1); + if (entity instanceof ex.Actor) { + if (!ex.Util.contains(this.children, entity)) { + this.addChild(entity); + this._sortedDrawingTree.add(entity); + } + return; } - if ((this.startSize > 0) && (this.endSize > 0)) { - this.particleSize = ex.Util.clamp(this.sizeRate * delta + this.particleSize, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize)); + if (entity instanceof ex.Timer) { + if (!ex.Util.contains(this._timers, entity)) { + this.addTimer(entity); + } + return; } - this._currentColor.r = ex.Util.clamp(this._currentColor.r + this._rRate * delta, 0, 255); - this._currentColor.g = ex.Util.clamp(this._currentColor.g + this._gRate * delta, 0, 255); - this._currentColor.b = ex.Util.clamp(this._currentColor.b + this._bRate * delta, 0, 255); - this._currentColor.a = ex.Util.clamp(this.opacity, 0.0001, 1); - if (this.focus) { - var accel = this.focus.minus(this.position).normalize().scale(this.focusAccel).scale(delta / 1000); - this.velocity = this.velocity.add(accel); + if (entity instanceof ex.TileMap) { + if (!ex.Util.contains(this.tileMaps, entity)) { + this.addTileMap(entity); + } } - else { - this.velocity = this.velocity.add(this.acceleration.scale(delta / 1000)); + }; + Scene.prototype.remove = function (entity) { + if (entity instanceof ex.UIActor) { + this.removeUIActor(entity); + return; } - this.position = this.position.add(this.velocity.scale(delta / 1000)); - if (this.particleRotationalVelocity) { - this.currentRotation = (this.currentRotation + this.particleRotationalVelocity * delta / 1000) % (2 * Math.PI); + if (entity instanceof ex.Actor) { + this._collisionResolver.remove(entity); + this.removeChild(entity); + } + if (entity instanceof ex.Timer) { + this.removeTimer(entity); + } + if (entity instanceof ex.TileMap) { + this.removeTileMap(entity); } }; - Particle.prototype.draw = function (ctx) { - if (this.particleSprite) { - this.particleSprite.rotation = this.currentRotation; - this.particleSprite.scale.setTo(this.particleSize, this.particleSize); - this.particleSprite.draw(ctx, this.position.x, this.position.y); - return; + /** + * Adds (any) actor to act as a piece of UI, meaning it is always positioned + * in screen coordinates. UI actors do not participate in collisions. + * @todo Should this be `UIActor` only? + */ + Scene.prototype.addUIActor = function (actor) { + this.uiActors.push(actor); + actor.scene = this; + }; + /** + * Removes an actor as a piece of UI + */ + Scene.prototype.removeUIActor = function (actor) { + var index = this.uiActors.indexOf(actor); + if (index > -1) { + this.uiActors.splice(index, 1); } - this._currentColor.a = ex.Util.clamp(this.opacity, 0.0001, 1); - ctx.fillStyle = this._currentColor.toString(); - ctx.beginPath(); - ctx.arc(this.position.x, this.position.y, this.particleSize, 0, Math.PI * 2); - ctx.fill(); - ctx.closePath(); }; - return Particle; - })(); - ex.Particle = Particle; - /** - * Particle Emitters - * - * Using a particle emitter is a great way to create interesting effects - * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter` - * extend [[Actor]] allowing you to use all of the features that come with. - * - * The easiest way to create a `ParticleEmitter` is to use the - * [Particle Tester](http://excaliburjs.com/particle-tester/). - * - * ## Example: Adding an emitter - * - * ```js - * var actor = new ex.Actor(...); - * var emitter = new ex.ParticleEmitter(...); - * - * // set emitter settings - * emitter.isEmitting = true; - * - * // add the emitter as a child actor, it will draw on top of the parent actor - * // and move with the parent - * actor.add(emitter); - * - * // or, alternatively, add it to the current scene - * engine.add(emitter); - * ``` - */ - var ParticleEmitter = (function (_super) { - __extends(ParticleEmitter, _super); /** - * @param x The x position of the emitter - * @param y The y position of the emitter - * @param width The width of the emitter - * @param height The height of the emitter + * Adds an actor to the scene, once this is done the actor will be drawn and updated. + * + * @obsolete Use [[add]] instead. */ - function ParticleEmitter(x, y, width, height) { - _super.call(this, x, y, width, height, ex.Color.White); - this._particlesToEmit = 0; - this.numParticles = 0; - /** - * Gets or sets the isEmitting flag - */ - this.isEmitting = true; - /** - * Gets or sets the backing particle collection - */ - this.particles = null; - /** - * Gets or sets the backing deadParticle collection - */ - this.deadParticles = null; - /** - * Gets or sets the minimum partical velocity - */ - this.minVel = 0; - /** - * Gets or sets the maximum partical velocity - */ - this.maxVel = 0; - /** - * Gets or sets the acceleration vector for all particles - */ - this.acceleration = new ex.Vector(0, 0); - /** - * Gets or sets the minimum angle in radians - */ - this.minAngle = 0; - /** - * Gets or sets the maximum angle in radians - */ - this.maxAngle = 0; - /** - * Gets or sets the emission rate for particles (particles/sec) - */ - this.emitRate = 1; //particles/sec - /** - * Gets or sets the life of each particle in milliseconds - */ - this.particleLife = 2000; - /** - * Gets or sets the opacity of each particle from 0 to 1.0 - */ - this.opacity = 1; - /** - * Gets or sets the fade flag which causes particles to gradually fade out over the course of their life. - */ - this.fadeFlag = false; - /** - * Gets or sets the optional focus where all particles should accelerate towards - */ - this.focus = null; - /** - * Gets or sets the acceleration for focusing particles if a focus has been specified - */ - this.focusAccel = 1; - /* - * Gets or sets the optional starting size for the particles - */ - this.startSize = null; - /* - * Gets or sets the optional ending size for the particles - */ - this.endSize = null; - /** - * Gets or sets the minimum size of all particles - */ - this.minSize = 5; - /** - * Gets or sets the maximum size of all particles - */ - this.maxSize = 5; - /** - * Gets or sets the beginning color of all particles - */ - this.beginColor = ex.Color.White; - /** - * Gets or sets the ending color of all particles - */ - this.endColor = ex.Color.White; - /** - * Gets or sets the sprite that a particle should use - * @warning Performance intensive - */ - this.particleSprite = null; - /** - * Gets or sets the emitter type for the particle emitter - */ - this.emitterType = EmitterType.Rectangle; - /** - * Gets or sets the emitter radius, only takes effect when the [[emitterType]] is [[EmitterType.Circle]] - */ - this.radius = 0; - /** - * Gets or sets the particle rotational speed velocity - */ - this.particleRotationalVelocity = 0; - /** - * Indicates whether particles should start with a random rotation - */ - this.randomRotation = false; - this.collisionType = ex.CollisionType.PreventCollision; - this.particles = new ex.Util.Collection(); - this.deadParticles = new ex.Util.Collection(); - // Remove offscreen culling from particle emitters - for (var trait in this.traits) { - if (this.traits[trait] instanceof ex.Traits.OffscreenCulling) { - this.traits.splice(trait, 1); - } + Scene.prototype.addChild = function (actor) { + this._collisionResolver.register(actor); + actor.scene = this; + this.children.push(actor); + this._sortedDrawingTree.add(actor); + actor.parent = this.actor; + }; + /** + * Adds a [[TileMap]] to the scene, once this is done the TileMap will be drawn and updated. + */ + Scene.prototype.addTileMap = function (tileMap) { + this.tileMaps.push(tileMap); + }; + /** + * Removes a [[TileMap]] from the scene, it will no longer be drawn or updated. + */ + Scene.prototype.removeTileMap = function (tileMap) { + var index = this.tileMaps.indexOf(tileMap); + if (index > -1) { + this.tileMaps.splice(index, 1); } - } - ParticleEmitter.prototype.removeParticle = function (particle) { - this.deadParticles.push(particle); }; /** - * Causes the emitter to emit particles - * @param particleCount Number of particles to emit right now + * Removes an actor from the scene, it will no longer be drawn or updated. */ - ParticleEmitter.prototype.emitParticles = function (particleCount) { - for (var i = 0; i < particleCount; i++) { - this.particles.push(this._createParticle()); - } + Scene.prototype.removeChild = function (actor) { + this._collisionResolver.remove(actor); + this._killQueue.push(actor); + actor.parent = null; }; - ParticleEmitter.prototype.clearParticles = function () { - this.particles.clear(); + /** + * Adds a [[Timer]] to the scene + * @param timer The timer to add + */ + Scene.prototype.addTimer = function (timer) { + this._timers.push(timer); + timer.scene = this; + return timer; }; - // Creates a new particle given the contraints of the emitter - ParticleEmitter.prototype._createParticle = function () { - // todo implement emitter contraints; - var ranX = 0; - var ranY = 0; - var angle = ex.Util.randomInRange(this.minAngle, this.maxAngle); - var vel = ex.Util.randomInRange(this.minVel, this.maxVel); - var size = this.startSize || ex.Util.randomInRange(this.minSize, this.maxSize); - var dx = vel * Math.cos(angle); - var dy = vel * Math.sin(angle); - if (this.emitterType === EmitterType.Rectangle) { - ranX = ex.Util.randomInRange(this.x, this.x + this.getWidth()); - ranY = ex.Util.randomInRange(this.y, this.y + this.getHeight()); - } - else if (this.emitterType === EmitterType.Circle) { - var radius = ex.Util.randomInRange(0, this.radius); - ranX = radius * Math.cos(angle) + this.x; - ranY = radius * Math.sin(angle) + this.y; + /** + * Removes a [[Timer]] from the scene. + * @warning Can be dangerous, use [[cancelTimer]] instead + * @param timer The timer to remove + */ + Scene.prototype.removeTimer = function (timer) { + var i = this._timers.indexOf(timer); + if (i !== -1) { + this._timers.splice(i, 1); } - var p = new Particle(this, this.particleLife, this.opacity, this.beginColor, this.endColor, new ex.Vector(ranX, ranY), new ex.Vector(dx, dy), this.acceleration, this.startSize, this.endSize); - p.fadeFlag = this.fadeFlag; - p.particleSize = size; - if (this.particleSprite) { - p.particleSprite = this.particleSprite; + return timer; + }; + /** + * Cancels a [[Timer]], removing it from the scene nicely + * @param timer The timer to cancel + */ + Scene.prototype.cancelTimer = function (timer) { + this._cancelQueue.push(timer); + return timer; + }; + /** + * Tests whether a [[Timer]] is active in the scene + */ + Scene.prototype.isTimerActive = function (timer) { + return (this._timers.indexOf(timer) > -1); + }; + /** + * Creates and adds a [[Group]] to the scene with a name + */ + Scene.prototype.createGroup = function (name) { + return new ex.Group(name, this); + }; + /** + * Returns a [[Group]] by name + */ + Scene.prototype.getGroup = function (name) { + return this.groups[name]; + }; + Scene.prototype.removeGroup = function (group) { + if (typeof group === 'string') { + delete this.groups[group]; } - p.particleRotationalVelocity = this.particleRotationalVelocity; - if (this.randomRotation) { - p.currentRotation = ex.Util.randomInRange(0, Math.PI * 2); + else if (group instanceof ex.Group) { + delete this.groups[group.name]; } - if (this.focus) { - p.focus = this.focus.add(new ex.Vector(this.x, this.y)); - p.focusAccel = this.focusAccel; + else { + this._logger.error('Invalid arguments to removeGroup', group); } - return p; }; - ParticleEmitter.prototype.update = function (engine, delta) { - var _this = this; - _super.prototype.update.call(this, engine, delta); - if (this.isEmitting) { - this._particlesToEmit += this.emitRate * (delta / 1000); - //var numParticles = Math.ceil(this.emitRate * delta / 1000); - if (this._particlesToEmit > 1.0) { - this.emitParticles(Math.floor(this._particlesToEmit)); - this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit); - } + /** + * Removes the given actor from the sorted drawing tree + */ + Scene.prototype.cleanupDrawTree = function (actor) { + this._sortedDrawingTree.removeByComparable(actor); + }; + /** + * Updates the given actor's position in the sorted drawing tree + */ + Scene.prototype.updateDrawTree = function (actor) { + this._sortedDrawingTree.add(actor); + }; + return Scene; + })(ex.Class); + ex.Scene = Scene; +})(ex || (ex = {})); +var ex; +(function (ex) { + /** + * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue] + * Given a time, the function will return a value from postive startValue to postive endValue. + * + * ```js + * function Linear (t) { + * return t * t; + * } + * + * // accelerating from zero velocity + * function EaseInQuad (t) { + * return t * t; + * } + * + * // decelerating to zero velocity + * function EaseOutQuad (t) { + * return t * (2 - t); + * } + * + * // acceleration until halfway, then deceleration + * function EaseInOutQuad (t) { + * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t; + * } + * + * // accelerating from zero velocity + * function EaseInCubic (t) { + * return t * t * t; + * } + * + * // decelerating to zero velocity + * function EaseOutCubic (t) { + * return (--t) * t * t + 1; + * } + * + * // acceleration until halfway, then deceleration + * function EaseInOutCubic (t) { + * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; + * } + * ``` + */ + var EasingFunctions = (function () { + function EasingFunctions() { + } + EasingFunctions.Linear = function (currentTime, startValue, endValue, duration) { + endValue = (endValue - startValue); + return endValue * currentTime / duration + startValue; + }; + EasingFunctions.EaseInQuad = function (currentTime, startValue, endValue, duration) { + //endValue = (endValue - startValue); + currentTime /= duration; + }; + EasingFunctions.EaseOutQuad = function (currentTime, startValue, endValue, duration) { + //endValue = (endValue - startValue); + currentTime /= duration; + return -endValue * currentTime * (currentTime - 2) + startValue; + }; + EasingFunctions.EaseInOutQuad = function (currentTime, startValue, endValue, duration) { + endValue = (endValue - startValue); + currentTime /= duration / 2; + if (currentTime < 1) { + return endValue / 2 * currentTime * currentTime + startValue; } - this.particles.forEach(function (p) { return p.update(delta); }); - this.deadParticles.forEach(function (p) { return _this.particles.removeElement(p); }); - this.deadParticles.clear(); + currentTime--; + return -endValue / 2 * (currentTime * (currentTime - 2) - 1) + startValue; }; - ParticleEmitter.prototype.draw = function (ctx, delta) { - // todo is there a more efficient to draw - // possibly use a webgl offscreen canvas and shaders to do particles? - this.particles.forEach(function (p) { return p.draw(ctx); }); + EasingFunctions.EaseInCubic = function (currentTime, startValue, endValue, duration) { + endValue = (endValue - startValue); + currentTime /= duration; + return endValue * currentTime * currentTime * currentTime + startValue; }; - ParticleEmitter.prototype.debugDraw = function (ctx) { - _super.prototype.debugDraw.call(this, ctx); - ctx.fillStyle = ex.Color.Black.toString(); - ctx.fillText('Particles: ' + this.particles.count(), this.x, this.y + 20); - if (this.focus) { - ctx.fillRect(this.focus.x + this.x, this.focus.y + this.y, 3, 3); - ex.Util.drawLine(ctx, 'yellow', this.focus.x + this.x, this.focus.y + this.y, _super.prototype.getCenter.call(this).x, _super.prototype.getCenter.call(this).y); - ctx.fillText('Focus', this.focus.x + this.x, this.focus.y + this.y); + EasingFunctions.EaseOutCubic = function (currentTime, startValue, endValue, duration) { + endValue = (endValue - startValue); + currentTime /= duration; + return endValue * (currentTime * currentTime * currentTime + 1) + startValue; + }; + EasingFunctions.EaseInOutCubic = function (currentTime, startValue, endValue, duration) { + endValue = (endValue - startValue); + currentTime /= duration / 2; + if (currentTime < 1) { + return endValue / 2 * currentTime * currentTime * currentTime + startValue; } + currentTime -= 2; + return endValue / 2 * (currentTime * currentTime * currentTime + 2) + startValue; }; - return ParticleEmitter; - })(ex.Actor); - ex.ParticleEmitter = ParticleEmitter; + return EasingFunctions; + })(); + ex.EasingFunctions = EasingFunctions; })(ex || (ex = {})); +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// var ex; (function (ex) { /** - * Animations + * Actors + * + * The most important primitive in Excalibur is an `Actor`. Anything that + * can move on the screen, collide with another `Actor`, respond to events, + * or interact with the current scene, must be an actor. An `Actor` **must** + * be part of a [[Scene]] for it to be drawn to the screen. + * + * ## Basic actors + * + * For quick and dirty games, you can just create an instance of an `Actor` + * and manipulate it directly. + * + * Actors (and other entities) must be added to a [[Scene]] to be drawn + * and updated on-screen. + * + * ```ts + * var player = new ex.Actor(); + * + * // move the player + * player.dx = 5; + * + * // add player to the current scene + * game.add(player); + * + * ``` + * `game.add` is a convenience method for adding an `Actor` to the current scene. The equivalent verbose call is `game.currentScene.add`. + * + * ## Actor Lifecycle + * + * An [[Actor|actor]] has a basic lifecycle that dictacts how it is initialized, updated, and drawn. Once an actor is part of a + * [[Scene|scene]], it will follow this lifecycle. + * + * ![Actor Lifecycle](/assets/images/docs/ActorLifeCycle.png) + * + * ## Extending actors * - * Animations allow you to display a series of images one after another, - * creating the illusion of change. Generally these images will come from a [[SpriteSheet]] source. + * For "real-world" games, you'll want to `extend` the `Actor` class. + * This gives you much greater control and encapsulates logic for that + * actor. * - * ## Creating an animation + * You can override the [[onInitialize]] method to perform any startup logic + * for an actor (such as configuring state). [[onInitialize]] gets called + * **once** before the first frame an actor is drawn/updated. It is passed + * an instance of [[Engine]] to access global state or perform coordinate math. * - * Create a [[Texture]] that contains the frames of your animation. Once the texture - * is [[Loader|loaded]], you can then generate an [[Animation]] by creating a [[SpriteSheet]] - * and using [[SpriteSheet.getAnimationForAll]]. + * **TypeScript** + * + * ```ts + * class Player extends ex.Actor { + * + * public level = 1; + * public endurance = 0; + * public fortitude = 0; + * + * constructor() { + * super(); + * } + * + * public onInitialize(engine: ex.Engine) { + * this.endurance = 20; + * this.fortitude = 16; + * } + * + * public getMaxHealth() { + * return (0.4 * this.endurance) + (0.9 * this.fortitude) + (this.level * 1.2); + * } + * } + * ``` + * + * **Javascript** + * + * In Javascript you can use the [[extend]] method to override or add + * methods to an `Actor`. * * ```js - * var game = new ex.Engine(); - * var txAnimPlayerIdle = new ex.Texture("/assets/tx/anim-player-idle.png"); + * var Player = ex.Actor.extend({ * - * // load assets - * var loader = new ex.Loader(txAnimPlayerIdle); + * level: 1, + * endurance: 0, + * fortitude: 0, * - * // start game - * game.start(loader).then(function () { - * var player = new ex.Actor(); + * onInitialize: function (engine) { + * this.endurance = 20; + * this.fortitude = 16; + * }, * - * // create sprite sheet with 5 columns, 1 row, 80x80 frames - * var playerIdleSheet = new ex.SpriteSheet(txAnimPlayerIdle, 5, 1, 80, 80); + * getMaxHealth: function () { + * return (0.4 * this.endurance) + (0.9 * this.fortitude) + (this.level * 1.2); + * } + * }); + * ``` * - * // create animation (125ms frame speed) - * var playerIdleAnimation = playerIdleSheet.getAnimationForAll(game, 125); + * ## Updating actors * - * // add drawing to player as "idle" - * player.addDrawing("idle", playerIdleAnimation); + * Override the [[update]] method to update the state of your actor each frame. + * Typically things that need to be updated include state, drawing, or position. * - * // add player to game - * game.add(player); + * Remember to call `super.update` to ensure the base update logic is performed. + * You can then write your own logic for what happens after that. + * + * The [[update]] method is passed an instance of the Excalibur engine, which + * can be used to perform coordinate math or access global state. It is also + * passed `delta` which is the time in milliseconds since the last frame, which can be used + * to perform time-based movement or time-based math (such as a timer). + * + * **TypeScript** + * + * ```ts + * class Player extends Actor { + * public update(engine: ex.Engine, delta: number) { + * super.update(engine, delta); // call base update logic + * + * // check if player died + * if (this.health <= 0) { + * this.emit("death"); + * this.onDeath(); + * return; + * } + * } + * } + * ``` + * + * **Javascript** + * + * ```js + * var Player = ex.Actor.extend({ + * update: function (engine, delta) { + * ex.Actor.prototype.update.call(this, engine, delta); // call base update logic + * + * // check if player died + * if (this.health <= 0) { + * this.emit("death"); + * this.onDeath(); + * return; + * } + * } * }); * ``` * - * ## Sprite effects + * ## Drawing actors + * + * Override the [[draw]] method to perform any custom drawing. For simple games, + * you don't need to override `draw`, instead you can use [[addDrawing]] and [[setDrawing]] + * to manipulate the [[Sprite|sprites]]/[[Animation|animations]] that the actor is using. + * + * ### Working with Textures & Sprites + * + * Think of a [[Texture|texture]] as the raw image file that will be loaded into Excalibur. In order for it to be drawn + * it must be converted to a [[Sprite.sprite]]. + * + * A common usage is to load a [[Texture]] and convert it to a [[Sprite]] for an actor. If you are using the [[Loader]] to + * pre-load assets, you can simply assign an actor a [[Sprite]] to draw. You can also create a + * [[Texture.asSprite|sprite from a Texture]] to quickly create a [[Sprite]] instance. + * + * ```ts + * // assume Resources.TxPlayer is a 80x80 png image + * + * public onInitialize(engine: ex.Engine) { + * + * // set as the "default" drawing + * this.addDrawing(Resources.TxPlayer); + * + * // you can also set a Sprite instance to draw + * this.addDrawing(Resources.TxPlayer.asSprite()); + * } + * ``` + * + * ### Working with Animations + * + * A [[SpriteSheet]] holds a collection of sprites from a single [[Texture]]. + * Use [[SpriteSheet.getAnimationForAll]] to easily generate an [[Animation]]. + * + * ```ts + * // assume Resources.TxPlayerIdle is a texture containing several frames of an animation + * + * public onInitialize(engine: ex.Engine) { + * + * // create a SpriteSheet for the animation + * var playerIdleSheet = new ex.SpriteSheet(Resources.TxPlayerIdle, 5, 1, 80, 80); + * + * // create an animation + * var playerIdleAnimation = playerIdleSheet.getAnimationForAll(engine, 120); + * + * // the first drawing is always the current + * this.addDrawing("idle", playerIdleAnimation); + * } + * ``` + * + * ### Custom drawing + * + * You can always override the default drawing logic for an actor in the [[draw]] method, + * for example, to draw complex shapes or to use the raw + * [[https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D|Canvas API]]. + * + * Usually you should call `super.draw` to perform the base drawing logic, but other times + * you may want to take over the drawing completely. + * + * ```ts + * public draw(ctx: Canvas2DRenderingContext, delta: number) { + * + * super.draw(ctx, delta); // perform base drawing logic + * + * // custom drawing + * ctx.lineTo(...); + * } + * ``` + * + * ## Actions + * + * You can use the [[ActionContext|Action API]] to create chains of + * actions and script actors into doing your bidding for your game. + * + * Actions can be simple or can be chained together to create complex + * AI routines. In the future, it will be easier to create timelines or + * scripts to run depending on the state of your actor, such as an + * enemy ship that is Guarding a path and then is Alerted when a Player + * draws near. + * + * Learn more about the [[ActionContext|Action API]]. + * + * ## Collision Detection + * + * By default Actors do not participate in collisions. If you wish to make + * an actor participate, you need to switch from the default [[CollisionType.PreventCollision|prevent collision]] + * to [[CollisionType.Active|active]], [[CollisionType.Fixed|fixed]], or [[CollisionType.Passive|passive]] collision type. + * + * ```ts + * public Player extends ex.Actor { + * constructor() { + * super(); + * // set preferred CollisionType + * this.collisionType = ex.CollisionType.Active; + * } + * } + * + * // or set the collisionType + * + * var actor = new ex.Actor(); + * actor.collisionType = ex.CollisionType.Active; + * + * ``` + * ### Collision Groups + * TODO, needs more information. + * + * ## Traits + * + * Traits describe actor behavior that occurs every update. If you wish to build a generic behavior + * without needing to extend every actor you can do it with a trait, a good example of this may be + * plugging in an external collision detection library like [[https://github.com/kripken/box2d.js/|Box2D]] or + * [[http://wellcaffeinated.net/PhysicsJS/|PhysicsJS]] by wrapping it in a trait. Removing traits can also make your + * actors more efficient. + * + * Default traits provided by Excalibur are [[Traits.CapturePointer|pointer capture]], + * [[Traits.CollisionDetection|tile map collision]], [[Traits.Movement|Euler style movement]], + * and [[Traits.OffscreenCulling|offscreen culling]]. + * + * + * ## Known Issues + * + * **Actor bounding boxes do not rotate** + * [Issue #68](https://github.com/excaliburjs/Excalibur/issues/68) * - * You can add [[SpriteEffect|sprite effects]] to an animation through methods - * like [[Animation.invert]] or [[Animation.lighten]]. Keep in mind, since this - * manipulates the raw pixel values of a [[Sprite]], it can have a performance impact. */ - var Animation = (function () { + var Actor = (function (_super) { + __extends(Actor, _super); /** - * Typically you will use a [[SpriteSheet]] to generate an [[Animation]]. - * - * @param engine Reference to the current game engine - * @param images An array of sprites to create the frames for the animation - * @param speed The number in milliseconds to display each frame in the animation - * @param loop Indicates whether the animation should loop after it is completed + * @param x The starting x coordinate of the actor + * @param y The starting y coordinate of the actor + * @param width The starting width of the actor + * @param height The starting height of the actor + * @param color The starting color of the actor. Leave null to draw a transparent actor. The opacity of the color will be used as the + * initial [[opacity]]. */ - function Animation(engine, images, speed, loop) { + function Actor(x, y, width, height, color) { + _super.call(this); + /** + * The unique identifier for the actor + */ + this.id = Actor.maxId++; + /** + * The x coordinate of the actor (middle if anchor is (0.5, 0.5) left edge if anchor is (0, 0)) + */ + this.x = 0; + /** + * The y coordinate of the actor (middle if anchor is (0.5, 0.5) and top edge if anchor is (0, 0)) + */ + this.y = 0; + this._height = 0; + this._width = 0; + /** + * The rotation of the actor in radians + */ + this.rotation = 0; // radians + /** + * The rotational velocity of the actor in radians/second + */ + this.rx = 0; //radions/sec + /** + * The scale vector of the actor + */ + this.scale = new ex.Vector(1, 1); /** - * Current frame index being shown + * The x scalar velocity of the actor in scale/second */ - this.currentFrame = 0; - this._oldTime = Date.now(); - this.anchor = new ex.Point(0.0, 0.0); - this.rotation = 0.0; - this.scale = new ex.Point(1, 1); + this.sx = 0; //scale/sec /** - * Indicates whether the animation should loop after it is completed + * The y scalar velocity of the actor in scale/second */ - this.loop = false; + this.sy = 0; //scale/sec /** - * Indicates the frame index the animation should freeze on for a non-looping - * animation. By default it is the last frame. + * The x velocity of the actor in pixels/second */ - this.freezeFrame = -1; + this.dx = 0; // pixels/sec /** - * Flip each frame vertically. Sets [[Sprite.flipVertical]]. + * The x velocity of the actor in pixels/second */ - this.flipVertical = false; + this.dy = 0; /** - * Flip each frame horizontally. Sets [[Sprite.flipHorizontal]]. + * The x acceleration of the actor in pixels/second^2 */ - this.flipHorizontal = false; - this.width = 0; - this.height = 0; - this.naturalWidth = 0; - this.naturalHeight = 0; - this.sprites = images; - this.speed = speed; - this._engine = engine; - if (loop != null) { - this.loop = loop; - } - if (images && images[0]) { - this.height = images[0] ? images[0].height : 0; - this.width = images[0] ? images[0].width : 0; - this.naturalWidth = images[0] ? images[0].naturalWidth : 0; - this.naturalHeight = images[0] ? images[0].naturalHeight : 0; - this.freezeFrame = images.length - 1; + this.ax = 0; // pixels/sec/sec + /** + * The y acceleration of the actor in pixels/second^2 + */ + this.ay = 0; + /** + * Indicates whether the actor is physically in the viewport + */ + this.isOffScreen = false; + /** + * The visibility of an actor + */ + this.visible = true; + /** + * The opacity of an actor. Passing in a color in the [[constructor]] will use the + * color's opacity. + */ + this.opacity = 1; + this.previousOpacity = 1; + this.actions = new ex.ActionContext(this); + /** + * Convenience reference to the global logger + */ + this.logger = ex.Logger.getInstance(); + /** + * The scene that the actor is in + */ + this.scene = null; + /** + * The parent of this actor + */ + this.parent = null; + // TODO: Replace this with the new actor collection once z-indexing is built + /** + * The children of this actor + */ + this.children = []; + /** + * Gets or sets the current collision type of this actor. By + * default it is ([[CollisionType.PreventCollision]]). + */ + this.collisionType = CollisionType.PreventCollision; + this.collisionGroups = []; + this._collisionHandlers = {}; + this._isInitialized = false; + this.frames = {}; + /** + * Access to the current drawing for the actor, this can be + * an [[Animation]], [[Sprite]], or [[Polygon]]. + * Set drawings with [[setDrawing]]. + */ + this.currentDrawing = null; + this.centerDrawingX = true; + this.centerDrawingY = true; + /** + * Modify the current actor update pipeline. + */ + this.traits = []; + /** + * Whether or not to enable the [[CapturePointer]] trait that propogates + * pointer events to this actor + */ + this.enableCapturePointer = false; + /** + * Configuration for [[CapturePointer]] trait + */ + this.capturePointer = { + captureMoveEvents: false + }; + this._zIndex = 0; + this._isKilled = false; + this.x = x || 0; + this.y = y || 0; + this._width = width || 0; + this._height = height || 0; + if (color) { + this.color = color.clone(); + // set default opacity of an actor to the color + this.opacity = color.a; } + // Build default pipeline + this.traits.push(new ex.Traits.Movement()); + this.traits.push(new ex.Traits.CollisionDetection()); + this.traits.push(new ex.Traits.OffscreenCulling()); + this.traits.push(new ex.Traits.CapturePointer()); + this.actionQueue = new ex.Internal.Actions.ActionQueue(this); + this.anchor = new ex.Point(.5, .5); } /** - * Applies the opacity effect to a sprite, setting the alpha of all pixels to a given value - */ - Animation.prototype.opacity = function (value) { - this.addEffect(new ex.Effects.Opacity(value)); - }; - /** - * Applies the grayscale effect to a sprite, removing color information. - */ - Animation.prototype.grayscale = function () { - this.addEffect(new ex.Effects.Grayscale()); - }; - /** - * Applies the invert effect to a sprite, inverting the pixel colors. - */ - Animation.prototype.invert = function () { - this.addEffect(new ex.Effects.Invert()); - }; - /** - * Applies the fill effect to a sprite, changing the color channels of all non-transparent pixels to match a given color - */ - Animation.prototype.fill = function (color) { - this.addEffect(new ex.Effects.Fill(color)); - }; - /** - * Applies the colorize effect to a sprite, changing the color channels of all pixesl to be the average of the original color and the - * provided color. - */ - Animation.prototype.colorize = function (color) { - this.addEffect(new ex.Effects.Colorize(color)); - }; - /** - * Applies the lighten effect to a sprite, changes the lightness of the color according to hsl - */ - Animation.prototype.lighten = function (factor) { - if (factor === void 0) { factor = 0.1; } - this.addEffect(new ex.Effects.Lighten(factor)); - }; - /** - * Applies the darken effect to a sprite, changes the darkness of the color according to hsl - */ - Animation.prototype.darken = function (factor) { - if (factor === void 0) { factor = 0.1; } - this.addEffect(new ex.Effects.Darken(factor)); - }; - /** - * Applies the saturate effect to a sprite, saturates the color acccording to hsl - */ - Animation.prototype.saturate = function (factor) { - if (factor === void 0) { factor = 0.1; } - this.addEffect(new ex.Effects.Saturate(factor)); - }; - /** - * Applies the desaturate effect to a sprite, desaturates the color acccording to hsl - */ - Animation.prototype.desaturate = function (factor) { - if (factor === void 0) { factor = 0.1; } - this.addEffect(new ex.Effects.Desaturate(factor)); - }; - /** - * Add a [[ISpriteEffect]] manually - */ - Animation.prototype.addEffect = function (effect) { - for (var i in this.sprites) { - this.sprites[i].addEffect(effect); - } - }; - Animation.prototype.removeEffect = function (param) { - for (var i in this.sprites) { - this.sprites[i].removeEffect(param); - } - }; - /** - * Clear all sprite effects - */ - Animation.prototype.clearEffects = function () { - for (var i in this.sprites) { - this.sprites[i].clearEffects(); - } - }; - Animation.prototype._setAnchor = function (point) { - //if (!this.anchor.equals(point)) { - for (var i in this.sprites) { - this.sprites[i].anchor.setTo(point.x, point.y); - } - //} - }; - Animation.prototype._setRotation = function (radians) { - //if (this.rotation !== radians) { - for (var i in this.sprites) { - this.sprites[i].rotation = radians; - } - //} - }; - Animation.prototype._setScale = function (scale) { - //if (!this.scale.equals(scale)) { - for (var i in this.sprites) { - this.sprites[i].scale = scale; - } - //} - }; - /** - * Resets the animation to first frame. - */ - Animation.prototype.reset = function () { - this.currentFrame = 0; - }; - /** - * Indicates whether the animation is complete, animations that loop are never complete. + * This is called before the first update of the actor. This method is meant to be + * overridden. This is where initialization of child actors should take place. */ - Animation.prototype.isDone = function () { - return (!this.loop && this.currentFrame >= this.sprites.length); + Actor.prototype.onInitialize = function (engine) { + // Override me }; - /** - * Not meant to be called by game developers. Ticks the animation forward internally and - * calculates whether to change to the frame. - * @internal - */ - Animation.prototype.tick = function () { - var time = Date.now(); - if ((time - this._oldTime) > this.speed) { - this.currentFrame = (this.loop ? (this.currentFrame + 1) % this.sprites.length : this.currentFrame + 1); - this._oldTime = time; + Actor.prototype._checkForPointerOptIn = function (eventName) { + if (eventName && (eventName.toLowerCase() === 'pointerdown' || + eventName.toLowerCase() === 'pointerdown' || + eventName.toLowerCase() === 'pointermove')) { + this.enableCapturePointer = true; + if (eventName.toLowerCase() === 'pointermove') { + this.capturePointer.captureMoveEvents = true; + } } }; - Animation.prototype._updateValues = function () { - this._setAnchor(this.anchor); - this._setRotation(this.rotation); - this._setScale(this.scale); + /** + * Add an event listener. You can listen for a variety of + * events off of the engine; see [[GameEvent]] + * @param eventName Name of the event to listen for + * @param handler Event handler for the thrown event + * @obsolete Use [[on]] instead. + */ + Actor.prototype.addEventListener = function (eventName, handler) { + this._checkForPointerOptIn(eventName); + _super.prototype.addEventListener.call(this, eventName, handler); }; /** - * Skips ahead a specified number of frames in the animation - * @param frames Frames to skip ahead + * Alias for `addEventListener`. You can listen for a variety of + * events off of the engine; see [[GameEvent]] + * @param eventName Name of the event to listen for + * @param handler Event handler for the thrown event */ - Animation.prototype.skip = function (frames) { - this.currentFrame = (this.currentFrame + frames) % this.sprites.length; + Actor.prototype.on = function (eventName, handler) { + this._checkForPointerOptIn(eventName); + this.eventDispatcher.subscribe(eventName, handler); }; - Animation.prototype.draw = function (ctx, x, y) { - this.tick(); - this._updateValues(); - var currSprite; - if (this.currentFrame < this.sprites.length) { - currSprite = this.sprites[this.currentFrame]; - if (this.flipVertical) { - currSprite.flipVertical = this.flipVertical; - } - if (this.flipHorizontal) { - currSprite.flipHorizontal = this.flipHorizontal; - } - currSprite.draw(ctx, x, y); - } - if (this.freezeFrame !== -1 && this.currentFrame >= this.sprites.length) { - currSprite = this.sprites[ex.Util.clamp(this.freezeFrame, 0, this.sprites.length - 1)]; - currSprite.draw(ctx, x, y); + /** + * If the current actor is a member of the scene, this will remove + * it from the scene graph. It will no longer be drawn or updated. + */ + Actor.prototype.kill = function () { + if (this.scene) { + this.scene.remove(this); + this._isKilled = true; } - // add the calculated width - if (currSprite) { - this.width = currSprite.width; - this.height = currSprite.height; + else { + this.logger.warn('Cannot kill actor, it was never added to the Scene'); } }; /** - * Plays an animation at an arbitrary location in the game. - * @param x The x position in the game to play - * @param y The y position in the game to play + * Indicates wether the actor has been killed. */ - Animation.prototype.play = function (x, y) { - this.reset(); - this._engine.playAnimation(this, x, y); + Actor.prototype.isKilled = function () { + return this._isKilled; }; - return Animation; - })(); - ex.Animation = Animation; -})(ex || (ex = {})); -/// -/// -/// -var ex; -(function (ex) { - var Internal; - (function (Internal) { - var FallbackAudio = (function () { - function FallbackAudio(path, volume) { - this._log = ex.Logger.getInstance(); - this.onload = function () { return; }; - this.onprogress = function () { return; }; - this.onerror = function () { return; }; - if (window.AudioContext) { - this._log.debug('Using new Web Audio Api for ' + path); - this._soundImpl = new WebAudio(path, volume); - } - else { - this._log.debug('Falling back to Audio Element for ' + path); - this._soundImpl = new AudioTag(path, volume); - } - } - FallbackAudio.prototype.setVolume = function (volume) { - this._soundImpl.setVolume(volume); - }; - FallbackAudio.prototype.setLoop = function (loop) { - this._soundImpl.setLoop(loop); - }; - FallbackAudio.prototype.load = function () { - this._soundImpl.onload = this.onload; - this._soundImpl.onprogress = this.onprogress; - this._soundImpl.onerror = this.onerror; - this._soundImpl.load(); - }; - FallbackAudio.prototype.isPlaying = function () { - return this._soundImpl.isPlaying(); - }; - FallbackAudio.prototype.play = function () { - return this._soundImpl.play(); - }; - FallbackAudio.prototype.pause = function () { - this._soundImpl.pause(); - }; - FallbackAudio.prototype.stop = function () { - this._soundImpl.stop(); - }; - return FallbackAudio; - })(); - Internal.FallbackAudio = FallbackAudio; - var AudioTag = (function () { - function AudioTag(path, volume) { - var _this = this; - this.path = path; - this._audioElements = new Array(5); - this._loadedAudio = null; - this._isLoaded = false; - this._index = 0; - this._log = ex.Logger.getInstance(); - this._isPlaying = false; - this._currentOffset = 0; - this.onload = function () { return; }; - this.onprogress = function () { return; }; - this.onerror = function () { return; }; - for (var i = 0; i < this._audioElements.length; i++) { - (function (i) { - _this._audioElements[i] = new Audio(); - })(i); - } - if (volume) { - this.setVolume(ex.Util.clamp(volume, 0, 1.0)); - } - else { - this.setVolume(1.0); - } + /** + * Adds a child actor to this actor. All movement of the child actor will be + * relative to the parent actor. Meaning if the parent moves the child will + * move with it. + * @param actor The child actor to add + */ + Actor.prototype.add = function (actor) { + actor.collisionType = CollisionType.PreventCollision; + if (ex.Util.addItemToArray(actor, this.children)) { + actor.parent = this; } - AudioTag.prototype.isPlaying = function () { - return this._isPlaying; - }; - AudioTag.prototype._audioLoaded = function () { - this._isLoaded = true; - }; - AudioTag.prototype.setVolume = function (volume) { - var i = 0, len = this._audioElements.length; - for (i; i < len; i++) { - this._audioElements[i].volume = volume; - } - }; - AudioTag.prototype.setLoop = function (loop) { - var i = 0, len = this._audioElements.length; - for (i; i < len; i++) { - this._audioElements[i].loop = loop; - } - }; - AudioTag.prototype.getLoop = function () { - this._audioElements.some(function (a) { return a.loop; }); - }; - AudioTag.prototype.load = function () { - var _this = this; - var request = new XMLHttpRequest(); - request.open('GET', this.path, true); - request.responseType = 'blob'; - request.onprogress = this.onprogress; - request.onerror = this.onerror; - request.onload = function (e) { - if (request.status !== 200) { - _this._log.error('Failed to load audio resource ', _this.path, ' server responded with error code', request.status); - _this.onerror(request.response); - _this._isLoaded = false; - return; - } - _this._loadedAudio = URL.createObjectURL(request.response); - _this._audioElements.forEach(function (a) { - a.src = _this._loadedAudio; - }); - _this.onload(e); - }; - request.send(); - }; - AudioTag.prototype.play = function () { - var _this = this; - this._audioElements[this._index].load(); - //this.audioElements[this.index].currentTime = this._currentOffset; - this._audioElements[this._index].play(); - this._currentOffset = 0; - var done = new ex.Promise(); - this._isPlaying = true; - if (!this.getLoop()) { - this._audioElements[this._index].addEventListener('ended', function () { - _this._isPlaying = false; - done.resolve(true); - }); - } - this._index = (this._index + 1) % this._audioElements.length; - return done; - }; - AudioTag.prototype.pause = function () { - this._index = (this._index - 1 + this._audioElements.length) % this._audioElements.length; - this._currentOffset = this._audioElements[this._index].currentTime; - this._audioElements.forEach(function (a) { - a.pause(); - }); - this._isPlaying = false; - }; - AudioTag.prototype.stop = function () { - this._audioElements.forEach(function (a) { - a.pause(); - //a.currentTime = 0; - }); - this._isPlaying = false; - }; - return AudioTag; - })(); - Internal.AudioTag = AudioTag; - if (window.AudioContext) { - var audioContext = new window.AudioContext(); - } - var WebAudio = (function () { - function WebAudio(soundPath, volume) { - this._context = audioContext; - this._volume = this._context.createGain(); - this._buffer = null; - this._sound = null; - this._path = ''; - this._isLoaded = false; - this._loop = false; - this._isPlaying = false; - this._isPaused = false; - this._currentOffset = 0; - this._logger = ex.Logger.getInstance(); - this.onload = function () { return; }; - this.onprogress = function () { return; }; - this.onerror = function () { return; }; - this._path = soundPath; - if (volume) { - this._volume.gain.value = ex.Util.clamp(volume, 0, 1.0); + }; + /** + * Removes a child actor from this actor. + * @param actor The child actor to remove + */ + Actor.prototype.remove = function (actor) { + if (ex.Util.removeItemToArray(actor, this.children)) { + actor.parent = null; + } + }; + Actor.prototype.setDrawing = function (key) { + key = key.toString(); + if (this.currentDrawing !== this.frames[key]) { + if (this.frames[key] != null) { + this.frames[key].reset(); + this.currentDrawing = this.frames[key]; } else { - this._volume.gain.value = 1.0; // max volume + ex.Logger.getInstance().error('the specified drawing key \'' + key + '\' does not exist'); } } - WebAudio.prototype.setVolume = function (volume) { - this._volume.gain.value = volume; - }; - WebAudio.prototype.load = function () { - var _this = this; - var request = new XMLHttpRequest(); - request.open('GET', this._path); - request.responseType = 'arraybuffer'; - request.onprogress = this.onprogress; - request.onerror = this.onerror; - request.onload = function () { - if (request.status !== 200) { - _this._logger.error('Failed to load audio resource ', _this._path, ' server responded with error code', request.status); - _this.onerror(request.response); - _this._isLoaded = false; - return; - } - _this._context.decodeAudioData(request.response, function (buffer) { - _this._buffer = buffer; - _this._isLoaded = true; - _this.onload(_this); - }, function (e) { - _this._logger.error('Unable to decode ' + _this._path + - ' this browser may not fully support this format, or the file may be corrupt, ' + - 'if this is an mp3 try removing id3 tags and album art from the file.'); - _this._isLoaded = false; - _this.onload(_this); - }); - }; - try { - request.send(); + }; + Actor.prototype.addDrawing = function (args) { + if (arguments.length === 2) { + this.frames[arguments[0]] = arguments[1]; + if (!this.currentDrawing) { + this.currentDrawing = arguments[1]; } - catch (e) { - console.error('Error loading sound! If this is a cross origin error, you must host your sound with your html and javascript.'); + } + else { + if (arguments[0] instanceof ex.Sprite) { + this.addDrawing('default', arguments[0]); } - }; - WebAudio.prototype.setLoop = function (loop) { - this._loop = loop; - }; - WebAudio.prototype.isPlaying = function () { - return this._isPlaying; - }; - WebAudio.prototype.play = function () { - var _this = this; - if (this._isLoaded) { - this._sound = this._context.createBufferSource(); - this._sound.buffer = this._buffer; - this._sound.loop = this._loop; - this._sound.connect(this._volume); - this._volume.connect(this._context.destination); - this._sound.start(0, this._currentOffset % this._buffer.duration); - this._currentOffset = 0; - var done; - if (!this._isPaused || !this._playPromise) { - done = new ex.Promise(); - } - else { - done = this._playPromise; - } - this._isPaused = false; - this._isPlaying = true; - if (!this._loop) { - this._sound.onended = (function () { - _this._isPlaying = false; - if (!_this._isPaused) { - done.resolve(true); - } - }).bind(this); + if (arguments[0] instanceof ex.Texture) { + this.addDrawing('default', arguments[0].asSprite()); + } + } + }; + /** + * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in. + * Actors with a higher z-index are drawn on top of actors with a lower z-index + */ + Actor.prototype.getZIndex = function () { + return this._zIndex; + }; + /** + * Sets the z-index of an actor and updates it in the drawing list for the scene. + * The z-index determines the relative order an actor is drawn in. + * Actors with a higher z-index are drawn on top of actors with a lower z-index + * @param actor The child actor to remove + */ + Actor.prototype.setZIndex = function (newIndex) { + this.scene.cleanupDrawTree(this); + this._zIndex = newIndex; + this.scene.updateDrawTree(this); + }; + /** + * Adds an actor to a collision group. Actors with no named collision groups are + * considered to be in every collision group. + * + * Once in a collision group(s) actors will only collide with other actors in + * that group. + * + * @param name The name of the collision group + */ + Actor.prototype.addCollisionGroup = function (name) { + this.collisionGroups.push(name); + }; + /** + * Removes an actor from a collision group. + * @param name The name of the collision group + */ + Actor.prototype.removeCollisionGroup = function (name) { + var index = this.collisionGroups.indexOf(name); + if (index !== -1) { + this.collisionGroups.splice(index, 1); + } + }; + /** + * Get the center point of an actor + */ + Actor.prototype.getCenter = function () { + return new ex.Vector(this.x + this.getWidth() / 2 - this.anchor.x * this.getWidth(), this.y + this.getHeight() / 2 - this.anchor.y * this.getHeight()); + }; + /** + * Gets the calculated width of an actor, factoring in scale + */ + Actor.prototype.getWidth = function () { + return this._width * this.scale.x; + }; + /** + * Sets the width of an actor, factoring in the current scale + */ + Actor.prototype.setWidth = function (width) { + this._width = width / this.scale.x; + }; + /** + * Gets the calculated height of an actor, factoring in scale + */ + Actor.prototype.getHeight = function () { + return this._height * this.scale.y; + }; + /** + * Sets the height of an actor, factoring in the current scale + */ + Actor.prototype.setHeight = function (height) { + this._height = height / this.scale.y; + }; + /** + * Centers the actor's drawing around the center of the actor's bounding box + * @param center Indicates to center the drawing around the actor + */ + Actor.prototype.setCenterDrawing = function (center) { + this.centerDrawingY = center; + this.centerDrawingX = center; + }; + /** + * Gets the left edge of the actor + */ + Actor.prototype.getLeft = function () { + return this.x; + }; + /** + * Gets the right edge of the actor + */ + Actor.prototype.getRight = function () { + return this.x + this.getWidth(); + }; + /** + * Gets the top edge of the actor + */ + Actor.prototype.getTop = function () { + return this.y; + }; + /** + * Gets the bottom edge of the actor + */ + Actor.prototype.getBottom = function () { + return this.y + this.getHeight(); + }; + /** + * Gets the x value of the Actor in global coordinates + */ + Actor.prototype.getWorldX = function () { + if (!this.parent) { + return this.x; + } + return this.x * this.parent.scale.x + this.parent.getWorldX(); + }; + /** + * Gets the y value of the Actor in global coordinates + */ + Actor.prototype.getWorldY = function () { + if (!this.parent) { + return this.y; + } + return this.y * this.parent.scale.y + this.parent.getWorldY(); + }; + /** + * Gets the global scale of the Actor + */ + Actor.prototype.getGlobalScale = function () { + if (!this.parent) { + return new ex.Point(this.scale.x, this.scale.y); + } + var parentScale = this.parent.getGlobalScale(); + return new ex.Point(this.scale.x * parentScale.x, this.scale.y * parentScale.y); + }; + /** + * Returns the actor's [[BoundingBox]] calculated for this instant. + */ + Actor.prototype.getBounds = function () { + var anchor = this._getCalculatedAnchor(); + return new ex.BoundingBox(this.getWorldX() - anchor.x, this.getWorldY() - anchor.y, this.getWorldX() + this.getWidth() - anchor.x, this.getWorldY() + this.getHeight() - anchor.y); + }; + /** + * Tests whether the x/y specified are contained in the actor + * @param x X coordinate to test (in world coordinates) + * @param y Y coordinate to test (in world coordinates) + * @param recurse checks whether the x/y are contained in any child actors (if they exist). + */ + Actor.prototype.contains = function (x, y, recurse) { + if (recurse === void 0) { recurse = false; } + var containment = this.getBounds().contains(new ex.Point(x, y)); + if (recurse) { + return containment || this.children.some(function (child) { + return child.contains(x, y, true); + }); + } + return containment; + }; + /** + * Returns the side of the collision based on the intersection + * @param intersect The displacement vector returned by a collision + */ + Actor.prototype.getSideFromIntersect = function (intersect) { + if (intersect) { + if (Math.abs(intersect.x) > Math.abs(intersect.y)) { + if (intersect.x < 0) { + return ex.Side.Right; } - this._playPromise = done; - return done; + return ex.Side.Left; } else { - return ex.Promise.wrap(true); - } - }; - WebAudio.prototype.pause = function () { - if (this._isPlaying) { - try { - window.clearTimeout(this._playingTimer); - this._sound.stop(0); - this._currentOffset = this._context.currentTime; - this._isPlaying = false; - this._isPaused = true; - } - catch (e) { - this._logger.warn('The sound clip', this._path, 'has already been paused!'); + if (intersect.y < 0) { + return ex.Side.Bottom; } + return ex.Side.Top; } - }; - WebAudio.prototype.stop = function () { - if (this._sound) { - try { - window.clearTimeout(this._playingTimer); - this._currentOffset = 0; - this._sound.stop(0); - this._isPlaying = false; - this._isPaused = false; - } - catch (e) { - this._logger.warn('The sound clip', this._path, 'has already been stopped!'); - } + } + return ex.Side.None; + }; + /** + * Test whether the actor has collided with another actor, returns the side of the current actor that collided. + * @param actor The other actor to test + */ + Actor.prototype.collidesWithSide = function (actor) { + var separationVector = this.collides(actor); + if (!separationVector) { + return ex.Side.None; + } + if (Math.abs(separationVector.x) > Math.abs(separationVector.y)) { + if (this.x < actor.x) { + return ex.Side.Right; } - }; - return WebAudio; - })(); - Internal.WebAudio = WebAudio; - })(Internal = ex.Internal || (ex.Internal = {})); -})(ex || (ex = {})); -/// -// Promises/A+ Spec http://promises-aplus.github.io/promises-spec/ -var ex; -(function (ex) { - /** - * Valid states for a promise to be in - */ - (function (PromiseState) { - PromiseState[PromiseState["Resolved"] = 0] = "Resolved"; - PromiseState[PromiseState["Rejected"] = 1] = "Rejected"; - PromiseState[PromiseState["Pending"] = 2] = "Pending"; - })(ex.PromiseState || (ex.PromiseState = {})); - var PromiseState = ex.PromiseState; - /** - * Promises/A+ spec implementation of promises - * - * Promises are used to do asynchronous work and they are useful for - * creating a chain of actions. In Excalibur they are used for loading, - * sounds, animation, actions, and more. - * - * ## A Promise Chain - * - * Promises can be chained together and can be useful for creating a queue - * of functions to be called when something is done. - * - * The first [[Promise]] you will encounter is probably [[Engine.start]] - * which resolves when the game has finished loading. - * - * ```js - * var game = new ex.Engine(); - * - * // perform start-up logic once game is ready - * game.start().then(function () { - * - * // start-up & initialization logic - * - * }); - * ``` - * - * ## Handling errors - * - * You can optionally pass an error handler to [[Promise.then]] which will handle - * any errors that occur during Promise execution. - * - * ```js - * var game = new ex.Engine(); - * - * game.start().then( - * // success handler - * function () { - * }, - * - * // error handler - * function (err) { - * } - * ); - * ``` - * - * Any errors that go unhandled will be bubbled up to the browser. - */ - var Promise = (function () { - function Promise() { - this._state = PromiseState.Pending; - this._successCallbacks = []; - this._rejectCallback = function () { return; }; - this._logger = ex.Logger.getInstance(); - } + else { + return ex.Side.Left; + } + } + else { + if (this.y < actor.y) { + return ex.Side.Bottom; + } + else { + return ex.Side.Top; + } + } + return ex.Side.None; + }; + /** + * Test whether the actor has collided with another actor, returns the intersection vector on collision. Returns + * `null` when there is no collision; + * @param actor The other actor to test + */ + Actor.prototype.collides = function (actor) { + var bounds = this.getBounds(); + var otherBounds = actor.getBounds(); + var intersect = bounds.collides(otherBounds); + return intersect; + }; + /** + * Register a handler to fire when this actor collides with another in a specified group + * @param group The group name to listen for + * @param func The callback to fire on collision with another actor from the group. The callback is passed the other actor. + */ + Actor.prototype.onCollidesWith = function (group, func) { + if (!this._collisionHandlers[group]) { + this._collisionHandlers[group] = []; + } + this._collisionHandlers[group].push(func); + }; + Actor.prototype.getCollisionHandlers = function () { + return this._collisionHandlers; + }; + /** + * Removes all collision handlers for this group on this actor + * @param group Group to remove all handlers for on this actor. + */ + Actor.prototype.removeCollidesWith = function (group) { + this._collisionHandlers[group] = []; + }; + /** + * Returns true if the two actors are less than or equal to the distance specified from each other + * @param actor Actor to test + * @param distance Distance in pixels to test + */ + Actor.prototype.within = function (actor, distance) { + return Math.sqrt(Math.pow(this.x - actor.x, 2) + Math.pow(this.y - actor.y, 2)) <= distance; + }; + /** + * Clears all queued actions from the Actor + * @obsolete Use [[ActionContext.clearActions|Actor.actions.clearActions]] + */ + Actor.prototype.clearActions = function () { + this.actionQueue.clearActions(); + }; + /** + * This method will move an actor to the specified `x` and `y` position over the + * specified duration using a given [[EasingFunctions]] and return back the actor. This + * method is part of the actor 'Action' fluent API allowing action chaining. + * @param x The x location to move the actor to + * @param y The y location to move the actor to + * @param duration The time it should take the actor to move to the new location in milliseconds + * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position + * @obsolete Use [[ActionContext.easeTo|Actor.actions.easeTo]] + */ + Actor.prototype.easeTo = function (x, y, duration, easingFcn) { + if (easingFcn === void 0) { easingFcn = ex.EasingFunctions.Linear; } + this.actionQueue.add(new ex.Internal.Actions.EaseTo(this, x, y, duration, easingFcn)); + return this; + }; + /** + * This method will move an actor to the specified `x` and `y` position at the + * `speed` specified (in pixels per second) and return back the actor. This + * method is part of the actor 'Action' fluent API allowing action chaining. + * @param x The x location to move the actor to + * @param y The y location to move the actor to + * @param speed The speed in pixels per second to move + * @obsolete Use [[ActionContext.moveTo|Actor.actions.moveTo]] + */ + Actor.prototype.moveTo = function (x, y, speed) { + this.actionQueue.add(new ex.Internal.Actions.MoveTo(this, x, y, speed)); + return this; + }; + /** + * This method will move an actor to the specified `x` and `y` position by a + * certain `duration` (in milliseconds). This method is part of the actor + * 'Action' fluent API allowing action chaining. + * @param x The x location to move the actor to + * @param y The y location to move the actor to + * @param duration The time it should take the actor to move to the new location in milliseconds + * @obsolete Use [[ActionContext.moveBy|Actor.actions.moveBy]] + */ + Actor.prototype.moveBy = function (x, y, duration) { + this.actionQueue.add(new ex.Internal.Actions.MoveBy(this, x, y, duration)); + return this; + }; + /** + * This method will rotate an actor to the specified angle (in radians) at the `speed` + * specified (in radians per second) and return back the actor. This + * method is part of the actor 'Action' fluent API allowing action chaining. + * @param angleRadians The angle to rotate to in radians + * @param speed The angular velocity of the rotation specified in radians per second + * @obsolete Use [[ActionContext.rotateTo|Actor.actions.rotateTo]] + */ + Actor.prototype.rotateTo = function (angleRadians, speed, rotationType) { + this.actionQueue.add(new ex.Internal.Actions.RotateTo(this, angleRadians, speed, rotationType)); + return this; + }; + /** + * This method will rotate an actor to the specified angle by a certain + * `duration` (in milliseconds) and return back the actor. This method is part + * of the actor 'Action' fluent API allowing action chaining. + * @param angleRadians The angle to rotate to in radians + * @param duration The time it should take the actor to complete the rotation in milliseconds + * @obsolete Use [[ActionContext.rotateBy|ex.Actor.actions.rotateBy]] + */ + Actor.prototype.rotateBy = function (angleRadians, duration, rotationType) { + this.actionQueue.add(new ex.Internal.Actions.RotateBy(this, angleRadians, duration, rotationType)); + return this; + }; + /** + * This method will scale an actor to the specified size at the speed + * specified (in magnitude increase per second) and return back the + * actor. This method is part of the actor 'Action' fluent API allowing + * action chaining. + * @param sizeX The scaling factor in the x direction to apply + * @param sizeY The scaling factor in the y direction to apply + * @param speedX The speed of scaling in the x direction specified in magnitude increase per second + * @param speedY The speed of scaling in the y direction specified in magnitude increase per second + * @obsolete Use [[ActionContext.scaleTo|Actor.actions.scaleTo]] + */ + Actor.prototype.scaleTo = function (sizeX, sizeY, speedX, speedY) { + this.actionQueue.add(new ex.Internal.Actions.ScaleTo(this, sizeX, sizeY, speedX, speedY)); + return this; + }; /** - * Wrap a value in a resolved promise - * @param value An optional value to wrap in a resolved promise + * This method will scale an actor to the specified size by a certain duration + * (in milliseconds) and return back the actor. This method is part of the + * actor 'Action' fluent API allowing action chaining. + * @param sizeX The scaling factor in the x direction to apply + * @param sizeY The scaling factor in the y direction to apply + * @param duration The time it should take to complete the scaling in milliseconds + * @obsolete Use [[ActionContext.scaleBy|Actor.actions.scaleBy]] */ - Promise.wrap = function (value) { - var promise = (new Promise()).resolve(value); - return promise; + Actor.prototype.scaleBy = function (sizeX, sizeY, duration) { + this.actionQueue.add(new ex.Internal.Actions.ScaleBy(this, sizeX, sizeY, duration)); + return this; }; /** - * Returns a new promise that resolves when all the promises passed to it resolve, or rejects - * when at least 1 promise rejects. + * This method will cause an actor to blink (become visible and not + * visible). Optionally, you may specify the number of blinks. Specify the amount of time + * the actor should be visible per blink, and the amount of time not visible. + * This method is part of the actor 'Action' fluent API allowing action chaining. + * @param timeVisible The amount of time to stay visible per blink in milliseconds + * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds + * @param numBlinks The number of times to blink + * @obsolete Use [[ActionContext.blink|Actor.actions.blink]] */ - Promise.join = function () { - var promises = []; - for (var _i = 0; _i < arguments.length; _i++) { - promises[_i - 0] = arguments[_i]; - } - var joinedPromise = new Promise(); - if (!promises || !promises.length) { - return joinedPromise.resolve(); - } - var total = promises.length; - var successes = 0; - var rejects = 0; - var errors = []; - promises.forEach(function (p) { - p.then(function () { - successes += 1; - if (successes === total) { - joinedPromise.resolve(); - } - else if (successes + rejects + errors.length === total) { - joinedPromise.reject(errors); - } - }, function () { - rejects += 1; - if (successes + rejects + errors.length === total) { - joinedPromise.reject(errors); - } - }).error(function (e) { - errors.push(e); - if ((errors.length + successes + rejects) === total) { - joinedPromise.reject(errors); - } - }); - }); - return joinedPromise; + Actor.prototype.blink = function (timeVisible, timeNotVisible, numBlinks) { + if (numBlinks === void 0) { numBlinks = 1; } + this.actionQueue.add(new ex.Internal.Actions.Blink(this, timeVisible, timeNotVisible, numBlinks)); + return this; }; /** - * Chain success and reject callbacks after the promise is resovled - * @param successCallback Call on resolution of promise - * @param rejectCallback Call on rejection of promise + * This method will cause an actor's opacity to change from its current value + * to the provided value by a specified `duration` (in milliseconds). This method is + * part of the actor 'Action' fluent API allowing action chaining. + * @param opacity The ending opacity + * @param duration The time it should take to fade the actor (in milliseconds) + * @obsolete Use [[ActionContext.fade|Actor.actions.fade]] */ - Promise.prototype.then = function (successCallback, rejectCallback) { - if (successCallback) { - this._successCallbacks.push(successCallback); - // If the promise is already resovled call immediately - if (this.state() === PromiseState.Resolved) { - try { - successCallback.call(this, this._value); - } - catch (e) { - this._handleError(e); - } - } - } - if (rejectCallback) { - this._rejectCallback = rejectCallback; - // If the promise is already rejected call immediately - if (this.state() === PromiseState.Rejected) { - try { - rejectCallback.call(this, this._value); - } - catch (e) { - this._handleError(e); - } - } + Actor.prototype.fade = function (opacity, duration) { + this.actionQueue.add(new ex.Internal.Actions.Fade(this, opacity, duration)); + return this; + }; + /** + * This method will delay the next action from executing for the specified + * `duration` (in milliseconds). This method is part of the actor + * 'Action' fluent API allowing action chaining. + * @param duration The amount of time to delay the next action in the queue from executing in milliseconds + * @obsolete Use [[ActionContext.delay|Actor.actions.delay]] + */ + Actor.prototype.delay = function (duration) { + this.actionQueue.add(new ex.Internal.Actions.Delay(this, duration)); + return this; + }; + /** + * This method will add an action to the queue that will remove the actor from the + * scene once it has completed its previous actions. Any actions on the + * action queue after this action will not be executed. + * @obsolete Use [[ActionContext.die|Actor.actions.die]] + */ + Actor.prototype.die = function () { + this.actionQueue.add(new ex.Internal.Actions.Die(this)); + return this; + }; + /** + * This method allows you to call an arbitrary method as the next action in the + * action queue. This is useful if you want to execute code in after a specific + * action, i.e An actor arrives at a destination after traversing a path + * @obsolete Use [[ActionContext.callMethod|Actor.actions.callMethod]] + */ + Actor.prototype.callMethod = function (method) { + this.actionQueue.add(new ex.Internal.Actions.CallMethod(this, method)); + return this; + }; + /** + * This method will cause the actor to repeat all of the previously + * called actions a certain number of times. If the number of repeats + * is not specified it will repeat forever. This method is part of + * the actor 'Action' fluent API allowing action chaining + * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions will + * repeat forever + * @obsolete Use [[ActionContext.repeat|Actor.actions.repeat]] + */ + Actor.prototype.repeat = function (times) { + if (!times) { + this.repeatForever(); + return this; } + this.actionQueue.add(new ex.Internal.Actions.Repeat(this, times, this.actionQueue.getActions())); return this; }; /** - * Add an error callback to the promise - * @param errorCallback Call if there was an error in a callback + * This method will cause the actor to repeat all of the previously + * called actions forever. This method is part of the actor 'Action' + * fluent API allowing action chaining. + * @obsolete Use [[ActionContext.repeatForever|Actor.actions.repeatForever]] */ - Promise.prototype.error = function (errorCallback) { - if (errorCallback) { - this._errorCallback = errorCallback; + Actor.prototype.repeatForever = function () { + this.actionQueue.add(new ex.Internal.Actions.RepeatForever(this, this.actionQueue.getActions())); + return this; + }; + /** + * This method will cause the actor to follow another at a specified distance + * @param actor The actor to follow + * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance. + * @obsolete Use [[ActionContext.follow|Actor.actions.follow]] + */ + Actor.prototype.follow = function (actor, followDistance) { + if (typeof followDistance === 'undefined') { + this.actionQueue.add(new ex.Internal.Actions.Follow(this, actor)); + } + else { + this.actionQueue.add(new ex.Internal.Actions.Follow(this, actor, followDistance)); } return this; }; /** - * Resolve the promise and pass an option value to the success callbacks - * @param value Value to pass to the success callbacks + * This method will cause the actor to move towards another Actor until they + * collide ("meet") at a specified speed. + * @param actor The actor to meet + * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor + * @obsolete Use [[ActionContext.meet|Actor.actions.meet]] */ - Promise.prototype.resolve = function (value) { - var _this = this; - if (this._state === PromiseState.Pending) { - this._value = value; - try { - this._state = PromiseState.Resolved; - this._successCallbacks.forEach(function (cb) { - cb.call(_this, _this._value); - }); - } - catch (e) { - this._handleError(e); - } + Actor.prototype.meet = function (actor, speed) { + if (typeof speed === 'undefined') { + this.actionQueue.add(new ex.Internal.Actions.Meet(this, actor)); } else { - throw new Error('Cannot resolve a promise that is not in a pending state!'); + this.actionQueue.add(new ex.Internal.Actions.Meet(this, actor, speed)); } return this; }; /** - * Reject the promise and pass an option value to the reject callbacks - * @param value Value to pass to the reject callbacks + * Returns a promise that resolves when the current action queue up to now + * is finished. + * @obsolete Use [[ActionContext.asPromise|Actor.actions.asPromise]] */ - Promise.prototype.reject = function (value) { - if (this._state === PromiseState.Pending) { - this._value = value; - try { - this._state = PromiseState.Rejected; - this._rejectCallback.call(this, this._value); + Actor.prototype.asPromise = function () { + var complete = new ex.Promise(); + this.callMethod(function () { + complete.resolve(); + }); + return complete; + }; + Actor.prototype._getCalculatedAnchor = function () { + return new ex.Point(this.getWidth() * this.anchor.x, this.getHeight() * this.anchor.y); + }; + /** + * Called by the Engine, updates the state of the actor + * @param engine The reference to the current game engine + * @param delta The time elapsed since the last update in milliseconds + */ + Actor.prototype.update = function (engine, delta) { + if (!this._isInitialized) { + this.onInitialize(engine); + this.eventDispatcher.emit('initialize', new ex.InitializeEvent(engine)); + this._isInitialized = true; + } + this.emit('preupdate', new ex.PreUpdateEvent(engine, delta, this)); + var eventDispatcher = this.eventDispatcher; + // Update action queue + this.actionQueue.update(delta); + // Update color only opacity + if (this.color) { + this.color.a = this.opacity; + } + // Update actor pipeline (movement, collision detection, event propagation, offscreen culling) + for (var i = 0; i < this.traits.length; i++) { + this.traits[i].update(this, engine, delta); + } + eventDispatcher.emit('update', new ex.UpdateEvent(delta)); + this.emit('postupdate', new ex.PostUpdateEvent(engine, delta, this)); + }; + /** + * Called by the Engine, draws the actor to the screen + * @param ctx The rendering context + * @param delta The time since the last draw in milliseconds + */ + Actor.prototype.draw = function (ctx, delta) { + var anchorPoint = this._getCalculatedAnchor(); + ctx.save(); + ctx.translate(this.x, this.y); + ctx.scale(this.scale.x, this.scale.y); + ctx.rotate(this.rotation); + this.emit('predraw', new ex.PreDrawEvent(ctx, delta, this)); + // calculate changing opacity + if (this.previousOpacity !== this.opacity) { + for (var drawing in this.frames) { + this.frames[drawing].addEffect(new ex.Effects.Opacity(this.opacity)); } - catch (e) { - this._handleError(e); + this.previousOpacity = this.opacity; + } + if (this.currentDrawing) { + var xDiff = 0; + var yDiff = 0; + if (this.centerDrawingX) { + xDiff = (this.currentDrawing.naturalWidth * this.currentDrawing.scale.x - this.getWidth()) / 2 - + this.currentDrawing.naturalWidth * this.currentDrawing.scale.x * this.currentDrawing.anchor.x; } + if (this.centerDrawingY) { + yDiff = (this.currentDrawing.naturalHeight * this.currentDrawing.scale.y - this.getHeight()) / 2 - + this.currentDrawing.naturalHeight * this.currentDrawing.scale.y * this.currentDrawing.anchor.y; + } + this.currentDrawing.draw(ctx, -anchorPoint.x - xDiff, -anchorPoint.y - yDiff); } else { - throw new Error('Cannot reject a promise that is not in a pending state!'); + if (this.color) { + ctx.fillStyle = this.color.toString(); + ctx.fillRect(-anchorPoint.x, -anchorPoint.y, this._width, this._height); + } } - return this; + // Draw child actors + for (var i = 0; i < this.children.length; i++) { + if (this.children[i].visible) { + this.children[i].draw(ctx, delta); + } + } + this.emit('postdraw', new ex.PostDrawEvent(ctx, delta, this)); + ctx.restore(); }; /** - * Inpect the current state of a promise + * Called by the Engine, draws the actors debugging to the screen + * @param ctx The rendering context */ - Promise.prototype.state = function () { - return this._state; - }; - Promise.prototype._handleError = function (e) { - if (this._errorCallback) { - this._errorCallback.call(this, e); + Actor.prototype.debugDraw = function (ctx) { + this.emit('predebugdraw', new ex.PreDebugDrawEvent(ctx, this)); + // Draw actor bounding box + var bb = this.getBounds(); + bb.debugDraw(ctx); + // Draw actor Id + ctx.fillText('id: ' + this.id, bb.left + 3, bb.top + 10); + // Draw actor anchor point + ctx.fillStyle = ex.Color.Yellow.toString(); + ctx.beginPath(); + ctx.arc(this.getWorldX(), this.getWorldY(), 3, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + // Culling Box debug draw + for (var j = 0; j < this.traits.length; j++) { + if (this.traits[j] instanceof ex.Traits.OffscreenCulling) { + this.traits[j].cullingBox.debugDraw(ctx); + } } - else { - // rethrow error - throw e; + // Unit Circle debug draw + ctx.strokeStyle = ex.Color.Yellow.toString(); + ctx.beginPath(); + var radius = Math.min(this.getWidth(), this.getHeight()); + ctx.arc(this.getWorldX(), this.getWorldY(), radius, 0, Math.PI * 2); + ctx.closePath(); + ctx.stroke(); + var ticks = { '0 Pi': 0, + 'Pi/2': Math.PI / 2, + 'Pi': Math.PI, + '3/2 Pi': 3 * Math.PI / 2 }; + var oldFont = ctx.font; + for (var tick in ticks) { + ctx.fillStyle = ex.Color.Yellow.toString(); + ctx.font = '14px'; + ctx.textAlign = 'center'; + ctx.fillText(tick, this.getWorldX() + Math.cos(ticks[tick]) * (radius + 10), this.getWorldY() + Math.sin(ticks[tick]) * (radius + 10)); } + ctx.font = oldFont; + // Draw child actors + ctx.save(); + ctx.translate(this.x, this.y); + ctx.rotate(this.rotation); + // Draw child actors + for (var i = 0; i < this.children.length; i++) { + this.children[i].debugDraw(ctx); + } + ctx.restore(); + this.emit('postdebugdraw', new ex.PostDebugDrawEvent(ctx, this)); }; - return Promise; - })(); - ex.Promise = Promise; -})(ex || (ex = {})); -/// -var ex; -(function (ex) { + /** + * Indicates the next id to be set + */ + Actor.maxId = 0; + return Actor; + })(ex.Class); + ex.Actor = Actor; /** - * Generic Resources - * - * The [[Resource]] type allows games built in Excalibur to load generic resources. - * For any type of remote resource it is recommended to use [[Resource]] for preloading. - * - * [[Resource]] is an [[ILoadable]] so it can be passed to a [[Loader]] to pre-load before - * a level or game. - * - * Example usages: JSON, compressed files, blobs. - * - * ## Pre-loading generic resources - * - * ```js - * var resLevel1 = new ex.Resource("/assets/levels/1.json", "application/json"); - * var loader = new ex.Loader(resLevel1); - * - * // attach a handler to process once loaded - * resLevel1.processDownload = function (data) { - * - * // process JSON - * var json = JSON.parse(data); - * - * // create a new level (inherits Scene) with the JSON configuration - * var level = new Level(json); - * - * // add a new scene - * game.add(level.name, level); - * } - * - * game.start(loader); - * ``` + * An enum that describes the types of collisions actors can participate in */ - var Resource = (function () { + (function (CollisionType) { /** - * @param path Path to the remote resource - * @param responseType The Content-Type to expect (e.g. `application/json`) - * @param bustCache Whether or not to cache-bust requests + * Actors with the `PreventCollision` setting do not participate in any + * collisions and do not raise collision events. */ - function Resource(path, responseType, bustCache) { - if (bustCache === void 0) { bustCache = true; } - this.path = path; - this.responseType = responseType; - this.bustCache = bustCache; - this.data = null; - this.logger = ex.Logger.getInstance(); - this.onprogress = function () { return; }; - this.oncomplete = function () { return; }; - this.onerror = function () { return; }; - } + CollisionType[CollisionType["PreventCollision"] = 0] = "PreventCollision"; /** - * Returns true if the Resource is completely loaded and is ready - * to be drawn. + * Actors with the `Passive` setting only raise collision events, but are not + * influenced or moved by other actors and do not influence or move other actors. */ - Resource.prototype.isLoaded = function () { - return !!this.data; - }; - Resource.prototype.wireEngine = function (engine) { - this._engine = engine; - }; - Resource.prototype._cacheBust = function (uri) { - var query = /\?\w*=\w*/; - if (query.test(uri)) { - uri += ('&__=' + Date.now()); - } - else { - uri += ('?__=' + Date.now()); - } - return uri; - }; - Resource.prototype._start = function (e) { - this.logger.debug('Started loading resource ' + this.path); - }; + CollisionType[CollisionType["Passive"] = 1] = "Passive"; /** - * Begin loading the resource and returns a promise to be resolved on completion + * Actors with the `Active` setting raise collision events and participate + * in collisions with other actors and will be push or moved by actors sharing + * the `Active` or `Fixed` setting. */ - Resource.prototype.load = function () { - var _this = this; - var complete = new ex.Promise(); - var request = new XMLHttpRequest(); - request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true); - request.responseType = this.responseType; - request.onloadstart = function (e) { _this._start(e); }; - request.onprogress = this.onprogress; - request.onerror = this.onerror; - request.onload = function (e) { - if (request.status !== 200) { - _this.logger.error('Failed to load resource ', _this.path, ' server responded with error code', request.status); - _this.onerror(request.response); - complete.resolve(request.response); - return; - } - _this.data = _this.processDownload(request.response); - _this.oncomplete(); - _this.logger.debug('Completed loading resource', _this.path); - complete.resolve(_this.data); - }; - request.send(); - return complete; - }; + CollisionType[CollisionType["Active"] = 2] = "Active"; /** - * Returns the loaded data once the resource is loaded + * Actors with the `Elastic` setting will behave the same as `Active`, except that they will + * "bounce" in the opposite direction given their velocity dx/dy. This is a naive implementation meant for + * prototyping, for a more robust elastic collision listen to the "collision" event and perform your custom logic. + * @obsolete This behavior will be handled by a future physics system */ - Resource.prototype.getData = function () { - return this.data; - }; + CollisionType[CollisionType["Elastic"] = 3] = "Elastic"; /** - * This method is meant to be overriden to handle any additional - * processing. Such as decoding downloaded audio bits. + * Actors with the `Fixed` setting raise collision events and participate in + * collisions with other actors. Actors with the `Fixed` setting will not be + * pushed or moved by other actors sharing the `Fixed`. Think of Fixed + * actors as "immovable/onstoppable" objects. If two `Fixed` actors meet they will + * not be pushed or moved by each other, they will not interact except to throw + * collision events. */ - Resource.prototype.processDownload = function (data) { - // Handle any additional loading after the xhr has completed. - return URL.createObjectURL(data); - }; - return Resource; - })(); - ex.Resource = Resource; + CollisionType[CollisionType["Fixed"] = 4] = "Fixed"; + })(ex.CollisionType || (ex.CollisionType = {})); + var CollisionType = ex.CollisionType; })(ex || (ex = {})); -/// -/// -/// -/// -/// var ex; (function (ex) { /** - * Textures - * - * The [[Texture]] object allows games built in Excalibur to load image resources. - * [[Texture]] is an [[ILoadable]] which means it can be passed to a [[Loader]] - * to pre-load before starting a level or game. - * - * Textures are the raw image so to add a drawing to a game, you must create - * a [[Sprite]]. You can use [[Texture.asSprite]] to quickly generate a Sprite - * instance. - * - * ## Pre-loading textures - * - * Pass the [[Texture]] to a [[Loader]] to pre-load the asset. Once a [[Texture]] - * is loaded, you can generate a [[Sprite]] with it. - * - * ```js - * var txPlayer = new ex.Texture("/assets/tx/player.png"); - * - * var loader = new ex.Loader(txPlayer); - * - * game.start(loader).then(function () { + * Logging level that Excalibur will tag + */ + (function (LogLevel) { + LogLevel[LogLevel["Debug"] = 0] = "Debug"; + LogLevel[LogLevel["Info"] = 1] = "Info"; + LogLevel[LogLevel["Warn"] = 2] = "Warn"; + LogLevel[LogLevel["Error"] = 3] = "Error"; + LogLevel[LogLevel["Fatal"] = 4] = "Fatal"; + })(ex.LogLevel || (ex.LogLevel = {})); + var LogLevel = ex.LogLevel; + /** + * Static singleton that represents the logging facility for Excalibur. + * Excalibur comes built-in with a [[ConsoleAppender]] and [[ScreenAppender]]. + * Derive from [[IAppender]] to create your own logging appenders. * - * var player = new ex.Actor(); + * ## Example: Logging * - * player.addDrawing(txPlayer); + * ```js + * // set default log level (default: Info) + * ex.Logger.getInstance().defaultLevel = ex.LogLevel.Warn; * - * game.add(player); - * }); + * // this will not be shown because it is below Warn + * ex.Logger.getInstance().info("This will be logged as Info"); + * // this will show because it is Warn + * ex.Logger.getInstance().warn("This will be logged as Warn"); + * // this will show because it is above Warn + * ex.Logger.getInstance().error("This will be logged as Error"); + * // this will show because it is above Warn + * ex.Logger.getInstance().fatal("This will be logged as Fatal"); * ``` */ - var Texture = (function (_super) { - __extends(Texture, _super); - /** - * @param path Path to the image resource - * @param bustCache Optionally load texture with cache busting - */ - function Texture(path, bustCache) { - if (bustCache === void 0) { bustCache = true; } - _super.call(this, path, 'blob', bustCache); - this.path = path; - this.bustCache = bustCache; + var Logger = (function () { + function Logger() { + this._appenders = []; /** - * A [[Promise]] that resolves when the Texture is loaded. + * Gets or sets the default logging level. Excalibur will only log + * messages if equal to or above this level. Default: [[LogLevel.Info]] */ - this.loaded = new ex.Promise(); - this._isLoaded = false; - this._sprite = null; - this._sprite = new ex.Sprite(this, 0, 0, 0, 0); + this.defaultLevel = LogLevel.Info; + if (Logger._instance) { + throw new Error('Logger is a singleton'); + } + Logger._instance = this; + // Default console appender + Logger._instance.addAppender(new ConsoleAppender()); + return Logger._instance; } /** - * Returns true if the Texture is completely loaded and is ready - * to be drawn. + * Gets the current static instance of Logger */ - Texture.prototype.isLoaded = function () { - return this._isLoaded; + Logger.getInstance = function () { + if (Logger._instance == null) { + Logger._instance = new Logger(); + } + return Logger._instance; }; /** - * Begins loading the texture and returns a promise to be resolved on completion + * Adds a new [[IAppender]] to the list of appenders to write to */ - Texture.prototype.load = function () { - var _this = this; - var complete = new ex.Promise(); - var loaded = _super.prototype.load.call(this); - loaded.then(function () { - _this.image = new Image(); - _this.image.addEventListener('load', function () { - _this._isLoaded = true; - _this.width = _this._sprite.swidth = _this._sprite.naturalWidth = _this._sprite.width = _this.image.naturalWidth; - _this.height = _this._sprite.sheight = _this._sprite.naturalHeight = _this._sprite.height = _this.image.naturalHeight; - _this.loaded.resolve(_this.image); - complete.resolve(_this.image); - }); - _this.image.src = _super.prototype.getData.call(_this); - }, function () { - complete.reject('Error loading texture.'); - }); - return complete; + Logger.prototype.addAppender = function (appender) { + this._appenders.push(appender); }; - Texture.prototype.asSprite = function () { - return this._sprite; + /** + * Clears all appenders from the logger + */ + Logger.prototype.clearAppenders = function () { + this._appenders.length = 0; }; - return Texture; - })(ex.Resource); - ex.Texture = Texture; - /** - * Sounds - * - * The [[Sound]] object allows games built in Excalibur to load audio - * components, from soundtracks to sound effects. [[Sound]] is an [[ILoadable]] - * which means it can be passed to a [[Loader]] to pre-load before a game or level. - * - * ## Pre-loading sounds - * - * Pass the [[Sound]] to a [[Loader]] to pre-load the asset. Once a [[Sound]] - * is loaded, you can [[Sound.play|play]] it. - * - * ```js - * var sndPlayerDeath = new ex.Sound("/assets/snd/player-death.mp3", "/assets/snd/player-wav.mp3"); - * - * var loader = new ex.Loader(sndPlayerDeath); - * - * game.start(loader).then(function () { - * - * sndPlayerDeath.play(); - * }); - * ``` - */ - var Sound = (function () { /** - * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility. + * Logs a message at a given LogLevel + * @param level The LogLevel`to log the message at + * @param args An array of arguments to write to an appender */ - function Sound() { - var paths = []; - for (var _i = 0; _i < arguments.length; _i++) { - paths[_i - 0] = arguments[_i]; + Logger.prototype._log = function (level, args) { + if (level == null) { + level = this.defaultLevel; } - this._logger = ex.Logger.getInstance(); - this.onprogress = function () { return; }; - this.oncomplete = function () { return; }; - this.onerror = function () { return; }; - this.onload = function () { return; }; - this._isLoaded = false; - this._selectedFile = ''; - this._wasPlayingOnHidden = false; - /* Chrome : MP3, WAV, Ogg - * Firefox : WAV, Ogg, - * IE : MP3, WAV coming soon - * Safari MP3, WAV, Ogg - */ - this._selectedFile = ''; - for (var i = 0; i < paths.length; i++) { - if (Sound.canPlayFile(paths[i])) { - this._selectedFile = paths[i]; - break; + var i = 0, len = this._appenders.length; + for (i; i < len; i++) { + if (level >= this.defaultLevel) { + this._appenders[i].log(level, args); } } - if (!this._selectedFile) { - this._logger.warn('This browser does not support any of the audio files specified:', paths.join(', ')); - this._logger.warn('Attempting to use', paths[0]); - this._selectedFile = paths[0]; // select the first specified + }; + /** + * Writes a log message at the [[LogLevel.Debug]] level + * @param args Accepts any number of arguments + */ + Logger.prototype.debug = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; } - this.sound = new ex.Internal.FallbackAudio(this._selectedFile, 1.0); + this._log(LogLevel.Debug, args); + }; + /** + * Writes a log message at the [[LogLevel.Info]] level + * @param args Accepts any number of arguments + */ + Logger.prototype.info = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + this._log(LogLevel.Info, args); + }; + /** + * Writes a log message at the [[LogLevel.Warn]] level + * @param args Accepts any number of arguments + */ + Logger.prototype.warn = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + this._log(LogLevel.Warn, args); + }; + /** + * Writes a log message at the [[LogLevel.Error]] level + * @param args Accepts any number of arguments + */ + Logger.prototype.error = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + this._log(LogLevel.Error, args); + }; + /** + * Writes a log message at the [[LogLevel.Fatal]] level + * @param args Accepts any number of arguments + */ + Logger.prototype.fatal = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + this._log(LogLevel.Fatal, args); + }; + Logger._instance = null; + return Logger; + })(); + ex.Logger = Logger; + /** + * Console appender for browsers (i.e. `console.log`) + */ + var ConsoleAppender = (function () { + function ConsoleAppender() { } /** - * Whether or not the browser can play this file as HTML5 Audio + * Logs a message at the given [[LogLevel]] + * @param level Level to log at + * @param args Arguments to log */ - Sound.canPlayFile = function (file) { - try { - var a = new Audio(); - var filetype = /.*\.([A-Za-z0-9]+)$/; - var type = file.match(filetype)[1]; - if (a.canPlayType('audio/' + type)) { - return true; + ConsoleAppender.prototype.log = function (level, args) { + // Check for console support + if (!console && !console.log && console.warn && console.error) { + // todo maybe do something better than nothing + return; + } + // Create a new console args array + var consoleArgs = []; + consoleArgs.unshift.apply(consoleArgs, args); + consoleArgs.unshift('[' + LogLevel[level] + '] : '); + if (level < LogLevel.Warn) { + // Call .log for Debug/Info + if (console.log.apply) { + // this is required on some older browsers that don't support apply on console.log :( + console.log.apply(console, consoleArgs); + } + else { + console.log(consoleArgs.join(' ')); + } + } + else if (level < LogLevel.Error) { + // Call .warn for Warn + if (console.warn.apply) { + console.warn.apply(console, consoleArgs); + } + else { + console.warn(consoleArgs.join(' ')); + } + } + else { + // Call .error for Error/Fatal + if (console.error.apply) { + console.error.apply(console, consoleArgs); } - { - return false; + else { + console.error(consoleArgs.join(' ')); } } - catch (e) { - ex.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e); - return false; - } - }; - Sound.prototype.wireEngine = function (engine) { - var _this = this; - if (engine) { - this._engine = engine; - this._engine.on('hidden', function () { - if (engine.pauseAudioWhenHidden && _this.isPlaying()) { - _this._wasPlayingOnHidden = true; - _this.pause(); - } - }); - this._engine.on('visible', function () { - if (engine.pauseAudioWhenHidden && _this._wasPlayingOnHidden) { - _this.play(); - _this._wasPlayingOnHidden = false; - } - }); - } }; + return ConsoleAppender; + })(); + ex.ConsoleAppender = ConsoleAppender; + /** + * On-screen (canvas) appender + */ + var ScreenAppender = (function () { /** - * Sets the volume of the sound clip - * @param volume A volume value between 0-1.0 + * @param width Width of the screen appender in pixels + * @param height Height of the screen appender in pixels */ - Sound.prototype.setVolume = function (volume) { - if (this.sound) { - this.sound.setVolume(volume); - } - }; + function ScreenAppender(width, height) { + // @todo Clean this up + this._messages = []; + this._canvas = document.createElement('canvas'); + this._canvas.width = width || window.innerWidth; + this._canvas.height = height || window.innerHeight; + this._canvas.style.position = 'absolute'; + this._ctx = this._canvas.getContext('2d'); + document.body.appendChild(this._canvas); + } /** - * Indicates whether the clip should loop when complete - * @param loop Set the looping flag + * Logs a message at the given [[LogLevel]] + * @param level Level to log at + * @param args Arguments to log */ - Sound.prototype.setLoop = function (loop) { - if (this.sound) { - this.sound.setLoop(loop); + ScreenAppender.prototype.log = function (level, args) { + var message = args.join(','); + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + this._messages.unshift('[' + LogLevel[level] + '] : ' + message); + var pos = 10; + var opacity = 1.0; + for (var i = 0; i < this._messages.length; i++) { + this._ctx.fillStyle = 'rgba(255,255,255,' + opacity.toFixed(2) + ')'; + this._ctx.fillText(this._messages[i], 200, pos); + pos += 10; + opacity = opacity > 0 ? opacity - .05 : 0; } }; + return ScreenAppender; + })(); + ex.ScreenAppender = ScreenAppender; +})(ex || (ex = {})); +/// +/// +/// +var ex; +(function (ex) { + /** + * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects, + * some events are unique to a type, others are not. + * + * Excalibur events follow the convention that the name of the thrown event for listening will be the same as the Event object in all + * lower case with the 'Event' suffix removed. + * + * For example: + * - PreDrawEvent event object and "predraw" as the event name + * + * ```typescript + * + * actor.on('predraw', (evtObj: PreDrawEvent) => { + * // do some pre drawing + * }) + * + * ``` + * + */ + var GameEvent = (function () { + function GameEvent() { + } + return GameEvent; + })(); + ex.GameEvent = GameEvent; + /** + * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics + * transform so that all drawing takes place with the actor as the origin. + * + */ + var PreDrawEvent = (function (_super) { + __extends(PreDrawEvent, _super); + function PreDrawEvent(ctx, delta, target) { + _super.call(this); + this.ctx = ctx; + this.delta = delta; + this.target = target; + } + return PreDrawEvent; + })(GameEvent); + ex.PreDrawEvent = PreDrawEvent; + /** + * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics + * transform so that all drawing takes place with the actor as the origin. + * + */ + var PostDrawEvent = (function (_super) { + __extends(PostDrawEvent, _super); + function PostDrawEvent(ctx, delta, target) { + _super.call(this); + this.ctx = ctx; + this.delta = delta; + this.target = target; + } + return PostDrawEvent; + })(GameEvent); + ex.PostDrawEvent = PostDrawEvent; + /** + * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts. + */ + var PreDebugDrawEvent = (function (_super) { + __extends(PreDebugDrawEvent, _super); + function PreDebugDrawEvent(ctx, target) { + _super.call(this); + this.ctx = ctx; + this.target = target; + } + return PreDebugDrawEvent; + })(GameEvent); + ex.PreDebugDrawEvent = PreDebugDrawEvent; + /** + * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts. + */ + var PostDebugDrawEvent = (function (_super) { + __extends(PostDebugDrawEvent, _super); + function PostDebugDrawEvent(ctx, target) { + _super.call(this); + this.ctx = ctx; + this.target = target; + } + return PostDebugDrawEvent; + })(GameEvent); + ex.PostDebugDrawEvent = PostDebugDrawEvent; + /** + * The 'preupdate' event is emitted on actors, scenes, and engine before the update starts. + */ + var PreUpdateEvent = (function (_super) { + __extends(PreUpdateEvent, _super); + function PreUpdateEvent(engine, delta, target) { + _super.call(this); + this.engine = engine; + this.delta = delta; + this.target = target; + } + return PreUpdateEvent; + })(GameEvent); + ex.PreUpdateEvent = PreUpdateEvent; + /** + * The 'postupdate' event is emitted on actors, scenes, and engine after the update ends. This is equivalent to the obsolete 'update' + * event. + */ + var PostUpdateEvent = (function (_super) { + __extends(PostUpdateEvent, _super); + function PostUpdateEvent(engine, delta, target) { + _super.call(this); + this.engine = engine; + this.delta = delta; + this.target = target; + } + return PostUpdateEvent; + })(GameEvent); + ex.PostUpdateEvent = PostUpdateEvent; + /** + * Event received when a gamepad is connected to Excalibur. [[Input.Gamepads|engine.input.gamepads]] receives this event. + */ + var GamepadConnectEvent = (function (_super) { + __extends(GamepadConnectEvent, _super); + function GamepadConnectEvent(index, gamepad) { + _super.call(this); + this.index = index; + this.gamepad = gamepad; + } + return GamepadConnectEvent; + })(GameEvent); + ex.GamepadConnectEvent = GamepadConnectEvent; + /** + * Event received when a gamepad is disconnected from Excalibur. [[Input.Gamepads|engine.input.gamepads]] receives this event. + */ + var GamepadDisconnectEvent = (function (_super) { + __extends(GamepadDisconnectEvent, _super); + function GamepadDisconnectEvent(index) { + _super.call(this); + this.index = index; + } + return GamepadDisconnectEvent; + })(GameEvent); + ex.GamepadDisconnectEvent = GamepadDisconnectEvent; + /** + * Gamepad button event. See [[Gamepads]] for information on responding to controller input. [[Gamepad]] instances receive this event; + */ + var GamepadButtonEvent = (function (_super) { + __extends(GamepadButtonEvent, _super); /** - * Whether or not the sound is playing right now + * @param button The Gamepad button + * @param value A numeric value between 0 and 1 */ - Sound.prototype.isPlaying = function () { - if (this.sound) { - return this.sound.isPlaying(); - } - }; + function GamepadButtonEvent(button, value) { + _super.call(this); + this.button = button; + this.value = value; + } + return GamepadButtonEvent; + })(ex.GameEvent); + ex.GamepadButtonEvent = GamepadButtonEvent; + /** + * Gamepad axis event. See [[Gamepads]] for information on responding to controller input. [[Gamepad]] instances receive this event; + */ + var GamepadAxisEvent = (function (_super) { + __extends(GamepadAxisEvent, _super); /** - * Play the sound, returns a promise that resolves when the sound is done playing + * @param axis The Gamepad axis + * @param value A numeric value between -1 and 1 */ - Sound.prototype.play = function () { - if (this.sound) { - return this.sound.play(); - } - }; + function GamepadAxisEvent(axis, value) { + _super.call(this); + this.axis = axis; + this.value = value; + } + return GamepadAxisEvent; + })(ex.GameEvent); + ex.GamepadAxisEvent = GamepadAxisEvent; + /** + * Subscribe event thrown when handlers for events other than subscribe are added. Meta event that is received by + * [[EventDispatcher|event dispatchers]]. + */ + var SubscribeEvent = (function (_super) { + __extends(SubscribeEvent, _super); + function SubscribeEvent(topic, handler) { + _super.call(this); + this.topic = topic; + this.handler = handler; + } + return SubscribeEvent; + })(GameEvent); + ex.SubscribeEvent = SubscribeEvent; + /** + * Unsubscribe event thrown when handlers for events other than unsubscribe are removed. Meta event that is received by + * [[EventDispatcher|event dispatchers]]. + */ + var UnsubscribeEvent = (function (_super) { + __extends(UnsubscribeEvent, _super); + function UnsubscribeEvent(topic, handler) { + _super.call(this); + this.topic = topic; + this.handler = handler; + } + return UnsubscribeEvent; + })(GameEvent); + ex.UnsubscribeEvent = UnsubscribeEvent; + /** + * Event received by the [[Engine]] when the browser window is visible on a screen. + */ + var VisibleEvent = (function (_super) { + __extends(VisibleEvent, _super); + function VisibleEvent() { + _super.call(this); + } + return VisibleEvent; + })(GameEvent); + ex.VisibleEvent = VisibleEvent; + /** + * Event received by the [[Engine]] when the browser window is hidden from all screens. + */ + var HiddenEvent = (function (_super) { + __extends(HiddenEvent, _super); + function HiddenEvent() { + _super.call(this); + } + return HiddenEvent; + })(GameEvent); + ex.HiddenEvent = HiddenEvent; + /** + * Event thrown on an [[Actor|actor]] when a collision has occured + */ + var CollisionEvent = (function (_super) { + __extends(CollisionEvent, _super); /** - * Stop the sound, and do not rewind + * @param actor The actor the event was thrown on + * @param other The actor that was collided with + * @param side The side that was collided with */ - Sound.prototype.pause = function () { - if (this.sound) { - this.sound.pause(); - } - }; + function CollisionEvent(actor, other, side, intersection) { + _super.call(this); + this.actor = actor; + this.other = other; + this.side = side; + this.intersection = intersection; + } + return CollisionEvent; + })(GameEvent); + ex.CollisionEvent = CollisionEvent; + /** + * Event thrown on a game object on Excalibur update, this is equivalent to postupdate. + * @obsolete Please use [[PostUpdateEvent|postupdate]], or [[PreUpdateEvent|preupdate]]. + */ + var UpdateEvent = (function (_super) { + __extends(UpdateEvent, _super); /** - * Stop the sound and rewind + * @param delta The number of milliseconds since the last update */ - Sound.prototype.stop = function () { - if (this.sound) { - this.sound.stop(); - } - }; + function UpdateEvent(delta) { + _super.call(this); + this.delta = delta; + } + return UpdateEvent; + })(GameEvent); + ex.UpdateEvent = UpdateEvent; + /** + * Event thrown on an [[Actor]] only once before the first update call + */ + var InitializeEvent = (function (_super) { + __extends(InitializeEvent, _super); /** - * Returns true if the sound is loaded + * @param engine The reference to the current engine */ - Sound.prototype.isLoaded = function () { - return this._isLoaded; - }; + function InitializeEvent(engine) { + _super.call(this); + this.engine = engine; + } + return InitializeEvent; + })(GameEvent); + ex.InitializeEvent = InitializeEvent; + /** + * Event thrown on a [[Scene]] on activation + */ + var ActivateEvent = (function (_super) { + __extends(ActivateEvent, _super); /** - * Begins loading the sound and returns a promise to be resolved on completion + * @param oldScene The reference to the old scene */ - Sound.prototype.load = function () { - var _this = this; - var complete = new ex.Promise(); - this._logger.debug('Started loading sound', this._selectedFile); - this.sound.onprogress = this.onprogress; - this.sound.onload = function () { - _this.oncomplete(); - _this._isLoaded = true; - _this._logger.debug('Completed loading sound', _this._selectedFile); - complete.resolve(_this.sound); - }; - this.sound.onerror = function (e) { - _this.onerror(e); - complete.resolve(e); - }; - this.sound.load(); - return complete; - }; - return Sound; - })(); - ex.Sound = Sound; + function ActivateEvent(oldScene) { + _super.call(this); + this.oldScene = oldScene; + } + return ActivateEvent; + })(GameEvent); + ex.ActivateEvent = ActivateEvent; /** - * Pre-loading assets + * Event thrown on a [[Scene]] on deactivation + */ + var DeactivateEvent = (function (_super) { + __extends(DeactivateEvent, _super); + /** + * @param newScene The reference to the new scene + */ + function DeactivateEvent(newScene) { + _super.call(this); + this.newScene = newScene; + } + return DeactivateEvent; + })(GameEvent); + ex.DeactivateEvent = DeactivateEvent; + /** + * Event thrown on an [[Actor]] when it completely leaves the screen. + */ + var ExitViewPortEvent = (function (_super) { + __extends(ExitViewPortEvent, _super); + function ExitViewPortEvent() { + _super.call(this); + } + return ExitViewPortEvent; + })(GameEvent); + ex.ExitViewPortEvent = ExitViewPortEvent; + /** + * Event thrown on an [[Actor]] when it completely leaves the screen. + */ + var EnterViewPortEvent = (function (_super) { + __extends(EnterViewPortEvent, _super); + function EnterViewPortEvent() { + _super.call(this); + } + return EnterViewPortEvent; + })(GameEvent); + ex.EnterViewPortEvent = EnterViewPortEvent; +})(ex || (ex = {})); +/// +var ex; +(function (ex) { + /** + * Excalibur's internal event dispatcher implementation. + * Callbacks are fired immediately after an event is published. + * Typically you will use [[Class.eventDispatcher]] since most classes in + * Excalibur inherit from [[Class]]. You will rarely create an `EventDispatcher` + * yourself. * - * The loader provides a mechanism to preload multiple resources at - * one time. The loader must be passed to the engine in order to - * trigger the loading progress bar. + * When working with events, be sure to keep in mind the order of subscriptions + * and try not to create a situation that requires specific things to happen in + * order. Events are best used for input events, tying together disparate objects, + * or for UI updates. * - * The [[Loader]] itself implements [[ILoadable]] so you can load loaders. + * ## Example: Actor events * - * ## Example: Pre-loading resources for a game + * Actors implement an EventDispatcher ([[Actor.eventDispatcher]]) so they can + * send and receive events. For example, they can enable Pointer events (mouse/touch) + * and you can respond to them by subscribing to the event names. + * + * You can also emit any other kind of event for your game just by using a custom + * `string` value and implementing a class that inherits from [[GameEvent]]. * * ```js - * // create a loader - * var loader = new ex.Loader(); + * var player = new ex.Actor(...); * - * // create a resource dictionary (best practice is to keep a separate file) - * var resources = { - * TextureGround: new ex.Texture("/images/textures/ground.png"), - * SoundDeath: new ex.Sound("/sound/death.wav", "/sound/death.mp3") - * }; + * // Enable pointer events for this actor + * player.enableCapturePointer = true; * - * // loop through dictionary and add to loader - * for (var loadable in resources) { - * if (resources.hasOwnProperty(loadable)) { - * loader.addResource(loadable); - * } - * } + * // subscribe to pointerdown event + * player.on("pointerdown", function (evt: ex.Input.PointerEvent) { + * console.log("Player was clicked!"); + * }); * - * // start game - * game.start(loader).then(function () { - * console.log("Game started!"); + * // turn off subscription + * player.off("pointerdown"); + * + * // subscribe to custom event + * player.on("death", function (evt) { + * console.log("Player died:", evt); * }); + * + * // trigger custom event + * player.emit("death", new DeathEvent()); + * + * ``` + * + * ## Example: Pub/Sub with Excalibur + * + * You can also create an EventDispatcher for any arbitrary object, for example + * a global game event aggregator (shown below as `vent`). Anything in your game can subscribe to + * it, if the event aggregator is in the global scope. + * + * *Warning:* This can easily get out of hand. Avoid this usage, it just serves as + * an example. + * + * ```js + * // create a publisher on an empty object + * var vent = new ex.EventDispatcher({}); + * + * // handler for an event + * var subscription = function (event) { + * console.log(event); + * } + * + * // add a subscription + * vent.subscribe("someevent", subscription); + * + * // publish an event somewhere in the game + * vent.emit("someevent", new ex.GameEvent()); * ``` */ - var Loader = (function () { + var EventDispatcher = (function () { /** - * @param loadables Optionally provide the list of resources you want to load at constructor time + * @param target The object that will be the recipient of events from this event dispatcher */ - function Loader(loadables) { - this._resourceList = []; - this._index = 0; - this._resourceCount = 0; - this._numLoaded = 0; - this._progressCounts = {}; - this._totalCounts = {}; - this.onprogress = function () { return; }; - this.oncomplete = function () { return; }; - this.onerror = function () { return; }; - if (loadables) { - this.addResources(loadables); - } + function EventDispatcher(target) { + this._handlers = {}; + this._wiredEventDispatchers = []; + this._log = ex.Logger.getInstance(); + this._target = target; } - Loader.prototype.wireEngine = function (engine) { - this._engine = engine; + /** + * Publish an event for target + * @param eventName The name of the event to publish + * @param event Optionally pass an event data object to the handler + * + * @obsolete Use [[emit]] instead. + */ + EventDispatcher.prototype.publish = function (eventName, event) { + if (!eventName) { + // key not mapped + return; + } + eventName = eventName.toLowerCase(); + var target = this._target; + if (!event) { + event = new ex.GameEvent(); + } + event.target = target; + var i, len; + if (this._handlers[eventName]) { + i = 0; + len = this._handlers[eventName].length; + for (i; i < len; i++) { + this._handlers[eventName][i].call(target, event); + } + } + i = 0; + len = this._wiredEventDispatchers.length; + for (i; i < len; i++) { + this._wiredEventDispatchers[i].emit(eventName, event); + } }; /** - * Add a resource to the loader to load - * @param loadable Resource to add + * Alias for [[publish]], publishes an event for target + * @param eventName The name of the event to publish + * @param event Optionally pass an event data object to the handler */ - Loader.prototype.addResource = function (loadable) { - var key = this._index++; - this._resourceList.push(loadable); - this._progressCounts[key] = 0; - this._totalCounts[key] = 1; - this._resourceCount++; + EventDispatcher.prototype.emit = function (eventName, event) { + this.publish(eventName, event); }; /** - * Add a list of resources to the loader to load - * @param loadables The list of resources to load + * Subscribe an event handler to a particular event name, multiple handlers per event name are allowed. + * @param eventName The name of the event to subscribe to + * @param handler The handler callback to fire on this event */ - Loader.prototype.addResources = function (loadables) { - var i = 0, len = loadables.length; - for (i; i < len; i++) { - this.addResource(loadables[i]); + EventDispatcher.prototype.subscribe = function (eventName, handler) { + eventName = eventName.toLowerCase(); + if (!this._handlers[eventName]) { + this._handlers[eventName] = []; + } + this._handlers[eventName].push(handler); + // meta event handlers + if (eventName !== 'unsubscribe' && eventName !== 'subscribe') { + this.emit('subscribe', new ex.SubscribeEvent(eventName, handler)); + } + }; + /** + * Unsubscribe an event handler(s) from an event. If a specific handler + * is specified for an event, only that handler will be unsubscribed. + * Otherwise all handlers will be unsubscribed for that event. + * + * @param eventName The name of the event to unsubscribe + * @param handler Optionally the specific handler to unsubscribe + * + */ + EventDispatcher.prototype.unsubscribe = function (eventName, handler) { + eventName = eventName.toLowerCase(); + var eventHandlers = this._handlers[eventName]; + if (eventHandlers) { + // if no explicit handler is give with the event name clear all handlers + if (!handler) { + this._handlers[eventName].length = 0; + } + else { + var index = eventHandlers.indexOf(handler); + this._handlers[eventName].splice(index, 1); + } } - }; - Loader.prototype._sumCounts = function (obj) { - var sum = 0; - var prev = 0; - for (var i in obj) { - sum += obj[i] | 0; + // meta event handlers + if (eventName !== 'unsubscribe' && eventName !== 'subscribe') { + this.emit('unsubscribe', new ex.UnsubscribeEvent(eventName, handler)); } - return sum; }; /** - * Returns true if the loader has completely loaded all resources + * Wires this event dispatcher to also recieve events from another */ - Loader.prototype.isLoaded = function () { - return this._numLoaded === this._resourceCount; + EventDispatcher.prototype.wire = function (eventDispatcher) { + eventDispatcher._wiredEventDispatchers.push(this); }; /** - * Begin loading all of the supplied resources, returning a promise - * that resolves when loading of all is complete + * Unwires this event dispatcher from another */ - Loader.prototype.load = function () { - var _this = this; - var complete = new ex.Promise(); - var me = this; - if (this._resourceList.length === 0) { - me.oncomplete.call(me); - return complete; - } - var progressArray = new Array(this._resourceList.length); - var progressChunks = this._resourceList.length; - this._resourceList.forEach(function (r, i) { - if (_this._engine) { - r.wireEngine(_this._engine); - } - r.onprogress = function (e) { - var total = e.total; - var loaded = e.loaded; - progressArray[i] = { loaded: ((loaded / total) * (100 / progressChunks)), total: 100 }; - var progressResult = progressArray.reduce(function (accum, next) { - return { loaded: (accum.loaded + next.loaded), total: 100 }; - }, { loaded: 0, total: 100 }); - me.onprogress.call(me, progressResult); - }; - r.oncomplete = r.onerror = function () { - me._numLoaded++; - if (me._numLoaded === me._resourceCount) { - me.onprogress.call(me, { loaded: 100, total: 100 }); - me.oncomplete.call(me); - complete.resolve(); - } - }; - }); - function loadNext(list, index) { - if (!list[index]) { - return; - } - list[index].load().then(function () { - loadNext(list, index + 1); - }); + EventDispatcher.prototype.unwire = function (eventDispatcher) { + var index = eventDispatcher._wiredEventDispatchers.indexOf(this); + if (index > -1) { + eventDispatcher._wiredEventDispatchers.splice(index, 1); } - loadNext(this._resourceList, 0); - return complete; }; - return Loader; + return EventDispatcher; })(); - ex.Loader = Loader; + ex.EventDispatcher = EventDispatcher; })(ex || (ex = {})); -/// var ex; (function (ex) { - var Detector = (function () { - function Detector() { - this.failedTests = []; - // critical browser features required for ex to run - this._criticalTests = { - // Test canvas/2d context support - canvasSupport: function () { - var elem = document.createElement('canvas'); - return !!(elem.getContext && elem.getContext('2d')); - }, - // Test array buffer support ex uses for downloading binary data - arrayBufferSupport: function () { - var xhr = new XMLHttpRequest(); - xhr.open('GET', '/'); - try { - xhr.responseType = 'arraybuffer'; - } - catch (e) { - return false; - } - return xhr.responseType === 'arraybuffer'; - }, - // Test data urls ex uses for sprites - dataUrlSupport: function () { - var canvas = document.createElement('canvas'); - return canvas.toDataURL('image/png').indexOf('data:image/png') === 0; - }, - // Test object url support for loading - objectUrlSupport: function () { - return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL; - }, - // RGBA support for colors - rgbaSupport: function () { - var style = document.createElement('a').style; - style.cssText = 'background-color:rgba(150,255,150,.5)'; - return ('' + style.backgroundColor).indexOf('rgba') > -1; - } - }; - // warnings excalibur performance will be degraded - this._warningTest = { - webAudioSupport: function () { - return !!(window.AudioContext || - window.webkitAudioContext || - window.mozAudioContext || - window.msAudioContext || - window.oAudioContext); - }, - webglSupport: function () { - var elem = document.createElement('canvas'); - return !!(elem.getContext && elem.getContext('webgl')); - } - }; + /** + * Provides standard colors (e.g. [[Color.Black]]) + * but you can also create custom colors using RGB, HSL, or Hex. Also provides + * useful color operations like [[Color.lighten]], [[Color.darken]], and more. + * + * ## Creating colors + * + * ```js + * // RGBA + * new ex.Color(r, g, b, a); + * ex.Color.fromRGB(r, g, b, a); + * + * // HSLA + * ex.Color.fromHSL(h, s, l, a); + * + * // Hex, alpha optional + * ex.Color.fromHex("#000000"); + * ex.Color.fromHex("#000000FF"); + * ``` + * + * ## Working with colors + * + * Since Javascript does not support structs, if you change a color "constant" like [[Color.Black]] + * it will change it across the entire game. You can safely use the color operations + * like [[Color.lighten]] and [[Color.darken]] because they `clone` the color to + * return a new color. However, be aware that this can use up memory if used excessively. + * + * Just be aware that if you directly alter properties (i.e. [[Color.r]], etc.) , this will change it + * for all the code that uses that instance of Color. + */ + var Color = (function () { + /** + * Creates a new instance of Color from an r, g, b, a + * + * @param r The red component of color (0-255) + * @param g The green component of color (0-255) + * @param b The blue component of color (0-255) + * @param a The alpha component of color (0-1.0) + */ + function Color(r, g, b, a) { + this.r = r; + this.g = g; + this.b = b; + this.a = (a != null ? a : 1); } - Detector.prototype.test = function () { - // Critical test will for ex not to run - var failedCritical = false; - for (var test in this._criticalTests) { - if (!this._criticalTests[test]()) { - this.failedTests.push(test); - ex.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test); - failedCritical = true; + /** + * Creates a new instance of Color from an r, g, b, a + * + * @param r The red component of color (0-255) + * @param g The green component of color (0-255) + * @param b The blue component of color (0-255) + * @param a The alpha component of color (0-1.0) + */ + Color.fromRGB = function (r, g, b, a) { + return new Color(r, g, b, a); + }; + /** + * Creates a new inscance of Color from a hex string + * + * @param hex CSS color string of the form #ffffff, the alpha component is optional + */ + Color.fromHex = function (hex) { + var hexRegEx = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i; + var match = null; + if (match = hex.match(hexRegEx)) { + var r = parseInt(match[1], 16); + var g = parseInt(match[2], 16); + var b = parseInt(match[3], 16); + var a = 1; + if (match[4]) { + a = parseInt(match[4], 16) / 255; } + return new Color(r, g, b, a); } - if (failedCritical) { - return false; - } - // Warning tests do not for ex to return false to compatibility - for (var warning in this._warningTest) { - if (!this._warningTest[warning]()) { - ex.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning); - } + else { + throw new Error('Invalid hex string: ' + hex); } - return true; }; - return Detector; - })(); - ex.Detector = Detector; -})(ex || (ex = {})); -/// -/// -/// -var ex; -(function (ex) { - /** - * Excalibur's built in templating class, it is a loadable that will load - * and html fragment from a url. Excalibur templating is very basic only - * allowing bindings of the type `data-text="this.obj.someprop"`, - * `data-style="color:this.obj.color.toString()"`. Bindings allow all valid - * Javascript expressions. - */ - var Template = (function () { /** - * @param path Location of the html template + * Creats a new instance of Color from hsla values + * + * @param h Hue is represented [0-1] + * @param s Saturation is represented [0-1] + * @param l Luminance is represented [0-1] + * @param a Alpha is represented [0-1] + */ + Color.fromHSL = function (h, s, l, a) { + if (a === void 0) { a = 1.0; } + var temp = new HSLColor(h, s, l, a); + return temp.toRGBA(); + }; + /** + * Lightens the current color by a specified amount + * + * @param factor The amount to lighten by [0-1] */ - function Template(path) { - this.path = path; - this._isLoaded = false; - this.logger = ex.Logger.getInstance(); - this.onprogress = function () { return; }; - this.oncomplete = function () { return; }; - this.onerror = function () { return; }; - this._innerElement = document.createElement('div'); - this._innerElement.className = 'excalibur-template'; - } - Template.prototype.wireEngine = function (engine) { - this._engine = engine; + Color.prototype.lighten = function (factor) { + if (factor === void 0) { factor = 0.1; } + var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); + temp.l += (temp.l * factor); + return temp.toRGBA(); }; /** - * Returns the full html template string once loaded. + * Darkens the current color by a specified amount + * + * @param factor The amount to darken by [0-1] */ - Template.prototype.getTemplateString = function () { - if (!this._isLoaded) { - return ''; - } - return this._htmlString; + Color.prototype.darken = function (factor) { + if (factor === void 0) { factor = 0.1; } + var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); + temp.l -= (temp.l * factor); + return temp.toRGBA(); }; - Template.prototype._compile = function () { - this._innerElement.innerHTML = this._htmlString; - this._styleElements = this._innerElement.querySelectorAll('[data-style]'); - this._textElements = this._innerElement.querySelectorAll('[data-text]'); + /** + * Saturates the current color by a specified amount + * + * @param factor The amount to saturate by [0-1] + */ + Color.prototype.saturate = function (factor) { + if (factor === void 0) { factor = 0.1; } + var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); + temp.s += (temp.s * factor); + return temp.toRGBA(); }; - Template.prototype._evaluateExpresion = function (expression, ctx) { - var func = new Function('return ' + expression + ';'); - var val = func.call(ctx); - return val; + /** + * Desaturates the current color by a specified amount + * + * @param factor The amount to desaturate by [0-1] + */ + Color.prototype.desaturate = function (factor) { + if (factor === void 0) { factor = 0.1; } + var temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a); + temp.s -= (temp.s * factor); + return temp.toRGBA(); }; /** - * Applies any ctx object you wish and evaluates the template. - * Overload this method to include your favorite template library. - * You may return either an HTML string or a Dom node. - * @param ctx Any object you wish to apply to the template + * Multiplies a color by another, results in a darker color + * + * @param color The other color */ - Template.prototype.apply = function (ctx) { - var _this = this; - /* tslint:disable:no-string-literal */ - for (var j = 0; j < this._styleElements.length; j++) { - (function () { - // poor man's json parse for things that aren't exactly json :( - // Extract style expressions - var styles = {}; - _this._styleElements[j].dataset['style'].split(';').forEach(function (s) { - if (s) { - var vals = s.split(':'); - styles[vals[0].trim()] = vals[1].trim(); - } - }); - // Evaluate parsed style expressions - for (var style in styles) { - (function () { - var expression = styles[style]; - _this._styleElements[j].style[style] = _this._evaluateExpresion(expression, ctx); - })(); - } - })(); - } - for (var i = 0; i < this._textElements.length; i++) { - (function () { - // Evaluate text expressions - var expression = _this._textElements[i].dataset['text']; - _this._textElements[i].innerText = _this._evaluateExpresion(expression, ctx); - })(); - } - // If the template HTML has a root element return that, otherwise use constructed root - if (this._innerElement.children.length === 1) { - this._innerElement = this._innerElement.firstChild; - } - /* tslint:enable:no-string-literal */ - return this._innerElement; + Color.prototype.mulitiply = function (color) { + var newR = ((color.r / 255 * this.r / 255) * 255); + var newG = ((color.g / 255 * this.g / 255) * 255); + var newB = ((color.b / 255 * this.b / 255) * 255); + var newA = (color.a * this.a); + return new Color(newR, newG, newB, newA); }; /** - * Begins loading the template. Returns a promise that resolves with the template string when loaded. + * Screens a color by another, results in a lighter color + * + * @param color The other color */ - Template.prototype.load = function () { - var _this = this; - var complete = new ex.Promise(); - var request = new XMLHttpRequest(); - request.open('GET', this.path, true); - request.responseType = 'text'; - request.onprogress = this.onprogress; - request.onerror = this.onerror; - request.onload = function (e) { - if (request.status !== 200) { - _this.logger.error('Failed to load html template resource ', _this.path, ' server responded with error code', request.status); - _this.onerror(request.response); - _this._isLoaded = false; - complete.resolve('error'); - return; - } - _this._htmlString = request.response; - _this.oncomplete(); - _this.logger.debug('Completed loading template', _this.path); - _this._compile(); - _this._isLoaded = true; - complete.resolve(_this._htmlString); - }; - if (request.overrideMimeType) { - request.overrideMimeType('text/plain; charset=x-user-defined'); - } - request.send(); - return complete; + Color.prototype.screen = function (color) { + var color1 = color.invert(); + var color2 = color.invert(); + return color1.mulitiply(color2).invert(); }; /** - * Indicates whether the template has been loaded + * Inverts the current color */ - Template.prototype.isLoaded = function () { - return this._isLoaded; + Color.prototype.invert = function () { + return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a); }; - return Template; - })(); - ex.Template = Template; - /** - * Excalibur's binding library that allows you to bind an html - * template to the dom given a certain context. Excalibur bindings are only updated - * when the update() method is called - */ - var Binding = (function () { /** - * @param parentElementId The id of the element in the dom to attach the template binding - * @param template The template you wish to bind - * @param ctx The context of the binding, which can be any object + * Averages the current color with another + * + * @param color The other color */ - function Binding(parentElementId, template, ctx) { - this.parent = document.getElementById(parentElementId); - this.template = template; - this._ctx = ctx; - this.update(); - } + Color.prototype.average = function (color) { + var newR = (color.r + this.r) / 2; + var newG = (color.g + this.g) / 2; + var newB = (color.b + this.b) / 2; + var newA = (color.a + this.a) / 2; + return new Color(newR, newG, newB, newA); + }; /** - * Listen to any arbitrary object's events to update this binding - * @param obj Any object that supports addEventListener - * @param events A list of events to listen for - * @param handler A optional handler to fire on any event + * Returns a CSS string representation of a color. */ - Binding.prototype.listen = function (obj, events, handler) { - var _this = this; - // todo - if (!handler) { - handler = function () { - _this.update(); - }; - } - if (obj.addEventListener) { - events.forEach(function (e) { - obj.addEventListener(e, handler); - }); + Color.prototype.toString = function () { + var result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0)); + if (this.a !== undefined || this.a !== null) { + return 'rgba(' + result + ', ' + String(this.a) + ')'; } + return 'rgb(' + result + ')'; }; /** - * Update this template binding with the latest values from - * the ctx reference passed to the constructor + * Returns a CSS string representation of a color. */ - Binding.prototype.update = function () { - var html = this._applyTemplate(this.template, this._ctx); - if (html instanceof String) { - this.parent.innerHTML = html; - } - if (html instanceof Node) { - if (this.parent.lastChild !== html) { - this.parent.appendChild(html); - } - } + Color.prototype.fillStyle = function () { + return this.toString(); }; - Binding.prototype._applyTemplate = function (template, ctx) { - if (template.isLoaded()) { - return template.apply(ctx); - } + /** + * Returns a clone of the current color. + */ + Color.prototype.clone = function () { + return new Color(this.r, this.g, this.b, this.a); }; - return Binding; - })(); - ex.Binding = Binding; -})(ex || (ex = {})); -/// -var ex; -(function (ex) { - /** - * Enum representing the different horizontal text alignments - */ - (function (TextAlign) { /** - * The text is left-aligned. + * Black (#000000) + */ + Color.Black = Color.fromHex('#000000'); + /** + * White (#FFFFFF) + */ + Color.White = Color.fromHex('#FFFFFF'); + /** + * Gray (#808080) + */ + Color.Gray = Color.fromHex('#808080'); + /** + * Light gray (#D3D3D3) + */ + Color.LightGray = Color.fromHex('#D3D3D3'); + /** + * Dark gray (#A9A9A9) + */ + Color.DarkGray = Color.fromHex('#A9A9A9'); + /** + * Yellow (#FFFF00) */ - TextAlign[TextAlign["Left"] = 0] = "Left"; + Color.Yellow = Color.fromHex('#FFFF00'); /** - * The text is right-aligned. + * Orange (#FFA500) */ - TextAlign[TextAlign["Right"] = 1] = "Right"; + Color.Orange = Color.fromHex('#FFA500'); /** - * The text is centered. + * Red (#FF0000) */ - TextAlign[TextAlign["Center"] = 2] = "Center"; + Color.Red = Color.fromHex('#FF0000'); /** - * The text is aligned at the normal start of the line (left-aligned for left-to-right locales, - * right-aligned for right-to-left locales). + * Vermillion (#FF5B31) */ - TextAlign[TextAlign["Start"] = 3] = "Start"; + Color.Vermillion = Color.fromHex('#FF5B31'); /** - * The text is aligned at the normal end of the line (right-aligned for left-to-right locales, - * left-aligned for right-to-left locales). + * Rose (#FF007F) */ - TextAlign[TextAlign["End"] = 4] = "End"; - })(ex.TextAlign || (ex.TextAlign = {})); - var TextAlign = ex.TextAlign; - /** - * Enum representing the different baseline text alignments - */ - (function (BaseAlign) { + Color.Rose = Color.fromHex('#FF007F'); /** - * The text baseline is the top of the em square. + * Magenta (#FF00FF) */ - BaseAlign[BaseAlign["Top"] = 0] = "Top"; + Color.Magenta = Color.fromHex('#FF00FF'); /** - * The text baseline is the hanging baseline. Currently unsupported; this will act like - * alphabetic. + * Violet (#7F00FF) */ - BaseAlign[BaseAlign["Hanging"] = 1] = "Hanging"; + Color.Violet = Color.fromHex('#7F00FF'); /** - * The text baseline is the middle of the em square. + * Blue (#0000FF) */ - BaseAlign[BaseAlign["Middle"] = 2] = "Middle"; + Color.Blue = Color.fromHex('#0000FF'); /** - * The text baseline is the normal alphabetic baseline. + * Azure (#007FFF) */ - BaseAlign[BaseAlign["Alphabetic"] = 3] = "Alphabetic"; + Color.Azure = Color.fromHex('#007FFF'); /** - * The text baseline is the ideographic baseline; this is the bottom of - * the body of the characters, if the main body of characters protrudes - * beneath the alphabetic baseline. Currently unsupported; this will - * act like alphabetic. + * Cyan (#00FFFF) */ - BaseAlign[BaseAlign["Ideographic"] = 4] = "Ideographic"; + Color.Cyan = Color.fromHex('#00FFFF'); /** - * The text baseline is the bottom of the bounding box. This differs - * from the ideographic baseline in that the ideographic baseline - * doesn't consider descenders. + * Viridian (#59978F) */ - BaseAlign[BaseAlign["Bottom"] = 5] = "Bottom"; - })(ex.BaseAlign || (ex.BaseAlign = {})); - var BaseAlign = ex.BaseAlign; + Color.Viridian = Color.fromHex('#59978F'); + /** + * Green (#00FF00) + */ + Color.Green = Color.fromHex('#00FF00'); + /** + * Chartreuse (#7FFF00) + */ + Color.Chartreuse = Color.fromHex('#7FFF00'); + /** + * Transparent (#FFFFFF00) + */ + Color.Transparent = Color.fromHex('#FFFFFF00'); + return Color; + })(); + ex.Color = Color; /** - * Labels - * - * Labels are the way to draw small amounts of text to the screen. They are - * actors and inherit all of the benifits and capabilities. + * Internal HSL Color representation * - * ## Creating a Label + * http://en.wikipedia.org/wiki/HSL_and_HSV + * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c + */ + var HSLColor = (function () { + function HSLColor(h, s, l, a) { + this.h = h; + this.s = s; + this.l = l; + this.a = a; + } + HSLColor.fromRGBA = function (r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + if (max === min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return new HSLColor(h, s, l, a); + }; + HSLColor.prototype.toRGBA = function () { + var r, g, b; + if (this.s === 0) { + r = g = b = this.l; // achromatic + } + else { + function hue2rgb(p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + } + var q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s; + var p = 2 * this.l - q; + r = hue2rgb(p, q, this.h + 1 / 3); + g = hue2rgb(p, q, this.h); + b = hue2rgb(p, q, this.h - 1 / 3); + } + return new Color(r * 255, g * 255, b * 255, this.a); + }; + return HSLColor; + })(); +})(ex || (ex = {})); +/// +var ex; +(function (ex) { + /** + * Helper [[Actor]] primitive for drawing UI's, optimized for UI drawing. Does + * not participate in collisions. Drawn on top of all other actors. + */ + var UIActor = (function (_super) { + __extends(UIActor, _super); + /** + * @param x The starting x coordinate of the actor + * @param y The starting y coordinate of the actor + * @param width The starting width of the actor + * @param height The starting height of the actor + */ + function UIActor(x, y, width, height) { + _super.call(this, x, y, width, height); + this.traits = []; + this.traits.push(new ex.Traits.Movement()); + this.traits.push(new ex.Traits.CapturePointer()); + this.anchor.setTo(0, 0); + this.collisionType = ex.CollisionType.PreventCollision; + this.enableCapturePointer = true; + } + UIActor.prototype.onInitialize = function (engine) { + this._engine = engine; + }; + UIActor.prototype.contains = function (x, y, useWorld) { + if (useWorld === void 0) { useWorld = true; } + if (useWorld) { + return _super.prototype.contains.call(this, x, y); + } + var coords = this._engine.worldToScreenCoordinates(new ex.Point(x, y)); + return _super.prototype.contains.call(this, coords.x, coords.y); + }; + return UIActor; + })(ex.Actor); + ex.UIActor = UIActor; +})(ex || (ex = {})); +/// +/// +var ex; +(function (ex) { + /** + * Triggers * - * You can pass in arguments to the [[Label.constructor]] or simply set the - * properties you need after creating an instance of the [[Label]]. + * Triggers are a method of firing arbitrary code on collision. These are useful + * as 'buttons', 'switches', or to trigger effects in a game. By default triggers + * are invisible, and can only be seen when [[Engine.isDebug]] is set to `true`. * - * Since labels are [[Actor|Actors]], they need to be added to a [[Scene]] - * to be drawn and updated on-screen. + * ## Creating a trigger * * ```js - * var game = new ex.Engine(); - * - * // constructor - * var label = new ex.Label("Hello World", 50, 50, "10px Arial"); - * - * // properties - * var label = new ex.Label(); - * label.x = 50; - * label.y = 50; - * label.font = "10px Arial"; - * label.text = "Foo"; - * label.color = ex.Color.White; - * label.textAlign = ex.TextAlign.Center; - * - * // add to current scene - * game.add(label); - * - * // start game - * game.start(); - * ``` - * - * ## Web Fonts + * var game = new ex.Game(); * - * The HTML5 Canvas API draws text using CSS syntax. Because of this, web fonts - * are fully supported. To draw a web font, follow the same procedure you use - * for CSS. Then simply pass in the font string to the [[Label]] constructor - * or set [[Label.font]]. + * // create a handler + * function onTrigger() { * - * **index.html** + * // `this` will be the Trigger instance + * ex.Logger.getInstance().info("Trigger was triggered!", this); + * } * - * ```html - * - * - * - * - * - * - * - * - * - * - * - * ``` + * // set a trigger at (100, 100) that is 40x40px + * var trigger = new ex.Trigger(100, 100, 40, 40, onTrigger, 1); * - * **game.js** + * // create an actor across from the trigger + * var actor = new ex.Actor(100, 0, 40, 40, ex.Color.Red); * - * ```js - * var game = new ex.Engine(); + * // tell the actor to move towards the trigger over 3 seconds + * actor.moveTo(100, 200, 3000); * - * var label = new ex.Label(); - * label.font = "12px Foobar, Arial, Sans-Serif"; - * label.text = "Hello World"; + * game.add(trigger); + * game.add(actor); * - * game.add(label); * game.start(); * ``` - * - * ## Performance Implications - * - * It is recommended to use a [[SpriteFont]] for labels as the raw Canvas - * API for drawing text is slow (`fillText`). Too many labels that - * do not use sprite fonts will visibly affect the frame rate of your game. - * - * Alternatively, you can always use HTML and CSS to draw UI elements, but - * currently Excalibur does not provide a way to easily interact with the - * DOM. Still, this will not affect canvas performance and is a way to - * lighten your game, if needed. */ - var Label = (function (_super) { - __extends(Label, _super); + var Trigger = (function (_super) { + __extends(Trigger, _super); /** - * @param text The text of the label - * @param x The x position of the label - * @param y The y position of the label - * @param font Use any valid CSS font string for the label's font. Web fonts are supported. Default is `10px sans-serif`. - * @param spriteFont Use an Excalibur sprite font for the label's font, if a SpriteFont is provided it will take precendence - * over a css font. + * @param x The x position of the trigger + * @param y The y position of the trigger + * @param width The width of the trigger + * @param height The height of the trigger + * @param action Callback to fire when trigger is activated, `this` will be bound to the Trigger instance + * @param repeats The number of times that this trigger should fire, by default it is 1, if -1 is supplied it will fire indefinitely */ - function Label(text, x, y, font, spriteFont) { - _super.call(this, x, y); - /** - * The font size in pixels, default is 10px - */ - this.fontSize = 10; - /** - * Gets or sets the horizontal text alignment property for the label. - */ - this.textAlign = TextAlign.Left; - /** - * Gets or sets the baseline alignment property for the label. - */ - this.baseAlign = BaseAlign.Bottom; - /** - * Gets or sets the letter spacing on a Label. Only supported with Sprite Fonts. - */ - this.letterSpacing = 0; //px - /** - * Whether or not the [[SpriteFont]] will be case-sensitive when matching characters. - */ - this.caseInsensitive = true; - this._textShadowOn = false; - this._shadowOffsetX = 0; - this._shadowOffsetY = 0; - this._shadowColor = ex.Color.Black.clone(); - this._shadowColorDirty = false; - this._textSprites = {}; - this._shadowSprites = {}; - this._color = ex.Color.Black.clone(); - this.text = text || ''; - this.color = ex.Color.Black.clone(); - this.spriteFont = spriteFont; + function Trigger(x, y, width, height, action, repeats) { + _super.call(this, x, y, width, height); + this._action = function () { return; }; + this.repeats = 1; + this.target = null; + this.repeats = repeats || this.repeats; + this._action = action || this._action; this.collisionType = ex.CollisionType.PreventCollision; - this.font = font || '10px sans-serif'; // coallesce to default canvas font - if (spriteFont) { - } + this.eventDispatcher = new ex.EventDispatcher(this); + this.actionQueue = new ex.Internal.Actions.ActionQueue(this); } - /** - * Returns the width of the text in the label (in pixels); - * @param ctx Rending context to measure the string with - */ - Label.prototype.getTextWidth = function (ctx) { - var oldFont = ctx.font; - ctx.font = this.font; - var width = ctx.measureText(this.text).width; - ctx.font = oldFont; - return width; - }; - // TypeScript doesn't support string enums :( - Label.prototype._lookupTextAlign = function (textAlign) { - switch (textAlign) { - case TextAlign.Left: - return 'left'; - case TextAlign.Right: - return 'right'; - case TextAlign.Center: - return 'center'; - case TextAlign.End: - return 'end'; - case TextAlign.Start: - return 'start'; - default: - return 'start'; + Trigger.prototype.update = function (engine, delta) { + // Update action queue + this.actionQueue.update(delta); + // Update placements based on linear algebra + this.x += this.dx * delta / 1000; + this.y += this.dy * delta / 1000; + this.rotation += this.rx * delta / 1000; + this.scale.x += this.sx * delta / 1000; + this.scale.y += this.sy * delta / 1000; + // check for trigger collisions + if (this.target) { + if (this.collides(this.target)) { + this._dispatchAction(); + } } - }; - Label.prototype._lookupBaseAlign = function (baseAlign) { - switch (baseAlign) { - case BaseAlign.Alphabetic: - return 'alphabetic'; - case BaseAlign.Bottom: - return 'bottom'; - case BaseAlign.Hanging: - return 'hangin'; - case BaseAlign.Ideographic: - return 'ideographic'; - case BaseAlign.Middle: - return 'middle'; - case BaseAlign.Top: - return 'top'; - default: - return 'alphabetic'; + else { + for (var i = 0; i < engine.currentScene.children.length; i++) { + var other = engine.currentScene.children[i]; + if (other !== this && + other.collisionType !== ex.CollisionType.PreventCollision && + this.collides(other)) { + this._dispatchAction(); + } + } + } + // remove trigger if its done, -1 repeat forever + if (this.repeats === 0) { + this.kill(); } }; - /** - * Sets the text shadow for sprite fonts - * @param offsetX The x offset in pixels to place the shadow - * @param offsetY The y offset in pixles to place the shadow - * @param shadowColor The color of the text shadow - */ - Label.prototype.setTextShadow = function (offsetX, offsetY, shadowColor) { - this.spriteFont.setTextShadow(offsetX, offsetY, shadowColor); - }; - /** - * Toggles text shadows on or off, only applies when using sprite fonts - */ - Label.prototype.useTextShadow = function (on) { - this.spriteFont.useTextShadow(on); - }; - /** - * Clears the current text shadow - */ - Label.prototype.clearTextShadow = function () { - this._textShadowOn = false; - this._shadowOffsetX = 0; - this._shadowOffsetY = 0; - this._shadowColor = ex.Color.Black.clone(); + Trigger.prototype._dispatchAction = function () { + this._action.call(this); + this.repeats--; }; - Label.prototype.update = function (engine, delta) { - _super.prototype.update.call(this, engine, delta); - /* - if (this.spriteFont && (this._color !== this.color || this.previousOpacity !== this.opacity)) { - for (var character in this._textSprites) { - this._textSprites[character].clearEffects(); - this._textSprites[character].fill(this.color.clone()); - this._textSprites[character].opacity(this.opacity); - - } - this._color = this.color; - this.previousOpacity = this.opacity; - } - - if (this.spriteFont && this._textShadowOn && this._shadowColorDirty && this._shadowColor) { - for (var characterShadow in this._shadowSprites) { - this._shadowSprites[characterShadow].clearEffects(); - this._shadowSprites[characterShadow].addEffect(new Effects.Fill(this._shadowColor.clone())); - } - this._shadowColorDirty = false; - }*/ + Trigger.prototype.draw = function (ctx, delta) { + // does not draw + return; }; - Label.prototype.draw = function (ctx, delta) { + Trigger.prototype.debugDraw = function (ctx) { + _super.prototype.debugDraw.call(this, ctx); + // Meant to draw debug information about actors ctx.save(); ctx.translate(this.x, this.y); - ctx.scale(this.scale.x, this.scale.y); - ctx.rotate(this.rotation); - if (this._textShadowOn) { - ctx.save(); - ctx.translate(this._shadowOffsetX, this._shadowOffsetY); - this._fontDraw(ctx, delta, this._shadowSprites); - ctx.restore(); - } - this._fontDraw(ctx, delta, this._textSprites); - _super.prototype.draw.call(this, ctx, delta); - ctx.restore(); - }; - Label.prototype._fontDraw = function (ctx, delta, sprites) { - if (this.spriteFont) { - this.spriteFont.draw(ctx, this.text, 0, 0, { - color: this.color.clone(), - baseAlign: this.baseAlign, - textAlign: this.textAlign, - fontSize: this.fontSize, - letterSpacing: this.letterSpacing, - opacity: this.opacity - }); - } - else { - var oldAlign = ctx.textAlign; - var oldTextBaseline = ctx.textBaseline; - ctx.textAlign = this._lookupTextAlign(this.textAlign); - ctx.textBaseline = this._lookupBaseAlign(this.baseAlign); - if (this.color) { - this.color.a = this.opacity; - } - ctx.fillStyle = this.color.toString(); - ctx.font = this.fontSize + " " + this.font; - if (this.maxWidth) { - ctx.fillText(this.text, 0, 0, this.maxWidth); - } - else { - ctx.fillText(this.text, 0, 0); - } - ctx.textAlign = oldAlign; - ctx.textBaseline = oldTextBaseline; - } - }; - Label.prototype.debugDraw = function (ctx) { - _super.prototype.debugDraw.call(this, ctx); + var bb = this.getBounds(); + bb.left = bb.left - this.getWorldX(); + bb.right = bb.right - this.getWorldX(); + bb.top = bb.top - this.getWorldY(); + bb.bottom = bb.bottom - this.getWorldY(); + // Currently collision primitives cannot rotate + // ctx.rotate(this.rotation); + ctx.fillStyle = ex.Color.Violet.toString(); + ctx.strokeStyle = ex.Color.Violet.toString(); + ctx.fillText('Trigger', 10, 10); + bb.debugDraw(ctx); + ctx.restore(); }; - return Label; + return Trigger; })(ex.Actor); - ex.Label = Label; + ex.Trigger = Trigger; })(ex || (ex = {})); -/// +/// +/// +/// +/// var ex; (function (ex) { - var Input; - (function (Input) { + /** + * An enum that represents the types of emitter nozzles + */ + (function (EmitterType) { /** - * The type of pointer for a [[PointerEvent]]. + * Constant for the circular emitter type */ - (function (PointerType) { - PointerType[PointerType["Touch"] = 0] = "Touch"; - PointerType[PointerType["Mouse"] = 1] = "Mouse"; - PointerType[PointerType["Pen"] = 2] = "Pen"; - PointerType[PointerType["Unknown"] = 3] = "Unknown"; - })(Input.PointerType || (Input.PointerType = {})); - var PointerType = Input.PointerType; + EmitterType[EmitterType["Circle"] = 0] = "Circle"; /** - * The mouse button being pressed. + * Constant for the rectangular emitter type */ - (function (PointerButton) { - PointerButton[PointerButton["Left"] = 0] = "Left"; - PointerButton[PointerButton["Middle"] = 1] = "Middle"; - PointerButton[PointerButton["Right"] = 2] = "Right"; - PointerButton[PointerButton["Unknown"] = 3] = "Unknown"; - })(Input.PointerButton || (Input.PointerButton = {})); - var PointerButton = Input.PointerButton; + EmitterType[EmitterType["Rectangle"] = 1] = "Rectangle"; + })(ex.EmitterType || (ex.EmitterType = {})); + var EmitterType = ex.EmitterType; + /** + * Particle is used in a [[ParticleEmitter]] + */ + var Particle = (function () { + function Particle(emitter, life, opacity, beginColor, endColor, position, velocity, acceleration, startSize, endSize) { + this.position = new ex.Vector(0, 0); + this.velocity = new ex.Vector(0, 0); + this.acceleration = new ex.Vector(0, 0); + this.particleRotationalVelocity = 0; + this.currentRotation = 0; + this.focus = null; + this.focusAccel = 0; + this.opacity = 1; + this.beginColor = ex.Color.White.clone(); + this.endColor = ex.Color.White.clone(); + // Life is counted in ms + this.life = 300; + this.fadeFlag = false; + // Color transitions + this._rRate = 1; + this._gRate = 1; + this._bRate = 1; + this._aRate = 0; + this._currentColor = ex.Color.White.clone(); + this.emitter = null; + this.particleSize = 5; + this.particleSprite = null; + this.sizeRate = 0; + this.elapsedMultiplier = 0; + this.emitter = emitter; + this.life = life || this.life; + this.opacity = opacity || this.opacity; + this.endColor = endColor || this.endColor.clone(); + this.beginColor = beginColor || this.beginColor.clone(); + this._currentColor = this.beginColor.clone(); + this.position = position || this.position; + this.velocity = velocity || this.velocity; + this.acceleration = acceleration || this.acceleration; + this._rRate = (this.endColor.r - this.beginColor.r) / this.life; + this._gRate = (this.endColor.g - this.beginColor.g) / this.life; + this._bRate = (this.endColor.b - this.beginColor.b) / this.life; + this._aRate = this.opacity / this.life; + this.startSize = startSize || 0; + this.endSize = endSize || 0; + if ((this.endSize > 0) && (this.startSize > 0)) { + this.sizeRate = (this.endSize - this.startSize) / this.life; + this.particleSize = this.startSize; + } + } + Particle.prototype.kill = function () { + this.emitter.removeParticle(this); + }; + Particle.prototype.update = function (delta) { + this.life = this.life - delta; + this.elapsedMultiplier = this.elapsedMultiplier + delta; + if (this.life < 0) { + this.kill(); + } + if (this.fadeFlag) { + this.opacity = ex.Util.clamp(this._aRate * this.life, 0.0001, 1); + } + if ((this.startSize > 0) && (this.endSize > 0)) { + this.particleSize = ex.Util.clamp(this.sizeRate * delta + this.particleSize, Math.min(this.startSize, this.endSize), Math.max(this.startSize, this.endSize)); + } + this._currentColor.r = ex.Util.clamp(this._currentColor.r + this._rRate * delta, 0, 255); + this._currentColor.g = ex.Util.clamp(this._currentColor.g + this._gRate * delta, 0, 255); + this._currentColor.b = ex.Util.clamp(this._currentColor.b + this._bRate * delta, 0, 255); + this._currentColor.a = ex.Util.clamp(this.opacity, 0.0001, 1); + if (this.focus) { + var accel = this.focus.minus(this.position).normalize().scale(this.focusAccel).scale(delta / 1000); + this.velocity = this.velocity.add(accel); + } + else { + this.velocity = this.velocity.add(this.acceleration.scale(delta / 1000)); + } + this.position = this.position.add(this.velocity.scale(delta / 1000)); + if (this.particleRotationalVelocity) { + this.currentRotation = (this.currentRotation + this.particleRotationalVelocity * delta / 1000) % (2 * Math.PI); + } + }; + Particle.prototype.draw = function (ctx) { + if (this.particleSprite) { + this.particleSprite.rotation = this.currentRotation; + this.particleSprite.scale.setTo(this.particleSize, this.particleSize); + this.particleSprite.draw(ctx, this.position.x, this.position.y); + return; + } + this._currentColor.a = ex.Util.clamp(this.opacity, 0.0001, 1); + ctx.fillStyle = this._currentColor.toString(); + ctx.beginPath(); + ctx.arc(this.position.x, this.position.y, this.particleSize, 0, Math.PI * 2); + ctx.fill(); + ctx.closePath(); + }; + return Particle; + })(); + ex.Particle = Particle; + /** + * Particle Emitters + * + * Using a particle emitter is a great way to create interesting effects + * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter` + * extend [[Actor]] allowing you to use all of the features that come with. + * + * The easiest way to create a `ParticleEmitter` is to use the + * [Particle Tester](http://excaliburjs.com/particle-tester/) to generate code for emitters. + * + * ## Example: Adding an emitter + * + * ```js + * var actor = new ex.Actor(...); + * var emitter = new ex.ParticleEmitter(...); + * + * emitter.emitterType = ex.EmitterType.Circle; // Shape of emitter nozzle + * emitter.radius = 5; + * emitter.minVel = 100; + * emitter.maxVel = 200; + * emitter.minAngle = 0; + * emitter.maxAngle = Math.PI * 2; + * emitter.emitRate = 300; // 300 particles/second + * emitter.opacity = 0.5; + * emitter.fadeFlag = true; // fade particles overtime + * emitter.particleLife = 1000; // in milliseconds = 1 sec + * emitter.maxSize = 10; // in pixels + * emitter.minSize = 1; + * emitter.particleColor = ex.Color.Rose; + * + * // set emitter settings + * emitter.isEmitting = true; // should the emitter be emitting + * + * // add the emitter as a child actor, it will draw on top of the parent actor + * // and move with the parent + * actor.add(emitter); + * + * // or, alternatively, add it to the current scene + * engine.add(emitter); + * ``` + */ + var ParticleEmitter = (function (_super) { + __extends(ParticleEmitter, _super); /** - * Determines the scope of handling mouse/touch events. See [[Pointers]] for more information. + * @param x The x position of the emitter + * @param y The y position of the emitter + * @param width The width of the emitter + * @param height The height of the emitter */ - (function (PointerScope) { + function ParticleEmitter(x, y, width, height) { + _super.call(this, x, y, width, height, ex.Color.White); + this._particlesToEmit = 0; + this.numParticles = 0; + /** + * Gets or sets the isEmitting flag + */ + this.isEmitting = true; + /** + * Gets or sets the backing particle collection + */ + this.particles = null; + /** + * Gets or sets the backing deadParticle collection + */ + this.deadParticles = null; + /** + * Gets or sets the minimum partical velocity + */ + this.minVel = 0; + /** + * Gets or sets the maximum partical velocity + */ + this.maxVel = 0; + /** + * Gets or sets the acceleration vector for all particles + */ + this.acceleration = new ex.Vector(0, 0); + /** + * Gets or sets the minimum angle in radians + */ + this.minAngle = 0; + /** + * Gets or sets the maximum angle in radians + */ + this.maxAngle = 0; + /** + * Gets or sets the emission rate for particles (particles/sec) + */ + this.emitRate = 1; //particles/sec + /** + * Gets or sets the life of each particle in milliseconds + */ + this.particleLife = 2000; + /** + * Gets or sets the opacity of each particle from 0 to 1.0 + */ + this.opacity = 1; + /** + * Gets or sets the fade flag which causes particles to gradually fade out over the course of their life. + */ + this.fadeFlag = false; + /** + * Gets or sets the optional focus where all particles should accelerate towards + */ + this.focus = null; + /** + * Gets or sets the acceleration for focusing particles if a focus has been specified + */ + this.focusAccel = 1; + /* + * Gets or sets the optional starting size for the particles + */ + this.startSize = null; + /* + * Gets or sets the optional ending size for the particles + */ + this.endSize = null; + /** + * Gets or sets the minimum size of all particles + */ + this.minSize = 5; + /** + * Gets or sets the maximum size of all particles + */ + this.maxSize = 5; + /** + * Gets or sets the beginning color of all particles + */ + this.beginColor = ex.Color.White; /** - * Handle events on the `canvas` element only. Events originating outside the - * `canvas` will not be handled. + * Gets or sets the ending color of all particles */ - PointerScope[PointerScope["Canvas"] = 0] = "Canvas"; + this.endColor = ex.Color.White; /** - * Handles events on the entire document. All events will be handled by Excalibur. + * Gets or sets the sprite that a particle should use + * @warning Performance intensive */ - PointerScope[PointerScope["Document"] = 1] = "Document"; - })(Input.PointerScope || (Input.PointerScope = {})); - var PointerScope = Input.PointerScope; - /** - * Pointer events - * - * Represents a mouse, touch, or stylus event. See [[Pointers]] for more information on - * handling pointer input. - * - * For mouse-based events, you can inspect [[PointerEvent.button]] to see what button was pressed. - */ - var PointerEvent = (function (_super) { - __extends(PointerEvent, _super); + this.particleSprite = null; /** - * @param x The `x` coordinate of the event (in world coordinates) - * @param y The `y` coordinate of the event (in world coordinates) - * @param index The index of the pointer (zero-based) - * @param pointerType The type of pointer - * @param button The button pressed (if [[PointerType.Mouse]]) - * @param ev The raw DOM event being handled + * Gets or sets the emitter type for the particle emitter */ - function PointerEvent(x, y, index, pointerType, button, ev) { - _super.call(this); - this.x = x; - this.y = y; - this.index = index; - this.pointerType = pointerType; - this.button = button; - this.ev = ev; + this.emitterType = EmitterType.Rectangle; + /** + * Gets or sets the emitter radius, only takes effect when the [[emitterType]] is [[EmitterType.Circle]] + */ + this.radius = 0; + /** + * Gets or sets the particle rotational speed velocity + */ + this.particleRotationalVelocity = 0; + /** + * Indicates whether particles should start with a random rotation + */ + this.randomRotation = false; + this.collisionType = ex.CollisionType.PreventCollision; + this.particles = new ex.Util.Collection(); + this.deadParticles = new ex.Util.Collection(); + // Remove offscreen culling from particle emitters + for (var trait in this.traits) { + if (this.traits[trait] instanceof ex.Traits.OffscreenCulling) { + this.traits.splice(trait, 1); + } } - return PointerEvent; - })(ex.GameEvent); - Input.PointerEvent = PointerEvent; - ; + } + ParticleEmitter.prototype.removeParticle = function (particle) { + this.deadParticles.push(particle); + }; /** - * Mouse and Touch (Pointers) - * - * Handles pointer events (mouse, touch, stylus, etc.) and normalizes to - * [W3C Pointer Events](http://www.w3.org/TR/pointerevents/). - * - * There is always at least one [[Pointer]] available ([[Pointers.primary]]) and - * you can request multiple pointers to support multi-touch scenarios. - * - * Since [[Pointers.primary]] normalizes both mouse and touch events, your game - * automatically supports touch for the primary pointer by default. When - * you handle the events, you can customize what your game does based on the type - * of pointer, if applicable. - * - * Excalibur handles mouse/touch events and normalizes them to a [[PointerEvent]] - * that your game can subscribe to and handle (`engine.input.pointers`). - * - * ## Events - * - * You can subscribe to pointer events through `engine.input.pointers`. A [[PointerEvent]] object is - * passed to your handler which offers information about the pointer input being received. - * - * - `down` - When a pointer is pressed down (any mouse button or finger press) - * - `up` - When a pointer is lifted - * - `move` - When a pointer moves (be wary of performance issues when subscribing to this) - * - `cancel` - When a pointer event is canceled for some reason - * - * ```js - * engine.input.pointers.primary.on("down", function (evt) { }); - * engine.input.pointers.primary.on("up", function (evt) { }); - * engine.input.pointers.primary.on("move", function (evt) { }); - * engine.input.pointers.primary.on("cancel", function (evt) { }); - * ``` - * - * ## Pointer scope (window vs. canvas) - * - * You have the option to handle *all* pointer events in the browser by setting - * [[IEngineOptions.pointerScope]] to [[PointerScope.Document]]. If this is enabled, - * Excalibur will handle every pointer event in the browser. This is useful for handling - * complex input and having control over every interaction. - * - * You can also use [[PointerScope.Canvas]] to only scope event handling to the game - * canvas. This is useful if you don't care about events that occur outside. - * - * One real-world example is dragging and gestures. Sometimes a player will drag their - * finger outside your game and then into it, expecting it to work. If [[PointerScope]] - * is set to [[PointerScope.Canvas|Canvas]] this will not work. If it is set to - * [[PointerScope.Document|Document]], it will. - * - * ## Responding to input - * - * The primary pointer can be a mouse, stylus, or 1 finger touch event. You - * can inspect what it is from the [[PointerEvent]] handled. - * - * ```js - * engine.input.pointers.primary.on("down", function (pe) { - * if (pe.pointerType === ex.Input.PointerType.Mouse) { - * ex.Logger.getInstance().info("Mouse event:", pe); - * } else if (pe.pointerType === ex.Input.PointerType.Touch) { - * ex.Logger.getInstance().info("Touch event:", pe); - * } - * }); - * ``` - * - * ## Multiple Pointers (Multi-Touch) - * - * When there is more than one pointer detected on the screen, - * this is considered multi-touch. For example, pressing one finger, - * then another, will create two pointers. If you lift a finger, - * the first one remains and the second one disappears. - * - * You can handle multi-touch by subscribing to however many pointers - * you would like to support. If a pointer doesn't yet exist, it will - * be created. You do not need to check if a pointer exists. If it does - * exist, it will propogate events, otherwise it will remain idle. - * - * Excalibur does not impose a limit to the amount of pointers you can - * subscribe to, so by all means, support all 10 fingers. - * - * *Note:* There is no way to identify touches after they happen; you can only - * know that there are *n* touches on the screen at once. - * - * ```js - * function paint(color) { - * - * // create a handler for the event - * return function (pe) { - * if (pe.pointerType === ex.Input.PointerType.Touch) { - * engine.canvas.fillStyle = color; - * engine.canvas.fillRect(pe.x, pe.y, 5, 5); - * } - * } - * } - * - * engine.input.pointers.at(0).on("move", paint("blue")); // 1st finger - * engine.input.pointers.at(1).on("move", paint("red")); // 2nd finger - * engine.input.pointers.at(2).on("move", paint("green")); // 3rd finger - * ``` - * - * ## Actor pointer events - * - * By default, [[Actor|Actors]] do not participate in pointer events. In other - * words, when you "click" an Actor, it will not throw an event **for that Actor**, - * only a generic pointer event for the game. This is to keep performance - * high and allow actors to "opt-in" to handling pointer events. - * - * To opt-in, set [[Actor.enableCapturePointer]] to `true` and the [[Actor]] will - * start publishing `pointerup` and `pointerdown` events. `pointermove` events - * will not be published by default due to performance implications. If you want - * an actor to receive move events, set [[ICapturePointerConfig.captureMoveEvents]] to - * `true`. - * - * Actor pointer events will be prefixed with `pointer`. - * - * ```js - * var player = new ex.Actor(); - * - * // enable propogating pointer events - * player.enableCapturePointer = true; - * - * // enable move events, warning: performance intensive! - * player.capturePointer.captureMoveEvents = true; + * Causes the emitter to emit particles + * @param particleCount Number of particles to emit right now + */ + ParticleEmitter.prototype.emitParticles = function (particleCount) { + for (var i = 0; i < particleCount; i++) { + this.particles.push(this._createParticle()); + } + }; + ParticleEmitter.prototype.clearParticles = function () { + this.particles.clear(); + }; + // Creates a new particle given the contraints of the emitter + ParticleEmitter.prototype._createParticle = function () { + // todo implement emitter contraints; + var ranX = 0; + var ranY = 0; + var angle = ex.Util.randomInRange(this.minAngle, this.maxAngle); + var vel = ex.Util.randomInRange(this.minVel, this.maxVel); + var size = this.startSize || ex.Util.randomInRange(this.minSize, this.maxSize); + var dx = vel * Math.cos(angle); + var dy = vel * Math.sin(angle); + if (this.emitterType === EmitterType.Rectangle) { + ranX = ex.Util.randomInRange(this.x, this.x + this.getWidth()); + ranY = ex.Util.randomInRange(this.y, this.y + this.getHeight()); + } + else if (this.emitterType === EmitterType.Circle) { + var radius = ex.Util.randomInRange(0, this.radius); + ranX = radius * Math.cos(angle) + this.x; + ranY = radius * Math.sin(angle) + this.y; + } + var p = new Particle(this, this.particleLife, this.opacity, this.beginColor, this.endColor, new ex.Vector(ranX, ranY), new ex.Vector(dx, dy), this.acceleration, this.startSize, this.endSize); + p.fadeFlag = this.fadeFlag; + p.particleSize = size; + if (this.particleSprite) { + p.particleSprite = this.particleSprite; + } + p.particleRotationalVelocity = this.particleRotationalVelocity; + if (this.randomRotation) { + p.currentRotation = ex.Util.randomInRange(0, Math.PI * 2); + } + if (this.focus) { + p.focus = this.focus.add(new ex.Vector(this.x, this.y)); + p.focusAccel = this.focusAccel; + } + return p; + }; + ParticleEmitter.prototype.update = function (engine, delta) { + var _this = this; + _super.prototype.update.call(this, engine, delta); + if (this.isEmitting) { + this._particlesToEmit += this.emitRate * (delta / 1000); + //var numParticles = Math.ceil(this.emitRate * delta / 1000); + if (this._particlesToEmit > 1.0) { + this.emitParticles(Math.floor(this._particlesToEmit)); + this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit); + } + } + this.particles.forEach(function (p) { return p.update(delta); }); + this.deadParticles.forEach(function (p) { return _this.particles.removeElement(p); }); + this.deadParticles.clear(); + }; + ParticleEmitter.prototype.draw = function (ctx, delta) { + // todo is there a more efficient to draw + // possibly use a webgl offscreen canvas and shaders to do particles? + this.particles.forEach(function (p) { return p.draw(ctx); }); + }; + ParticleEmitter.prototype.debugDraw = function (ctx) { + _super.prototype.debugDraw.call(this, ctx); + ctx.fillStyle = ex.Color.Black.toString(); + ctx.fillText('Particles: ' + this.particles.count(), this.x, this.y + 20); + if (this.focus) { + ctx.fillRect(this.focus.x + this.x, this.focus.y + this.y, 3, 3); + ex.Util.drawLine(ctx, 'yellow', this.focus.x + this.x, this.focus.y + this.y, _super.prototype.getCenter.call(this).x, _super.prototype.getCenter.call(this).y); + ctx.fillText('Focus', this.focus.x + this.x, this.focus.y + this.y); + } + }; + return ParticleEmitter; + })(ex.Actor); + ex.ParticleEmitter = ParticleEmitter; +})(ex || (ex = {})); +var ex; +(function (ex) { + /** + * Animations + * + * Animations allow you to display a series of images one after another, + * creating the illusion of change. Generally these images will come from a [[SpriteSheet]] source. + * + * ## Creating an animation + * + * Create a [[Texture]] that contains the frames of your animation. Once the texture + * is [[Loader|loaded]], you can then generate an [[Animation]] by creating a [[SpriteSheet]] + * and using [[SpriteSheet.getAnimationForAll]]. + * + * ```js + * var game = new ex.Engine(); + * var txAnimPlayerIdle = new ex.Texture("/assets/tx/anim-player-idle.png"); + * + * // load assets + * var loader = new ex.Loader(txAnimPlayerIdle); + * + * // start game + * game.start(loader).then(function () { + * var player = new ex.Actor(); + * + * // create sprite sheet with 5 columns, 1 row, 80x80 frames + * var playerIdleSheet = new ex.SpriteSheet(txAnimPlayerIdle, 5, 1, 80, 80); + * + * // create animation (125ms frame speed) + * var playerIdleAnimation = playerIdleSheet.getAnimationForAll(game, 125); + * + * // add drawing to player as "idle" + * player.addDrawing("idle", playerIdleAnimation); + * + * // add player to game + * game.add(player); + * }); + * ``` + * + * ## Sprite effects + * + * You can add [[SpriteEffect|sprite effects]] to an animation through methods + * like [[Animation.invert]] or [[Animation.lighten]]. Keep in mind, since this + * manipulates the raw pixel values of a [[Sprite]], it can have a performance impact. + */ + var Animation = (function () { + /** + * Typically you will use a [[SpriteSheet]] to generate an [[Animation]]. * - * // subscribe to input - * player.on("pointerup", function (ev) { - * player.logger.info("Player selected!", ev); - * }); - * ``` + * @param engine Reference to the current game engine + * @param images An array of sprites to create the frames for the animation + * @param speed The number in milliseconds to display each frame in the animation + * @param loop Indicates whether the animation should loop after it is completed */ - var Pointers = (function (_super) { - __extends(Pointers, _super); - function Pointers(engine) { - _super.call(this); - this._pointerDown = []; - this._pointerUp = []; - this._pointerMove = []; - this._pointerCancel = []; - this._pointers = []; - this._activePointers = []; - this._engine = engine; - this._pointers.push(new Pointer()); - this._activePointers = [-1]; - this.primary = this._pointers[0]; - } - /** - * Initializes pointer event listeners - */ - Pointers.prototype.init = function (scope) { - if (scope === void 0) { scope = PointerScope.Document; } - var target = document; - if (scope === PointerScope.Document) { - target = document; - } - else { - target = this._engine.canvas; - } - // Touch Events - target.addEventListener('touchstart', this._handleTouchEvent('down', this._pointerDown)); - target.addEventListener('touchend', this._handleTouchEvent('up', this._pointerUp)); - target.addEventListener('touchmove', this._handleTouchEvent('move', this._pointerMove)); - target.addEventListener('touchcancel', this._handleTouchEvent('cancel', this._pointerCancel)); - // W3C Pointer Events - // Current: IE11, IE10 - if (window.PointerEvent) { - // IE11 - this._engine.canvas.style.touchAction = 'none'; - target.addEventListener('pointerdown', this._handlePointerEvent('down', this._pointerDown)); - target.addEventListener('pointerup', this._handlePointerEvent('up', this._pointerUp)); - target.addEventListener('pointermove', this._handlePointerEvent('move', this._pointerMove)); - target.addEventListener('pointercancel', this._handlePointerEvent('cancel', this._pointerMove)); - } - else if (window.MSPointerEvent) { - // IE10 - this._engine.canvas.style.msTouchAction = 'none'; - target.addEventListener('MSPointerDown', this._handlePointerEvent('down', this._pointerDown)); - target.addEventListener('MSPointerUp', this._handlePointerEvent('up', this._pointerUp)); - target.addEventListener('MSPointerMove', this._handlePointerEvent('move', this._pointerMove)); - target.addEventListener('MSPointerCancel', this._handlePointerEvent('cancel', this._pointerMove)); - } - else { - // Mouse Events - target.addEventListener('mousedown', this._handleMouseEvent('down', this._pointerDown)); - target.addEventListener('mouseup', this._handleMouseEvent('up', this._pointerUp)); - target.addEventListener('mousemove', this._handleMouseEvent('move', this._pointerMove)); - } - }; - Pointers.prototype.update = function (delta) { - this._pointerUp.length = 0; - this._pointerDown.length = 0; - this._pointerMove.length = 0; - this._pointerCancel.length = 0; - }; + function Animation(engine, images, speed, loop) { /** - * Safely gets a Pointer at a specific index and initializes one if it doesn't yet exist - * @param index The pointer index to retrieve + * Current frame index being shown */ - Pointers.prototype.at = function (index) { - if (index >= this._pointers.length) { - // Ensure there is a pointer to retrieve - for (var i = this._pointers.length - 1, max = index; i < max; i++) { - this._pointers.push(new Pointer()); - this._activePointers.push(-1); - } - } - return this._pointers[index]; - }; + this.currentFrame = 0; + this._oldTime = Date.now(); + this.anchor = new ex.Point(0.0, 0.0); + this.rotation = 0.0; + this.scale = new ex.Point(1, 1); /** - * Get number of pointers being watched + * Indicates whether the animation should loop after it is completed */ - Pointers.prototype.count = function () { - return this._pointers.length; - }; + this.loop = false; /** - * Propogates events to actor if necessary + * Indicates the frame index the animation should freeze on for a non-looping + * animation. By default it is the last frame. */ - Pointers.prototype.propogate = function (actor) { - var isUIActor = actor instanceof ex.UIActor; - var i = 0, len = this._pointerUp.length; - for (i; i < len; i++) { - if (actor.contains(this._pointerUp[i].x, this._pointerUp[i].y, !isUIActor)) { - actor.eventDispatcher.emit('pointerup', this._pointerUp[i]); - } - } - i = 0; - len = this._pointerDown.length; - for (i; i < len; i++) { - if (actor.contains(this._pointerDown[i].x, this._pointerDown[i].y, !isUIActor)) { - actor.eventDispatcher.emit('pointerdown', this._pointerDown[i]); - } - } - if (actor.capturePointer.captureMoveEvents) { - i = 0; - len = this._pointerMove.length; - for (i; i < len; i++) { - if (actor.contains(this._pointerMove[i].x, this._pointerMove[i].y, !isUIActor)) { - actor.eventDispatcher.emit('pointermove', this._pointerMove[i]); - } - } - } - i = 0; - len = this._pointerCancel.length; - for (i; i < len; i++) { - if (actor.contains(this._pointerCancel[i].x, this._pointerCancel[i].y, !isUIActor)) { - actor.eventDispatcher.emit('pointercancel', this._pointerCancel[i]); - } - } - }; - Pointers.prototype._handleMouseEvent = function (eventName, eventArr) { - var _this = this; - return function (e) { - e.preventDefault(); - var x = e.pageX - ex.Util.getPosition(_this._engine.canvas).x; - var y = e.pageY - ex.Util.getPosition(_this._engine.canvas).y; - var transformedPoint = _this._engine.screenToWorldCoordinates(new ex.Point(x, y)); - var pe = new PointerEvent(transformedPoint.x, transformedPoint.y, 0, PointerType.Mouse, e.button, e); - eventArr.push(pe); - _this.at(0).eventDispatcher.emit(eventName, pe); - }; - }; - Pointers.prototype._handleTouchEvent = function (eventName, eventArr) { - var _this = this; - return function (e) { - e.preventDefault(); - for (var i = 0, len = e.changedTouches.length; i < len; i++) { - var index = _this._pointers.length > 1 ? _this._getPointerIndex(e.changedTouches[i].identifier) : 0; - if (index === -1) { - continue; - } - var x = e.changedTouches[i].pageX - ex.Util.getPosition(_this._engine.canvas).x; - var y = e.changedTouches[i].pageY - ex.Util.getPosition(_this._engine.canvas).y; - var transformedPoint = _this._engine.screenToWorldCoordinates(new ex.Point(x, y)); - var pe = new PointerEvent(transformedPoint.x, transformedPoint.y, index, PointerType.Touch, PointerButton.Unknown, e); - eventArr.push(pe); - _this.at(index).eventDispatcher.emit(eventName, pe); - // only with multi-pointer - if (_this._pointers.length > 1) { - if (eventName === 'up') { - // remove pointer ID from pool when pointer is lifted - _this._activePointers[index] = -1; - } - else if (eventName === 'down') { - // set pointer ID to given index - _this._activePointers[index] = e.changedTouches[i].identifier; - } - } - } - }; - }; - Pointers.prototype._handlePointerEvent = function (eventName, eventArr) { - var _this = this; - return function (e) { - e.preventDefault(); - // get the index for this pointer ID if multi-pointer is asked for - var index = _this._pointers.length > 1 ? _this._getPointerIndex(e.pointerId) : 0; - if (index === -1) { - return; - } - var x = e.pageX - ex.Util.getPosition(_this._engine.canvas).x; - var y = e.pageY - ex.Util.getPosition(_this._engine.canvas).y; - var transformedPoint = _this._engine.screenToWorldCoordinates(new ex.Point(x, y)); - var pe = new PointerEvent(transformedPoint.x, transformedPoint.y, index, _this._stringToPointerType(e.pointerType), e.button, e); - eventArr.push(pe); - _this.at(index).eventDispatcher.emit(eventName, pe); - // only with multi-pointer - if (_this._pointers.length > 1) { - if (eventName === 'up') { - // remove pointer ID from pool when pointer is lifted - _this._activePointers[index] = -1; - } - else if (eventName === 'down') { - // set pointer ID to given index - _this._activePointers[index] = e.pointerId; - } - } - }; - }; + this.freezeFrame = -1; /** - * Gets the index of the pointer specified for the given pointer ID or finds the next empty pointer slot available. - * This is required because IE10/11 uses incrementing pointer IDs so we need to store a mapping of ID => idx + * Flip each frame vertically. Sets [[Sprite.flipVertical]]. */ - Pointers.prototype._getPointerIndex = function (pointerId) { - var idx; - if ((idx = this._activePointers.indexOf(pointerId)) > -1) { - return idx; - } - for (var i = 0; i < this._activePointers.length; i++) { - if (this._activePointers[i] === -1) { - return i; - } - } - // ignore pointer because game isn't watching - return -1; - }; - Pointers.prototype._stringToPointerType = function (s) { - switch (s) { - case 'touch': - return PointerType.Touch; - case 'mouse': - return PointerType.Mouse; - case 'pen': - return PointerType.Pen; - default: - return PointerType.Unknown; - } - }; - return Pointers; - })(ex.Class); - Input.Pointers = Pointers; + this.flipVertical = false; + /** + * Flip each frame horizontally. Sets [[Sprite.flipHorizontal]]. + */ + this.flipHorizontal = false; + this.width = 0; + this.height = 0; + this.naturalWidth = 0; + this.naturalHeight = 0; + this.sprites = images; + this.speed = speed; + this._engine = engine; + if (loop != null) { + this.loop = loop; + } + if (images && images[0]) { + this.height = images[0] ? images[0].height : 0; + this.width = images[0] ? images[0].width : 0; + this.naturalWidth = images[0] ? images[0].naturalWidth : 0; + this.naturalHeight = images[0] ? images[0].naturalHeight : 0; + this.freezeFrame = images.length - 1; + } + } /** - * Captures and dispatches PointerEvents + * Applies the opacity effect to a sprite, setting the alpha of all pixels to a given value */ - var Pointer = (function (_super) { - __extends(Pointer, _super); - function Pointer() { - _super.apply(this, arguments); - } - return Pointer; - })(ex.Class); - Input.Pointer = Pointer; - })(Input = ex.Input || (ex.Input = {})); -})(ex || (ex = {})); -var ex; -(function (ex) { - var Input; - (function (Input) { + Animation.prototype.opacity = function (value) { + this.addEffect(new ex.Effects.Opacity(value)); + }; /** - * Enum representing input key codes + * Applies the grayscale effect to a sprite, removing color information. */ - (function (Keys) { - Keys[Keys["Num1"] = 97] = "Num1"; - Keys[Keys["Num2"] = 98] = "Num2"; - Keys[Keys["Num3"] = 99] = "Num3"; - Keys[Keys["Num4"] = 100] = "Num4"; - Keys[Keys["Num5"] = 101] = "Num5"; - Keys[Keys["Num6"] = 102] = "Num6"; - Keys[Keys["Num7"] = 103] = "Num7"; - Keys[Keys["Num8"] = 104] = "Num8"; - Keys[Keys["Num9"] = 105] = "Num9"; - Keys[Keys["Num0"] = 96] = "Num0"; - Keys[Keys["Numlock"] = 144] = "Numlock"; - Keys[Keys["Semicolon"] = 186] = "Semicolon"; - Keys[Keys["A"] = 65] = "A"; - Keys[Keys["B"] = 66] = "B"; - Keys[Keys["C"] = 67] = "C"; - Keys[Keys["D"] = 68] = "D"; - Keys[Keys["E"] = 69] = "E"; - Keys[Keys["F"] = 70] = "F"; - Keys[Keys["G"] = 71] = "G"; - Keys[Keys["H"] = 72] = "H"; - Keys[Keys["I"] = 73] = "I"; - Keys[Keys["J"] = 74] = "J"; - Keys[Keys["K"] = 75] = "K"; - Keys[Keys["L"] = 76] = "L"; - Keys[Keys["M"] = 77] = "M"; - Keys[Keys["N"] = 78] = "N"; - Keys[Keys["O"] = 79] = "O"; - Keys[Keys["P"] = 80] = "P"; - Keys[Keys["Q"] = 81] = "Q"; - Keys[Keys["R"] = 82] = "R"; - Keys[Keys["S"] = 83] = "S"; - Keys[Keys["T"] = 84] = "T"; - Keys[Keys["U"] = 85] = "U"; - Keys[Keys["V"] = 86] = "V"; - Keys[Keys["W"] = 87] = "W"; - Keys[Keys["X"] = 88] = "X"; - Keys[Keys["Y"] = 89] = "Y"; - Keys[Keys["Z"] = 90] = "Z"; - Keys[Keys["Shift"] = 16] = "Shift"; - Keys[Keys["Alt"] = 18] = "Alt"; - Keys[Keys["Up"] = 38] = "Up"; - Keys[Keys["Down"] = 40] = "Down"; - Keys[Keys["Left"] = 37] = "Left"; - Keys[Keys["Right"] = 39] = "Right"; - Keys[Keys["Space"] = 32] = "Space"; - Keys[Keys["Esc"] = 27] = "Esc"; - })(Input.Keys || (Input.Keys = {})); - var Keys = Input.Keys; - ; + Animation.prototype.grayscale = function () { + this.addEffect(new ex.Effects.Grayscale()); + }; /** - * Event thrown on a game object for a key event + * Applies the invert effect to a sprite, inverting the pixel colors. */ - var KeyEvent = (function (_super) { - __extends(KeyEvent, _super); - /** - * @param key The key responsible for throwing the event - */ - function KeyEvent(key) { - _super.call(this); - this.key = key; + Animation.prototype.invert = function () { + this.addEffect(new ex.Effects.Invert()); + }; + /** + * Applies the fill effect to a sprite, changing the color channels of all non-transparent pixels to match a given color + */ + Animation.prototype.fill = function (color) { + this.addEffect(new ex.Effects.Fill(color)); + }; + /** + * Applies the colorize effect to a sprite, changing the color channels of all pixesl to be the average of the original color and the + * provided color. + */ + Animation.prototype.colorize = function (color) { + this.addEffect(new ex.Effects.Colorize(color)); + }; + /** + * Applies the lighten effect to a sprite, changes the lightness of the color according to hsl + */ + Animation.prototype.lighten = function (factor) { + if (factor === void 0) { factor = 0.1; } + this.addEffect(new ex.Effects.Lighten(factor)); + }; + /** + * Applies the darken effect to a sprite, changes the darkness of the color according to hsl + */ + Animation.prototype.darken = function (factor) { + if (factor === void 0) { factor = 0.1; } + this.addEffect(new ex.Effects.Darken(factor)); + }; + /** + * Applies the saturate effect to a sprite, saturates the color acccording to hsl + */ + Animation.prototype.saturate = function (factor) { + if (factor === void 0) { factor = 0.1; } + this.addEffect(new ex.Effects.Saturate(factor)); + }; + /** + * Applies the desaturate effect to a sprite, desaturates the color acccording to hsl + */ + Animation.prototype.desaturate = function (factor) { + if (factor === void 0) { factor = 0.1; } + this.addEffect(new ex.Effects.Desaturate(factor)); + }; + /** + * Add a [[ISpriteEffect]] manually + */ + Animation.prototype.addEffect = function (effect) { + for (var i in this.sprites) { + this.sprites[i].addEffect(effect); } - return KeyEvent; - })(ex.GameEvent); - Input.KeyEvent = KeyEvent; + }; + Animation.prototype.removeEffect = function (param) { + for (var i in this.sprites) { + this.sprites[i].removeEffect(param); + } + }; /** - * Keyboard input - * - * Working with the keyboard is easy in Excalibur. You can inspect - * whether a button is [[Keyboard.isKeyDown|down]], [[Keyboard.isKeyUp|up]], or - * [[Keyboard.isKeyPressed|pressed]]. Common keys are held in the [[Input.Keys]] - * enumeration but you can pass any character code to the methods. - * - * Excalibur subscribes to the browser events and keeps track of - * what keys are currently down, up, or pressed. A key can be pressed - * for multiple frames, but a key cannot be down or up for more than one - * update frame. - * - * ## Inspecting the keyboard - * - * You can inspect [[Engine.input]] to see what the state of the keyboard - * is during an update. - * - * ```ts - * class Player extends ex.Actor { - * public update(engine, delta) { - * - * if (engine.input.keyboard.isKeyPressed(ex.Input.Keys.W) || - * engine.input.keyboard.isKeyPressed(ex.Input.Keys.Up)) { - * - * player._moveForward(); - * } - * - * } - * } - * ``` + * Clear all sprite effects + */ + Animation.prototype.clearEffects = function () { + for (var i in this.sprites) { + this.sprites[i].clearEffects(); + } + }; + Animation.prototype._setAnchor = function (point) { + //if (!this.anchor.equals(point)) { + for (var i in this.sprites) { + this.sprites[i].anchor.setTo(point.x, point.y); + } + //} + }; + Animation.prototype._setRotation = function (radians) { + //if (this.rotation !== radians) { + for (var i in this.sprites) { + this.sprites[i].rotation = radians; + } + //} + }; + Animation.prototype._setScale = function (scale) { + //if (!this.scale.equals(scale)) { + for (var i in this.sprites) { + this.sprites[i].scale = scale; + } + //} + }; + /** + * Resets the animation to first frame. + */ + Animation.prototype.reset = function () { + this.currentFrame = 0; + }; + /** + * Indicates whether the animation is complete, animations that loop are never complete. */ - var Keyboard = (function (_super) { - __extends(Keyboard, _super); - function Keyboard(engine) { - _super.call(this); - this._keys = []; - this._keysUp = []; - this._keysDown = []; - this._engine = engine; + Animation.prototype.isDone = function () { + return (!this.loop && this.currentFrame >= this.sprites.length); + }; + /** + * Not meant to be called by game developers. Ticks the animation forward internally and + * calculates whether to change to the frame. + * @internal + */ + Animation.prototype.tick = function () { + var time = Date.now(); + if ((time - this._oldTime) > this.speed) { + this.currentFrame = (this.loop ? (this.currentFrame + 1) % this.sprites.length : this.currentFrame + 1); + this._oldTime = time; } - /** - * Initialize Keyboard event listeners - */ - Keyboard.prototype.init = function () { - var _this = this; - window.addEventListener('blur', function (ev) { - _this._keys.length = 0; // empties array efficiently - }); - // key up is on window because canvas cannot have focus - window.addEventListener('keyup', function (ev) { - var key = _this._keys.indexOf(ev.keyCode); - _this._keys.splice(key, 1); - _this._keysUp.push(ev.keyCode); - var keyEvent = new KeyEvent(ev.keyCode); - // alias the old api, we may want to deprecate this in the future - _this.eventDispatcher.emit('up', keyEvent); - _this.eventDispatcher.emit('release', keyEvent); - }); - // key down is on window because canvas cannot have focus - window.addEventListener('keydown', function (ev) { - if (_this._keys.indexOf(ev.keyCode) === -1) { - _this._keys.push(ev.keyCode); - _this._keysDown.push(ev.keyCode); - var keyEvent = new KeyEvent(ev.keyCode); - _this.eventDispatcher.emit('down', keyEvent); - _this.eventDispatcher.emit('press', keyEvent); - } - }); - }; - Keyboard.prototype.update = function (delta) { - // Reset keysDown and keysUp after update is complete - this._keysDown.length = 0; - this._keysUp.length = 0; - // Emit synthetic "hold" event - for (var i = 0; i < this._keys.length; i++) { - this.eventDispatcher.emit('hold', new KeyEvent(this._keys[i])); + }; + Animation.prototype._updateValues = function () { + this._setAnchor(this.anchor); + this._setRotation(this.rotation); + this._setScale(this.scale); + }; + /** + * Skips ahead a specified number of frames in the animation + * @param frames Frames to skip ahead + */ + Animation.prototype.skip = function (frames) { + this.currentFrame = (this.currentFrame + frames) % this.sprites.length; + }; + Animation.prototype.draw = function (ctx, x, y) { + this.tick(); + this._updateValues(); + var currSprite; + if (this.currentFrame < this.sprites.length) { + currSprite = this.sprites[this.currentFrame]; + if (this.flipVertical) { + currSprite.flipVertical = this.flipVertical; } - }; - /** - * Gets list of keys being pressed down - */ - Keyboard.prototype.getKeys = function () { - return this._keys; - }; - /** - * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame. - * @param key Test wether a key was just pressed - */ - Keyboard.prototype.wasPressed = function (key) { - return this._keysDown.indexOf(key) > -1; - }; - /** - * Tests if a certain key is held down. This is persisted between frames. - * @param key Test wether a key is held down - */ - Keyboard.prototype.isHeld = function (key) { - return this._keys.indexOf(key) > -1; - }; - /** - * Tests if a certain key was just released this frame. This is cleared at the end of the update frame. - * @param key Test wether a key was just released - */ - Keyboard.prototype.wasReleased = function (key) { - return this._keysUp.indexOf(key) > -1; - }; - return Keyboard; - })(ex.Class); - Input.Keyboard = Keyboard; - })(Input = ex.Input || (ex.Input = {})); + if (this.flipHorizontal) { + currSprite.flipHorizontal = this.flipHorizontal; + } + currSprite.draw(ctx, x, y); + } + if (this.freezeFrame !== -1 && this.currentFrame >= this.sprites.length) { + currSprite = this.sprites[ex.Util.clamp(this.freezeFrame, 0, this.sprites.length - 1)]; + currSprite.draw(ctx, x, y); + } + // add the calculated width + if (currSprite) { + this.width = currSprite.width; + this.height = currSprite.height; + } + }; + /** + * Plays an animation at an arbitrary location in the game. + * @param x The x position in the game to play + * @param y The y position in the game to play + */ + Animation.prototype.play = function (x, y) { + this.reset(); + this._engine.playAnimation(this, x, y); + }; + return Animation; + })(); + ex.Animation = Animation; })(ex || (ex = {})); +/// +/// +/// var ex; (function (ex) { - var Input; - (function (Input) { - /** - * Controller Support (Gamepads) - * - * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad) - * to provide controller support for your games. - * - * You can query any [[Gamepad|Gamepads]] that are connected or listen to events ("button" and "axis"). - * - * You must opt-in to controller support ([[Gamepads.enabled]]) because it is a polling-based - * API, so we have to check it each update frame. - * - * Any number of gamepads are supported using the [[Gamepads.at]] method. If a [[Gamepad]] is - * not connected, it will simply not throw events. - * - * ## Responding to button input - * - * [[Buttons|Gamepad buttons]] typically have values between 0 and 1, however depending on - * the sensitivity of the controller, even if a button is idle it could have a - * very tiny value. For this reason, you can pass in a threshold to several - * methods to customize how sensitive you want to be in detecting button presses. - * - * You can inspect any connected [[Gamepad]] using [[Gamepad.isButtonPressed]], [[Gamepad.getButton]], - * or you can subscribe to the `button` event published on the [[Gamepad]] which passes - * a [[GamepadButtonEvent]] to your handler. - * - * ```js - * // enable gamepad support - * engine.input.gamepads.enabled = true; - * - * // query gamepad on update - * engine.on("update", function (ev) { - * - * // access any gamepad by index - * if (engine.input.gamepads.at(0).isButtonPressed(ex.Input.Buttons.Face1)) { - * ex.Logger.getInstance().info("Controller A button pressed"); - * } - * - * // query individual button - * if (engine.input.gamepads.at(0).getButton(ex.Input.Buttons.DpadLeft) > 0.2) { - * ex.Logger.getInstance().info("Controller D-pad left value is > 0.2") - * } - * }); - * - * // subscribe to button events - * engine.input.gamepads.at(0).on("button", function (ev) { - * ex.Logger.getInstance().info(ev.button, ev.value); - * }); - * ``` - * - * ## Responding to axis input - * - * [[Axes|Gamepad axes]] typically have values between -1 and 1, but even idle - * sticks can still propogate very small values depending on the quality and age - * of a controller. For this reason, you can set [[Gamepads.MinAxisMoveThreshold]] - * to set the (absolute) threshold after which Excalibur will start publishing `axis` events. - * By default it is set to a value that normally will not throw events if a stick is idle. - * - * You can query axes via [[Gamepad.getAxes]] or by subscribing to the `axis` event on [[Gamepad]] - * which passes a [[GamepadAxisEvent]] to your handler. - * - * ```js - * // enable gamepad support - * engine.input.gamepads.enabled = true; - * - * // query gamepad on update - * engine.on("update", function (ev) { - * - * // access any gamepad by index - * var axisValue; - * if ((axisValue = engine.input.gamepads.at(0).getAxes(ex.Input.Axes.LeftStickX)) > 0.5) { - * ex.Logger.getInstance().info("Move right", axisValue); - * } - * }); - * - * // subscribe to axis events - * engine.input.gamepads.at(0).on("axis", function (ev) { - * ex.Logger.getInstance().info(ev.axis, ev.value); - * }); - * ``` - */ - var Gamepads = (function (_super) { - __extends(Gamepads, _super); - function Gamepads(engine) { - _super.call(this); - /** - * Whether or not to poll for Gamepad input (default: `false`) - */ - this.enabled = false; - /** - * Whether or not Gamepad API is supported - */ - this.supported = !!navigator.getGamepads; - this._gamePadTimeStamps = [0, 0, 0, 0]; - this._oldPads = []; - this._pads = []; - this._initSuccess = false; - this._navigator = navigator; - this._minimumConfiguration = null; - this._engine = engine; + var Internal; + (function (Internal) { + var FallbackAudio = (function () { + function FallbackAudio(path, volume) { + this._log = ex.Logger.getInstance(); + this.onload = function () { return; }; + this.onprogress = function () { return; }; + this.onerror = function () { return; }; + if (window.AudioContext) { + this._log.debug('Using new Web Audio Api for ' + path); + this._soundImpl = new WebAudio(path, volume); + } + else { + this._log.debug('Falling back to Audio Element for ' + path); + this._soundImpl = new AudioTag(path, volume); + } } - Gamepads.prototype.init = function () { - if (!this.supported) { - return; + FallbackAudio.prototype.setVolume = function (volume) { + this._soundImpl.setVolume(volume); + }; + FallbackAudio.prototype.setLoop = function (loop) { + this._soundImpl.setLoop(loop); + }; + FallbackAudio.prototype.load = function () { + this._soundImpl.onload = this.onload; + this._soundImpl.onprogress = this.onprogress; + this._soundImpl.onerror = this.onerror; + this._soundImpl.load(); + }; + FallbackAudio.prototype.isPlaying = function () { + return this._soundImpl.isPlaying(); + }; + FallbackAudio.prototype.play = function () { + return this._soundImpl.play(); + }; + FallbackAudio.prototype.pause = function () { + this._soundImpl.pause(); + }; + FallbackAudio.prototype.stop = function () { + this._soundImpl.stop(); + }; + return FallbackAudio; + })(); + Internal.FallbackAudio = FallbackAudio; + var AudioTag = (function () { + function AudioTag(path, volume) { + var _this = this; + this.path = path; + this._audioElements = new Array(5); + this._loadedAudio = null; + this._isLoaded = false; + this._index = 0; + this._log = ex.Logger.getInstance(); + this._isPlaying = false; + this._currentOffset = 0; + this.onload = function () { return; }; + this.onprogress = function () { return; }; + this.onerror = function () { return; }; + for (var i = 0; i < this._audioElements.length; i++) { + (function (i) { + _this._audioElements[i] = new Audio(); + })(i); } - if (this._initSuccess) { - return; + if (volume) { + this.setVolume(ex.Util.clamp(volume, 0, 1.0)); } - // In Chrome, this will return 4 undefined items until a button is pressed - // In FF, this will not return any items until a button is pressed - this._oldPads = this._clonePads(this._navigator.getGamepads()); - if (this._oldPads.length && this._oldPads[0]) { - this._initSuccess = true; + else { + this.setVolume(1.0); } + } + AudioTag.prototype.isPlaying = function () { + return this._isPlaying; }; - /** - * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means - * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive - * all other controllers with more axis or buttons are valid as well. If no minimum - * configuration is set all pads are valid. - */ - Gamepads.prototype.setMinimumGamepadConfiguration = function (config) { - this._enableAndUpdate(); // if config is used, implicitely enable - this._minimumConfiguration = config; + AudioTag.prototype._audioLoaded = function () { + this._isLoaded = true; }; - /** - * When implicitely enabled, set the enabled flag and run an update so information is updated - */ - Gamepads.prototype._enableAndUpdate = function () { - if (!this.enabled) { - this.enabled = true; - this.update(100); + AudioTag.prototype.setVolume = function (volume) { + var i = 0, len = this._audioElements.length; + for (i; i < len; i++) { + this._audioElements[i].volume = volume; } }; - /** - * Checks a navigator gamepad against the minimum configuration if present. - */ - Gamepads.prototype._isGamepadValid = function (pad) { - if (!this._minimumConfiguration) { - return true; + AudioTag.prototype.setLoop = function (loop) { + var i = 0, len = this._audioElements.length; + for (i; i < len; i++) { + this._audioElements[i].loop = loop; } - ; - if (!pad) { - return false; + }; + AudioTag.prototype.getLoop = function () { + this._audioElements.some(function (a) { return a.loop; }); + }; + AudioTag.prototype.load = function () { + var _this = this; + var request = new XMLHttpRequest(); + request.open('GET', this.path, true); + request.responseType = 'blob'; + request.onprogress = this.onprogress; + request.onerror = this.onerror; + request.onload = function (e) { + if (request.status !== 200) { + _this._log.error('Failed to load audio resource ', _this.path, ' server responded with error code', request.status); + _this.onerror(request.response); + _this._isLoaded = false; + return; + } + _this._loadedAudio = URL.createObjectURL(request.response); + _this._audioElements.forEach(function (a) { + a.src = _this._loadedAudio; + }); + _this.onload(e); + }; + request.send(); + }; + AudioTag.prototype.play = function () { + var _this = this; + this._audioElements[this._index].load(); + //this.audioElements[this.index].currentTime = this._currentOffset; + this._audioElements[this._index].play(); + this._currentOffset = 0; + var done = new ex.Promise(); + this._isPlaying = true; + if (!this.getLoop()) { + this._audioElements[this._index].addEventListener('ended', function () { + _this._isPlaying = false; + done.resolve(true); + }); } - ; - var axesLength = pad.axes.filter(function (value, index, array) { - return (typeof value !== undefined); - }).length; - var buttonLength = pad.buttons.filter(function (value, index, array) { - return (typeof value !== undefined); - }).length; - return axesLength >= this._minimumConfiguration.axis && - buttonLength >= this._minimumConfiguration.buttons && - pad.connected; + this._index = (this._index + 1) % this._audioElements.length; + return done; }; - Gamepads.prototype.on = function (eventName, handler) { - this._enableAndUpdate(); // implicitly enable - _super.prototype.on.call(this, eventName, handler); + AudioTag.prototype.pause = function () { + this._index = (this._index - 1 + this._audioElements.length) % this._audioElements.length; + this._currentOffset = this._audioElements[this._index].currentTime; + this._audioElements.forEach(function (a) { + a.pause(); + }); + this._isPlaying = false; }; - Gamepads.prototype.off = function (eventName, handler) { - this._enableAndUpdate(); // implicitly enable - _super.prototype.off.call(this, eventName, handler); + AudioTag.prototype.stop = function () { + this._audioElements.forEach(function (a) { + a.pause(); + //a.currentTime = 0; + }); + this._isPlaying = false; }; - /** - * Updates Gamepad state and publishes Gamepad events - */ - Gamepads.prototype.update = function (delta) { - if (!this.enabled || !this.supported) { - return; + return AudioTag; + })(); + Internal.AudioTag = AudioTag; + if (window.AudioContext) { + var audioContext = new window.AudioContext(); + } + var WebAudio = (function () { + function WebAudio(soundPath, volume) { + this._context = audioContext; + this._volume = this._context.createGain(); + this._buffer = null; + this._sound = null; + this._path = ''; + this._isLoaded = false; + this._loop = false; + this._isPlaying = false; + this._isPaused = false; + this._currentOffset = 0; + this._logger = ex.Logger.getInstance(); + this.onload = function () { return; }; + this.onprogress = function () { return; }; + this.onerror = function () { return; }; + this._path = soundPath; + if (volume) { + this._volume.gain.value = ex.Util.clamp(volume, 0, 1.0); } - this.init(); - var gamepads = this._navigator.getGamepads(); - for (var i = 0; i < gamepads.length; i++) { - if (!gamepads[i]) { - // If was connected, but now isn't emit the disconnect event - if (this.at(i).connected) { - this.eventDispatcher.emit('disconnect', new GamepadDisconnectEvent(i)); - } - // Reset connection status - this.at(i).connected = false; - continue; + else { + this._volume.gain.value = 1.0; // max volume + } + } + WebAudio.prototype.setVolume = function (volume) { + this._volume.gain.value = volume; + }; + WebAudio.prototype.load = function () { + var _this = this; + var request = new XMLHttpRequest(); + request.open('GET', this._path); + request.responseType = 'arraybuffer'; + request.onprogress = this.onprogress; + request.onerror = this.onerror; + request.onload = function () { + if (request.status !== 200) { + _this._logger.error('Failed to load audio resource ', _this._path, ' server responded with error code', request.status); + _this.onerror(request.response); + _this._isLoaded = false; + return; + } + _this._context.decodeAudioData(request.response, function (buffer) { + _this._buffer = buffer; + _this._isLoaded = true; + _this.onload(_this); + }, function (e) { + _this._logger.error('Unable to decode ' + _this._path + + ' this browser may not fully support this format, or the file may be corrupt, ' + + 'if this is an mp3 try removing id3 tags and album art from the file.'); + _this._isLoaded = false; + _this.onload(_this); + }); + }; + try { + request.send(); + } + catch (e) { + console.error('Error loading sound! If this is a cross origin error, you must host your sound with your html and javascript.'); + } + }; + WebAudio.prototype.setLoop = function (loop) { + this._loop = loop; + }; + WebAudio.prototype.isPlaying = function () { + return this._isPlaying; + }; + WebAudio.prototype.play = function () { + var _this = this; + if (this._isLoaded) { + this._sound = this._context.createBufferSource(); + this._sound.buffer = this._buffer; + this._sound.loop = this._loop; + this._sound.connect(this._volume); + this._volume.connect(this._context.destination); + this._sound.start(0, this._currentOffset % this._buffer.duration); + this._currentOffset = 0; + var done; + if (!this._isPaused || !this._playPromise) { + done = new ex.Promise(); } else { - if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) { - this.eventDispatcher.emit('connect', new GamepadConnectEvent(i, this.at(i))); - } - // Set connection status - this.at(i).connected = true; - } - ; - // Only supported in Chrome - if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) { - continue; + done = this._playPromise; } - this._gamePadTimeStamps[i] = gamepads[i].timestamp; - // Add reference to navigator gamepad - this.at(i).navigatorGamepad = gamepads[i]; - // Buttons - var b, a, value, buttonIndex, axesIndex; - for (b in Buttons) { - if (typeof Buttons[b] !== 'number') { - continue; - } - buttonIndex = Buttons[b]; - if (gamepads[i].buttons[buttonIndex]) { - value = gamepads[i].buttons[buttonIndex].value; - if (value !== this._oldPads[i].getButton(buttonIndex)) { - if (gamepads[i].buttons[buttonIndex].pressed) { - this.at(i).updateButton(buttonIndex, value); - this.at(i).eventDispatcher.publish('button', new GamepadButtonEvent(buttonIndex, value)); - } - else { - this.at(i).updateButton(buttonIndex, 0); - } + this._isPaused = false; + this._isPlaying = true; + if (!this._loop) { + this._sound.onended = (function () { + _this._isPlaying = false; + if (!_this._isPaused) { + done.resolve(true); } - } - } - // Axes - for (a in Axes) { - if (typeof Axes[a] !== 'number') { - continue; - } - axesIndex = Axes[a]; - value = gamepads[i].axes[axesIndex]; - if (value !== this._oldPads[i].getAxes(axesIndex)) { - this.at(i).updateAxes(axesIndex, value); - this.at(i).eventDispatcher.emit('axis', new GamepadAxisEvent(axesIndex, value)); - } + }).bind(this); } - this._oldPads[i] = this._clonePad(gamepads[i]); + this._playPromise = done; + return done; } - }; - /** - * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist - */ - Gamepads.prototype.at = function (index) { - this._enableAndUpdate(); // implicitly enable gamepads when at() is called - if (index >= this._pads.length) { - // Ensure there is a pad to retrieve - for (var i = this._pads.length - 1, max = index; i < max; i++) { - this._pads.push(new Gamepad()); - this._oldPads.push(new Gamepad()); - } + else { + return ex.Promise.wrap(true); } - return this._pads[index]; }; - /** - * Returns a list of all valid gamepads that meet the minimum configuration requirment. - */ - Gamepads.prototype.getValidGamepads = function () { - this._enableAndUpdate(); - var result = []; - for (var i = 0; i < this._pads.length; i++) { - if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) { - result.push(this.at(i)); + WebAudio.prototype.pause = function () { + if (this._isPlaying) { + try { + window.clearTimeout(this._playingTimer); + this._sound.stop(0); + this._currentOffset = this._context.currentTime; + this._isPlaying = false; + this._isPaused = true; + } + catch (e) { + this._logger.warn('The sound clip', this._path, 'has already been paused!'); } } - return result; - }; - /** - * Gets the number of connected gamepads - */ - Gamepads.prototype.count = function () { - return this._pads.filter(function (p) { return p.connected; }).length; - }; - Gamepads.prototype._clonePads = function (pads) { - var arr = []; - for (var i = 0, len = pads.length; i < len; i++) { - arr.push(this._clonePad(pads[i])); - } - return arr; }; - /** - * Fastest way to clone a known object is to do it yourself - */ - Gamepads.prototype._clonePad = function (pad) { - var i, len; - var clonedPad = new Gamepad(); - if (!pad) { - return clonedPad; - } - for (i = 0, len = pad.buttons.length; i < len; i++) { - if (pad.buttons[i]) { - clonedPad.updateButton(i, pad.buttons[i].value); + WebAudio.prototype.stop = function () { + if (this._sound) { + try { + window.clearTimeout(this._playingTimer); + this._currentOffset = 0; + this._sound.stop(0); + this._isPlaying = false; + this._isPaused = false; + } + catch (e) { + this._logger.warn('The sound clip', this._path, 'has already been stopped!'); } } - for (i = 0, len = pad.axes.length; i < len; i++) { - clonedPad.updateAxes(i, pad.axes[i]); - } - return clonedPad; }; - /** - * The minimum value an axis has to move before considering it a change - */ - Gamepads.MinAxisMoveThreshold = 0.05; - return Gamepads; - })(ex.Class); - Input.Gamepads = Gamepads; + return WebAudio; + })(); + Internal.WebAudio = WebAudio; + })(Internal = ex.Internal || (ex.Internal = {})); +})(ex || (ex = {})); +/// +// Promises/A+ Spec http://promises-aplus.github.io/promises-spec/ +var ex; +(function (ex) { + /** + * Valid states for a promise to be in + */ + (function (PromiseState) { + PromiseState[PromiseState["Resolved"] = 0] = "Resolved"; + PromiseState[PromiseState["Rejected"] = 1] = "Rejected"; + PromiseState[PromiseState["Pending"] = 2] = "Pending"; + })(ex.PromiseState || (ex.PromiseState = {})); + var PromiseState = ex.PromiseState; + /** + * Promises/A+ spec implementation of promises + * + * Promises are used to do asynchronous work and they are useful for + * creating a chain of actions. In Excalibur they are used for loading, + * sounds, animation, actions, and more. + * + * ## A Promise Chain + * + * Promises can be chained together and can be useful for creating a queue + * of functions to be called when something is done. + * + * The first [[Promise]] you will encounter is probably [[Engine.start]] + * which resolves when the game has finished loading. + * + * ```js + * var game = new ex.Engine(); + * + * // perform start-up logic once game is ready + * game.start().then(function () { + * + * // start-up & initialization logic + * + * }); + * ``` + * + * ## Handling errors + * + * You can optionally pass an error handler to [[Promise.then]] which will handle + * any errors that occur during Promise execution. + * + * ```js + * var game = new ex.Engine(); + * + * game.start().then( + * // success handler + * function () { + * }, + * + * // error handler + * function (err) { + * } + * ); + * ``` + * + * Any errors that go unhandled will be bubbled up to the browser. + */ + var Promise = (function () { + function Promise() { + this._state = PromiseState.Pending; + this._successCallbacks = []; + this._rejectCallback = function () { return; }; + this._logger = ex.Logger.getInstance(); + } + /** + * Wrap a value in a resolved promise + * @param value An optional value to wrap in a resolved promise + */ + Promise.wrap = function (value) { + var promise = (new Promise()).resolve(value); + return promise; + }; + /** + * Returns a new promise that resolves when all the promises passed to it resolve, or rejects + * when at least 1 promise rejects. + */ + Promise.join = function () { + var promises = []; + for (var _i = 0; _i < arguments.length; _i++) { + promises[_i - 0] = arguments[_i]; + } + var joinedPromise = new Promise(); + if (!promises || !promises.length) { + return joinedPromise.resolve(); + } + var total = promises.length; + var successes = 0; + var rejects = 0; + var errors = []; + promises.forEach(function (p) { + p.then(function () { + successes += 1; + if (successes === total) { + joinedPromise.resolve(); + } + else if (successes + rejects + errors.length === total) { + joinedPromise.reject(errors); + } + }, function () { + rejects += 1; + if (successes + rejects + errors.length === total) { + joinedPromise.reject(errors); + } + }).error(function (e) { + errors.push(e); + if ((errors.length + successes + rejects) === total) { + joinedPromise.reject(errors); + } + }); + }); + return joinedPromise; + }; /** - * Gamepad holds state information for a connected controller. See [[Gamepads]] - * for more information on handling controller input. + * Chain success and reject callbacks after the promise is resovled + * @param successCallback Call on resolution of promise + * @param rejectCallback Call on rejection of promise */ - var Gamepad = (function (_super) { - __extends(Gamepad, _super); - function Gamepad() { - _super.call(this); - this.connected = false; - this._buttons = new Array(16); - this._axes = new Array(4); - var i; - for (i = 0; i < this._buttons.length; i++) { - this._buttons[i] = 0; - } - for (i = 0; i < this._axes.length; i++) { - this._axes[i] = 0; + Promise.prototype.then = function (successCallback, rejectCallback) { + if (successCallback) { + this._successCallbacks.push(successCallback); + // If the promise is already resovled call immediately + if (this.state() === PromiseState.Resolved) { + try { + successCallback.call(this, this._value); + } + catch (e) { + this._handleError(e); + } } } - /** - * Whether or not the given button is pressed - * @param button The button to query - * @param threshold The threshold over which the button is considered to be pressed - */ - Gamepad.prototype.isButtonPressed = function (button, threshold) { - if (threshold === void 0) { threshold = 1; } - return this._buttons[button] >= threshold; - }; - /** - * Gets the given button value between 0 and 1 - */ - Gamepad.prototype.getButton = function (button) { - return this._buttons[button]; - }; - /** - * Gets the given axis value between -1 and 1. Values below - * [[MinAxisMoveThreshold]] are considered 0. - */ - Gamepad.prototype.getAxes = function (axes) { - var value = this._axes[axes]; - if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) { - return 0; - } - else { - return value; + if (rejectCallback) { + this._rejectCallback = rejectCallback; + // If the promise is already rejected call immediately + if (this.state() === PromiseState.Rejected) { + try { + rejectCallback.call(this, this._value); + } + catch (e) { + this._handleError(e); + } } - }; - Gamepad.prototype.updateButton = function (buttonIndex, value) { - this._buttons[buttonIndex] = value; - }; - Gamepad.prototype.updateAxes = function (axesIndex, value) { - this._axes[axesIndex] = value; - }; - return Gamepad; - })(ex.Class); - Input.Gamepad = Gamepad; - /** - * Gamepad Buttons enumeration - */ - (function (Buttons) { - /** - * Face 1 button (e.g. A) - */ - Buttons[Buttons["Face1"] = 0] = "Face1"; - /** - * Face 2 button (e.g. B) - */ - Buttons[Buttons["Face2"] = 1] = "Face2"; - /** - * Face 3 button (e.g. X) - */ - Buttons[Buttons["Face3"] = 2] = "Face3"; - /** - * Face 4 button (e.g. Y) - */ - Buttons[Buttons["Face4"] = 3] = "Face4"; - /** - * Left bumper button - */ - Buttons[Buttons["LeftBumper"] = 4] = "LeftBumper"; - /** - * Right bumper button - */ - Buttons[Buttons["RightBumper"] = 5] = "RightBumper"; - /** - * Left trigger button - */ - Buttons[Buttons["LeftTrigger"] = 6] = "LeftTrigger"; - /** - * Right trigger button - */ - Buttons[Buttons["RightTrigger"] = 7] = "RightTrigger"; - /** - * Select button - */ - Buttons[Buttons["Select"] = 8] = "Select"; - /** - * Start button - */ - Buttons[Buttons["Start"] = 9] = "Start"; - /** - * Left analog stick press (e.g. L3) - */ - Buttons[Buttons["LeftStick"] = 10] = "LeftStick"; - /** - * Right analog stick press (e.g. R3) - */ - Buttons[Buttons["RightStick"] = 11] = "RightStick"; - /** - * D-pad up - */ - Buttons[Buttons["DpadUp"] = 12] = "DpadUp"; - /** - * D-pad down - */ - Buttons[Buttons["DpadDown"] = 13] = "DpadDown"; - /** - * D-pad left - */ - Buttons[Buttons["DpadLeft"] = 14] = "DpadLeft"; - /** - * D-pad right - */ - Buttons[Buttons["DpadRight"] = 15] = "DpadRight"; - })(Input.Buttons || (Input.Buttons = {})); - var Buttons = Input.Buttons; - /** - * Gamepad Axes enumeration - */ - (function (Axes) { - /** - * Left analogue stick X direction - */ - Axes[Axes["LeftStickX"] = 0] = "LeftStickX"; - /** - * Left analogue stick Y direction - */ - Axes[Axes["LeftStickY"] = 1] = "LeftStickY"; - /** - * Right analogue stick X direction - */ - Axes[Axes["RightStickX"] = 2] = "RightStickX"; - /** - * Right analogue stick Y direction - */ - Axes[Axes["RightStickY"] = 3] = "RightStickY"; - })(Input.Axes || (Input.Axes = {})); - var Axes = Input.Axes; + } + return this; + }; /** - * Event recieved when a gamepad is connected to excalibur + * Add an error callback to the promise + * @param errorCallback Call if there was an error in a callback */ - var GamepadConnectEvent = (function (_super) { - __extends(GamepadConnectEvent, _super); - function GamepadConnectEvent(index, gamepad) { - _super.call(this); - this.index = index; - this.gamepad = gamepad; + Promise.prototype.error = function (errorCallback) { + if (errorCallback) { + this._errorCallback = errorCallback; } - return GamepadConnectEvent; - })(ex.GameEvent); - Input.GamepadConnectEvent = GamepadConnectEvent; + return this; + }; /** - * Event recieved when a gamepad is disconnected from excalibur + * Resolve the promise and pass an option value to the success callbacks + * @param value Value to pass to the success callbacks */ - var GamepadDisconnectEvent = (function (_super) { - __extends(GamepadDisconnectEvent, _super); - function GamepadDisconnectEvent(index) { - _super.call(this); - this.index = index; + Promise.prototype.resolve = function (value) { + var _this = this; + if (this._state === PromiseState.Pending) { + this._value = value; + try { + this._state = PromiseState.Resolved; + this._successCallbacks.forEach(function (cb) { + cb.call(_this, _this._value); + }); + } + catch (e) { + this._handleError(e); + } } - return GamepadDisconnectEvent; - })(ex.GameEvent); - Input.GamepadDisconnectEvent = GamepadDisconnectEvent; + else { + throw new Error('Cannot resolve a promise that is not in a pending state!'); + } + return this; + }; /** - * Gamepad button event. See [[Gamepads]] for information on responding to controller input. + * Reject the promise and pass an option value to the reject callbacks + * @param value Value to pass to the reject callbacks */ - var GamepadButtonEvent = (function (_super) { - __extends(GamepadButtonEvent, _super); - /** - * @param button The Gamepad button - * @param value A numeric value between 0 and 1 - */ - function GamepadButtonEvent(button, value) { - _super.call(this); - this.button = button; - this.value = value; + Promise.prototype.reject = function (value) { + if (this._state === PromiseState.Pending) { + this._value = value; + try { + this._state = PromiseState.Rejected; + this._rejectCallback.call(this, this._value); + } + catch (e) { + this._handleError(e); + } } - return GamepadButtonEvent; - })(ex.GameEvent); - Input.GamepadButtonEvent = GamepadButtonEvent; + else { + throw new Error('Cannot reject a promise that is not in a pending state!'); + } + return this; + }; /** - * Gamepad axis event. See [[Gamepads]] for information on responding to controller input. + * Inpect the current state of a promise */ - var GamepadAxisEvent = (function (_super) { - __extends(GamepadAxisEvent, _super); - /** - * @param axis The Gamepad axis - * @param value A numeric value between -1 and 1 - */ - function GamepadAxisEvent(axis, value) { - _super.call(this); - this.axis = axis; - this.value = value; + Promise.prototype.state = function () { + return this._state; + }; + Promise.prototype._handleError = function (e) { + if (this._errorCallback) { + this._errorCallback.call(this, e); } - return GamepadAxisEvent; - })(ex.GameEvent); - Input.GamepadAxisEvent = GamepadAxisEvent; - })(Input = ex.Input || (ex.Input = {})); + else { + // rethrow error + throw e; + } + }; + return Promise; + })(); + ex.Promise = Promise; })(ex || (ex = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/** - * # Welcome to the Excalibur API - * - * This documentation is automatically generated from the Excalibur - * source code on [GitHub](http://github.com/excaliburjs/Excalibur). - * - * If you're just starting out, we recommend reading the tutorials and guides - * on [Excaliburjs.com](http://excaliburjs.com/docs). If you have questions, - * feel free to get help on the [Excalibur.js mailing list](https://groups.google.com/forum/#!forum/excaliburjs). - * - * If you're looking for a specific method or property, you can search the documentation - * using the search icon at the top or just start typing. - * - * ## Where to Start - * - * These are the core concepts of Excalibur that you should be - * familiar with. - * - * - [[Engine|Intro to the Engine]] - * - [[EventDispatcher|Eventing]] - * - [[Scene|Working with Scenes]] - * - [[BaseCamera|Working with Cameras]] - * - [[Actor|Working with Actors]] - * - [[Label|Labels]] - * - [[Trigger|Triggers]] - * - [[UIActor|UI Actors (HUD)]] - * - [[ActionContext|Action API]] - * - [[Group|Groups]] - * - * ## Working with Resources - * - * Excalibur provides easy ways of loading assets, from images to JSON files. - * - * - [[Loader|Working with the Loader]] - * - [[Texture|Loading Textures]] - * - [[Sound|Loading Sounds]] - * - [[Resource|Loading Generic Resources]] - * - * ## Working with Input - * - * Excalibur comes built-in with support for mouse, keyboard, touch, and controllers. - * - * - [[Pointers|Mouse and Touch]] - * - [[Keyboard]] - * - [[Gamepads|Controller Support]] - * - * ## Working with Media - * - * Add sounds, images, and animations to your game. - * - * - [[Sprite|Working with Sprites]] - * - [[Sound|Working with Sounds]] - * - [[SpriteSheet|Working with SpriteSheets]] - * - [[Animation|Working with Animations]] - * - * ## Effects and Particles - * - * Every game needs an explosion or two. Add sprite effects such as lighten, - * darken, and colorize. - * - * - [[Effects|Sprite Effects]] - * - [[ParticleEmitter|Particle Emitters]] - * - * ## Math - * - * These classes provide the basics for math & algebra operations. - * - * - [[Point]] - * - [[Vector]] - * - [[Ray]] - * - [[Line]] - * - [[Projection]] - * - * ## Utilities - * - * - [[Util|Utility Functions]] - * - [[Promise|Promises and Async]] - * - [[Logger|Logging]] - * - [[Color|Colors]] - * - [[Timer|Timers]] - */ +/// var ex; (function (ex) { /** - * The Excalibur Engine - * - * The [[Engine]] is the main driver for a game. It is responsible for - * starting/stopping the game, maintaining state, transmitting events, - * loading resources, and managing the scene. + * Generic Resources * - * Excalibur uses the HTML5 Canvas API for drawing your game to the screen. - * The canvas is available to all `draw` functions for raw manipulation, - * but Excalibur is meant to simplify or completely remove the need to use - * the canvas directly. + * The [[Resource]] type allows games built in Excalibur to load generic resources. + * For any type of remote resource it is recommended to use [[Resource]] for preloading. * - * ## Creating a Game + * [[Resource]] is an [[ILoadable]] so it can be passed to a [[Loader]] to pre-load before + * a level or game. * - * To create a new game, create a new instance of [[Engine]] and pass in - * the configuration ([[IEngineOptions]]). Excalibur only supports a single - * instance of a game at a time, so it is safe to use globally. + * Example usages: JSON, compressed files, blobs. * - * You can then call [[start]] which starts the game and optionally accepts - * a [[Loader]] which you can use to pre-load assets. + * ## Pre-loading generic resources * * ```js - * var game = new ex.Engine({ width: 800, height: 600 }); + * var resLevel1 = new ex.Resource("/assets/levels/1.json", "application/json"); + * var loader = new ex.Loader(resLevel1); * - * // call game.start, which is a Promise - * game.start().then(function () { - * // ready, set, go! - * }); - * ``` + * // attach a handler to process once loaded + * resLevel1.processDownload = function (data) { * - * ## The Main Loop + * // process JSON + * var json = JSON.parse(data); * - * The Excalibur engine uses a simple main loop. The engine updates and renders - * the "scene graph" which is the [[Scene|scenes]] and the tree of [[Actor|actors]] within that - * scene. Only one [[Scene]] can be active at once, the engine does not update/draw any other - * scene, which means any actors will not be updated/drawn if they are part of a deactivated scene. + * // create a new level (inherits Scene) with the JSON configuration + * var level = new Level(json); * - * **Scene Graph** + * // add a new scene + * game.add(level.name, level); + * } * + * game.start(loader); * ``` - * Engine - * |_ Scene 1 (activated) - * |_ Actor 1 - * |_ Child Actor 1 - * |_ Actor 2 - * |_ Scene 2 (deactiveated) - * |_ Scene 3 (deactiveated) - * ``` - * - * The engine splits the game into two primary responsibilities: updating and drawing. This is - * to keep your game smart about splitting duties so that you aren't drawing when doing - * logic or performing logic as you draw. - * - * ### Update Loop - * - * The first operation run is the [[Engine.update|update]] loop. [[Actor]] and [[Scene]] both implement - * an overridable/extendable `update` method. Use it to perform any logic-based operations - * in your game for a particular class. - * - * ### Draw Loop - * - * The next step is the [[Engine.draw|draw]] loop. A [[Scene]] loops through its child [[Actor|actors]] and - * draws each one. You can override the `draw` method on an actor to customize its drawing. - * You should **not** perform any logic in a draw call, it should only relate to drawing. + */ + var Resource = (function () { + /** + * @param path Path to the remote resource + * @param responseType The Content-Type to expect (e.g. `application/json`) + * @param bustCache Whether or not to cache-bust requests + */ + function Resource(path, responseType, bustCache) { + if (bustCache === void 0) { bustCache = true; } + this.path = path; + this.responseType = responseType; + this.bustCache = bustCache; + this.data = null; + this.logger = ex.Logger.getInstance(); + this.onprogress = function () { return; }; + this.oncomplete = function () { return; }; + this.onerror = function () { return; }; + } + /** + * Returns true if the Resource is completely loaded and is ready + * to be drawn. + */ + Resource.prototype.isLoaded = function () { + return !!this.data; + }; + Resource.prototype.wireEngine = function (engine) { + this._engine = engine; + }; + Resource.prototype._cacheBust = function (uri) { + var query = /\?\w*=\w*/; + if (query.test(uri)) { + uri += ('&__=' + Date.now()); + } + else { + uri += ('?__=' + Date.now()); + } + return uri; + }; + Resource.prototype._start = function (e) { + this.logger.debug('Started loading resource ' + this.path); + }; + /** + * Begin loading the resource and returns a promise to be resolved on completion + */ + Resource.prototype.load = function () { + var _this = this; + var complete = new ex.Promise(); + var request = new XMLHttpRequest(); + request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true); + request.responseType = this.responseType; + request.onloadstart = function (e) { _this._start(e); }; + request.onprogress = this.onprogress; + request.onerror = this.onerror; + request.onload = function (e) { + if (request.status !== 200) { + _this.logger.error('Failed to load resource ', _this.path, ' server responded with error code', request.status); + _this.onerror(request.response); + complete.resolve(request.response); + return; + } + _this.data = _this.processDownload(request.response); + _this.oncomplete(); + _this.logger.debug('Completed loading resource', _this.path); + complete.resolve(_this.data); + }; + request.send(); + return complete; + }; + /** + * Returns the loaded data once the resource is loaded + */ + Resource.prototype.getData = function () { + return this.data; + }; + /** + * This method is meant to be overriden to handle any additional + * processing. Such as decoding downloaded audio bits. + */ + Resource.prototype.processDownload = function (data) { + // Handle any additional loading after the xhr has completed. + return URL.createObjectURL(data); + }; + return Resource; + })(); + ex.Resource = Resource; +})(ex || (ex = {})); +/// +/// +/// +/// +/// +var ex; +(function (ex) { + /** + * Textures * - * ## Working with Scenes + * The [[Texture]] object allows games built in Excalibur to load image resources. + * [[Texture]] is an [[ILoadable]] which means it can be passed to a [[Loader]] + * to pre-load before starting a level or game. * - * The engine automatically creates a "root" [[Scene]]. You can use this for whatever you want. - * You can manipulate scenes using [[Engine.add|add]], [[Engine.remove|remove]], - * and [[Engine.goToScene|goToScene]]. You can overwrite or remove the `root` scene if - * you want. There always has to be at least one scene and only **one** scene can be - * active at any one time. + * Textures are the raw image so to add a drawing to a game, you must create + * a [[Sprite]]. You can use [[Texture.asSprite]] to quickly generate a Sprite + * instance. * - * Learn more about the [[Scene|scene lifecycle]]. + * ## Pre-loading textures * - * ### Adding a scene + * Pass the [[Texture]] to a [[Loader]] to pre-load the asset. Once a [[Texture]] + * is loaded, you can generate a [[Sprite]] with it. * * ```js - * var game = new ex.Engine(); - * - * // create a new level - * var level1 = new ex.Scene(); - * - * // add level 1 to the game - * game.add("level1", level1); - * - * // in response to user input, go to level 1 - * game.goToScene("level1"); - * - * // go back to main menu - * game.goToScene("root"); - * ``` - * - * ### Accessing the current scene - * - * To add actors and other entities to the current [[Scene]], you can use [[Engine.add|add]]. Alternatively, - * you can use [[Engine.currentScene]] to directly access the current scene. - * - * ## Managing the Viewport - * - * Excalibur supports multiple [[DisplayMode|display modes]] for a game. Pass in a `displayMode` - * option when creating a game to customize the viewport. - * - * ## Extending the Engine - * - * For complex games, any entity that inherits [[Class]] can be extended to override built-in - * functionality. This is recommended for [[Actor|actors]] and [[Scene|scenes]], especially. - * - * You can customize the options or provide more for your game by extending [[Engine]]. - * - * **TypeScript** - * - * ```ts - * class Game extends ex.Engine { - * - * constructor() { - * super({ width: 800, height: 600, displayMode: DisplayMode.FullScreen }); - * } + * var txPlayer = new ex.Texture("/assets/tx/player.png"); * - * public start() { - * // add custom scenes - * this.add("mainmenu", new MainMenu()); + * var loader = new ex.Loader(txPlayer); * - * return super.start(myLoader).then(() => { + * game.start(loader).then(function () { * - * this.goToScene("mainmenu"); + * var player = new ex.Actor(); * - * // custom start-up - * }); - * } - * } + * player.addDrawing(txPlayer); * - * var game = new Game(); - * game.start(); + * game.add(player); + * }); * ``` + */ + var Texture = (function (_super) { + __extends(Texture, _super); + /** + * @param path Path to the image resource + * @param bustCache Optionally load texture with cache busting + */ + function Texture(path, bustCache) { + if (bustCache === void 0) { bustCache = true; } + _super.call(this, path, 'blob', bustCache); + this.path = path; + this.bustCache = bustCache; + /** + * A [[Promise]] that resolves when the Texture is loaded. + */ + this.loaded = new ex.Promise(); + this._isLoaded = false; + this._sprite = null; + this._sprite = new ex.Sprite(this, 0, 0, 0, 0); + } + /** + * Returns true if the Texture is completely loaded and is ready + * to be drawn. + */ + Texture.prototype.isLoaded = function () { + return this._isLoaded; + }; + /** + * Begins loading the texture and returns a promise to be resolved on completion + */ + Texture.prototype.load = function () { + var _this = this; + var complete = new ex.Promise(); + var loaded = _super.prototype.load.call(this); + loaded.then(function () { + _this.image = new Image(); + _this.image.addEventListener('load', function () { + _this._isLoaded = true; + _this.width = _this._sprite.swidth = _this._sprite.naturalWidth = _this._sprite.width = _this.image.naturalWidth; + _this.height = _this._sprite.sheight = _this._sprite.naturalHeight = _this._sprite.height = _this.image.naturalHeight; + _this.loaded.resolve(_this.image); + complete.resolve(_this.image); + }); + _this.image.src = _super.prototype.getData.call(_this); + }, function () { + complete.reject('Error loading texture.'); + }); + return complete; + }; + Texture.prototype.asSprite = function () { + return this._sprite; + }; + return Texture; + })(ex.Resource); + ex.Texture = Texture; + /** + * Sounds * - * **Javascript** + * The [[Sound]] object allows games built in Excalibur to load audio + * components, from soundtracks to sound effects. [[Sound]] is an [[ILoadable]] + * which means it can be passed to a [[Loader]] to pre-load before a game or level. * - * ```js - * var Game = ex.Engine.extend({ + * ## Pre-loading sounds * - * constructor: function () { - * Engine.call(this, { width: 800, height: 600, displayMode: DisplayMode.FullScreen }); - * } + * Pass the [[Sound]] to a [[Loader]] to pre-load the asset. Once a [[Sound]] + * is loaded, you can [[Sound.play|play]] it. * - * start: function() { - * // add custom scenes - * this.add("mainmenu", new MainMenu()); + * ```js + * // define multiple sources (such as mp3/wav/ogg) as a browser fallback + * var sndPlayerDeath = new ex.Sound("/assets/snd/player-death.mp3", "/assets/snd/player-death.wav"); * - * var _this = this; - * return Engine.prototype.start.call(this, myLoader).then(function() { + * var loader = new ex.Loader(sndPlayerDeath); * - * _this.goToScene("mainmenu"); + * game.start(loader).then(function () { * - * // custom start-up - * }); - * } + * sndPlayerDeath.play(); * }); - * - * var game = new Game(); - * game.start(); * ``` */ - var Engine = (function (_super) { - __extends(Engine, _super); + var Sound = (function () { /** - * @internal + * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility. */ - function Engine(args) { - _super.call(this); - /** - * Gets or sets the [[CollisionStrategy]] for Excalibur actors - */ - this.collisionStrategy = ex.CollisionStrategy.DynamicAABBTree; - this._hasStarted = false; - /** - * Current FPS - */ - this.fps = 0; - /** - * Gets or sets the list of post processors to apply at the end of drawing a frame (such as [[ColorBlindCorrector]]) - */ - this.postProcessors = []; - /** - * Contains all the scenes currently registered with Excalibur - */ - this.scenes = {}; - this._animations = []; - /** - * Indicates whether the engine is set to fullscreen or not - */ - this.isFullscreen = false; - /** - * Indicates the current [[DisplayMode]] of the engine. - */ - this.displayMode = DisplayMode.FullScreen; - /** - * Indicates whether audio should be paused when the game is no longer visible. - */ - this.pauseAudioWhenHidden = true; - /** - * Indicates whether the engine should draw with debug information - */ - this.isDebug = false; - this.debugColor = new ex.Color(255, 255, 255); - /** - * Sets the background color for the engine. - */ - this.backgroundColor = new ex.Color(0, 0, 100); - /** - * The action to take when a fatal exception is thrown + function Sound() { + var paths = []; + for (var _i = 0; _i < arguments.length; _i++) { + paths[_i - 0] = arguments[_i]; + } + this._logger = ex.Logger.getInstance(); + this.onprogress = function () { return; }; + this.oncomplete = function () { return; }; + this.onerror = function () { return; }; + this.onload = function () { return; }; + this._isLoaded = false; + this._selectedFile = ''; + this._wasPlayingOnHidden = false; + /* Chrome : MP3, WAV, Ogg + * Firefox : WAV, Ogg, + * IE : MP3, WAV coming soon + * Safari MP3, WAV, Ogg */ - this.onFatalException = function (e) { ex.Logger.getInstance().fatal(e); }; - this._isSmoothingEnabled = true; - this._isLoading = false; - this._progress = 0; - this._total = 1; - var width; - var height; - var canvasElementId; - var displayMode; - var options = null; - if (typeof arguments[0] === 'number') { - width = arguments[0]; - height = arguments[1]; - canvasElementId = arguments[2]; - displayMode = arguments[3]; + this._selectedFile = ''; + for (var i = 0; i < paths.length; i++) { + if (Sound.canPlayFile(paths[i])) { + this._selectedFile = paths[i]; + break; + } } - else { - options = arguments[0] || { width: 0, height: 0, canvasElementId: '', displayMode: DisplayMode.FullScreen }; - width = options.width; - height = options.height; - canvasElementId = options.canvasElementId; - displayMode = options.displayMode; + if (!this._selectedFile) { + this._logger.warn('This browser does not support any of the audio files specified:', paths.join(', ')); + this._logger.warn('Attempting to use', paths[0]); + this._selectedFile = paths[0]; // select the first specified } - // Check compatibility - var detector = new ex.Detector(); - if (!(this._compatible = detector.test())) { - var message = document.createElement('div'); - message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur'; - document.body.appendChild(message); - detector.failedTests.forEach(function (test) { - var testMessage = document.createElement('div'); - testMessage.innerText = 'Browser feature missing ' + test; - document.body.appendChild(testMessage); + this.sound = new ex.Internal.FallbackAudio(this._selectedFile, 1.0); + } + /** + * Whether or not the browser can play this file as HTML5 Audio + */ + Sound.canPlayFile = function (file) { + try { + var a = new Audio(); + var filetype = /.*\.([A-Za-z0-9]+)$/; + var type = file.match(filetype)[1]; + if (a.canPlayType('audio/' + type)) { + return true; + } + { + return false; + } + } + catch (e) { + ex.Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e); + return false; + } + }; + Sound.prototype.wireEngine = function (engine) { + var _this = this; + if (engine) { + this._engine = engine; + this._engine.on('hidden', function () { + if (engine.pauseAudioWhenHidden && _this.isPlaying()) { + _this._wasPlayingOnHidden = true; + _this.pause(); + } }); - if (canvasElementId) { - var canvas = document.getElementById(canvasElementId); - if (canvas) { - canvas.parentElement.removeChild(canvas); + this._engine.on('visible', function () { + if (engine.pauseAudioWhenHidden && _this._wasPlayingOnHidden) { + _this.play(); + _this._wasPlayingOnHidden = false; } - } - return; + }); } - this._logger = ex.Logger.getInstance(); - this._logger.info('Powered by Excalibur.js visit", "http://excaliburjs.com", "for more information.'); - this._logger.debug('Building engine...'); - this.canvasElementId = canvasElementId; - if (canvasElementId) { - this._logger.debug('Using Canvas element specified: ' + canvasElementId); - this.canvas = document.getElementById(canvasElementId); + }; + /** + * Sets the volume of the sound clip + * @param volume A volume value between 0-1.0 + */ + Sound.prototype.setVolume = function (volume) { + if (this.sound) { + this.sound.setVolume(volume); } - else { - this._logger.debug('Using generated canvas element'); - this.canvas = document.createElement('canvas'); + }; + /** + * Indicates whether the clip should loop when complete + * @param loop Set the looping flag + */ + Sound.prototype.setLoop = function (loop) { + if (this.sound) { + this.sound.setLoop(loop); } - if (width && height) { - if (displayMode === undefined) { - this.displayMode = DisplayMode.Fixed; - } - this._logger.debug('Engine viewport is size ' + width + ' x ' + height); - this.width = width; - this.canvas.width = width; - this.height = height; - this.canvas.height = height; + }; + /** + * Whether or not the sound is playing right now + */ + Sound.prototype.isPlaying = function () { + if (this.sound) { + return this.sound.isPlaying(); } - else if (!displayMode) { - this._logger.debug('Engine viewport is fullscreen'); - this.displayMode = DisplayMode.FullScreen; + }; + /** + * Play the sound, returns a promise that resolves when the sound is done playing + */ + Sound.prototype.play = function () { + if (this.sound) { + return this.sound.play(); } - this._loader = new ex.Loader(); - this._initialize(options); - this.rootScene = this.currentScene = new ex.Scene(this); - this.addScene('root', this.rootScene); - this.goToScene('root'); - } + }; /** - * Plays a sprite animation on the screen at the specified `x` and `y` - * (in game coordinates, not screen pixels). These animations play - * independent of actors, and will be cleaned up internally as soon - * as they are complete. Note animations that loop will never be - * cleaned up. - * - * @param animation Animation to play - * @param x x game coordinate to play the animation - * @param y y game coordinate to play the animation + * Stop the sound, and do not rewind */ - Engine.prototype.playAnimation = function (animation, x, y) { - this._animations.push(new AnimationNode(animation, x, y)); + Sound.prototype.pause = function () { + if (this.sound) { + this.sound.pause(); + } }; /** - * Adds an actor to the [[currentScene]] of the game. This is synonymous - * to calling `engine.currentScene.addChild(actor)`. - * - * Actors can only be drawn if they are a member of a scene, and only - * the [[currentScene]] may be drawn or updated. - * - * @param actor The actor to add to the [[currentScene]] - * - * @obsolete Use [[add]] instead. + * Stop the sound and rewind */ - Engine.prototype.addChild = function (actor) { - this.currentScene.addChild(actor); + Sound.prototype.stop = function () { + if (this.sound) { + this.sound.stop(); + } }; /** - * Removes an actor from the [[currentScene]] of the game. This is synonymous - * to calling `engine.currentScene.removeChild(actor)`. - * Actors that are removed from a scene will no longer be drawn or updated. - * - * @param actor The actor to remove from the [[currentScene]]. + * Returns true if the sound is loaded */ - Engine.prototype.removeChild = function (actor) { - this.currentScene.removeChild(actor); + Sound.prototype.isLoaded = function () { + return this._isLoaded; }; /** - * Adds a [[TileMap]] to the [[currentScene]], once this is done the TileMap - * will be drawn and updated. + * Begins loading the sound and returns a promise to be resolved on completion */ - Engine.prototype.addTileMap = function (tileMap) { - this.currentScene.addTileMap(tileMap); + Sound.prototype.load = function () { + var _this = this; + var complete = new ex.Promise(); + this._logger.debug('Started loading sound', this._selectedFile); + this.sound.onprogress = this.onprogress; + this.sound.onload = function () { + _this.oncomplete(); + _this._isLoaded = true; + _this._logger.debug('Completed loading sound', _this._selectedFile); + complete.resolve(_this.sound); + }; + this.sound.onerror = function (e) { + _this.onerror(e); + complete.resolve(e); + }; + this.sound.load(); + return complete; }; + return Sound; + })(); + ex.Sound = Sound; + /** + * Pre-loading assets + * + * The loader provides a mechanism to preload multiple resources at + * one time. The loader must be passed to the engine in order to + * trigger the loading progress bar. + * + * The [[Loader]] itself implements [[ILoadable]] so you can load loaders. + * + * ## Example: Pre-loading resources for a game + * + * ```js + * // create a loader + * var loader = new ex.Loader(); + * + * // create a resource dictionary (best practice is to keep a separate file) + * var resources = { + * TextureGround: new ex.Texture("/images/textures/ground.png"), + * SoundDeath: new ex.Sound("/sound/death.wav", "/sound/death.mp3") + * }; + * + * // loop through dictionary and add to loader + * for (var loadable in resources) { + * if (resources.hasOwnProperty(loadable)) { + * loader.addResource(loadable); + * } + * } + * + * // start game + * game.start(loader).then(function () { + * console.log("Game started!"); + * }); + * ``` + */ + var Loader = (function () { /** - * Removes a [[TileMap]] from the [[currentScene]], it will no longer be drawn or updated. + * @param loadables Optionally provide the list of resources you want to load at constructor time */ - Engine.prototype.removeTileMap = function (tileMap) { - this.currentScene.removeTileMap(tileMap); + function Loader(loadables) { + this._resourceList = []; + this._index = 0; + this._resourceCount = 0; + this._numLoaded = 0; + this._progressCounts = {}; + this._totalCounts = {}; + this.onprogress = function () { return; }; + this.oncomplete = function () { return; }; + this.onerror = function () { return; }; + if (loadables) { + this.addResources(loadables); + } + } + Loader.prototype.wireEngine = function (engine) { + this._engine = engine; }; /** - * Adds a [[Timer]] to the [[currentScene]]. - * @param timer The timer to add to the [[currentScene]]. + * Add a resource to the loader to load + * @param loadable Resource to add */ - Engine.prototype.addTimer = function (timer) { - return this.currentScene.addTimer(timer); + Loader.prototype.addResource = function (loadable) { + var key = this._index++; + this._resourceList.push(loadable); + this._progressCounts[key] = 0; + this._totalCounts[key] = 1; + this._resourceCount++; }; /** - * Removes a [[Timer]] from the [[currentScene]]. - * @param timer The timer to remove to the [[currentScene]]. + * Add a list of resources to the loader to load + * @param loadables The list of resources to load */ - Engine.prototype.removeTimer = function (timer) { - return this.currentScene.removeTimer(timer); + Loader.prototype.addResources = function (loadables) { + var i = 0, len = loadables.length; + for (i; i < len; i++) { + this.addResource(loadables[i]); + } + }; + Loader.prototype._sumCounts = function (obj) { + var sum = 0; + var prev = 0; + for (var i in obj) { + sum += obj[i] | 0; + } + return sum; }; /** - * Adds a [[Scene]] to the engine, think of scenes in Excalibur as you - * would levels or menus. - * - * @param key The name of the scene, must be unique - * @param scene The scene to add to the engine + * Returns true if the loader has completely loaded all resources */ - Engine.prototype.addScene = function (key, scene) { - if (this.scenes[key]) { - this._logger.warn('Scene', key, 'already exists overwriting'); - } - this.scenes[key] = scene; - scene.engine = this; + Loader.prototype.isLoaded = function () { + return this._numLoaded === this._resourceCount; }; /** - * @internal + * Begin loading all of the supplied resources, returning a promise + * that resolves when loading of all is complete */ - Engine.prototype.removeScene = function (entity) { - if (entity instanceof ex.Scene) { - // remove scene - for (var key in this.scenes) { - if (this.scenes.hasOwnProperty(key)) { - if (this.scenes[key] === entity) { - delete this.scenes[key]; - } + Loader.prototype.load = function () { + var _this = this; + var complete = new ex.Promise(); + var me = this; + if (this._resourceList.length === 0) { + me.oncomplete.call(me); + return complete; + } + var progressArray = new Array(this._resourceList.length); + var progressChunks = this._resourceList.length; + this._resourceList.forEach(function (r, i) { + if (_this._engine) { + r.wireEngine(_this._engine); + } + r.onprogress = function (e) { + var total = e.total; + var loaded = e.loaded; + progressArray[i] = { loaded: ((loaded / total) * (100 / progressChunks)), total: 100 }; + var progressResult = progressArray.reduce(function (accum, next) { + return { loaded: (accum.loaded + next.loaded), total: 100 }; + }, { loaded: 0, total: 100 }); + me.onprogress.call(me, progressResult); + }; + r.oncomplete = r.onerror = function () { + me._numLoaded++; + if (me._numLoaded === me._resourceCount) { + me.onprogress.call(me, { loaded: 100, total: 100 }); + me.oncomplete.call(me); + complete.resolve(); } + }; + }); + function loadNext(list, index) { + if (!list[index]) { + return; } + list[index].load().then(function () { + loadNext(list, index + 1); + }); } - if (typeof entity === 'string') { - // remove scene - delete this.scenes[entity]; - } - }; - Engine.prototype.add = function (entity) { - if (entity instanceof ex.UIActor) { - this.currentScene.addUIActor(entity); - return; - } - if (entity instanceof ex.Actor) { - this.addChild(entity); - } - if (entity instanceof ex.Timer) { - this.addTimer(entity); - } - if (entity instanceof ex.TileMap) { - this.addTileMap(entity); - } - if (arguments.length === 2) { - this.addScene(arguments[0], arguments[1]); - } + loadNext(this._resourceList, 0); + return complete; }; - Engine.prototype.remove = function (entity) { - if (entity instanceof ex.UIActor) { - this.currentScene.removeUIActor(entity); - return; - } - if (entity instanceof ex.Actor) { - this.removeChild(entity); - } - if (entity instanceof ex.Timer) { - this.removeTimer(entity); - } - if (entity instanceof ex.TileMap) { - this.removeTileMap(entity); + return Loader; + })(); + ex.Loader = Loader; +})(ex || (ex = {})); +/// +var ex; +(function (ex) { + var Detector = (function () { + function Detector() { + this.failedTests = []; + // critical browser features required for ex to run + this._criticalTests = { + // Test canvas/2d context support + canvasSupport: function () { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }, + // Test array buffer support ex uses for downloading binary data + arrayBufferSupport: function () { + var xhr = new XMLHttpRequest(); + xhr.open('GET', '/'); + try { + xhr.responseType = 'arraybuffer'; + } + catch (e) { + return false; + } + return xhr.responseType === 'arraybuffer'; + }, + // Test data urls ex uses for sprites + dataUrlSupport: function () { + var canvas = document.createElement('canvas'); + return canvas.toDataURL('image/png').indexOf('data:image/png') === 0; + }, + // Test object url support for loading + objectUrlSupport: function () { + return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL; + }, + // RGBA support for colors + rgbaSupport: function () { + var style = document.createElement('a').style; + style.cssText = 'background-color:rgba(150,255,150,.5)'; + return ('' + style.backgroundColor).indexOf('rgba') > -1; + } + }; + // warnings excalibur performance will be degraded + this._warningTest = { + webAudioSupport: function () { + return !!(window.AudioContext || + window.webkitAudioContext || + window.mozAudioContext || + window.msAudioContext || + window.oAudioContext); + }, + webglSupport: function () { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('webgl')); + } + }; + } + Detector.prototype.test = function () { + // Critical test will for ex not to run + var failedCritical = false; + for (var test in this._criticalTests) { + if (!this._criticalTests[test]()) { + this.failedTests.push(test); + ex.Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test); + failedCritical = true; + } } - if (entity instanceof ex.Scene) { - this.removeScene(entity); + if (failedCritical) { + return false; } - if (typeof entity === 'string') { - this.removeScene(entity); + // Warning tests do not for ex to return false to compatibility + for (var warning in this._warningTest) { + if (!this._warningTest[warning]()) { + ex.Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning); + } } + return true; }; + return Detector; + })(); + ex.Detector = Detector; +})(ex || (ex = {})); +/// +/// +/// +var ex; +(function (ex) { + /** + * Excalibur's built in templating class, it is a loadable that will load + * and html fragment from a url. Excalibur templating is very basic only + * allowing bindings of the type `data-text="this.obj.someprop"`, + * `data-style="color:this.obj.color.toString()"`. Bindings allow all valid + * Javascript expressions. + */ + var Template = (function () { /** - * Changes the currently updating and drawing scene to a different, - * named scene. Calls the [[Scene]] lifecycle events. - * @param key The key of the scene to trasition to. + * @param path Location of the html template */ - Engine.prototype.goToScene = function (key) { - if (this.scenes[key]) { - var oldScene = this.currentScene; - var newScene = this.scenes[key]; - this._logger.debug('Going to scene:', key); - // only deactivate when initialized - if (this.currentScene.isInitialized) { - this.currentScene.onDeactivate.call(this.currentScene); - this.currentScene.eventDispatcher.emit('deactivate', new ex.DeactivateEvent(newScene)); - } - // set current scene to new one - this.currentScene = newScene; - if (!this.currentScene.isInitialized) { - this.currentScene.onInitialize.call(this.currentScene, this); - this.currentScene.eventDispatcher.emit('initialize', new ex.InitializeEvent(this)); - this.currentScene.isInitialized = true; - } - this.currentScene.onActivate.call(this.currentScene); - this.currentScene.eventDispatcher.emit('activate', new ex.ActivateEvent(oldScene)); - } - else { - this._logger.error('Scene', key, 'does not exist!'); - } + function Template(path) { + this.path = path; + this._isLoaded = false; + this.logger = ex.Logger.getInstance(); + this.onprogress = function () { return; }; + this.oncomplete = function () { return; }; + this.onerror = function () { return; }; + this._innerElement = document.createElement('div'); + this._innerElement.className = 'excalibur-template'; + } + Template.prototype.wireEngine = function (engine) { + this._engine = engine; }; /** - * Returns the width of the engine's drawing surface in pixels. + * Returns the full html template string once loaded. */ - Engine.prototype.getWidth = function () { - if (this.currentScene && this.currentScene.camera) { - return this.width / this.currentScene.camera.getZoom(); + Template.prototype.getTemplateString = function () { + if (!this._isLoaded) { + return ''; } - return this.width; + return this._htmlString; }; - /** - * Returns the height of the engine's drawing surface in pixels. - */ - Engine.prototype.getHeight = function () { - if (this.currentScene && this.currentScene.camera) { - return this.height / this.currentScene.camera.getZoom(); - } - return this.height; + Template.prototype._compile = function () { + this._innerElement.innerHTML = this._htmlString; + this._styleElements = this._innerElement.querySelectorAll('[data-style]'); + this._textElements = this._innerElement.querySelectorAll('[data-text]'); }; - /** - * Transforms the current x, y from screen coordinates to world coordinates - * @param point Screen coordinate to convert - */ - Engine.prototype.screenToWorldCoordinates = function (point) { - var newX = point.x; - var newY = point.y; - // transform back to world space - newX = (newX / this.canvas.clientWidth) * this.getWidth(); - newY = (newY / this.canvas.clientHeight) * this.getHeight(); - // transform based on zoom - newX = newX - this.getWidth() / 2; - newY = newY - this.getHeight() / 2; - // shift by focus - if (this.currentScene && this.currentScene.camera) { - var focus = this.currentScene.camera.getFocus(); - newX += focus.x; - newY += focus.y; - } - return new ex.Point(Math.floor(newX), Math.floor(newY)); + Template.prototype._evaluateExpresion = function (expression, ctx) { + var func = new Function('return ' + expression + ';'); + var val = func.call(ctx); + return val; }; /** - * Transforms a world coordinate, to a screen coordinate - * @param point World coordinate to convert + * Applies any ctx object you wish and evaluates the template. + * Overload this method to include your favorite template library. + * You may return either an HTML string or a Dom node. + * @param ctx Any object you wish to apply to the template */ - Engine.prototype.worldToScreenCoordinates = function (point) { - var screenX = point.x; - var screenY = point.y; - // shift by focus - if (this.currentScene && this.currentScene.camera) { - var focus = this.currentScene.camera.getFocus(); - screenX -= focus.x; - screenY -= focus.y; + Template.prototype.apply = function (ctx) { + var _this = this; + /* tslint:disable:no-string-literal */ + for (var j = 0; j < this._styleElements.length; j++) { + (function () { + // poor man's json parse for things that aren't exactly json :( + // Extract style expressions + var styles = {}; + _this._styleElements[j].dataset['style'].split(';').forEach(function (s) { + if (s) { + var vals = s.split(':'); + styles[vals[0].trim()] = vals[1].trim(); + } + }); + // Evaluate parsed style expressions + for (var style in styles) { + (function () { + var expression = styles[style]; + _this._styleElements[j].style[style] = _this._evaluateExpresion(expression, ctx); + })(); + } + })(); } - // transfrom back on zoom - screenX = screenX + this.getWidth() / 2; - screenY = screenY + this.getHeight() / 2; - // transform back to screen space - screenX = (screenX * this.canvas.clientWidth) / this.getWidth(); - screenY = (screenY * this.canvas.clientHeight) / this.getHeight(); - return new ex.Point(Math.floor(screenX), Math.floor(screenY)); - }; - /** - * Sets the internal canvas height based on the selected display mode. - */ - Engine.prototype._setHeightByDisplayMode = function (parent) { - if (this.displayMode === DisplayMode.Container) { - this.width = this.canvas.width = parent.clientWidth; - this.height = this.canvas.height = parent.clientHeight; + for (var i = 0; i < this._textElements.length; i++) { + (function () { + // Evaluate text expressions + var expression = _this._textElements[i].dataset['text']; + _this._textElements[i].innerText = _this._evaluateExpresion(expression, ctx); + })(); } - if (this.displayMode === DisplayMode.FullScreen) { - document.body.style.margin = '0px'; - document.body.style.overflow = 'hidden'; - this.width = this.canvas.width = parent.innerWidth; - this.height = this.canvas.height = parent.innerHeight; + // If the template HTML has a root element return that, otherwise use constructed root + if (this._innerElement.children.length === 1) { + this._innerElement = this._innerElement.firstChild; } + /* tslint:enable:no-string-literal */ + return this._innerElement; }; /** - * Initializes the internal canvas, rendering context, displaymode, and native event listeners + * Begins loading the template. Returns a promise that resolves with the template string when loaded. */ - Engine.prototype._initialize = function (options) { + Template.prototype.load = function () { var _this = this; - if (this.displayMode === DisplayMode.FullScreen || this.displayMode === DisplayMode.Container) { - var parent = (this.displayMode === DisplayMode.Container ? - (this.canvas.parentElement || document.body) : window); - this._setHeightByDisplayMode(parent); - window.addEventListener('resize', function (ev) { - _this._logger.debug('View port resized'); - _this._setHeightByDisplayMode(parent); - _this._logger.info('parent.clientHeight ' + parent.clientHeight); - _this.setAntialiasing(_this._isSmoothingEnabled); - }); - } - // initialize inputs - this.input = { - keyboard: new ex.Input.Keyboard(this), - pointers: new ex.Input.Pointers(this), - gamepads: new ex.Input.Gamepads(this) - }; - this.input.keyboard.init(); - this.input.pointers.init(options ? options.pointerScope : ex.Input.PointerScope.Document); - this.input.gamepads.init(); - // Issue #385 make use of the visibility api - // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API - document.addEventListener('visibilitychange', function () { - if (document.hidden || document.msHidden) { - _this.eventDispatcher.emit('hidden', new ex.HiddenEvent()); - _this._logger.debug('Window hidden'); - } - else { - _this.eventDispatcher.emit('visible', new ex.VisibleEvent()); - _this._logger.debug('Window visible'); + var complete = new ex.Promise(); + var request = new XMLHttpRequest(); + request.open('GET', this.path, true); + request.responseType = 'text'; + request.onprogress = this.onprogress; + request.onerror = this.onerror; + request.onload = function (e) { + if (request.status !== 200) { + _this.logger.error('Failed to load html template resource ', _this.path, ' server responded with error code', request.status); + _this.onerror(request.response); + _this._isLoaded = false; + complete.resolve('error'); + return; } - }); - /* - // DEPRECATED in favor of visibility api - window.addEventListener('blur', () => { - this.eventDispatcher.publish(EventType[EventType.Blur], new BlurEvent()); - }); - - window.addEventListener('focus', () => { - this.eventDispatcher.publish(EventType[EventType.Focus], new FocusEvent()); - });*/ - this.ctx = this.canvas.getContext('2d'); - if (!this.canvasElementId) { - document.body.appendChild(this.canvas); + _this._htmlString = request.response; + _this.oncomplete(); + _this.logger.debug('Completed loading template', _this.path); + _this._compile(); + _this._isLoaded = true; + complete.resolve(_this._htmlString); + }; + if (request.overrideMimeType) { + request.overrideMimeType('text/plain; charset=x-user-defined'); } + request.send(); + return complete; }; /** - * If supported by the browser, this will set the antialiasing flag on the - * canvas. Set this to `false` if you want a 'jagged' pixel art look to your - * image resources. - * @param isSmooth Set smoothing to true or false + * Indicates whether the template has been loaded */ - Engine.prototype.setAntialiasing = function (isSmooth) { - this._isSmoothingEnabled = isSmooth; - this.ctx.imageSmoothingEnabled = isSmooth; - this.ctx.webkitImageSmoothingEnabled = isSmooth; - this.ctx.mozImageSmoothingEnabled = isSmooth; - this.ctx.msImageSmoothingEnabled = isSmooth; + Template.prototype.isLoaded = function () { + return this._isLoaded; }; + return Template; + })(); + ex.Template = Template; + /** + * Excalibur's binding library that allows you to bind an html + * template to the dom given a certain context. Excalibur bindings are only updated + * when the update() method is called + */ + var Binding = (function () { /** - * Return the current smoothing status of the canvas + * @param parentElementId The id of the element in the dom to attach the template binding + * @param template The template you wish to bind + * @param ctx The context of the binding, which can be any object */ - Engine.prototype.getAntialiasing = function () { - return this.ctx.imageSmoothingEnabled || - this.ctx.webkitImageSmoothingEnabled || - this.ctx.mozImageSmoothingEnabled || - this.ctx.msImageSmoothingEnabled; - }; + function Binding(parentElementId, template, ctx) { + this.parent = document.getElementById(parentElementId); + this.template = template; + this._ctx = ctx; + this.update(); + } /** - * Updates the entire state of the game - * @param delta Number of milliseconds elapsed since the last update. + * Listen to any arbitrary object's events to update this binding + * @param obj Any object that supports addEventListener + * @param events A list of events to listen for + * @param handler A optional handler to fire on any event */ - Engine.prototype._update = function (delta) { - if (this._isLoading) { - // suspend updates untill loading is finished - return; + Binding.prototype.listen = function (obj, events, handler) { + var _this = this; + // todo + if (!handler) { + handler = function () { + _this.update(); + }; + } + if (obj.addEventListener) { + events.forEach(function (e) { + obj.addEventListener(e, handler); + }); } - // process engine level events - this.currentScene.update(this, delta); - // update animations - this._animations = this._animations.filter(function (a) { - return !a.animation.isDone(); - }); - // Update input listeners - this.input.keyboard.update(delta); - this.input.pointers.update(delta); - this.input.gamepads.update(delta); - // Publish update event - this.eventDispatcher.emit(ex.EventType[ex.EventType.Update], new ex.UpdateEvent(delta)); }; /** - * Draws the entire game - * @param draw Number of milliseconds elapsed since the last draw. + * Update this template binding with the latest values from + * the ctx reference passed to the constructor */ - Engine.prototype._draw = function (delta) { - var ctx = this.ctx; - if (this._isLoading) { - ctx.fillStyle = 'black'; - ctx.fillRect(0, 0, this.width, this.height); - this._drawLoadingBar(ctx, this._progress, this._total); - // Drawing nothing else while loading - return; - } - ctx.clearRect(0, 0, this.width, this.height); - ctx.fillStyle = this.backgroundColor.toString(); - ctx.fillRect(0, 0, this.width, this.height); - this.currentScene.draw(this.ctx, delta); - // todo needs to be a better way of doing this - var a = 0, len = this._animations.length; - for (a; a < len; a++) { - this._animations[a].animation.draw(ctx, this._animations[a].x, this._animations[a].y); + Binding.prototype.update = function () { + var html = this._applyTemplate(this.template, this._ctx); + if (html instanceof String) { + this.parent.innerHTML = html; } - this.fps = 1.0 / (delta / 1000); - // Draw debug information - if (this.isDebug) { - this.ctx.font = 'Consolas'; - this.ctx.fillStyle = this.debugColor.toString(); - var keys = this.input.keyboard.getKeys(); - for (var j = 0; j < keys.length; j++) { - this.ctx.fillText(keys[j].toString() + ' : ' + (ex.Input.Keys[keys[j]] ? ex.Input.Keys[keys[j]] : 'Not Mapped'), 100, 10 * j + 10); + if (html instanceof Node) { + if (this.parent.lastChild !== html) { + this.parent.appendChild(html); } - this.ctx.fillText('FPS:' + this.fps.toFixed(2).toString(), 10, 10); } - // Post processing - for (var i = 0; i < this.postProcessors.length; i++) { - this.postProcessors[i].process(this.ctx.getImageData(0, 0, this.width, this.height), this.ctx); + }; + Binding.prototype._applyTemplate = function (template, ctx) { + if (template.isLoaded()) { + return template.apply(ctx); } - //ctx.drawImage(currentImage, 0, 0, this.width, this.height); }; + return Binding; + })(); + ex.Binding = Binding; +})(ex || (ex = {})); +/// +var ex; +(function (ex) { + /** + * Enum representing the different horizontal text alignments + */ + (function (TextAlign) { /** - * Starts the internal game loop for Excalibur after loading - * any provided assets. - * @param loader Optional resources to load before starting the main loop. Some [[ILoadable]] such as a [[Loader]] collection, - * [[Sound]], or [[Texture]]. + * The text is left-aligned. */ - Engine.prototype.start = function (loader) { - if (!this._compatible) { - var promise = new ex.Promise(); - return promise.reject('Excalibur is incompatible with your browser'); - } - var loadingComplete; - if (loader) { - loader.wireEngine(this); - loadingComplete = this.load(loader); - } - else { - loadingComplete = ex.Promise.wrap(); - } - if (!this._hasStarted) { - this._hasStarted = true; - this._logger.debug('Starting game...'); - // Mainloop - var lastTime = Date.now(); - var game = this; - (function mainloop() { - if (!game._hasStarted) { - return; - } - try { - game._requestId = window.requestAnimationFrame(mainloop); - // Get the time to calculate time-elapsed - var now = Date.now(); - var elapsed = Math.floor(now - lastTime) || 1; - // Resolves issue #138 if the game has been paused, or blurred for - // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability - // and provides more expected behavior when the engine comes back - // into focus - if (elapsed > 200) { - elapsed = 1; - } - game._update(elapsed); - game._draw(elapsed); - lastTime = now; - } - catch (e) { - window.cancelAnimationFrame(game._requestId); - game.stop(); - game.onFatalException(e); - } - })(); - this._logger.debug('Game started'); - } - else { - } - return loadingComplete; - }; + TextAlign[TextAlign["Left"] = 0] = "Left"; /** - * Stops Excalibur's main loop, useful for pausing the game. + * The text is right-aligned. + */ + TextAlign[TextAlign["Right"] = 1] = "Right"; + /** + * The text is centered. + */ + TextAlign[TextAlign["Center"] = 2] = "Center"; + /** + * The text is aligned at the normal start of the line (left-aligned for left-to-right locales, + * right-aligned for right-to-left locales). + */ + TextAlign[TextAlign["Start"] = 3] = "Start"; + /** + * The text is aligned at the normal end of the line (right-aligned for left-to-right locales, + * left-aligned for right-to-left locales). + */ + TextAlign[TextAlign["End"] = 4] = "End"; + })(ex.TextAlign || (ex.TextAlign = {})); + var TextAlign = ex.TextAlign; + /** + * Enum representing the different baseline text alignments + */ + (function (BaseAlign) { + /** + * The text baseline is the top of the em square. + */ + BaseAlign[BaseAlign["Top"] = 0] = "Top"; + /** + * The text baseline is the hanging baseline. Currently unsupported; this will act like + * alphabetic. + */ + BaseAlign[BaseAlign["Hanging"] = 1] = "Hanging"; + /** + * The text baseline is the middle of the em square. + */ + BaseAlign[BaseAlign["Middle"] = 2] = "Middle"; + /** + * The text baseline is the normal alphabetic baseline. + */ + BaseAlign[BaseAlign["Alphabetic"] = 3] = "Alphabetic"; + /** + * The text baseline is the ideographic baseline; this is the bottom of + * the body of the characters, if the main body of characters protrudes + * beneath the alphabetic baseline. Currently unsupported; this will + * act like alphabetic. + */ + BaseAlign[BaseAlign["Ideographic"] = 4] = "Ideographic"; + /** + * The text baseline is the bottom of the bounding box. This differs + * from the ideographic baseline in that the ideographic baseline + * doesn't consider descenders. + */ + BaseAlign[BaseAlign["Bottom"] = 5] = "Bottom"; + })(ex.BaseAlign || (ex.BaseAlign = {})); + var BaseAlign = ex.BaseAlign; + /** + * Labels + * + * Labels are the way to draw small amounts of text to the screen. They are + * actors and inherit all of the benifits and capabilities. + * + * ## Creating a Label + * + * You can pass in arguments to the [[Label.constructor]] or simply set the + * properties you need after creating an instance of the [[Label]]. + * + * Since labels are [[Actor|Actors]], they need to be added to a [[Scene]] + * to be drawn and updated on-screen. + * + * ```js + * var game = new ex.Engine(); + * + * // constructor + * var label = new ex.Label("Hello World", 50, 50, "10px Arial"); + * + * // properties + * var label = new ex.Label(); + * label.x = 50; + * label.y = 50; + * label.font = "10px Arial"; + * label.text = "Foo"; + * label.color = ex.Color.White; + * label.textAlign = ex.TextAlign.Center; + * + * // add to current scene + * game.add(label); + * + * // start game + * game.start(); + * ``` + * + * ## Web Fonts + * + * The HTML5 Canvas API draws text using CSS syntax. Because of this, web fonts + * are fully supported. To draw a web font, follow the same procedure you use + * for CSS. Then simply pass in the font string to the [[Label]] constructor + * or set [[Label.font]]. + * + * **index.html** + * + * ```html + * + * + * + * + * + * + * + * + * + * + * + * ``` + * + * **game.js** + * + * ```js + * var game = new ex.Engine(); + * + * var label = new ex.Label(); + * label.font = "12px Foobar, Arial, Sans-Serif"; + * label.text = "Hello World"; + * + * game.add(label); + * game.start(); + * ``` + * + * ## Performance Implications + * + * It is recommended to use a [[SpriteFont]] for labels as the raw Canvas + * API for drawing text is slow (`fillText`). Too many labels that + * do not use sprite fonts will visibly affect the frame rate of your game. + * + * Alternatively, you can always use HTML and CSS to draw UI elements, but + * currently Excalibur does not provide a way to easily interact with the + * DOM. Still, this will not affect canvas performance and is a way to + * lighten your game, if needed. + */ + var Label = (function (_super) { + __extends(Label, _super); + /** + * @param text The text of the label + * @param x The x position of the label + * @param y The y position of the label + * @param font Use any valid CSS font string for the label's font. Web fonts are supported. Default is `10px sans-serif`. + * @param spriteFont Use an Excalibur sprite font for the label's font, if a SpriteFont is provided it will take precendence + * over a css font. */ - Engine.prototype.stop = function () { - if (this._hasStarted) { - this._hasStarted = false; - this._logger.debug('Game stopped'); + function Label(text, x, y, font, spriteFont) { + _super.call(this, x, y); + /** + * The font size in pixels, default is 10px + */ + this.fontSize = 10; + /** + * Gets or sets the horizontal text alignment property for the label. + */ + this.textAlign = TextAlign.Left; + /** + * Gets or sets the baseline alignment property for the label. + */ + this.baseAlign = BaseAlign.Bottom; + /** + * Gets or sets the letter spacing on a Label. Only supported with Sprite Fonts. + */ + this.letterSpacing = 0; //px + /** + * Whether or not the [[SpriteFont]] will be case-sensitive when matching characters. + */ + this.caseInsensitive = true; + this._textShadowOn = false; + this._shadowOffsetX = 0; + this._shadowOffsetY = 0; + this._shadowColor = ex.Color.Black.clone(); + this._shadowColorDirty = false; + this._textSprites = {}; + this._shadowSprites = {}; + this._color = ex.Color.Black.clone(); + this.text = text || ''; + this.color = ex.Color.Black.clone(); + this.spriteFont = spriteFont; + this.collisionType = ex.CollisionType.PreventCollision; + this.font = font || '10px sans-serif'; // coallesce to default canvas font + if (spriteFont) { } - }; + } /** - * Takes a screen shot of the current viewport and returns it as an - * HTML Image Element. + * Returns the width of the text in the label (in pixels); + * @param ctx Rending context to measure the string with */ - Engine.prototype.screenshot = function () { - var result = new Image(); - var raw = this.canvas.toDataURL('image/png'); - result.src = raw; - return result; + Label.prototype.getTextWidth = function (ctx) { + var oldFont = ctx.font; + ctx.font = this.font; + var width = ctx.measureText(this.text).width; + ctx.font = oldFont; + return width; }; - /** - * Draws the Excalibur loading bar - * @param ctx The canvas rendering context - * @param loaded Number of bytes loaded - * @param total Total number of bytes to load - */ - Engine.prototype._drawLoadingBar = function (ctx, loaded, total) { - if (this._loadingDraw) { - this._loadingDraw(ctx, loaded, total); - return; + // TypeScript doesn't support string enums :( + Label.prototype._lookupTextAlign = function (textAlign) { + switch (textAlign) { + case TextAlign.Left: + return 'left'; + case TextAlign.Right: + return 'right'; + case TextAlign.Center: + return 'center'; + case TextAlign.End: + return 'end'; + case TextAlign.Start: + return 'start'; + default: + return 'start'; } - var y = this.canvas.height / 2; - var width = this.canvas.width / 3; - var x = width; - // loading image - var image = new Image(); - /* tslint:disable:max-line-length */ - // 64 bit string encoding of the excalibur logo - image.src = 'data:image/png;base64,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'; - /* tslint:enable:max-line-length */ - var imageHeight = width * 3 / 8; - var oldAntialias = this.getAntialiasing(); - this.setAntialiasing(true); - ctx.drawImage(image, 0, 0, 800, 300, x, y - imageHeight - 20, width, imageHeight); - // loading box - ctx.strokeStyle = 'white'; - ctx.lineWidth = 2; - ctx.strokeRect(x, y, width, 20); - var progress = width * (loaded / total); - ctx.fillStyle = 'white'; - var margin = 5; - var progressWidth = progress - margin * 2; - var height = 20 - margin * 2; - ctx.fillRect(x + margin, y + margin, progressWidth > 0 ? progressWidth : 0, height); - this.setAntialiasing(oldAntialias); }; - /** - * Sets the loading screen draw function if you want to customize the draw - * @param fcn Callback to draw the loading screen which is passed a rendering context, the number of bytes loaded, and the total - * number of bytes to load. - */ - Engine.prototype.setLoadingDrawFunction = function (fcn) { - this._loadingDraw = fcn; + Label.prototype._lookupBaseAlign = function (baseAlign) { + switch (baseAlign) { + case BaseAlign.Alphabetic: + return 'alphabetic'; + case BaseAlign.Bottom: + return 'bottom'; + case BaseAlign.Hanging: + return 'hangin'; + case BaseAlign.Ideographic: + return 'ideographic'; + case BaseAlign.Middle: + return 'middle'; + case BaseAlign.Top: + return 'top'; + default: + return 'alphabetic'; + } }; /** - * Another option available to you to load resources into the game. - * Immediately after calling this the game will pause and the loading screen - * will appear. - * @param loader Some [[ILoadable]] such as a [[Loader]] collection, [[Sound]], or [[Texture]]. + * Sets the text shadow for sprite fonts + * @param offsetX The x offset in pixels to place the shadow + * @param offsetY The y offset in pixles to place the shadow + * @param shadowColor The color of the text shadow */ - Engine.prototype.load = function (loader) { - var _this = this; - var complete = new ex.Promise(); - this._isLoading = true; - loader.onprogress = function (e) { - _this._progress = e.loaded; - _this._total = e.total; - _this._logger.debug('Loading ' + (100 * _this._progress / _this._total).toFixed(0)); - }; - loader.oncomplete = function () { - setTimeout(function () { - _this._isLoading = false; - complete.resolve(); - }, 500); - }; - loader.load(); - return complete; + Label.prototype.setTextShadow = function (offsetX, offsetY, shadowColor) { + this.spriteFont.setTextShadow(offsetX, offsetY, shadowColor); }; - return Engine; - })(ex.Class); - ex.Engine = Engine; - /** - * Enum representing the different display modes available to Excalibur - */ - (function (DisplayMode) { - /** - * Show the game as full screen - */ - DisplayMode[DisplayMode["FullScreen"] = 0] = "FullScreen"; /** - * Scale the game to the parent DOM container + * Toggles text shadows on or off, only applies when using sprite fonts */ - DisplayMode[DisplayMode["Container"] = 1] = "Container"; + Label.prototype.useTextShadow = function (on) { + this.spriteFont.useTextShadow(on); + }; /** - * Show the game as a fixed size + * Clears the current text shadow */ - DisplayMode[DisplayMode["Fixed"] = 2] = "Fixed"; - })(ex.DisplayMode || (ex.DisplayMode = {})); - var DisplayMode = ex.DisplayMode; - /** - * @internal - */ - var AnimationNode = (function () { - function AnimationNode(animation, x, y) { - this.animation = animation; - this.x = x; - this.y = y; - } - return AnimationNode; - })(); + Label.prototype.clearTextShadow = function () { + this._textShadowOn = false; + this._shadowOffsetX = 0; + this._shadowOffsetY = 0; + this._shadowColor = ex.Color.Black.clone(); + }; + Label.prototype.update = function (engine, delta) { + _super.prototype.update.call(this, engine, delta); + /* + if (this.spriteFont && (this._color !== this.color || this.previousOpacity !== this.opacity)) { + for (var character in this._textSprites) { + this._textSprites[character].clearEffects(); + this._textSprites[character].fill(this.color.clone()); + this._textSprites[character].opacity(this.opacity); + + } + this._color = this.color; + this.previousOpacity = this.opacity; + } + + if (this.spriteFont && this._textShadowOn && this._shadowColorDirty && this._shadowColor) { + for (var characterShadow in this._shadowSprites) { + this._shadowSprites[characterShadow].clearEffects(); + this._shadowSprites[characterShadow].addEffect(new Effects.Fill(this._shadowColor.clone())); + } + this._shadowColorDirty = false; + }*/ + }; + Label.prototype.draw = function (ctx, delta) { + ctx.save(); + ctx.translate(this.x, this.y); + ctx.scale(this.scale.x, this.scale.y); + ctx.rotate(this.rotation); + if (this._textShadowOn) { + ctx.save(); + ctx.translate(this._shadowOffsetX, this._shadowOffsetY); + this._fontDraw(ctx, delta, this._shadowSprites); + ctx.restore(); + } + this._fontDraw(ctx, delta, this._textSprites); + _super.prototype.draw.call(this, ctx, delta); + ctx.restore(); + }; + Label.prototype._fontDraw = function (ctx, delta, sprites) { + if (this.spriteFont) { + this.spriteFont.draw(ctx, this.text, 0, 0, { + color: this.color.clone(), + baseAlign: this.baseAlign, + textAlign: this.textAlign, + fontSize: this.fontSize, + letterSpacing: this.letterSpacing, + opacity: this.opacity + }); + } + else { + var oldAlign = ctx.textAlign; + var oldTextBaseline = ctx.textBaseline; + ctx.textAlign = this._lookupTextAlign(this.textAlign); + ctx.textBaseline = this._lookupBaseAlign(this.baseAlign); + if (this.color) { + this.color.a = this.opacity; + } + ctx.fillStyle = this.color.toString(); + ctx.font = this.fontSize + " " + this.font; + if (this.maxWidth) { + ctx.fillText(this.text, 0, 0, this.maxWidth); + } + else { + ctx.fillText(this.text, 0, 0); + } + ctx.textAlign = oldAlign; + ctx.textBaseline = oldTextBaseline; + } + }; + Label.prototype.debugDraw = function (ctx) { + _super.prototype.debugDraw.call(this, ctx); + }; + return Label; + })(ex.Actor); + ex.Label = Label; })(ex || (ex = {})); +/// var ex; (function (ex) { - /** - * An enum that describes the strategies that rotation actions can use - */ - (function (RotationType) { + var Input; + (function (Input) { /** - * Rotation via `ShortestPath` will use the smallest angle - * between the starting and ending points. This strategy is the default behavior. + * The type of pointer for a [[PointerEvent]]. */ - RotationType[RotationType["ShortestPath"] = 0] = "ShortestPath"; + (function (PointerType) { + PointerType[PointerType["Touch"] = 0] = "Touch"; + PointerType[PointerType["Mouse"] = 1] = "Mouse"; + PointerType[PointerType["Pen"] = 2] = "Pen"; + PointerType[PointerType["Unknown"] = 3] = "Unknown"; + })(Input.PointerType || (Input.PointerType = {})); + var PointerType = Input.PointerType; /** - * Rotation via `LongestPath` will use the largest angle - * between the starting and ending points. + * The mouse button being pressed. */ - RotationType[RotationType["LongestPath"] = 1] = "LongestPath"; + (function (PointerButton) { + PointerButton[PointerButton["Left"] = 0] = "Left"; + PointerButton[PointerButton["Middle"] = 1] = "Middle"; + PointerButton[PointerButton["Right"] = 2] = "Right"; + PointerButton[PointerButton["Unknown"] = 3] = "Unknown"; + })(Input.PointerButton || (Input.PointerButton = {})); + var PointerButton = Input.PointerButton; /** - * Rotation via `Clockwise` will travel in a clockwise direction, - * regardless of the starting and ending points. + * Determines the scope of handling mouse/touch events. See [[Pointers]] for more information. */ - RotationType[RotationType["Clockwise"] = 2] = "Clockwise"; + (function (PointerScope) { + /** + * Handle events on the `canvas` element only. Events originating outside the + * `canvas` will not be handled. + */ + PointerScope[PointerScope["Canvas"] = 0] = "Canvas"; + /** + * Handles events on the entire document. All events will be handled by Excalibur. + */ + PointerScope[PointerScope["Document"] = 1] = "Document"; + })(Input.PointerScope || (Input.PointerScope = {})); + var PointerScope = Input.PointerScope; /** - * Rotation via `CounterClockwise` will travel in a counterclockwise direction, - * regardless of the starting and ending points. + * Pointer events + * + * Represents a mouse, touch, or stylus event. See [[Pointers]] for more information on + * handling pointer input. + * + * For mouse-based events, you can inspect [[PointerEvent.button]] to see what button was pressed. */ - RotationType[RotationType["CounterClockwise"] = 3] = "CounterClockwise"; - })(ex.RotationType || (ex.RotationType = {})); - var RotationType = ex.RotationType; -})(ex || (ex = {})); -/// -/// -/// -/// -/** - * See [[ActionContext|Action API]] for more information about Actions. - */ -var ex; -(function (ex) { - var Internal; - (function (Internal) { - var Actions; - (function (Actions) { - var EaseTo = (function () { - function EaseTo(actor, x, y, duration, easingFcn) { - this.actor = actor; - this.easingFcn = easingFcn; - this._currentLerpTime = 0; - this._lerpDuration = 1 * 1000; // 5 seconds - this._lerpStart = new ex.Point(0, 0); - this._lerpEnd = new ex.Point(0, 0); - this._initialized = false; - this._stopped = false; - this._distance = 0; - this._lerpDuration = duration; - this._lerpEnd = new ex.Point(x, y); + var PointerEvent = (function (_super) { + __extends(PointerEvent, _super); + /** + * @param x The `x` coordinate of the event (in world coordinates) + * @param y The `y` coordinate of the event (in world coordinates) + * @param index The index of the pointer (zero-based) + * @param pointerType The type of pointer + * @param button The button pressed (if [[PointerType.Mouse]]) + * @param ev The raw DOM event being handled + */ + function PointerEvent(x, y, index, pointerType, button, ev) { + _super.call(this); + this.x = x; + this.y = y; + this.index = index; + this.pointerType = pointerType; + this.button = button; + this.ev = ev; + } + return PointerEvent; + })(ex.GameEvent); + Input.PointerEvent = PointerEvent; + ; + /** + * Mouse and Touch (Pointers) + * + * Handles pointer events (mouse, touch, stylus, etc.) and normalizes to + * [W3C Pointer Events](http://www.w3.org/TR/pointerevents/). + * + * There is always at least one [[Pointer]] available ([[Pointers.primary]]) and + * you can request multiple pointers to support multi-touch scenarios. + * + * Since [[Pointers.primary]] normalizes both mouse and touch events, your game + * automatically supports touch for the primary pointer by default. When + * you handle the events, you can customize what your game does based on the type + * of pointer, if applicable. + * + * Excalibur handles mouse/touch events and normalizes them to a [[PointerEvent]] + * that your game can subscribe to and handle (`engine.input.pointers`). + * + * ## Events + * + * You can subscribe to pointer events through `engine.input.pointers.on`. A [[PointerEvent]] object is + * passed to your handler which offers information about the pointer input being received. + * + * - `down` - When a pointer is pressed down (any mouse button or finger press) + * - `up` - When a pointer is lifted + * - `move` - When a pointer moves (be wary of performance issues when subscribing to this) + * - `cancel` - When a pointer event is canceled for some reason + * + * ```js + * engine.input.pointers.primary.on("down", function (evt) { }); + * engine.input.pointers.primary.on("up", function (evt) { }); + * engine.input.pointers.primary.on("move", function (evt) { }); + * engine.input.pointers.primary.on("cancel", function (evt) { }); + * ``` + * + * ## Pointer scope (window vs. canvas) + * + * You have the option to handle *all* pointer events in the browser by setting + * [[IEngineOptions.pointerScope]] to [[PointerScope.Document]]. If this is enabled, + * Excalibur will handle every pointer event in the browser. This is useful for handling + * complex input and having control over every interaction. + * + * You can also use [[PointerScope.Canvas]] to only scope event handling to the game + * canvas. This is useful if you don't care about events that occur outside the game. + * + * One real-world example is dragging and gestures. Sometimes a player will drag their + * finger outside your game and then into it, expecting it to work. If [[PointerScope]] + * is set to [[PointerScope.Canvas|Canvas]] this will not work. If it is set to + * [[PointerScope.Document|Document]], it will. + * + * ## Responding to input + * + * The primary pointer can be a mouse, stylus, or single finger touch event. You + * can inspect what type of pointer it is from the [[PointerEvent]] handled. + * + * ```js + * engine.input.pointers.primary.on("down", function (pe) { + * if (pe.pointerType === ex.Input.PointerType.Mouse) { + * ex.Logger.getInstance().info("Mouse event:", pe); + * } else if (pe.pointerType === ex.Input.PointerType.Touch) { + * ex.Logger.getInstance().info("Touch event:", pe); + * } + * }); + * ``` + * + * ## Multiple Pointers (Multi-Touch) + * + * When there is more than one pointer detected on the screen, + * this is considered multi-touch. For example, pressing one finger, + * then another, will create two pointers. If you lift a finger, + * the first one remains and the second one disappears. + * + * You can handle multi-touch by subscribing to however many pointers + * you would like to support. If a pointer doesn't yet exist, it will + * be created. You do not need to check if a pointer exists. If it does + * exist, it will propogate events, otherwise it will remain idle. + * + * Excalibur does not impose a limit to the amount of pointers you can + * subscribe to, so by all means, support all 10 fingers. + * + * *Note:* There is no way to identify touches after they happen; you can only + * know that there are *n* touches on the screen at once. + * + * ```js + * function paint(color) { + * + * // create a handler for the event + * return function (pe) { + * if (pe.pointerType === ex.Input.PointerType.Touch) { + * engine.canvas.fillStyle = color; + * engine.canvas.fillRect(pe.x, pe.y, 5, 5); + * } + * } + * } + * + * engine.input.pointers.at(0).on("move", paint("blue")); // 1st finger + * engine.input.pointers.at(1).on("move", paint("red")); // 2nd finger + * engine.input.pointers.at(2).on("move", paint("green")); // 3rd finger + * ``` + * + * ## Actor pointer events + * + * By default, [[Actor|Actors]] do not participate in pointer events. In other + * words, when you "click" an Actor, it will not throw an event **for that Actor**, + * only a generic pointer event for the game. This is to keep performance + * high and allow actors to "opt-in" to handling pointer events. Actors will automatically + * opt-in if a pointer related event handler is set on them `actor.on("pointerdown", () => {})` for example. + * + * To opt-in manually, set [[Actor.enableCapturePointer]] to `true` and the [[Actor]] will + * start publishing `pointerup` and `pointerdown` events. `pointermove` events + * will not be published by default due to performance implications. If you want + * an actor to receive move events, set [[ICapturePointerConfig.captureMoveEvents]] to + * `true`. + * + * Actor pointer events will be prefixed with `pointer`. + * + * ```js + * var player = new ex.Actor(); + * + * // enable propogating pointer events + * player.enableCapturePointer = true; + * + * // enable move events, warning: performance intensive! + * player.capturePointer.captureMoveEvents = true; + * + * // subscribe to input + * player.on("pointerup", function (ev) { + * player.logger.info("Player selected!", ev); + * }); + * ``` + */ + var Pointers = (function (_super) { + __extends(Pointers, _super); + function Pointers(engine) { + _super.call(this); + this._pointerDown = []; + this._pointerUp = []; + this._pointerMove = []; + this._pointerCancel = []; + this._pointers = []; + this._activePointers = []; + this._engine = engine; + this._pointers.push(new Pointer()); + this._activePointers = [-1]; + this.primary = this._pointers[0]; + } + /** + * Initializes pointer event listeners + */ + Pointers.prototype.init = function (scope) { + if (scope === void 0) { scope = PointerScope.Document; } + var target = document; + if (scope === PointerScope.Document) { + target = document; } - EaseTo.prototype._initialize = function () { - this._lerpStart = new ex.Point(this.actor.x, this.actor.y); - this._currentLerpTime = 0; - this._distance = this._lerpStart.toVector().distance(this._lerpEnd.toVector()); - }; - EaseTo.prototype.update = function (delta) { - if (!this._initialized) { - this._initialize(); - this._initialized = true; - } - var newX = this.actor.x; - var newY = this.actor.y; - if (this._currentLerpTime < this._lerpDuration) { - if (this._lerpEnd.x < this._lerpStart.x) { - newX = this._lerpStart.x - (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x); - } - else { - newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration); - } - if (this._lerpEnd.y < this._lerpStart.y) { - newY = this._lerpStart.y - (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y); - } - else { - newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration); - } - this.actor.x = newX; - this.actor.y = newY; - this._currentLerpTime += delta; - } - else { - this.actor.x = this._lerpEnd.x; - this.actor.y = this._lerpEnd.y; - } - }; - EaseTo.prototype.isComplete = function (actor) { - return this._stopped || (new ex.Vector(actor.x, actor.y)).distance(this._lerpStart.toVector()) >= this._distance; - }; - EaseTo.prototype.reset = function () { - this._initialized = false; - }; - EaseTo.prototype.stop = function () { - this._stopped = true; - }; - return EaseTo; - })(); - Actions.EaseTo = EaseTo; - var MoveTo = (function () { - function MoveTo(actor, destx, desty, speed) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._end = new ex.Vector(destx, desty); - this._speed = speed; + else { + target = this._engine.canvas; } - MoveTo.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._start = new ex.Vector(this._actor.x, this._actor.y); - this._distance = this._start.distance(this._end); - this._dir = this._end.minus(this._start).normalize(); - } - var m = this._dir.scale(this._speed); - this._actor.dx = m.x; - this._actor.dy = m.y; - if (this.isComplete(this._actor)) { - this._actor.x = this._end.x; - this._actor.y = this._end.y; - this._actor.dy = 0; - this._actor.dx = 0; - } - }; - MoveTo.prototype.isComplete = function (actor) { - return this._stopped || (new ex.Vector(actor.x, actor.y)).distance(this._start) >= this._distance; - }; - MoveTo.prototype.stop = function () { - this._actor.dy = 0; - this._actor.dx = 0; - this._stopped = true; - }; - MoveTo.prototype.reset = function () { - this._started = false; - }; - return MoveTo; - })(); - Actions.MoveTo = MoveTo; - var MoveBy = (function () { - function MoveBy(actor, destx, desty, time) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._end = new ex.Vector(destx, desty); - if (time <= 0) { - ex.Logger.getInstance().error('Attempted to moveBy time less than or equal to zero : ' + time); - throw new Error('Cannot move in time <= 0'); - } - this._time = time; + // Touch Events + target.addEventListener('touchstart', this._handleTouchEvent('down', this._pointerDown)); + target.addEventListener('touchend', this._handleTouchEvent('up', this._pointerUp)); + target.addEventListener('touchmove', this._handleTouchEvent('move', this._pointerMove)); + target.addEventListener('touchcancel', this._handleTouchEvent('cancel', this._pointerCancel)); + // W3C Pointer Events + // Current: IE11, IE10 + if (window.PointerEvent) { + // IE11 + this._engine.canvas.style.touchAction = 'none'; + target.addEventListener('pointerdown', this._handlePointerEvent('down', this._pointerDown)); + target.addEventListener('pointerup', this._handlePointerEvent('up', this._pointerUp)); + target.addEventListener('pointermove', this._handlePointerEvent('move', this._pointerMove)); + target.addEventListener('pointercancel', this._handlePointerEvent('cancel', this._pointerMove)); } - MoveBy.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._start = new ex.Vector(this._actor.x, this._actor.y); - this._distance = this._start.distance(this._end); - this._dir = this._end.minus(this._start).normalize(); - this._speed = this._distance / (this._time / 1000); - } - var m = this._dir.scale(this._speed); - this._actor.dx = m.x; - this._actor.dy = m.y; - if (this.isComplete(this._actor)) { - this._actor.x = this._end.x; - this._actor.y = this._end.y; - this._actor.dy = 0; - this._actor.dx = 0; - } - }; - MoveBy.prototype.isComplete = function (actor) { - return this._stopped || (new ex.Vector(actor.x, actor.y)).distance(this._start) >= this._distance; - }; - MoveBy.prototype.stop = function () { - this._actor.dy = 0; - this._actor.dx = 0; - this._stopped = true; - }; - MoveBy.prototype.reset = function () { - this._started = false; - }; - return MoveBy; - })(); - Actions.MoveBy = MoveBy; - var Follow = (function () { - function Follow(actor, actorToFollow, followDistance) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._actorToFollow = actorToFollow; - this._current = new ex.Vector(this._actor.x, this._actor.y); - this._end = new ex.Vector(actorToFollow.x, actorToFollow.y); - this._maximumDistance = (followDistance !== undefined) ? followDistance : this._current.distance(this._end); - this._speed = 0; + else if (window.MSPointerEvent) { + // IE10 + this._engine.canvas.style.msTouchAction = 'none'; + target.addEventListener('MSPointerDown', this._handlePointerEvent('down', this._pointerDown)); + target.addEventListener('MSPointerUp', this._handlePointerEvent('up', this._pointerUp)); + target.addEventListener('MSPointerMove', this._handlePointerEvent('move', this._pointerMove)); + target.addEventListener('MSPointerCancel', this._handlePointerEvent('cancel', this._pointerMove)); } - Follow.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._distanceBetween = this._current.distance(this._end); - this._dir = this._end.minus(this._current).normalize(); - } - var actorToFollowSpeed = Math.sqrt(Math.pow(this._actorToFollow.dx, 2) + Math.pow(this._actorToFollow.dy, 2)); - if (actorToFollowSpeed !== 0) { - this._speed = actorToFollowSpeed; + else { + // Mouse Events + target.addEventListener('mousedown', this._handleMouseEvent('down', this._pointerDown)); + target.addEventListener('mouseup', this._handleMouseEvent('up', this._pointerUp)); + target.addEventListener('mousemove', this._handleMouseEvent('move', this._pointerMove)); + } + }; + Pointers.prototype.update = function (delta) { + this._pointerUp.length = 0; + this._pointerDown.length = 0; + this._pointerMove.length = 0; + this._pointerCancel.length = 0; + }; + /** + * Safely gets a Pointer at a specific index and initializes one if it doesn't yet exist + * @param index The pointer index to retrieve + */ + Pointers.prototype.at = function (index) { + if (index >= this._pointers.length) { + // Ensure there is a pointer to retrieve + for (var i = this._pointers.length - 1, max = index; i < max; i++) { + this._pointers.push(new Pointer()); + this._activePointers.push(-1); } - this._current.x = this._actor.x; - this._current.y = this._actor.y; - this._end.x = this._actorToFollow.x; - this._end.y = this._actorToFollow.y; - this._distanceBetween = this._current.distance(this._end); - this._dir = this._end.minus(this._current).normalize(); - if (this._distanceBetween >= this._maximumDistance) { - var m = this._dir.scale(this._speed); - this._actor.dx = m.x; - this._actor.dy = m.y; + } + return this._pointers[index]; + }; + /** + * Get number of pointers being watched + */ + Pointers.prototype.count = function () { + return this._pointers.length; + }; + /** + * Propogates events to actor if necessary + */ + Pointers.prototype.propogate = function (actor) { + var isUIActor = actor instanceof ex.UIActor; + var i = 0, len = this._pointerUp.length; + for (i; i < len; i++) { + if (actor.contains(this._pointerUp[i].x, this._pointerUp[i].y, !isUIActor)) { + actor.eventDispatcher.emit('pointerup', this._pointerUp[i]); } - else { - this._actor.dx = 0; - this._actor.dy = 0; + } + i = 0; + len = this._pointerDown.length; + for (i; i < len; i++) { + if (actor.contains(this._pointerDown[i].x, this._pointerDown[i].y, !isUIActor)) { + actor.eventDispatcher.emit('pointerdown', this._pointerDown[i]); } - if (this.isComplete(this._actor)) { - // TODO this should never occur - this._actor.x = this._end.x; - this._actor.y = this._end.y; - this._actor.dy = 0; - this._actor.dx = 0; + } + if (actor.capturePointer.captureMoveEvents) { + i = 0; + len = this._pointerMove.length; + for (i; i < len; i++) { + if (actor.contains(this._pointerMove[i].x, this._pointerMove[i].y, !isUIActor)) { + actor.eventDispatcher.emit('pointermove', this._pointerMove[i]); + } } + } + i = 0; + len = this._pointerCancel.length; + for (i; i < len; i++) { + if (actor.contains(this._pointerCancel[i].x, this._pointerCancel[i].y, !isUIActor)) { + actor.eventDispatcher.emit('pointercancel', this._pointerCancel[i]); + } + } + }; + Pointers.prototype._handleMouseEvent = function (eventName, eventArr) { + var _this = this; + return function (e) { + e.preventDefault(); + var x = e.pageX - ex.Util.getPosition(_this._engine.canvas).x; + var y = e.pageY - ex.Util.getPosition(_this._engine.canvas).y; + var transformedPoint = _this._engine.screenToWorldCoordinates(new ex.Point(x, y)); + var pe = new PointerEvent(transformedPoint.x, transformedPoint.y, 0, PointerType.Mouse, e.button, e); + eventArr.push(pe); + _this.at(0).eventDispatcher.emit(eventName, pe); }; - Follow.prototype.stop = function () { - this._actor.dy = 0; - this._actor.dx = 0; - this._stopped = true; - }; - Follow.prototype.isComplete = function (actor) { - // the actor following should never stop unless specified to do so - return this._stopped; - }; - Follow.prototype.reset = function () { - this._started = false; + }; + Pointers.prototype._handleTouchEvent = function (eventName, eventArr) { + var _this = this; + return function (e) { + e.preventDefault(); + for (var i = 0, len = e.changedTouches.length; i < len; i++) { + var index = _this._pointers.length > 1 ? _this._getPointerIndex(e.changedTouches[i].identifier) : 0; + if (index === -1) { + continue; + } + var x = e.changedTouches[i].pageX - ex.Util.getPosition(_this._engine.canvas).x; + var y = e.changedTouches[i].pageY - ex.Util.getPosition(_this._engine.canvas).y; + var transformedPoint = _this._engine.screenToWorldCoordinates(new ex.Point(x, y)); + var pe = new PointerEvent(transformedPoint.x, transformedPoint.y, index, PointerType.Touch, PointerButton.Unknown, e); + eventArr.push(pe); + _this.at(index).eventDispatcher.emit(eventName, pe); + // only with multi-pointer + if (_this._pointers.length > 1) { + if (eventName === 'up') { + // remove pointer ID from pool when pointer is lifted + _this._activePointers[index] = -1; + } + else if (eventName === 'down') { + // set pointer ID to given index + _this._activePointers[index] = e.changedTouches[i].identifier; + } + } + } }; - return Follow; - })(); - Actions.Follow = Follow; - var Meet = (function () { - function Meet(actor, actorToMeet, speed) { - this._started = false; - this._stopped = false; - this._speedWasSpecified = false; - this._actor = actor; - this._actorToMeet = actorToMeet; - this._current = new ex.Vector(this._actor.x, this._actor.y); - this._end = new ex.Vector(actorToMeet.x, actorToMeet.y); - this._speed = speed || 0; - if (speed !== undefined) { - this._speedWasSpecified = true; + }; + Pointers.prototype._handlePointerEvent = function (eventName, eventArr) { + var _this = this; + return function (e) { + e.preventDefault(); + // get the index for this pointer ID if multi-pointer is asked for + var index = _this._pointers.length > 1 ? _this._getPointerIndex(e.pointerId) : 0; + if (index === -1) { + return; } - } - Meet.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._distanceBetween = this._current.distance(this._end); - this._dir = this._end.minus(this._current).normalize(); + var x = e.pageX - ex.Util.getPosition(_this._engine.canvas).x; + var y = e.pageY - ex.Util.getPosition(_this._engine.canvas).y; + var transformedPoint = _this._engine.screenToWorldCoordinates(new ex.Point(x, y)); + var pe = new PointerEvent(transformedPoint.x, transformedPoint.y, index, _this._stringToPointerType(e.pointerType), e.button, e); + eventArr.push(pe); + _this.at(index).eventDispatcher.emit(eventName, pe); + // only with multi-pointer + if (_this._pointers.length > 1) { + if (eventName === 'up') { + // remove pointer ID from pool when pointer is lifted + _this._activePointers[index] = -1; + } + else if (eventName === 'down') { + // set pointer ID to given index + _this._activePointers[index] = e.pointerId; + } } - var actorToMeetSpeed = Math.sqrt(Math.pow(this._actorToMeet.dx, 2) + Math.pow(this._actorToMeet.dy, 2)); - if ((actorToMeetSpeed !== 0) && (!this._speedWasSpecified)) { - this._speed = actorToMeetSpeed; + }; + }; + /** + * Gets the index of the pointer specified for the given pointer ID or finds the next empty pointer slot available. + * This is required because IE10/11 uses incrementing pointer IDs so we need to store a mapping of ID => idx + */ + Pointers.prototype._getPointerIndex = function (pointerId) { + var idx; + if ((idx = this._activePointers.indexOf(pointerId)) > -1) { + return idx; + } + for (var i = 0; i < this._activePointers.length; i++) { + if (this._activePointers[i] === -1) { + return i; } - this._current.x = this._actor.x; - this._current.y = this._actor.y; - this._end.x = this._actorToMeet.x; - this._end.y = this._actorToMeet.y; - this._distanceBetween = this._current.distance(this._end); - this._dir = this._end.minus(this._current).normalize(); - var m = this._dir.scale(this._speed); - this._actor.dx = m.x; - this._actor.dy = m.y; - if (this.isComplete(this._actor)) { - this._actor.x = this._end.x; - this._actor.y = this._end.y; - this._actor.dy = 0; - this._actor.dx = 0; + } + // ignore pointer because game isn't watching + return -1; + }; + Pointers.prototype._stringToPointerType = function (s) { + switch (s) { + case 'touch': + return PointerType.Touch; + case 'mouse': + return PointerType.Mouse; + case 'pen': + return PointerType.Pen; + default: + return PointerType.Unknown; + } + }; + return Pointers; + })(ex.Class); + Input.Pointers = Pointers; + /** + * Captures and dispatches PointerEvents + */ + var Pointer = (function (_super) { + __extends(Pointer, _super); + function Pointer() { + _super.apply(this, arguments); + } + return Pointer; + })(ex.Class); + Input.Pointer = Pointer; + })(Input = ex.Input || (ex.Input = {})); +})(ex || (ex = {})); +var ex; +(function (ex) { + var Input; + (function (Input) { + /** + * Enum representing input key codes + */ + (function (Keys) { + Keys[Keys["Num1"] = 97] = "Num1"; + Keys[Keys["Num2"] = 98] = "Num2"; + Keys[Keys["Num3"] = 99] = "Num3"; + Keys[Keys["Num4"] = 100] = "Num4"; + Keys[Keys["Num5"] = 101] = "Num5"; + Keys[Keys["Num6"] = 102] = "Num6"; + Keys[Keys["Num7"] = 103] = "Num7"; + Keys[Keys["Num8"] = 104] = "Num8"; + Keys[Keys["Num9"] = 105] = "Num9"; + Keys[Keys["Num0"] = 96] = "Num0"; + Keys[Keys["Numlock"] = 144] = "Numlock"; + Keys[Keys["Semicolon"] = 186] = "Semicolon"; + Keys[Keys["A"] = 65] = "A"; + Keys[Keys["B"] = 66] = "B"; + Keys[Keys["C"] = 67] = "C"; + Keys[Keys["D"] = 68] = "D"; + Keys[Keys["E"] = 69] = "E"; + Keys[Keys["F"] = 70] = "F"; + Keys[Keys["G"] = 71] = "G"; + Keys[Keys["H"] = 72] = "H"; + Keys[Keys["I"] = 73] = "I"; + Keys[Keys["J"] = 74] = "J"; + Keys[Keys["K"] = 75] = "K"; + Keys[Keys["L"] = 76] = "L"; + Keys[Keys["M"] = 77] = "M"; + Keys[Keys["N"] = 78] = "N"; + Keys[Keys["O"] = 79] = "O"; + Keys[Keys["P"] = 80] = "P"; + Keys[Keys["Q"] = 81] = "Q"; + Keys[Keys["R"] = 82] = "R"; + Keys[Keys["S"] = 83] = "S"; + Keys[Keys["T"] = 84] = "T"; + Keys[Keys["U"] = 85] = "U"; + Keys[Keys["V"] = 86] = "V"; + Keys[Keys["W"] = 87] = "W"; + Keys[Keys["X"] = 88] = "X"; + Keys[Keys["Y"] = 89] = "Y"; + Keys[Keys["Z"] = 90] = "Z"; + Keys[Keys["Shift"] = 16] = "Shift"; + Keys[Keys["Alt"] = 18] = "Alt"; + Keys[Keys["Up"] = 38] = "Up"; + Keys[Keys["Down"] = 40] = "Down"; + Keys[Keys["Left"] = 37] = "Left"; + Keys[Keys["Right"] = 39] = "Right"; + Keys[Keys["Space"] = 32] = "Space"; + Keys[Keys["Esc"] = 27] = "Esc"; + })(Input.Keys || (Input.Keys = {})); + var Keys = Input.Keys; + ; + /** + * Event thrown on a game object for a key event + */ + var KeyEvent = (function (_super) { + __extends(KeyEvent, _super); + /** + * @param key The key responsible for throwing the event + */ + function KeyEvent(key) { + _super.call(this); + this.key = key; + } + return KeyEvent; + })(ex.GameEvent); + Input.KeyEvent = KeyEvent; + /** + * Keyboard input + * + * Working with the keyboard is easy in Excalibur. You can inspect + * whether a button was just [[Keyboard.wasPressed|pressed]] or [[Keyboard.wasReleased|released]] this frame, or + * if the key is currently being [[Keyboard.isHeld|held]] down. Common keys are held in the [[Input.Keys]] + * enumeration but you can pass any character code to the methods. + * + * Excalibur subscribes to the browser events and keeps track of + * what keys are currently held, released, or pressed. A key can be held + * for multiple frames, but a key cannot be pressed or released for more than one subsequent + * update frame. + * + * ## Inspecting the keyboard + * + * You can inspect [[Engine.input]] to see what the state of the keyboard + * is during an update. + * + * It is recommended that keyboard actions that directly effect actors be handled like so to improve code quality: + * ```ts + * class Player extends ex.Actor { + * public update(engine, delta) { + * + * if (engine.input.keyboard.isHeld(ex.Input.Keys.W) || + * engine.input.keyboard.isHeld(ex.Input.Keys.Up)) { + * + * player._moveForward(); + * } + * + * if (engine.input.keyboard.wasPressed(ex.Input.Keys.Right)) { + * player._fire(); + * } + * } + * } + * ``` + * ## Events + * You can subscribe to keyboard events through `engine.input.keyboard.on`. A [[KeyEvent]] object is + * passed to your handler which offers information about the key that was part of the event. + * + * - `press` - When a key was just pressed this frame + * - `release` - When a key was just released this frame + * - `hold` - Whenever a key is in the down position + * + * ```ts + * engine.input.pointers.primary.on("press", (evt: KeyEvent) => {...}); + * engine.input.pointers.primary.on("release", (evt: KeyEvent) => {...}); + * engine.input.pointers.primary.on("hold", (evt: KeyEvent) => {...}); + * ``` + */ + var Keyboard = (function (_super) { + __extends(Keyboard, _super); + function Keyboard(engine) { + _super.call(this); + this._keys = []; + this._keysUp = []; + this._keysDown = []; + this._engine = engine; + } + /** + * Initialize Keyboard event listeners + */ + Keyboard.prototype.init = function () { + var _this = this; + window.addEventListener('blur', function (ev) { + _this._keys.length = 0; // empties array efficiently + }); + // key up is on window because canvas cannot have focus + window.addEventListener('keyup', function (ev) { + var key = _this._keys.indexOf(ev.keyCode); + _this._keys.splice(key, 1); + _this._keysUp.push(ev.keyCode); + var keyEvent = new KeyEvent(ev.keyCode); + // alias the old api, we may want to deprecate this in the future + _this.eventDispatcher.emit('up', keyEvent); + _this.eventDispatcher.emit('release', keyEvent); + }); + // key down is on window because canvas cannot have focus + window.addEventListener('keydown', function (ev) { + if (_this._keys.indexOf(ev.keyCode) === -1) { + _this._keys.push(ev.keyCode); + _this._keysDown.push(ev.keyCode); + var keyEvent = new KeyEvent(ev.keyCode); + _this.eventDispatcher.emit('down', keyEvent); + _this.eventDispatcher.emit('press', keyEvent); } - }; - Meet.prototype.isComplete = function (actor) { - return this._stopped || (this._distanceBetween <= 1); - }; - Meet.prototype.stop = function () { - this._actor.dy = 0; - this._actor.dx = 0; - this._stopped = true; - }; - Meet.prototype.reset = function () { - this._started = false; - }; - return Meet; - })(); - Actions.Meet = Meet; - var RotateTo = (function () { - function RotateTo(actor, angleRadians, speed, rotationType) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._end = angleRadians; - this._speed = speed; - this._rotationType = rotationType || ex.RotationType.ShortestPath; + }); + }; + Keyboard.prototype.update = function (delta) { + // Reset keysDown and keysUp after update is complete + this._keysDown.length = 0; + this._keysUp.length = 0; + // Emit synthetic "hold" event + for (var i = 0; i < this._keys.length; i++) { + this.eventDispatcher.emit('hold', new KeyEvent(this._keys[i])); } - RotateTo.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._start = this._actor.rotation; - var distance1 = Math.abs(this._end - this._start); - var distance2 = ex.Util.TwoPI - distance1; - if (distance1 > distance2) { - this._shortDistance = distance2; - this._longDistance = distance1; - } - else { - this._shortDistance = distance1; - this._longDistance = distance2; - } - this._shortestPathIsPositive = (this._start - this._end + ex.Util.TwoPI) % ex.Util.TwoPI >= Math.PI; - switch (this._rotationType) { - case ex.RotationType.ShortestPath: - this._distance = this._shortDistance; - if (this._shortestPathIsPositive) { - this._direction = 1; - } - else { - this._direction = -1; - } - break; - case ex.RotationType.LongestPath: - this._distance = this._longDistance; - if (this._shortestPathIsPositive) { - this._direction = -1; - } - else { - this._direction = 1; - } - break; - case ex.RotationType.Clockwise: - this._direction = 1; - if (this._shortestPathIsPositive) { - this._distance = this._shortDistance; - } - else { - this._distance = this._longDistance; - } - break; - case ex.RotationType.CounterClockwise: - this._direction = -1; - if (!this._shortestPathIsPositive) { - this._distance = this._shortDistance; - } - else { - this._distance = this._longDistance; - } - break; - } - } - this._actor.rx = this._direction * this._speed; - if (this.isComplete(this._actor)) { - this._actor.rotation = this._end; - this._actor.rx = 0; - this._stopped = true; - } - }; - RotateTo.prototype.isComplete = function (actor) { - var distanceTravelled = Math.abs(this._actor.rotation - this._start); - return this._stopped || (distanceTravelled >= Math.abs(this._distance)); - }; - RotateTo.prototype.stop = function () { - this._actor.rx = 0; - this._stopped = true; - }; - RotateTo.prototype.reset = function () { - this._started = false; - }; - return RotateTo; - })(); - Actions.RotateTo = RotateTo; - var RotateBy = (function () { - function RotateBy(actor, angleRadians, time, rotationType) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._end = angleRadians; - this._time = time; - this._rotationType = rotationType || ex.RotationType.ShortestPath; + }; + /** + * Gets list of keys being pressed down + */ + Keyboard.prototype.getKeys = function () { + return this._keys; + }; + /** + * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame. + * @param key Test wether a key was just pressed + */ + Keyboard.prototype.wasPressed = function (key) { + return this._keysDown.indexOf(key) > -1; + }; + /** + * Tests if a certain key is held down. This is persisted between frames. + * @param key Test wether a key is held down + */ + Keyboard.prototype.isHeld = function (key) { + return this._keys.indexOf(key) > -1; + }; + /** + * Tests if a certain key was just released this frame. This is cleared at the end of the update frame. + * @param key Test wether a key was just released + */ + Keyboard.prototype.wasReleased = function (key) { + return this._keysUp.indexOf(key) > -1; + }; + return Keyboard; + })(ex.Class); + Input.Keyboard = Keyboard; + })(Input = ex.Input || (ex.Input = {})); +})(ex || (ex = {})); +var ex; +(function (ex) { + var Input; + (function (Input) { + /** + * Controller Support (Gamepads) + * + * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad) + * to provide controller support for your games. + * + * You can query any [[Gamepad|Gamepads]] that are connected or listen to events ("button" and "axis"). + * + * You must opt-in to controller support ([[Gamepads.enabled]]) because it is a polling-based + * API, so we have to check it each update frame. If an gamepad related event handler is set, you will + * automatically opt-in to controller polling. + * + * HTML5 Gamepad API only supports a maximum of 4 gamepads. You can access them using the [[Gamepads.at]] method. If a [[Gamepad]] is + * not connected, it will simply not throw events. + * + * ## Gamepad Filtering + * + * Different browsers/devices are sometimes loose about the devices they consider Gamepads, you can set minimum device requirements with + * `engine.inpute.gamepads.setMinimumGamepadConfiguration` so that undesired devices are not reported to you (Touchpads, Mice, Web + * Cameras, etc.). + * ```js + * // ensures that only gamepads with at least 4 axis and 8 buttons are reported for events + * engine.input.gamepads.setMinimumGamepadConfiguration({ + * axis: 4, + * buttons: 8 + * }); + * ``` + * + * ## Events + * + * You can subscribe to gamepad connect and disconnect events through `engine.input.gamepads.on`. + * A [[GamepadConnectEvent]] or [[GamepadDisconnectEvent]] will be passed to you. + * + * - `connect` - When a gamepad connects it will fire this event and pass a [[GamepadConnectEvent]] with a reference to the gamepad. + * - `disconnect` - When a gamepad disconnects it will fire this event and pass a [[GamepadDisconnectEvent]] + * + * Once you have a reference to a gamepad you may listen to changes on that gamepad with `.on`. A [[GamepadButtonEvent]] or + * [[GamepadAxisEvent]] will be passed to you. + * - `button` - Whenever a button is pressed on the game + * - `axis` - Whenever an axis + * + * ```ts + * + * engine.input.gamepads.on('connect', (ce: ex.Input.GamepadConnectEvent) => { + * var newPlayer = CreateNewPlayer(); // pseudo-code for new player logic on gamepad connection + * console.log("Gamepad connected", ce); + * ce.gamepad.on('button', (be: ex.GamepadButtonEvent) => { + * if(be.button === ex.Input.Buttons.Face1) { + * newPlayer.jump(); + * } + * }); + * + * ce.gamepad.on('axis', (ae: ex.GamepadAxisEvent) => { + * if(ae.axis === ex.Input.Axis.LeftStickX && ae.value > .5){ + * newPlayer.moveRight(); + * } + * }) + * + * }); + * + * + * ``` + * + * ## Responding to button input + * + * [[Buttons|Gamepad buttons]] typically have values between 0 and 1, however depending on + * the sensitivity of the controller, even if a button is idle it could have a + * very tiny value. For this reason, you can pass in a threshold to several + * methods to customize how sensitive you want to be in detecting button presses. + * + * You can inspect any connected [[Gamepad]] using [[Gamepad.isButtonPressed]], [[Gamepad.getButton]], + * or you can subscribe to the `button` event published on the [[Gamepad]] which passes + * a [[GamepadButtonEvent]] to your handler. + * + * ```js + * // enable gamepad support + * engine.input.gamepads.enabled = true; + * + * // query gamepad on update + * engine.on("update", function (ev) { + * + * // access any gamepad by index + * if (engine.input.gamepads.at(0).isButtonPressed(ex.Input.Buttons.Face1)) { + * ex.Logger.getInstance().info("Controller A button pressed"); + * } + * + * // query individual button + * if (engine.input.gamepads.at(0).getButton(ex.Input.Buttons.DpadLeft) > 0.2) { + * ex.Logger.getInstance().info("Controller D-pad left value is > 0.2") + * } + * }); + * + * // subscribe to button events + * engine.input.gamepads.at(0).on("button", function (ev) { + * ex.Logger.getInstance().info(ev.button, ev.value); + * }); + * ``` + * + * ## Responding to axis input + * + * [[Axes|Gamepad axes]] typically have values between -1 and 1, but even idle + * sticks can still propogate very small values depending on the quality and age + * of a controller. For this reason, you can set [[Gamepads.MinAxisMoveThreshold]] + * to set the (absolute) threshold after which Excalibur will start publishing `axis` events. + * By default it is set to a value that normally will not throw events if a stick is idle. + * + * You can query axes via [[Gamepad.getAxes]] or by subscribing to the `axis` event on [[Gamepad]] + * which passes a [[GamepadAxisEvent]] to your handler. + * + * ```js + * // enable gamepad support + * engine.input.gamepads.enabled = true; + * + * // query gamepad on update + * engine.on("update", function (ev) { + * + * // access any gamepad by index + * var axisValue; + * if ((axisValue = engine.input.gamepads.at(0).getAxes(ex.Input.Axes.LeftStickX)) > 0.5) { + * ex.Logger.getInstance().info("Move right", axisValue); + * } + * }); + * + * // subscribe to axis events + * engine.input.gamepads.at(0).on("axis", function (ev) { + * ex.Logger.getInstance().info(ev.axis, ev.value); + * }); + * ``` + */ + var Gamepads = (function (_super) { + __extends(Gamepads, _super); + function Gamepads(engine) { + _super.call(this); + /** + * Whether or not to poll for Gamepad input (default: `false`) + */ + this.enabled = false; + /** + * Whether or not Gamepad API is supported + */ + this.supported = !!navigator.getGamepads; + this._gamePadTimeStamps = [0, 0, 0, 0]; + this._oldPads = []; + this._pads = []; + this._initSuccess = false; + this._navigator = navigator; + this._minimumConfiguration = null; + this._engine = engine; + } + Gamepads.prototype.init = function () { + if (!this.supported) { + return; } - RotateBy.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._start = this._actor.rotation; - var distance1 = Math.abs(this._end - this._start); - var distance2 = ex.Util.TwoPI - distance1; - if (distance1 > distance2) { - this._shortDistance = distance2; - this._longDistance = distance1; - } - else { - this._shortDistance = distance1; - this._longDistance = distance2; - } - this._shortestPathIsPositive = (this._start - this._end + ex.Util.TwoPI) % ex.Util.TwoPI >= Math.PI; - switch (this._rotationType) { - case ex.RotationType.ShortestPath: - this._distance = this._shortDistance; - if (this._shortestPathIsPositive) { - this._direction = 1; - } - else { - this._direction = -1; - } - break; - case ex.RotationType.LongestPath: - this._distance = this._longDistance; - if (this._shortestPathIsPositive) { - this._direction = -1; - } - else { - this._direction = 1; - } - break; - case ex.RotationType.Clockwise: - this._direction = 1; - if (this._shortDistance >= 0) { - this._distance = this._shortDistance; - } - else { - this._distance = this._longDistance; - } - break; - case ex.RotationType.CounterClockwise: - this._direction = -1; - if (this._shortDistance <= 0) { - this._distance = this._shortDistance; - } - else { - this._distance = this._longDistance; - } - break; - } - this._speed = Math.abs(this._distance / this._time * 1000); - } - this._actor.rx = this._direction * this._speed; - if (this.isComplete(this._actor)) { - this._actor.rotation = this._end; - this._actor.rx = 0; - this._stopped = true; - } - }; - RotateBy.prototype.isComplete = function (actor) { - var distanceTravelled = Math.abs(this._actor.rotation - this._start); - return this._stopped || (distanceTravelled >= Math.abs(this._distance)); - }; - RotateBy.prototype.stop = function () { - this._actor.rx = 0; - this._stopped = true; - }; - RotateBy.prototype.reset = function () { - this._started = false; - }; - return RotateBy; - })(); - Actions.RotateBy = RotateBy; - var ScaleTo = (function () { - function ScaleTo(actor, scaleX, scaleY, speedX, speedY) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._endX = scaleX; - this._endY = scaleY; - this._speedX = speedX; - this._speedY = speedY; + if (this._initSuccess) { + return; } - ScaleTo.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._startX = this._actor.scale.x; - this._startY = this._actor.scale.y; - this._distanceX = Math.abs(this._endX - this._startX); - this._distanceY = Math.abs(this._endY - this._startY); - } - if (!(Math.abs(this._actor.scale.x - this._startX) >= this._distanceX)) { - var directionX = this._endY < this._startY ? -1 : 1; - this._actor.sx = this._speedX * directionX; - } - else { - this._actor.sx = 0; - } - if (!(Math.abs(this._actor.scale.y - this._startY) >= this._distanceY)) { - var directionY = this._endY < this._startY ? -1 : 1; - this._actor.sy = this._speedY * directionY; - } - else { - this._actor.sy = 0; - } - if (this.isComplete(this._actor)) { - this._actor.scale.x = this._endX; - this._actor.scale.y = this._endY; - this._actor.sx = 0; - this._actor.sy = 0; - } - }; - ScaleTo.prototype.isComplete = function (actor) { - return this._stopped || ((Math.abs(this._actor.scale.y - this._startX) >= this._distanceX) && - (Math.abs(this._actor.scale.y - this._startY) >= this._distanceY)); - }; - ScaleTo.prototype.stop = function () { - this._actor.sx = 0; - this._actor.sy = 0; - this._stopped = true; - }; - ScaleTo.prototype.reset = function () { - this._started = false; - }; - return ScaleTo; - })(); - Actions.ScaleTo = ScaleTo; - var ScaleBy = (function () { - function ScaleBy(actor, scaleX, scaleY, time) { - this._started = false; - this._stopped = false; - this._actor = actor; - this._endX = scaleX; - this._endY = scaleY; - this._time = time; - this._speedX = (this._endX - this._actor.scale.x) / time * 1000; - this._speedY = (this._endY - this._actor.scale.y) / time * 1000; + // In Chrome, this will return 4 undefined items until a button is pressed + // In FF, this will not return any items until a button is pressed + this._oldPads = this._clonePads(this._navigator.getGamepads()); + if (this._oldPads.length && this._oldPads[0]) { + this._initSuccess = true; } - ScaleBy.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - this._startX = this._actor.scale.x; - this._startY = this._actor.scale.y; - this._distanceX = Math.abs(this._endX - this._startX); - this._distanceY = Math.abs(this._endY - this._startY); - } - var directionX = this._endX < this._startX ? -1 : 1; - var directionY = this._endY < this._startY ? -1 : 1; - this._actor.sx = this._speedX * directionX; - this._actor.sy = this._speedY * directionY; - if (this.isComplete(this._actor)) { - this._actor.scale.x = this._endX; - this._actor.scale.y = this._endY; - this._actor.sx = 0; - this._actor.sy = 0; - } - }; - ScaleBy.prototype.isComplete = function (actor) { - return this._stopped || ((Math.abs(this._actor.scale.x - this._startX) >= this._distanceX) && - (Math.abs(this._actor.scale.y - this._startY) >= this._distanceY)); - }; - ScaleBy.prototype.stop = function () { - this._actor.sx = 0; - this._actor.sy = 0; - this._stopped = true; - }; - ScaleBy.prototype.reset = function () { - this._started = false; - }; - return ScaleBy; - })(); - Actions.ScaleBy = ScaleBy; - var Delay = (function () { - function Delay(actor, delay) { - this._elapsedTime = 0; - this._started = false; - this._stopped = false; - this._actor = actor; - this._delay = delay; + }; + /** + * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means + * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive + * all other controllers with more axis or buttons are valid as well. If no minimum + * configuration is set all pads are valid. + */ + Gamepads.prototype.setMinimumGamepadConfiguration = function (config) { + this._enableAndUpdate(); // if config is used, implicitely enable + this._minimumConfiguration = config; + }; + /** + * When implicitely enabled, set the enabled flag and run an update so information is updated + */ + Gamepads.prototype._enableAndUpdate = function () { + if (!this.enabled) { + this.enabled = true; + this.update(100); } - Delay.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - } - this.x = this._actor.x; - this.y = this._actor.y; - this._elapsedTime += delta; - }; - Delay.prototype.isComplete = function (actor) { - return this._stopped || (this._elapsedTime >= this._delay); - }; - Delay.prototype.stop = function () { - this._stopped = true; - }; - Delay.prototype.reset = function () { - this._elapsedTime = 0; - this._started = false; - }; - return Delay; - })(); - Actions.Delay = Delay; - var Blink = (function () { - function Blink(actor, timeVisible, timeNotVisible, numBlinks) { - if (numBlinks === void 0) { numBlinks = 1; } - this._timeVisible = 0; - this._timeNotVisible = 0; - this._elapsedTime = 0; - this._totalTime = 0; - this._stopped = false; - this._started = false; - this._actor = actor; - this._timeVisible = timeVisible; - this._timeNotVisible = timeNotVisible; - this._duration = (timeVisible + timeNotVisible) * numBlinks; + }; + /** + * Checks a navigator gamepad against the minimum configuration if present. + */ + Gamepads.prototype._isGamepadValid = function (pad) { + if (!this._minimumConfiguration) { + return true; } - Blink.prototype.update = function (delta) { - if (!this._started) { - this._started = true; - } - this._elapsedTime += delta; - this._totalTime += delta; - if (this._actor.visible && this._elapsedTime >= this._timeVisible) { - this._actor.visible = false; - this._elapsedTime = 0; - } - if (!this._actor.visible && this._elapsedTime >= this._timeNotVisible) { - this._actor.visible = true; - this._elapsedTime = 0; - } - if (this.isComplete(this._actor)) { - this._actor.visible = true; - } - }; - Blink.prototype.isComplete = function (actor) { - return this._stopped || (this._totalTime >= this._duration); - }; - Blink.prototype.stop = function () { - this._actor.visible = true; - this._stopped = true; - }; - Blink.prototype.reset = function () { - this._started = false; - this._elapsedTime = 0; - this._totalTime = 0; - }; - return Blink; - })(); - Actions.Blink = Blink; - var Fade = (function () { - function Fade(actor, endOpacity, speed) { - this._multiplyer = 1; - this._started = false; - this._stopped = false; - this._actor = actor; - this._endOpacity = endOpacity; - this._speed = speed; - if (endOpacity < actor.opacity) { - this._multiplyer = -1; - } + ; + if (!pad) { + return false; } - Fade.prototype.update = function (delta) { - if (!this._started) { - this._started = true; + ; + var axesLength = pad.axes.filter(function (value, index, array) { + return (typeof value !== undefined); + }).length; + var buttonLength = pad.buttons.filter(function (value, index, array) { + return (typeof value !== undefined); + }).length; + return axesLength >= this._minimumConfiguration.axis && + buttonLength >= this._minimumConfiguration.buttons && + pad.connected; + }; + Gamepads.prototype.on = function (eventName, handler) { + this._enableAndUpdate(); // implicitly enable + _super.prototype.on.call(this, eventName, handler); + }; + Gamepads.prototype.off = function (eventName, handler) { + this._enableAndUpdate(); // implicitly enable + _super.prototype.off.call(this, eventName, handler); + }; + /** + * Updates Gamepad state and publishes Gamepad events + */ + Gamepads.prototype.update = function (delta) { + if (!this.enabled || !this.supported) { + return; + } + this.init(); + var gamepads = this._navigator.getGamepads(); + for (var i = 0; i < gamepads.length; i++) { + if (!gamepads[i]) { + // If was connected, but now isn't emit the disconnect event + if (this.at(i).connected) { + this.eventDispatcher.emit('disconnect', new ex.GamepadDisconnectEvent(i)); + } + // Reset connection status + this.at(i).connected = false; + continue; } - if (this._speed > 0) { - this._actor.opacity += this._multiplyer * (Math.abs(this._actor.opacity - this._endOpacity) * delta) / this._speed; + else { + if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) { + this.eventDispatcher.emit('connect', new ex.GamepadConnectEvent(i, this.at(i))); + } + // Set connection status + this.at(i).connected = true; } - this._speed -= delta; - ex.Logger.getInstance().debug('actor opacity: ' + this._actor.opacity); - if (this.isComplete(this._actor)) { - this._actor.opacity = this._endOpacity; + ; + // Only supported in Chrome + if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) { + continue; } - }; - Fade.prototype.isComplete = function (actor) { - return this._stopped || (Math.abs(this._actor.opacity - this._endOpacity) < 0.05); - }; - Fade.prototype.stop = function () { - this._stopped = true; - }; - Fade.prototype.reset = function () { - this._started = false; - }; - return Fade; - })(); - Actions.Fade = Fade; - var Die = (function () { - function Die(actor) { - this._started = false; - this._stopped = false; - this._actor = actor; - } - Die.prototype.update = function (delta) { - this._actor.actionQueue.clearActions(); - this._actor.kill(); - this._stopped = true; - }; - Die.prototype.isComplete = function () { - return this._stopped; - }; - Die.prototype.stop = function () { return; }; - Die.prototype.reset = function () { return; }; - return Die; - })(); - Actions.Die = Die; - var CallMethod = (function () { - function CallMethod(actor, method) { - this._method = null; - this._actor = null; - this._hasBeenCalled = false; - this._actor = actor; - this._method = method; - } - CallMethod.prototype.update = function (delta) { - this._method.call(this._actor); - this._hasBeenCalled = true; - }; - CallMethod.prototype.isComplete = function (actor) { - return this._hasBeenCalled; - }; - CallMethod.prototype.reset = function () { - this._hasBeenCalled = false; - }; - CallMethod.prototype.stop = function () { - this._hasBeenCalled = true; - }; - return CallMethod; - })(); - Actions.CallMethod = CallMethod; - var Repeat = (function () { - function Repeat(actor, repeat, actions) { - this._stopped = false; - this._actor = actor; - this._actionQueue = new ActionQueue(actor); - this._repeat = repeat; - this._originalRepeat = repeat; - var i = 0, len = actions.length; - for (i; i < len; i++) { - actions[i].reset(); - this._actionQueue.add(actions[i]); + this._gamePadTimeStamps[i] = gamepads[i].timestamp; + // Add reference to navigator gamepad + this.at(i).navigatorGamepad = gamepads[i]; + // Buttons + var b, a, value, buttonIndex, axesIndex; + for (b in Buttons) { + if (typeof Buttons[b] !== 'number') { + continue; + } + buttonIndex = Buttons[b]; + if (gamepads[i].buttons[buttonIndex]) { + value = gamepads[i].buttons[buttonIndex].value; + if (value !== this._oldPads[i].getButton(buttonIndex)) { + if (gamepads[i].buttons[buttonIndex].pressed) { + this.at(i).updateButton(buttonIndex, value); + this.at(i).eventDispatcher.publish('button', new ex.GamepadButtonEvent(buttonIndex, value)); + } + else { + this.at(i).updateButton(buttonIndex, 0); + } + } + } + } + // Axes + for (a in Axes) { + if (typeof Axes[a] !== 'number') { + continue; + } + axesIndex = Axes[a]; + value = gamepads[i].axes[axesIndex]; + if (value !== this._oldPads[i].getAxes(axesIndex)) { + this.at(i).updateAxes(axesIndex, value); + this.at(i).eventDispatcher.emit('axis', new ex.GamepadAxisEvent(axesIndex, value)); + } } - ; + this._oldPads[i] = this._clonePad(gamepads[i]); } - Repeat.prototype.update = function (delta) { - this.x = this._actor.x; - this.y = this._actor.y; - if (!this._actionQueue.hasNext()) { - this._actionQueue.reset(); - this._repeat--; - } - this._actionQueue.update(delta); - }; - Repeat.prototype.isComplete = function () { - return this._stopped || (this._repeat <= 0); - }; - Repeat.prototype.stop = function () { - this._stopped = true; - }; - Repeat.prototype.reset = function () { - this._repeat = this._originalRepeat; - }; - return Repeat; - })(); - Actions.Repeat = Repeat; - var RepeatForever = (function () { - function RepeatForever(actor, actions) { - this._stopped = false; - this._actor = actor; - this._actionQueue = new ActionQueue(actor); - var i = 0, len = actions.length; - for (i; i < len; i++) { - actions[i].reset(); - this._actionQueue.add(actions[i]); + }; + /** + * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist + */ + Gamepads.prototype.at = function (index) { + this._enableAndUpdate(); // implicitly enable gamepads when at() is called + if (index >= this._pads.length) { + // Ensure there is a pad to retrieve + for (var i = this._pads.length - 1, max = index; i < max; i++) { + this._pads.push(new Gamepad()); + this._oldPads.push(new Gamepad()); } - ; } - RepeatForever.prototype.update = function (delta) { - this.x = this._actor.x; - this.y = this._actor.y; - if (this._stopped) { - return; + return this._pads[index]; + }; + /** + * Returns a list of all valid gamepads that meet the minimum configuration requirment. + */ + Gamepads.prototype.getValidGamepads = function () { + this._enableAndUpdate(); + var result = []; + for (var i = 0; i < this._pads.length; i++) { + if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) { + result.push(this.at(i)); } - if (!this._actionQueue.hasNext()) { - this._actionQueue.reset(); + } + return result; + }; + /** + * Gets the number of connected gamepads + */ + Gamepads.prototype.count = function () { + return this._pads.filter(function (p) { return p.connected; }).length; + }; + Gamepads.prototype._clonePads = function (pads) { + var arr = []; + for (var i = 0, len = pads.length; i < len; i++) { + arr.push(this._clonePad(pads[i])); + } + return arr; + }; + /** + * Fastest way to clone a known object is to do it yourself + */ + Gamepads.prototype._clonePad = function (pad) { + var i, len; + var clonedPad = new Gamepad(); + if (!pad) { + return clonedPad; + } + for (i = 0, len = pad.buttons.length; i < len; i++) { + if (pad.buttons[i]) { + clonedPad.updateButton(i, pad.buttons[i].value); } - this._actionQueue.update(delta); - }; - RepeatForever.prototype.isComplete = function () { - return this._stopped; - }; - RepeatForever.prototype.stop = function () { - this._stopped = true; - this._actionQueue.clearActions(); - }; - RepeatForever.prototype.reset = function () { return; }; - return RepeatForever; - })(); - Actions.RepeatForever = RepeatForever; + } + for (i = 0, len = pad.axes.length; i < len; i++) { + clonedPad.updateAxes(i, pad.axes[i]); + } + return clonedPad; + }; + /** + * The minimum value an axis has to move before considering it a change + */ + Gamepads.MinAxisMoveThreshold = 0.05; + return Gamepads; + })(ex.Class); + Input.Gamepads = Gamepads; + /** + * Gamepad holds state information for a connected controller. See [[Gamepads]] + * for more information on handling controller input. + */ + var Gamepad = (function (_super) { + __extends(Gamepad, _super); + function Gamepad() { + _super.call(this); + this.connected = false; + this._buttons = new Array(16); + this._axes = new Array(4); + var i; + for (i = 0; i < this._buttons.length; i++) { + this._buttons[i] = 0; + } + for (i = 0; i < this._axes.length; i++) { + this._axes[i] = 0; + } + } + /** + * Whether or not the given button is pressed + * @param button The button to query + * @param threshold The threshold over which the button is considered to be pressed + */ + Gamepad.prototype.isButtonPressed = function (button, threshold) { + if (threshold === void 0) { threshold = 1; } + return this._buttons[button] >= threshold; + }; + /** + * Gets the given button value between 0 and 1 + */ + Gamepad.prototype.getButton = function (button) { + return this._buttons[button]; + }; + /** + * Gets the given axis value between -1 and 1. Values below + * [[MinAxisMoveThreshold]] are considered 0. + */ + Gamepad.prototype.getAxes = function (axes) { + var value = this._axes[axes]; + if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) { + return 0; + } + else { + return value; + } + }; + Gamepad.prototype.updateButton = function (buttonIndex, value) { + this._buttons[buttonIndex] = value; + }; + Gamepad.prototype.updateAxes = function (axesIndex, value) { + this._axes[axesIndex] = value; + }; + return Gamepad; + })(ex.Class); + Input.Gamepad = Gamepad; + /** + * Gamepad Buttons enumeration + */ + (function (Buttons) { + /** + * Face 1 button (e.g. A) + */ + Buttons[Buttons["Face1"] = 0] = "Face1"; + /** + * Face 2 button (e.g. B) + */ + Buttons[Buttons["Face2"] = 1] = "Face2"; + /** + * Face 3 button (e.g. X) + */ + Buttons[Buttons["Face3"] = 2] = "Face3"; + /** + * Face 4 button (e.g. Y) + */ + Buttons[Buttons["Face4"] = 3] = "Face4"; + /** + * Left bumper button + */ + Buttons[Buttons["LeftBumper"] = 4] = "LeftBumper"; + /** + * Right bumper button + */ + Buttons[Buttons["RightBumper"] = 5] = "RightBumper"; + /** + * Left trigger button + */ + Buttons[Buttons["LeftTrigger"] = 6] = "LeftTrigger"; + /** + * Right trigger button + */ + Buttons[Buttons["RightTrigger"] = 7] = "RightTrigger"; + /** + * Select button + */ + Buttons[Buttons["Select"] = 8] = "Select"; + /** + * Start button + */ + Buttons[Buttons["Start"] = 9] = "Start"; + /** + * Left analog stick press (e.g. L3) + */ + Buttons[Buttons["LeftStick"] = 10] = "LeftStick"; + /** + * Right analog stick press (e.g. R3) + */ + Buttons[Buttons["RightStick"] = 11] = "RightStick"; + /** + * D-pad up + */ + Buttons[Buttons["DpadUp"] = 12] = "DpadUp"; + /** + * D-pad down + */ + Buttons[Buttons["DpadDown"] = 13] = "DpadDown"; + /** + * D-pad left + */ + Buttons[Buttons["DpadLeft"] = 14] = "DpadLeft"; + /** + * D-pad right + */ + Buttons[Buttons["DpadRight"] = 15] = "DpadRight"; + })(Input.Buttons || (Input.Buttons = {})); + var Buttons = Input.Buttons; + /** + * Gamepad Axes enumeration + */ + (function (Axes) { + /** + * Left analogue stick X direction + */ + Axes[Axes["LeftStickX"] = 0] = "LeftStickX"; + /** + * Left analogue stick Y direction + */ + Axes[Axes["LeftStickY"] = 1] = "LeftStickY"; + /** + * Right analogue stick X direction + */ + Axes[Axes["RightStickX"] = 2] = "RightStickX"; + /** + * Right analogue stick Y direction + */ + Axes[Axes["RightStickY"] = 3] = "RightStickY"; + })(Input.Axes || (Input.Axes = {})); + var Axes = Input.Axes; + })(Input = ex.Input || (ex.Input = {})); +})(ex || (ex = {})); +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/** + * # Welcome to the Excalibur API + * + * This documentation is automatically generated from the Excalibur + * source code on [GitHub](http://github.com/excaliburjs/Excalibur). + * + * If you're just starting out, we recommend reading the tutorials and guides + * on [Excaliburjs.com](http://excaliburjs.com/docs). If you have questions, + * feel free to get help on the [Excalibur.js mailing list](https://groups.google.com/forum/#!forum/excaliburjs). + * + * If you're looking for a specific method or property, you can search the documentation + * using the search icon at the top or just start typing. + * + * ## Where to Start + * + * These are the core concepts of Excalibur that you should become + * familiar with. + * + * - [[Engine|Intro to the Engine]] + * - [[EventDispatcher|Eventing]] + * - [[Scene|Working with Scenes]] + * - [[BaseCamera|Working with Cameras]] + * - [[Actor|Working with Actors]] + * - [[Label|Labels]] + * - [[Trigger|Triggers]] + * - [[UIActor|UI Actors (HUD)]] + * - [[ActionContext|Action API]] + * - [[Group|Groups]] + * + * ## Working with Resources + * + * Excalibur provides easy ways of loading assets, from images to JSON files. + * + * - [[Loader|Working with the Loader]] + * - [[Texture|Loading Textures]] + * - [[Sound|Loading Sounds]] + * - [[Resource|Loading Generic Resources]] + * + * ## Working with Input + * + * Excalibur comes built-in with support for mouse, keyboard, touch, and controllers. + * + * - [[Pointers|Mouse and Touch]] + * - [[Keyboard]] + * - [[Gamepads|Controller Support]] + * + * ## Working with Media + * + * Add sounds, images, and animations to your game. + * + * - [[Sprite|Working with Sprites]] + * - [[Sound|Working with Sounds]] + * - [[SpriteSheet|Working with SpriteSheets]] + * - [[Animation|Working with Animations]] + * - [[TileMap|Working with TileMaps]] + * + * ## Effects and Particles + * + * Every game needs an explosion or two. Add sprite effects such as lighten, + * darken, and colorize. + * + * - [[Effects|Sprite Effects]] + * - [[ParticleEmitter|Particle Emitters]] + * - [[IPostProcessor|Post Processors]] + * + * ## Math + * + * These classes provide the basics for math & algebra operations. + * + * - [[Point]] + * - [[Vector]] + * - [[Ray]] + * - [[Line]] + * - [[Projection]] + * + * ## Utilities + * + * - [[Util|Utility Functions]] + * - [[Promise|Promises and Async]] + * - [[Logger|Logging]] + * - [[Color|Colors]] + * - [[Timer|Timers]] + */ +var ex; +(function (ex) { + /** + * The Excalibur Engine + * + * The [[Engine]] is the main driver for a game. It is responsible for + * starting/stopping the game, maintaining state, transmitting events, + * loading resources, and managing the scene. + * + * Excalibur uses the HTML5 Canvas API for drawing your game to the screen. + * The canvas is available to all `draw` functions for raw manipulation, + * but Excalibur is meant to simplify or completely remove the need to use + * the canvas directly. + * + * ## Creating a Game + * + * To create a new game, create a new instance of [[Engine]] and pass in + * the configuration ([[IEngineOptions]]). Excalibur only supports a single + * instance of a game at a time, so it is safe to use globally. + * + * You can then call [[start]] which starts the game and optionally accepts + * a [[Loader]] which you can use to pre-load assets. + * + * ```js + * var game = new ex.Engine({ width: 800, height: 600 }); + * + * // call game.start, which is a Promise + * game.start().then(function () { + * // ready, set, go! + * }); + * ``` + * + * ## The Main Loop + * + * The Excalibur engine uses a simple main loop. The engine updates and renders + * the "scene graph" which is the [[Scene|scenes]] and the tree of [[Actor|actors]] within that + * scene. Only one [[Scene]] can be active at a time. The engine does not update/draw any other + * scene, which means any actors will not be updated/drawn if they are part of a deactivated scene. + * + * ![Engine Lifecycle](/assets/images/docs/EngineLifeCycle.png) + * + * **Scene Graph** + * + * ``` + * Engine + * |_ Scene 1 (activated) + * |_ Actor 1 + * |_ Child Actor 1 + * |_ Actor 2 + * |_ Scene 2 (deactiveated) + * |_ Scene 3 (deactiveated) + * ``` + * + * The engine splits the game into two primary responsibilities: updating and drawing. This is + * to keep your game smart about splitting duties so that you aren't drawing when doing + * logic or performing logic as you draw. + * + * ### Update Loop + * + * The first operation run is the [[Engine._update|update]] loop. [[Actor]] and [[Scene]] both implement + * an overridable/extendable `update` method. Use it to perform any logic-based operations + * in your game for a particular class. + * + * ### Draw Loop + * + * The next step is the [[Engine._draw|draw]] loop. A [[Scene]] loops through its child [[Actor|actors]] and + * draws each one. You can override the `draw` method on an actor to customize its drawing. + * You should **not** perform any logic in a draw call, it should only relate to drawing. + * + * ## Working with Scenes + * + * The engine automatically creates a "root" [[Scene]]. You can use this for whatever you want. + * You can manipulate scenes using [[Engine.add|add]], [[Engine.remove|remove]], + * and [[Engine.goToScene|goToScene]]. You can overwrite or remove the `root` scene if + * you want. There always has to be at least one scene and only **one** scene can be + * active at any one time. + * + * Learn more about the [[Scene|scene lifecycle]]. + * + * ### Adding a scene + * + * ```js + * var game = new ex.Engine(); + * + * // create a new level + * var level1 = new ex.Scene(); + * + * // add level 1 to the game + * game.add("level1", level1); + * + * // in response to user input, go to level 1 + * game.goToScene("level1"); + * + * // go back to main menu + * game.goToScene("root"); + * ``` + * + * ### Accessing the current scene + * + * To add actors and other entities to the current [[Scene]], you can use [[Engine.add|add]]. Alternatively, + * you can use [[Engine.currentScene]] to directly access the current scene. + * + * ## Managing the Viewport + * + * Excalibur supports multiple [[DisplayMode|display modes]] for a game. Pass in a `displayMode` + * option when creating a game to customize the viewport. + * + * ## Extending the Engine + * + * For complex games, any entity that inherits [[Class]] can be extended to override built-in + * functionality. This is recommended for [[Actor|actors]] and [[Scene|scenes]], especially. + * + * You can customize the options or provide more for your game by extending [[Engine]]. + * + * **TypeScript** + * + * ```ts + * class Game extends ex.Engine { + * + * constructor() { + * super({ width: 800, height: 600, displayMode: DisplayMode.FullScreen }); + * } + * + * public start() { + * // add custom scenes + * this.add("mainmenu", new MainMenu()); + * + * return super.start(myLoader).then(() => { + * + * this.goToScene("mainmenu"); + * + * // custom start-up + * }); + * } + * } + * + * var game = new Game(); + * game.start(); + * ``` + * + * **Javascript** + * + * ```js + * var Game = ex.Engine.extend({ + * + * constructor: function () { + * Engine.call(this, { width: 800, height: 600, displayMode: DisplayMode.FullScreen }); + * } + * + * start: function() { + * // add custom scenes + * this.add("mainmenu", new MainMenu()); + * + * var _this = this; + * return Engine.prototype.start.call(this, myLoader).then(function() { + * + * _this.goToScene("mainmenu"); + * + * // custom start-up + * }); + * } + * }); + * + * var game = new Game(); + * game.start(); + * ``` + */ + var Engine = (function (_super) { + __extends(Engine, _super); + /** + * @internal + */ + function Engine(args) { + _super.call(this); /** - * Action Queues - * - * Action queues are part of the [[ActionContext|Action API]] and - * store the list of actions to be executed for an [[Actor]]. - * - * Actors implement [[Action.actionQueue]] which can be manipulated by - * advanced users to adjust the actions currently being executed in the - * queue. + * Gets or sets the [[CollisionStrategy]] for Excalibur actors */ - var ActionQueue = (function () { - function ActionQueue(actor) { - this._actions = []; - this._completedActions = []; - this._actor = actor; - } - ActionQueue.prototype.add = function (action) { - this._actions.push(action); - }; - ActionQueue.prototype.remove = function (action) { - var index = this._actions.indexOf(action); - this._actions.splice(index, 1); - }; - ActionQueue.prototype.clearActions = function () { - this._actions.length = 0; - this._completedActions.length = 0; - if (this._currentAction) { - this._currentAction.stop(); - } - }; - ActionQueue.prototype.getActions = function () { - return this._actions.concat(this._completedActions); - }; - ActionQueue.prototype.hasNext = function () { - return this._actions.length > 0; - }; - ActionQueue.prototype.reset = function () { - this._actions = this.getActions(); - var i = 0, len = this._actions.length; - for (i; i < len; i++) { - this._actions[i].reset(); + this.collisionStrategy = ex.CollisionStrategy.DynamicAABBTree; + this._hasStarted = false; + /** + * Current FPS + */ + this.fps = 0; + /** + * Gets or sets the list of post processors to apply at the end of drawing a frame (such as [[ColorBlindCorrector]]) + */ + this.postProcessors = []; + /** + * Contains all the scenes currently registered with Excalibur + */ + this.scenes = {}; + this._animations = []; + /** + * Indicates whether the engine is set to fullscreen or not + */ + this.isFullscreen = false; + /** + * Indicates the current [[DisplayMode]] of the engine. + */ + this.displayMode = DisplayMode.FullScreen; + /** + * Indicates whether audio should be paused when the game is no longer visible. + */ + this.pauseAudioWhenHidden = true; + /** + * Indicates whether the engine should draw with debug information + */ + this.isDebug = false; + this.debugColor = new ex.Color(255, 255, 255); + /** + * Sets the background color for the engine. + */ + this.backgroundColor = new ex.Color(0, 0, 100); + /** + * The action to take when a fatal exception is thrown + */ + this.onFatalException = function (e) { ex.Logger.getInstance().fatal(e); }; + this._isSmoothingEnabled = true; + this._isLoading = false; + this._progress = 0; + this._total = 1; + var width; + var height; + var canvasElementId; + var displayMode; + var options = null; + if (typeof arguments[0] === 'number') { + width = arguments[0]; + height = arguments[1]; + canvasElementId = arguments[2]; + displayMode = arguments[3]; + } + else { + options = arguments[0] || { width: 0, height: 0, canvasElementId: '', displayMode: DisplayMode.FullScreen }; + width = options.width; + height = options.height; + canvasElementId = options.canvasElementId; + displayMode = options.displayMode; + } + // Check compatibility + var detector = new ex.Detector(); + if (!(this._compatible = detector.test())) { + var message = document.createElement('div'); + message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur'; + document.body.appendChild(message); + detector.failedTests.forEach(function (test) { + var testMessage = document.createElement('div'); + testMessage.innerText = 'Browser feature missing ' + test; + document.body.appendChild(testMessage); + }); + if (canvasElementId) { + var canvas = document.getElementById(canvasElementId); + if (canvas) { + canvas.parentElement.removeChild(canvas); } - this._completedActions = []; - }; - ActionQueue.prototype.update = function (delta) { - if (this._actions.length > 0) { - this._currentAction = this._actions[0]; - this._currentAction.update(delta); - if (this._currentAction.isComplete(this._actor)) { - this._completedActions.push(this._actions.shift()); + } + return; + } + this._logger = ex.Logger.getInstance(); + this._logger.info('Powered by Excalibur.js visit", "http://excaliburjs.com", "for more information.'); + this._logger.debug('Building engine...'); + this.canvasElementId = canvasElementId; + if (canvasElementId) { + this._logger.debug('Using Canvas element specified: ' + canvasElementId); + this.canvas = document.getElementById(canvasElementId); + } + else { + this._logger.debug('Using generated canvas element'); + this.canvas = document.createElement('canvas'); + } + if (width && height) { + if (displayMode === undefined) { + this.displayMode = DisplayMode.Fixed; + } + this._logger.debug('Engine viewport is size ' + width + ' x ' + height); + this.width = width; + this.canvas.width = width; + this.height = height; + this.canvas.height = height; + } + else if (!displayMode) { + this._logger.debug('Engine viewport is fullscreen'); + this.displayMode = DisplayMode.FullScreen; + } + this._loader = new ex.Loader(); + this._initialize(options); + this.rootScene = this.currentScene = new ex.Scene(this); + this.addScene('root', this.rootScene); + this.goToScene('root'); + } + /** + * Plays a sprite animation on the screen at the specified `x` and `y` + * (in game coordinates, not screen pixels). These animations play + * independent of actors, and will be cleaned up internally as soon + * as they are complete. Note animations that loop will never be + * cleaned up. + * + * @param animation Animation to play + * @param x x game coordinate to play the animation + * @param y y game coordinate to play the animation + */ + Engine.prototype.playAnimation = function (animation, x, y) { + this._animations.push(new AnimationNode(animation, x, y)); + }; + /** + * Adds an actor to the [[currentScene]] of the game. This is synonymous + * to calling `engine.currentScene.addChild(actor)`. + * + * Actors can only be drawn if they are a member of a scene, and only + * the [[currentScene]] may be drawn or updated. + * + * @param actor The actor to add to the [[currentScene]] + * + * @obsolete Use [[add]] instead. + */ + Engine.prototype.addChild = function (actor) { + this.currentScene.addChild(actor); + }; + /** + * Removes an actor from the [[currentScene]] of the game. This is synonymous + * to calling `engine.currentScene.removeChild(actor)`. + * Actors that are removed from a scene will no longer be drawn or updated. + * + * @param actor The actor to remove from the [[currentScene]]. + */ + Engine.prototype.removeChild = function (actor) { + this.currentScene.removeChild(actor); + }; + /** + * Adds a [[TileMap]] to the [[currentScene]], once this is done the TileMap + * will be drawn and updated. + */ + Engine.prototype.addTileMap = function (tileMap) { + this.currentScene.addTileMap(tileMap); + }; + /** + * Removes a [[TileMap]] from the [[currentScene]], it will no longer be drawn or updated. + */ + Engine.prototype.removeTileMap = function (tileMap) { + this.currentScene.removeTileMap(tileMap); + }; + /** + * Adds a [[Timer]] to the [[currentScene]]. + * @param timer The timer to add to the [[currentScene]]. + */ + Engine.prototype.addTimer = function (timer) { + return this.currentScene.addTimer(timer); + }; + /** + * Removes a [[Timer]] from the [[currentScene]]. + * @param timer The timer to remove to the [[currentScene]]. + */ + Engine.prototype.removeTimer = function (timer) { + return this.currentScene.removeTimer(timer); + }; + /** + * Adds a [[Scene]] to the engine, think of scenes in Excalibur as you + * would levels or menus. + * + * @param key The name of the scene, must be unique + * @param scene The scene to add to the engine + */ + Engine.prototype.addScene = function (key, scene) { + if (this.scenes[key]) { + this._logger.warn('Scene', key, 'already exists overwriting'); + } + this.scenes[key] = scene; + scene.engine = this; + }; + /** + * @internal + */ + Engine.prototype.removeScene = function (entity) { + if (entity instanceof ex.Scene) { + // remove scene + for (var key in this.scenes) { + if (this.scenes.hasOwnProperty(key)) { + if (this.scenes[key] === entity) { + delete this.scenes[key]; } } - }; - return ActionQueue; - })(); - Actions.ActionQueue = ActionQueue; - })(Actions = Internal.Actions || (Internal.Actions = {})); - })(Internal = ex.Internal || (ex.Internal = {})); -})(ex || (ex = {})); -/// -/// -/// -var ex; -(function (ex) { - /** - * Creates a closed polygon drawing given a list of [[Point]]s. - * - * @warning Use sparingly as Polygons are performance intensive - */ - var Polygon = (function () { + } + } + if (typeof entity === 'string') { + // remove scene + delete this.scenes[entity]; + } + }; + Engine.prototype.add = function (entity) { + if (entity instanceof ex.UIActor) { + this.currentScene.addUIActor(entity); + return; + } + if (entity instanceof ex.Actor) { + this.addChild(entity); + } + if (entity instanceof ex.Timer) { + this.addTimer(entity); + } + if (entity instanceof ex.TileMap) { + this.addTileMap(entity); + } + if (arguments.length === 2) { + this.addScene(arguments[0], arguments[1]); + } + }; + Engine.prototype.remove = function (entity) { + if (entity instanceof ex.UIActor) { + this.currentScene.removeUIActor(entity); + return; + } + if (entity instanceof ex.Actor) { + this.removeChild(entity); + } + if (entity instanceof ex.Timer) { + this.removeTimer(entity); + } + if (entity instanceof ex.TileMap) { + this.removeTileMap(entity); + } + if (entity instanceof ex.Scene) { + this.removeScene(entity); + } + if (typeof entity === 'string') { + this.removeScene(entity); + } + }; /** - * @param points The points to use to build the polygon in order + * Changes the currently updating and drawing scene to a different, + * named scene. Calls the [[Scene]] lifecycle events. + * @param key The key of the scene to trasition to. */ - function Polygon(points) { - /** - * The width of the lines of the polygon - */ - this.lineWidth = 5; - /** - * Indicates whether the polygon is filled or not. - */ - this.filled = false; - this._points = []; - this.anchor = new ex.Point(0, 0); - this.rotation = 0; - this.scale = new ex.Point(1, 1); - this._points = points; - var minX = this._points.reduce(function (prev, curr) { - return Math.min(prev, curr.x); - }, 0); - var maxX = this._points.reduce(function (prev, curr) { - return Math.max(prev, curr.x); - }, 0); - this.width = maxX - minX; - var minY = this._points.reduce(function (prev, curr) { - return Math.min(prev, curr.y); - }, 0); - var maxY = this._points.reduce(function (prev, curr) { - return Math.max(prev, curr.y); - }, 0); - this.height = maxY - minY; - this.naturalHeight = this.height; - this.naturalWidth = this.width; - } + Engine.prototype.goToScene = function (key) { + if (this.scenes[key]) { + var oldScene = this.currentScene; + var newScene = this.scenes[key]; + this._logger.debug('Going to scene:', key); + // only deactivate when initialized + if (this.currentScene.isInitialized) { + this.currentScene.onDeactivate.call(this.currentScene); + this.currentScene.eventDispatcher.emit('deactivate', new ex.DeactivateEvent(newScene)); + } + // set current scene to new one + this.currentScene = newScene; + if (!this.currentScene.isInitialized) { + this.currentScene.onInitialize.call(this.currentScene, this); + this.currentScene.eventDispatcher.emit('initialize', new ex.InitializeEvent(this)); + this.currentScene.isInitialized = true; + } + this.currentScene.onActivate.call(this.currentScene); + this.currentScene.eventDispatcher.emit('activate', new ex.ActivateEvent(oldScene)); + } + else { + this._logger.error('Scene', key, 'does not exist!'); + } + }; + /** + * Returns the width of the engine's drawing surface in pixels. + */ + Engine.prototype.getWidth = function () { + if (this.currentScene && this.currentScene.camera) { + return this.width / this.currentScene.camera.getZoom(); + } + return this.width; + }; + /** + * Returns the height of the engine's drawing surface in pixels. + */ + Engine.prototype.getHeight = function () { + if (this.currentScene && this.currentScene.camera) { + return this.height / this.currentScene.camera.getZoom(); + } + return this.height; + }; + /** + * Transforms the current x, y from screen coordinates to world coordinates + * @param point Screen coordinate to convert + */ + Engine.prototype.screenToWorldCoordinates = function (point) { + var newX = point.x; + var newY = point.y; + // transform back to world space + newX = (newX / this.canvas.clientWidth) * this.getWidth(); + newY = (newY / this.canvas.clientHeight) * this.getHeight(); + // transform based on zoom + newX = newX - this.getWidth() / 2; + newY = newY - this.getHeight() / 2; + // shift by focus + if (this.currentScene && this.currentScene.camera) { + var focus = this.currentScene.camera.getFocus(); + newX += focus.x; + newY += focus.y; + } + return new ex.Point(Math.floor(newX), Math.floor(newY)); + }; + /** + * Transforms a world coordinate, to a screen coordinate + * @param point World coordinate to convert + */ + Engine.prototype.worldToScreenCoordinates = function (point) { + var screenX = point.x; + var screenY = point.y; + // shift by focus + if (this.currentScene && this.currentScene.camera) { + var focus = this.currentScene.camera.getFocus(); + screenX -= focus.x; + screenY -= focus.y; + } + // transfrom back on zoom + screenX = screenX + this.getWidth() / 2; + screenY = screenY + this.getHeight() / 2; + // transform back to screen space + screenX = (screenX * this.canvas.clientWidth) / this.getWidth(); + screenY = (screenY * this.canvas.clientHeight) / this.getHeight(); + return new ex.Point(Math.floor(screenX), Math.floor(screenY)); + }; + /** + * Sets the internal canvas height based on the selected display mode. + */ + Engine.prototype._setHeightByDisplayMode = function (parent) { + if (this.displayMode === DisplayMode.Container) { + this.width = this.canvas.width = parent.clientWidth; + this.height = this.canvas.height = parent.clientHeight; + } + if (this.displayMode === DisplayMode.FullScreen) { + document.body.style.margin = '0px'; + document.body.style.overflow = 'hidden'; + this.width = this.canvas.width = parent.innerWidth; + this.height = this.canvas.height = parent.innerHeight; + } + }; + /** + * Initializes the internal canvas, rendering context, displaymode, and native event listeners + */ + Engine.prototype._initialize = function (options) { + var _this = this; + if (this.displayMode === DisplayMode.FullScreen || this.displayMode === DisplayMode.Container) { + var parent = (this.displayMode === DisplayMode.Container ? + (this.canvas.parentElement || document.body) : window); + this._setHeightByDisplayMode(parent); + window.addEventListener('resize', function (ev) { + _this._logger.debug('View port resized'); + _this._setHeightByDisplayMode(parent); + _this._logger.info('parent.clientHeight ' + parent.clientHeight); + _this.setAntialiasing(_this._isSmoothingEnabled); + }); + } + // initialize inputs + this.input = { + keyboard: new ex.Input.Keyboard(this), + pointers: new ex.Input.Pointers(this), + gamepads: new ex.Input.Gamepads(this) + }; + this.input.keyboard.init(); + this.input.pointers.init(options ? options.pointerScope : ex.Input.PointerScope.Document); + this.input.gamepads.init(); + // Issue #385 make use of the visibility api + // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API + document.addEventListener('visibilitychange', function () { + if (document.hidden || document.msHidden) { + _this.eventDispatcher.emit('hidden', new ex.HiddenEvent()); + _this._logger.debug('Window hidden'); + } + else { + _this.eventDispatcher.emit('visible', new ex.VisibleEvent()); + _this._logger.debug('Window visible'); + } + }); + /* + // DEPRECATED in favor of visibility api + window.addEventListener('blur', () => { + this.eventDispatcher.publish(EventType[EventType.Blur], new BlurEvent()); + }); + + window.addEventListener('focus', () => { + this.eventDispatcher.publish(EventType[EventType.Focus], new FocusEvent()); + });*/ + this.ctx = this.canvas.getContext('2d'); + if (!this.canvasElementId) { + document.body.appendChild(this.canvas); + } + }; + /** + * If supported by the browser, this will set the antialiasing flag on the + * canvas. Set this to `false` if you want a 'jagged' pixel art look to your + * image resources. + * @param isSmooth Set smoothing to true or false + */ + Engine.prototype.setAntialiasing = function (isSmooth) { + this._isSmoothingEnabled = isSmooth; + this.ctx.imageSmoothingEnabled = isSmooth; + this.ctx.webkitImageSmoothingEnabled = isSmooth; + this.ctx.mozImageSmoothingEnabled = isSmooth; + this.ctx.msImageSmoothingEnabled = isSmooth; + }; /** - * @notimplemented Effects are not supported on `Polygon` + * Return the current smoothing status of the canvas */ - Polygon.prototype.addEffect = function (effect) { - // not supported on polygons + Engine.prototype.getAntialiasing = function () { + return this.ctx.imageSmoothingEnabled || + this.ctx.webkitImageSmoothingEnabled || + this.ctx.mozImageSmoothingEnabled || + this.ctx.msImageSmoothingEnabled; }; /** - * @notimplemented Effects are not supported on `Polygon` + * Updates the entire state of the game + * @param delta Number of milliseconds elapsed since the last update. */ - Polygon.prototype.removeEffect = function (param) { - // not supported on polygons + Engine.prototype._update = function (delta) { + if (this._isLoading) { + // suspend updates untill loading is finished + return; + } + this.emit('preupdate', new ex.PreUpdateEvent(this, delta, this)); + // process engine level events + this.currentScene.update(this, delta); + // update animations + this._animations = this._animations.filter(function (a) { + return !a.animation.isDone(); + }); + // Update input listeners + this.input.keyboard.update(delta); + this.input.pointers.update(delta); + this.input.gamepads.update(delta); + // Publish update event + this.eventDispatcher.emit('update', new ex.UpdateEvent(delta)); + this.emit('postupdate', new ex.PreUpdateEvent(this, delta, this)); }; /** - * @notimplemented Effects are not supported on `Polygon` + * Draws the entire game + * @param draw Number of milliseconds elapsed since the last draw. */ - Polygon.prototype.clearEffects = function () { - // not supported on polygons - }; - Polygon.prototype.reset = function () { - //pass - }; - Polygon.prototype.draw = function (ctx, x, y) { - ctx.save(); - ctx.translate(x + this.anchor.x, y + this.anchor.y); - ctx.scale(this.scale.x, this.scale.y); - ctx.rotate(this.rotation); - ctx.beginPath(); - ctx.lineWidth = this.lineWidth; - // Iterate through the supplied points and contruct a 'polygon' - var firstPoint = this._points[0]; - ctx.moveTo(firstPoint.x, firstPoint.y); - var i = 0, len = this._points.length; - for (i; i < len; i++) { - ctx.lineTo(this._points[i].x, this._points[i].y); + Engine.prototype._draw = function (delta) { + var ctx = this.ctx; + this.emit('predraw', new ex.PreDrawEvent(ctx, delta, this)); + if (this._isLoading) { + ctx.fillStyle = 'black'; + ctx.fillRect(0, 0, this.width, this.height); + this._drawLoadingBar(ctx, this._progress, this._total); + // Drawing nothing else while loading + return; } - ctx.lineTo(firstPoint.x, firstPoint.y); - ctx.closePath(); - if (this.filled) { - ctx.fillStyle = this.fillColor.toString(); - ctx.fill(); + ctx.clearRect(0, 0, this.width, this.height); + ctx.fillStyle = this.backgroundColor.toString(); + ctx.fillRect(0, 0, this.width, this.height); + this.currentScene.draw(this.ctx, delta); + // todo needs to be a better way of doing this + var a = 0, len = this._animations.length; + for (a; a < len; a++) { + this._animations[a].animation.draw(ctx, this._animations[a].x, this._animations[a].y); } - ctx.strokeStyle = this.lineColor.toString(); - if (this.flipHorizontal) { - ctx.translate(this.width, 0); - ctx.scale(-1, 1); + this.fps = 1.0 / (delta / 1000); + // Draw debug information + if (this.isDebug) { + this.ctx.font = 'Consolas'; + this.ctx.fillStyle = this.debugColor.toString(); + var keys = this.input.keyboard.getKeys(); + for (var j = 0; j < keys.length; j++) { + this.ctx.fillText(keys[j].toString() + ' : ' + (ex.Input.Keys[keys[j]] ? ex.Input.Keys[keys[j]] : 'Not Mapped'), 100, 10 * j + 10); + } + this.ctx.fillText('FPS:' + this.fps.toFixed(2).toString(), 10, 10); } - if (this.flipVertical) { - ctx.translate(0, this.height); - ctx.scale(1, -1); + // Post processing + for (var i = 0; i < this.postProcessors.length; i++) { + this.postProcessors[i].process(this.ctx.getImageData(0, 0, this.width, this.height), this.ctx); } - ctx.stroke(); - ctx.restore(); + this.emit('postdraw', new ex.PreDrawEvent(ctx, delta, this)); }; - return Polygon; - })(); - ex.Polygon = Polygon; -})(ex || (ex = {})); -/// -var ex; -(function (ex) { - (function (ColorBlindness) { - ColorBlindness[ColorBlindness["Protanope"] = 0] = "Protanope"; - ColorBlindness[ColorBlindness["Deuteranope"] = 1] = "Deuteranope"; - ColorBlindness[ColorBlindness["Tritanope"] = 2] = "Tritanope"; - })(ex.ColorBlindness || (ex.ColorBlindness = {})); - var ColorBlindness = ex.ColorBlindness; - // Color correction algorithm originally sourced from http://www.daltonize.org/ - var ColorBlindCorrector = (function () { - function ColorBlindCorrector(engine, simulate, colorMode) { - if (simulate === void 0) { simulate = false; } - if (colorMode === void 0) { colorMode = ColorBlindness.Protanope; } - this.engine = engine; - this.simulate = simulate; - this.colorMode = colorMode; - this._vertexShader = 'attribute vec2 a_position;' + - 'attribute vec2 a_texCoord;' + - 'uniform vec2 u_resolution;' + - 'varying vec2 v_texCoord;' + - 'void main() {' + - // convert the rectangle from pixels to 0.0 to 1.0 - 'vec2 zeroToOne = a_position / u_resolution;' + - // convert from 0->1 to 0->2 - 'vec2 zeroToTwo = zeroToOne * 2.0;' + - // convert from 0->2 to -1->+1 (clipspace) - 'vec2 clipSpace = zeroToTwo - 1.0;' + - 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' + - // pass the texCoord to the fragment shader - // The GPU will interpolate this value between points. - 'v_texCoord = a_texCoord;' + - '}'; - this._fragmentShader = 'precision mediump float;' + - // our texture - 'uniform sampler2D u_image;' + - // the texCoords passed in from the vertex shader. - 'varying vec2 v_texCoord;' + - // Color blind conversions - /*'mat3 m[9] =' + - '{' + - 'mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ),' + // normal - 'mat3(0.567, 0.433, 0.0, 0.558, 0.442, 0.0, 0.0, 0.242, 0.758),' + // protanopia - 'mat3(0.817, 0.183, 0.0, 0.333, 0.667, 0.0, 0.0, 0.125,0.875),' + // protanomaly - 'mat3(0.625, 0.375, 0.0, 0.7, 0.3, 0.0, 0.0, 0.3,0.7 ),' + // deuteranopia - 'mat3(0.8, 0.2, 0.0, 0.258, 0.742, 0.0, 0.0, 0.142,0.858),' + // deuteranomaly - 'mat3(0.95, 0.05, 0.0, 0.0, 0.433, 0.567, 0.0, 0.475,0.525),' + // tritanopia - 'mat3(0.967, 0.033, 0.0, 0.0, 0.733, 0.267, 0.0, 0.183,0.817),' + // tritanomaly - 'mat3(0.299, 0.587, 0.114, 0.299, 0.587, 0.114, 0.299, 0.587,0.114),' + // achromatopsia - 'mat3(0.618, 0.320, 0.062, 0.163, 0.775, 0.062, 0.163, 0.320,0.516)' + // achromatomaly - '};' +*/ - 'void main() {' + - 'vec4 o = texture2D(u_image, v_texCoord);' + - // RGB to LMS matrix conversion - 'float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);' + - 'float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);' + - 'float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);' + - // Simulate color blindness - '//MODE CODE//' + - /* Deuteranope for testing - 'float l = 1.0 * L + 0.0 * M + 0.0 * S;' + - 'float m = 0.494207 * L + 0.0 * M + 1.24827 * S;' + - 'float s = 0.0 * L + 0.0 * M + 1.0 * S;' +*/ - // LMS to RGB matrix conversion - 'vec4 error;' + - 'error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);' + - 'error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);' + - 'error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);' + - 'error.a = 1.0;' + - 'vec4 diff = o - error;' + - 'vec4 correction;' + - 'correction.r = 0.0;' + - 'correction.g = (diff.r * 0.7) + (diff.g * 1.0);' + - 'correction.b = (diff.r * 0.7) + (diff.b * 1.0);' + - 'correction = o + correction;' + - 'correction.a = o.a;' + - '//SIMULATE//' + - '}'; - this._internalCanvas = document.createElement('canvas'); - this._internalCanvas.width = engine.getWidth(); - this._internalCanvas.height = engine.getHeight(); - this._gl = this._internalCanvas.getContext('webgl', { preserveDrawingBuffer: true }); - this._program = this._gl.createProgram(); - var fragmentShader = this._getShader('Fragment', this._getFragmentShaderByMode(colorMode)); - var vertextShader = this._getShader('Vertex', this._vertexShader); - this._gl.attachShader(this._program, vertextShader); - this._gl.attachShader(this._program, fragmentShader); - this._gl.linkProgram(this._program); - if (!this._gl.getProgramParameter(this._program, this._gl.LINK_STATUS)) { - ex.Logger.getInstance().error('Unable to link shader program!'); - } - this._gl.useProgram(this._program); - } - ColorBlindCorrector.prototype._getFragmentShaderByMode = function (colorMode) { - var code = ''; - if (colorMode === ColorBlindness.Protanope) { - code = - 'float l = 0.0 * L + 2.02344 * M + -2.52581 * S;' + - 'float m = 0.0 * L + 1.0 * M + 0.0 * S;' + - 'float s = 0.0 * L + 0.0 * M + 1.0 * S;'; - } - else if (colorMode === ColorBlindness.Deuteranope) { - code = - 'float l = 1.0 * L + 0.0 * M + 0.0 * S;' + - 'float m = 0.494207 * L + 0.0 * M + 1.24827 * S;' + - 'float s = 0.0 * L + 0.0 * M + 1.0 * S;'; - } - else if (colorMode === ColorBlindness.Tritanope) { - code = - 'float l = 1.0 * L + 0.0 * M + 0.0 * S;' + - 'float m = 0.0 * L + 1.0 * M + 0.0 * S;' + - 'float s = -0.395913 * L + 0.801109 * M + 0.0 * S;'; - } - if (this.simulate) { - this._fragmentShader = this._fragmentShader.replace('//SIMULATE//', 'gl_FragColor = error.rgba;'); + /** + * Starts the internal game loop for Excalibur after loading + * any provided assets. + * @param loader Optional resources to load before starting the main loop. Some [[ILoadable]] such as a [[Loader]] collection, + * [[Sound]], or [[Texture]]. + */ + Engine.prototype.start = function (loader) { + if (!this._compatible) { + var promise = new ex.Promise(); + return promise.reject('Excalibur is incompatible with your browser'); + } + var loadingComplete; + if (loader) { + loader.wireEngine(this); + loadingComplete = this.load(loader); } else { - this._fragmentShader = this._fragmentShader.replace('//SIMULATE//', 'gl_FragColor = correction.rgba;'); - } - return this._fragmentShader.replace('//MODE CODE//', code); - }; - ColorBlindCorrector.prototype._setRectangle = function (gl, x, y, width, height) { - var x1 = x; - var x2 = x + width; - var y1 = y; - var y2 = y + height; - this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array([ - x1, y1, - x2, y1, - x1, y2, - x1, y2, - x2, y1, - x2, y2]), this._gl.STATIC_DRAW); - }; - ColorBlindCorrector.prototype._getShader = function (type, program) { - var shader; - if (type === 'Fragment') { - shader = this._gl.createShader(this._gl.FRAGMENT_SHADER); - } - else if (type === 'Vertex') { - shader = this._gl.createShader(this._gl.VERTEX_SHADER); + loadingComplete = ex.Promise.wrap(); + } + if (!this._hasStarted) { + this._hasStarted = true; + this._logger.debug('Starting game...'); + // Mainloop + var lastTime = Date.now(); + var game = this; + (function mainloop() { + if (!game._hasStarted) { + return; + } + try { + game._requestId = window.requestAnimationFrame(mainloop); + // Get the time to calculate time-elapsed + var now = Date.now(); + var elapsed = Math.floor(now - lastTime) || 1; + // Resolves issue #138 if the game has been paused, or blurred for + // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability + // and provides more expected behavior when the engine comes back + // into focus + if (elapsed > 200) { + elapsed = 1; + } + game._update(elapsed); + game._draw(elapsed); + lastTime = now; + } + catch (e) { + window.cancelAnimationFrame(game._requestId); + game.stop(); + game.onFatalException(e); + } + })(); + this._logger.debug('Game started'); } else { - ex.Logger.getInstance().error('Error unknown shader type', type); } - this._gl.shaderSource(shader, program); - this._gl.compileShader(shader); - if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) { - ex.Logger.getInstance().error('Unable to compile shader!', this._gl.getShaderInfoLog(shader)); - return null; + return loadingComplete; + }; + /** + * Stops Excalibur's main loop, useful for pausing the game. + */ + Engine.prototype.stop = function () { + if (this._hasStarted) { + this._hasStarted = false; + this._logger.debug('Game stopped'); + } + }; + /** + * Takes a screen shot of the current viewport and returns it as an + * HTML Image Element. + */ + Engine.prototype.screenshot = function () { + var result = new Image(); + var raw = this.canvas.toDataURL('image/png'); + result.src = raw; + return result; + }; + /** + * Draws the Excalibur loading bar + * @param ctx The canvas rendering context + * @param loaded Number of bytes loaded + * @param total Total number of bytes to load + */ + Engine.prototype._drawLoadingBar = function (ctx, loaded, total) { + if (this._loadingDraw) { + this._loadingDraw(ctx, loaded, total); + return; } - return shader; - }; - ColorBlindCorrector.prototype.process = function (image, out) { - // look up where the vertex data needs to go. - var positionLocation = this._gl.getAttribLocation(this._program, 'a_position'); - var texCoordLocation = this._gl.getAttribLocation(this._program, 'a_texCoord'); - var texCoordBuffer = this._gl.createBuffer(); - this._gl.bindBuffer(this._gl.ARRAY_BUFFER, texCoordBuffer); - this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array([ - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 0.0, 1.0, - 1.0, 0.0, - 1.0, 1.0]), this._gl.STATIC_DRAW); - this._gl.enableVertexAttribArray(texCoordLocation); - this._gl.vertexAttribPointer(texCoordLocation, 2, this._gl.FLOAT, false, 0, 0); - // Create a texture. - var texture = this._gl.createTexture(); - this._gl.bindTexture(this._gl.TEXTURE_2D, texture); - // Set the parameters so we can render any size image. - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE); - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE); - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST); - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST); - // Flip the texture when unpacking into the gl context, gl reads textures in the opposite order as everything else :/ - this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, 1); - // Upload the image into the texture. - this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA, this._gl.RGBA, this._gl.UNSIGNED_BYTE, image); - // lookup uniforms - var resolutionLocation = this._gl.getUniformLocation(this._program, 'u_resolution'); - // set the resolution - this._gl.uniform2f(resolutionLocation, this._internalCanvas.width, this._internalCanvas.height); - // Create a buffer for the position of the rectangle corners. - var positionBuffer = this._gl.createBuffer(); - this._gl.bindBuffer(this._gl.ARRAY_BUFFER, positionBuffer); - this._gl.enableVertexAttribArray(positionLocation); - this._gl.vertexAttribPointer(positionLocation, 2, this._gl.FLOAT, false, 0, 0); - // Set a rectangle the same size as the image. - this._setRectangle(this._gl, 0, 0, image.width, image.height); - // Draw the rectangle. - this._gl.drawArrays(this._gl.TRIANGLES, 0, 6); - // Grab tranformed image from internal canvas - var pixelData = new Uint8Array(image.width * image.height * 4); - this._gl.readPixels(0, 0, image.width, image.height, this._gl.RGBA, this._gl.UNSIGNED_BYTE, pixelData); - image.data.set(pixelData); - out.putImageData(image, 0, 0); - }; - return ColorBlindCorrector; + var y = this.canvas.height / 2; + var width = this.canvas.width / 3; + var x = width; + // loading image + var image = new Image(); + /* tslint:disable:max-line-length */ + // 64 bit string encoding of the excalibur logo + image.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAEsCAYAAAA7Ldc6AAAACXBIWXMAAA7CAAAOwgEVKEqAAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAOBFJREFUeNrs3U9zE1fC7/GfAXvAgBE4mTg84xuReSpTtzJVI+pRNlk8ETW7WTjOK0BessLeU4Wpmj3OykubV4DCU0XNZgplFtngqihVT+6tcO+Acj0DzjiGtjHCsY24C5027UZ/TkvdUrf0/VRRWLIstfqc7j6/7nNOD71+/VoAAAAA0A1HWAUAAAAAuuWY+8PQ0BBrA0BsrKyspCRNS7os6cv/+I//KLBWAABIviG3CxYBBEBMgkde0ucmfEiSk81mz9JdFACA/nCMVQAgBqFj2hM6Ur5fF1hDAAAQQACg09CRkXS1Qejw+pK1BQBA/6ALFoBuh47LJnSkLf6knM1mL0gSXbAAAOgPXAEBEHXoSJvAcbVR6Dhy5IhGR0d14sQJvXjxQpVKxf1VgTUIAAABBABsQ8dlSZlGrzt16pROnDih0dFRSVK1WtX6+rr3JbdYmwAAEEAAoF7oSJnQ4Z3B6i3ulY7R0VEdOXL4VkTb29veh6VsNltizQIAQAABAG/wyLcKHSMjIzp9+nTd0OH14sUL70OufgAAQAABgJbT5h6EjpMnT2p0dFTHjrXe1ezv72t3d9f7VIE1DQAAAQTA4IaOjFpMm3vs2DGNjo7q9OnTVqHDyzPwXKp1vyqz1gEAIIAAGLzQ0XTaXDd0nDx5UiMjI21/1vPnz70PufcHAAAEEAADEjrSCjBtrjuDVSd2d3e1v7/vfapASQAAQAAB0P+hI9C0uWHxDT4vZLNZh1IBAIAAAqC/QkdKHU6bGxbf+I+vKB0AAAggAPoneOQV0rS5YdjZ2fF2v3JE9ysAAAggABIfOqYV8rS5YaH7FQAABBAA/RE6Mopw2tyw0P0KAAACCIBkh46uTJsbVvioVqvuQyebzRYoRQAACCAAkhE+8pKW6v0u7Glzw/Ly5UvvQ8IHAAAEEABJDh9RTZsbhmq1qu3tbe9T3HwQAAACCICkhY8jR47o7NmzXZnBqhO+sR/lbDZbojQBACCAAEhY+Hjvvfd6PrbDBt2vAAAYTEdYBQDho9uq1ar/CsgtShQAAAIIAMJHJHxjP0p0vwIAgAACgPARGd/NB7n6AQAAAQQA4SMa+/v72t3d9T5VoGQBACCAACB8RMJ39aOUzWbLlC4AAIODWbCABIaPkZERjY+PJy58SOLeHwAAEEAAJC18vPfee7G+x0cju7u72t/f9z5VoIQBABgsdMECCB9d4+t+Vchmsw6lDAAAAQQA4SMSvnt/fEUpAwBAAAFA+IgsfHi6Xzmi+xUAAAQQAISPqLx8+dL7kO5XAAAQQAAQPqJD9ysAAEAAAQgfXQsf1WrVfehks9kCJQ4AAAEEAOEjEr7Zr5YpcQAACCAACB+RqFar/u5Xtyh1AAAIIAAIH5HwhY9yNpstUfIAABBAABA+IuGf/YqSBwCAAAKA8BGJ/f19/xWQLyl9AAAIIAAIH5HwhY9SNpstUwMAACCAACB8RMI3+xWDzwEAAAEEIHxEY39/X7u7u96nCtQCAABAAAEIH5HwXf0o0v0KAAAQQADCR2S2t7e9D+l+BQAACCAA4SMau7u72t/f9z5VoDYAAAACCED4iISv+1Uhm8061AgAAEAAAQgfkfBNv/sVNQIAALiGXr9+XfthaIi1ARA+Qgkf6+vr7kMnm82eDeN93X0VAABINq6AAISPUL18+dL7sECtAAAABBCA8BEZul8BAIBm6IIFED5Cs7W1pWfPnrkPQ+t+JdEFCwCAfsEVEIDwEYrt7W1v+JCkZWoHAAAggACEj0jCx8bGhvepkqQb1BAAAEAAAQgf3Qgfl7j3BwAAIIAAhA/CBwAAIIAAhA/CBwAAIIAAIHwQPgAAAAEEIHwQPgAAAAEEIHwQPgAAAAggAOGD8AEAAAggAOGD8AEAAAggAEz4uEn4IHwAAIBwHWMVAHXDx5KkPOGD8AEAAMLFFRCA8EH4AAAABBCA8EH4AAAABBCA8EH4AAAAIIAAhA/CBwAAIIAAhA/CBwAAAAEEIHwQPgAAAAEEIHwQPgAAAAEEIHwQPgAAAAggAOGD8AEAAAggAOGD8AEAAEAAAeGD8EH4AAAABBCA8EH4AAAABBCA8EH4AAAAIIAAhA/CBwAAIIAAhA/CBwAAAAEEhA/CB+EDAAAQQADCB+EDAAAQQADCB+EDAACAAAIQPggfAACAAAIQPggfAAAABBAQPggfhA8AABArx1gFIHwk3+bmphzHIXwAAAACCED4iNbGxoa2t7cJHwAAIBHoggXCB+EDAACAAAIQPggfAACAAAIQPggfAAAABBAQPggfhA8AAEAAAQgfhA8AAAACCAgfhA8AAAACCED4IHwAAAACCED4IHwAAAAQQED4IHwAAAAkCHdCB+GD8IGEev36NSuh965bvu4G3xeAa2hoaLC/v3sAG/QVAcIH4YPGNusE7RSD7fGW7wuAAFJDFywQPggfAAAABBAQPggfhA8ATaUl3ZT0SLUrE+6/R5KWzO8BdE+KbdIOXbBA+CB8JALdjVgncS0G2+NtyJ+bNw2dVJPXOJLmJC33wfcF4i4n6bbFNjkjqcAYEAIICB99ET5ojBJAMDABJCfpXoDXfyGpQAABIpMx22TK8vUXh4aGSgQQAggIH4kOHzRGCSAYqADySMG6cpQlXSCAAJG5Z04M2CoODQ1dIoAQQED4SHT4oDFKAMHABJCMpG/b+LtLkooEECB0aXNSIKgL5uRA/4ULi0zBIHQQPvogfAAYGLk2/+4zVh0QWQDp5t/1BQIICB+EDwDJcYZVAPSFFAEEIHwQPgAkwXdt/t0mqw6IlYE+5hNAQPggfABIjlKbf1dk1QGx2iZLg7zSCCAgfBA+ACRHWcGn1C0OemMHiJCj4PfaWdaAXwFhFiwQPvokfDAj0uChzONRDLbH2xA/M6XarDspy8bRRYU32w6zYAH1t8l7qs1SZ3MS4WI/BxBmwUKswsfx48cJHxGFDwADxQ0VxRavK6k2/W6ZVQZEvk3aTHVd7PfwYR1SuAKCboSPU6dOaXx8fODWQzfDB2fDBw9lHo9isD3eRvT505I+1+EpPcuSvlJ4dz+P0/cF4i4n6XIXt8n4hQuLTEEAAeGjD8IHjVECCAY2gPB9ASQugNAFC4SPPggfAAAASUEAAeGD8AEAAEAAAeGD8AEAAEAAAQgfhA8AAAACCAgfhA8AAAACCAgfhA8AAAAQQED4IHwAAAAQQED4IHwAAAAQQADCB+EDAACgc8dYBSB8JCd8VKvVhr9r867YKUk5SX+QlDGP6ylJ+tH8X2RriIWUKbPPPD83UvSUXymm3ydj/n3Qoi4m5fsgmLTZF31g/q+nbP59bcrdYbX15X4tZ/ZrGVMv0qasS57t/yu2/baP9e469e57S90+3g+5jRab26aD8EH46O2Vj2YBJOCOKC/pcotGazMFcwAohNwI8O8Ym3EbI91oGNkuU9SNorSk6Q7LzjHldqvHYTIj6XNzUMx18D7u9/myRw0S2+Q/1KN6GfZ2Eub37bQ+F009Lqi7YaRX677V9pSyXGdhnwQJ4/PSkq6b+pAKUP6XYhai41QvwjhetHW8t8kUBBAQPhISPkIIIO4OPh/iIjmSFkzjL4z1kJb0reUByJF0oQsNj0eWB5WSpIsRLcO0pKsdNtQbHQhvSFruYiPpsvk+6Qjev2i+TzeDVa8CyHVJ8xavmzfrJE7fN2Pqc1j7orD3Q3Fd983cs9w/hFkPc+ZzO/m8lKkL821u73EKIHGpF1Ec693trGCWvdxpAGEMCAgfCQkfHUhJumka0vkI3nvevPdsSA3ihQCffT3idTcboKE8E8Hn58y6vR1B+HAPVEvmM3IRrse8aah8G3Cdttsguin7s6joHre+fRvyvsi7H5pmNSdGxmyv823+fZFVWDcERXGsd7ezvHn/pU734wQQED76O3zkPI2+boSceyE0/G7IvivNrDq7tBxWwFlQuN1/UiZ03Iuwse5vGEbRcPcerHJdrPezIdVFtH8ioZsNI/92s0QRxOoY1OxkQSf7769ZvYf24d92EOba3be3fcwggIDw0b/h43oXG7BhHlSkYFcTbkb0Xa7KvitYmJfTp9W7M7mzIZWfN3ike1T/M4SQWASQTJcbRm79+5ayj618SNtmiVV5aBvL9OCzZ9v9bAIICB/9GT6WunzAr9fw62RnWJJ9V6ycwr/Ckw6w/uYUXr/zWdXO4Pay4eSWXzsBKGcORr0MHvW+C3rb0Mz0sOwJIfFrLIdxhaokZkFzj1W9rudptdGtkgACwkd/hY+Uwu9f3e5yLHW4U2w50M3jesg7YNuuV0WFN4B7SdFdzWmn/NpZZ71qbLZq8NwUum0phH0AZZ98n9VpLIehxKqV1PsTVl6B2kfcBwSEj/4JH+5Bv50GYMk0pr+usxNJmYNILuB7Z8zOsd1ZShzVumLZHLBSpqERxkDwTIAANxNiuXUSGh01nrM9ozfz6dtaUG22kyB+DGE9FNX4zGY738M1q9o0kkX29F2R66D8ZU48pD2N1nQHy5KX9J3sr6giGY1lxn/UTvoEPd6Xzb7dPdYXfdttSrV7hUwHfO/AxwwCCAgf/RU+pgP+zbLsrjQUPI3AINNn5kzjr92Df9F8ts33yiuce1vYnjGdVzhzuc92ED6W9WZ+dptgZVN2RdW6lbWzLFcDHrRKejPHfClAQGxnCtfrBJDYcWR3T5qU3tzPoJ1wc918TplVHvvGsuM5EeENGZ/pzc0q0+IKSErBuh6X1XrK9aLneH/DrOfLZl+bbrEfD3zMoAsWCB+Nw0cxQeEjH7BBVlTtHhozAQ/KJfM3lxSse1S6g+82I/tLu512t8hZNnDKqt1zQCF8XjvLXPCUXyFg2V1o8jeOpC86+D42ByHHHAQvmn9BZj3z10EngrJFd4LHjKcOFy3rzCVTZ4IGyZSYGatXMubfvEUZz5k68YXe3M/H/XfDU2cuEECsJ0mRZ3+7HPAz3NByQY3HOrZ9zCCAED4IH/XDx3I2m01K+EgHbMTOBwwQjQLMRcuDQEqd3a/Dkf0sUxl1NiDdtpESxsDzlGpdEoKuiy/Mv3bLr+x5D/93uNTh9yo2aRw6pu65jc5OGxDFNpb3Knv9nnPrwHKbda1kyn0+4N8RQHsjZXF8WjZ1YsGyTpRZrdYnHAsKdhKvkQVPGXnNtFsedMFq050r1v1SbXZ4H/je69bUYvR3JiZ8NA0fMwn6CkEGes4ovEHTjmkI2Aw8zivYoPJ6O7/PLbendrtb5C236YKCj4/otNzchlcnwaPe9yiZEJQxoaoUwvvOqDYFr7+BEeZsYf7G6LeWr58269wRuq0UUvB03VBt3FGQKxt0w+u+TIv9XJjHpEFapzbHKkfh3iDXMfvxr8xxY7mTY+HABJA7V5RTrS9bWKEhSpEPriJ89E34mA5QX6PY0bs7OJtpAK+qvbEFzRq29aRUO+MW5LKw+ze2O+BO5RRsvI7b0A674Vw275tXeIN0y6ae5SNodDZaN/OyPyM+TYOn66IKoMuqncCbD7DdZUT3nW4ifIQvF2D7cCL4/KJqV0M6eu8jA1Zgeb25DNvsX6/9gfBB+LBk2/VqIcIdfcmy8ZoPoWEbpJEZZFu27U+7oHCuQATpkuaofnepMEPkQsjvOWfKyrabXqe+DLB+PqP90lUzCqcLSCPuWIEg2zriUS8IH+05Y/m6ryJcho63Z7pgtWl4+KjGxo63riVnfqXh4aPNC+FY7ffff79mc8aA8EH48Dbo05YBYS7iZflStbEXzepuygSDQoeNjWnZzaaypNpZmlbSshs3UlY4dzwPeqIjzG5X3eIo3LvD23xewTLk5oRulcmlLgXQOQXrhjdD8fTUAuGj42OIjWKcv8RABpDJyZQmJxu3k8bGWoeGsFUqe94AEskBkvDRV+FDsj+T143v5piDynyL132uzsdPzMnu3iBusFho8TrbmxiGtR6DXP1YEH3WbX1lGUDSYhxIN3QrfMh8zrJl+afMMZbtqjdKiv6EGBJgIGfBGh0d1vj4aMN/3Q4f7jJ5mUHuhA/CRyMZ2V0FWO5iI+CWxWvCCNdF2XcZahUucpaNluWQGizpAOvAUXevIiRdMeD2g+gbmt10K8BrP6d4eobw0T3pOC8c0/DGyPj4yUgOkISPvgsfkv3Vj242YMsWjY50SDtF2xm1Ump+xcHmaoQT4kEzSP/zBXGWPghHwW5miP4LoGXL1+ZYXT2xLK48hXWsTXw9H6QA8oH7gzvmIm58V0FCOUASPvoyfEh2MygFOSCH2Qjoxk4xSCiYbbA95SyX5UaIQWA6wPf7UminXtg4w6rqSwUCaKxxRbe7AcS2ezEBJGLpgyPPmeOxXMDx8VHvw45naiF89G34yFjuVG71YNlsppD+IMTGhm2Do95sYTb3DygpvBmi0rK/+rMsrn60o8QqGGhBZv3Jsbq6alncQLCbx1n3mHMzrl+CLlgx4gtGGcIH4aMB2/7LhR4sm02jOcwD/0yAz8x7Huctw0CYdWU6wGtvCVHVPxqf/asY4LUZVldXcfUj3Hpuu6/Lq3bTwBQBBA2NjR33DoBP3bnS3g6S8NHX4cO28VRSb86gF7v8eU6AA9tNz07YZuzHgsI9o257f5+yOJPfrjSrYODZbjt0w+uegrj6EbblAK+dVm2a6mkCCBrydcPKBfnblZWV1MrKyj3CR1+HD8nuzF0xxsufC/n9Fiy/b8oEj7xFQzVIsAmz3OJedr2WMvVn1pTlPXNgfW3+5VlFA8+2oZtjVcUuFMJe0LGJadWuhNyLS93nRoSxCyAntbb23H34uSz7n6+srKRMxcoQPvo6fKRldyn1ux4uo6PuX+6dkfTI4nWzljvtKO7cbBtAvhbcup5T7cpRRvZjn0Bjd5rVgD7nmBASdIxHzvwrm78vqEfjDbkCEjMTE6cPVZQ7V1ofcAkfAxM+3EaZjXKPGwDdVlbrmyC6Wm1TRYU/fiYT8LsMauCYVe0s3TMTKJfMcznCByxthrQfAOJuQe3fUT5t9q/PzP+5bi88V0BiZnR0WKOjw6pU9tynpptVMMLHQIWPIAHkpno3i1KmR597Q/aDy5uJos4EaewUB2izzUi6bPZzaQGdK8V8PwWEyT1e5Tt4j7z5VzbtzVvqwokwAkgMTUyc1sOHT92HnzcKIISPgQsfkv0UtoN6cJ0x20S75iPa8aYEb4i+HFJYBABCSOchxN03z5t/RRNElqNa6EHqgpVzfzhxYjjWCzo5eaitMt2kG9YS4WOgwgdaK6r9+3aUFd3N//4QYPn7eR98W7WuVfOEDwAINYSEOXYxpzddtK5Hsb8eyDEgvjuOx87Y2HH/Mk43eOmhgcZnz54lfBA+0P7sVVEMPEftwHXP/JuO6DPKJryVWd0ABtSypIsKdwxjSrUTRu6YvNCCCIPQY8o3GP1yg5cteBtMz58/J3wQPiBdbeNvimL62yhcNweuXEjv55hympf0haRLkoYkXTA/L7PKAQywsmffGPYxLW/259cVQrdiAkhMXbhwqCtV7s6Vt1NnNpt15OkysrW1pWq1SvjAIMvIfjasQ9uYGJQaprRq9+eY7/B9SqqdaPnChIyz5sDqTh9JaASAtxXNvjKKIDJv9u85AkgfGh0d1vj4Se9Tjc7qLshcBalWqwNxFYTwkXilCN/7Zgd/u0TRhBYCv+0g0BVU6w53QbXuBHPiTsoA0EkQuSBfr5kOpVXrVjvb7hswC1aMTU6e0cbGC/dh/s4V3ZhaPFx5stmss7Ky8qVql8TkOI5OnjypY8f6s2gJH9bmFN+7zzoRve+sOjsjkzHb0Q2qT0fr8J6CX54vq4vTP6Kv2dY9h1WFAVI27YI51cbiudOfd+qmapOsBG6HEUBiHUBSevBg3b0nSEq1/ncL/tdls9n5lZWVyyaR6tmzZ3r33XcJH+xsigPW6LgeUoiJohH8Y4AGfJLL4HbA8FE2gW+ZTRYhsZ1xrsSqwoAqmH9uu/KqOhtcnvfsy63RBSsBIcSj2eDaOfeHSqWinZ0dwkd/sm3I/mHA1suSwrnXRkrRdMUqB/j8JJdBkIPYgmpdrAgfCDsIA2jNMfvhMCbxmFfAHggDEUCa3Ecj9i5cOKfh4aPuw/SdK/VvNJPNZgvynPHe2NjomwHphI+2GrLpAVonOdldSp6TXbeLnDro1xqCTB+XgXvQuxSgPIAotp8Sqwo4UNSbsXftBpFAJ+8G5QrIwQ7JN7A79oaHj+rDD895n2rWzeTgPgb7+/va3NwkfAxuAMkMyPpIWe70llU707Ng+b5h33ip2OcBxLb7mxs+igJ6G0B+ZFUBddsYM6pdnQ66n04rwN3Y6YKVAHWugszXe102my3LNy1vkrtiET4a7hwcy4NwagDWh03fVUdvuijekN2Zz5Q6m1Grk/D4WQIbfDnL186IM8+Iti7a7veoh0Dz7eOSgk+lbj0WkwCSAHWuglxt1K0sm83Oe3es6+vrieyKRfgI5cCZ6/P1kLHcOS74Qtuc5ftPK9w7d/druV22fN2ywr1DL9DJtlOK2fIAcXRDwWa4SsvyKiQBJCF8V0FSsuyKVa1WtbGxQfjoL0XL133e5+vB5gpFWW/PzFGUfVessAa3B2nwWO/AE9boY3pjRO2zANuiw+oCrCzL/sSd9TGBAJIQw8NH9dFHh6bWnb1zpX4jJZvNlrwH+0qlkpjxIIQPK19bvm5a/dsNa9ZyJzfXpDFs0wBJKbyuWF8HeO3lBJWFTVgqift7IFop2V+xLLK6gEAWAmw3HxBA+syHH57T2Nhx71MNG0bZbHZBnu4OjuPEfjwI4cNaMUDjeboPv39Kdv1Mi2rc5ceR/RmdvMLpSmFbbu5nJkHa8nUlNltELMg283WXlilDsaCP3Aqz3hNAEub3v5/wPszdudJ0utBDAz7X19e1u7tL+OgPBcvXXe/D727bLapVl59l2Z/RCasrlm25pRISQmwDSJlNFhG7avk6R52PRdoMsB2nuvDdc2K8CeLT7rBCAEmY8fFR/80Jr9+5Ur8RkM1mHdUZDxKnQenValXr6+uEj+jORKT7LITkZHdVp2AZLua6vB6/CvDa6+KmaoCNfIAwHEYjqhTgtZmIv3tG0m2qALrAIYAEd7BjGh5O/lf++OP3/APSG94HwYwHOWjM7+7u6qeffopFCKlWq/rpp59UqVQIH8EVZX9WeVb9cWPCpnW9zWBRkv2A9Fl1fpaxoGA3k7xKVQ9cRzB4ZR5knNaXXW6IfR7xd1+i3iOJBi6AnDlzPPFfZnj4qDKZ896nco3uDWJCSMEfQtbX12MRPnxdwggfwdjOKpRSf5whs7054LKCdfmxHZAuhTMgfTnAa+fVH/3Ic12qH7PsFgZOkAZ4UeGMRwryHtMRho97YpxJvfberKkX98z/+T4Naekuf14mzO2DLlgJNTFx+q07pN+50vggn81ml70Nn52dnZ5Nz0v4CE2QhnZG9lcP4ihj2bh0FGy6wKB/k1HnXbG+VLAzqPe6dPBMtdFYKgVYb1Eu95KC3zAL0QeDqOUD1tkwp4K2rfvpCAI44aO+m5Iemf/zZr3nTV181GcnKHKe79rNz7TxIwGkz3300bv+WbFuN7pBoQkhM94Qsr293fUQQvgIXZDGdj7BIcR2uYNczfCHuaLla+c7PPA7su/25W1sRBlCMuZgtqRgZ9WcAN8hH8Fyp826ybMriJ28pG8V3VnaoPuzosKdfrcU4LVhjsMjfNT3bYuAkTKN9aU++K4pvenVMGvqQ7oLn3s1wLZGAOlnw8NHdfHief94kHvN/qZRCOnGmBDCRyQKCjaoMm92XKmIlyujN5e/OzVrebAtB2zY+wWph51+rxsK1k0sE2GjY9YcvFMKNs4m0MFG4Q+qnzbLTUMsvjIWDcNuhA93mwtTkAklciGtg5w5UUCdP+xmgHWS74MTFv5jeC6i7cy//7YJOWXRBWswjI0d18cfv3doh3/nSvMdc70QEvXAdMJHpA5mOgvYcMtFsCxp0zBw3z/f4cEyLfuzh53WpbLsu/FkQtjZB11eN4RMh1hW9/T2JfygjaWvAnzezZCW+3aXgjQ6lzLlHtY+p52z2AsK/+aDxTaWO9/BOryu7nXHTJJ0G/viJM8Meb3BduRuZ/ciOLbnAxwbC7ZvSgDpA5OTKf94kHyzQen1QkiUs2MRPiLntNGYdRufYe2scnrTzzZf58DbSWPD5oBbCKmBcUP2XStszwg1a8AstNEQud1huaU9ZZVr8t1sGzqFAJ+dV/vdBdxG2LeK1w02bcP/tAZbxrPPaachnld7/fjLCv/qh1vuywH/ZknBujmm9KYrW6sG4PyA1qt2tqt0QrfHnEU550I+tl8PGPitZ5kjgPSJjz+e0MTE6UOV5s6V5jv5eiHkn//8Z6g3KyR8dE1BwQdfe3dW7uXbTIAD47TeDPpr1qjItbkjnA5wkJgLcV3OBVgHSyF8VjGEcmvVoEl7Gv+PLBqAQb5bOeB3yJnltu02MW2W5Zk5+KZitu0FCawpIecpT3eGokyDOpjz7GOCjk9yfaGQ71/gcauNv3GD1G29mdo75/m+OfP87QDfe1ntj39LunanOf5Dwr5nSsFmswx6jKgXfB8FDLYLCtC1+Nig1dSff65ofLyiEyeGNTo63FffLZM5r2+++VFbWzsHZ1vuXJGmFhufpclmszMrKys/moPjQWA4e/asTp06RfhIlgWzU823U318jYCiOZiVfI1Y77+gZ1GCNFJTsr9yMq9w77RdNOty1nInn1fwM6H+BlK74zvccrtZp7y8r2mn4esGwILFa28EDJkps35nTdmVzbI7vmUOGlxL5r2mu7jdlQOU1SNfGV0a4P2V28jx76+cEIPajMKZdrfZvqLYhRMsrcLHjKf+5wQb6YQtb77N7cJ7jHD3syVJm75tIyPpjNo/YVhWwCuNgxJADpLuxsYLffPNi4NfjI+f1Jkzv9L4+EmNj496B3QnzvDwUX366Qf6298eqlLZCxJC5ldWVsrmTMvBHdN/+eUXjY+PEz6SZcazs+pEznOQDEMuQGPWDSw2B4iywrmxWL0Gte0O/6b5Xk6bn+WYhming8zbabCHdZAumnUw3eZnpBXOTR5nQmzY2fo6wPbmL6OU+u+stWPKIt9BPQ5rX7jche87p9pZ5l7whg/0pp51y4LneNPJ/jwdwf7RURtXGo8MekXb2Hihhw+f6v79Vf3lLz/o668f6vvv17S29jyxIeSTTyb9QWrJojvWsqSL3gq0vb2tJ0+eBO6SRfiIRQiJ47q+bPm6jOz7ec9F1IBzAqzDlDrviuWGkGKMGpFfKNgYlRn1rjE95zkAlrv82YUO/jaj/lMydWGuh8vQrfDhft/5mISPshCk3JJmwbTT4rbsc+0s06AEEPfgdEMt5vvf2to5CCT/9V//S/fvr2p11dHe3qvEfNmxseP69NMP2gkhJUkXvBXJHZy+tbVF+EiWZdOgjcMByfFsgzZsG/PFDht/Ng1L20Awrc7PKrkhZKHH5VU0B7lCm8vfzRBSMsu60MNGmNNBY/ezPtz3lH2NpXKXy+KLLoYP142I90X1AtZMk3U/SL5q8+++S3BwumhCr9PjZXH3+W1tbwMRQKYWVZpaVGFqUfNTi5qZWtSlqUUNmUKcMTvKuultbe25SqXH+stfflCp9DgxV0Y6CCFONps9dECvVqt69uyZfvrpJ+3v7xM+kqNYp3HWbfMm1Nouw6zszwp34wxrkLP6Swrnsv5cj8KjY75vJ59d6lIIcUNtvbOBvWiEtTvLUrqPA0ijgBh1w6zQo+89o+ivYJbNd1wWXIU212Mh4d/7Ro/rgruvb7vOD/QsWCaYLE8tam5qURclndWbsydvHcRWVx3dv7+qv/71/+jBg/XYXxVpEkJanmHOZrNvNYJ2dnb0z3/+U5ubm29N10v4iC1vQ63Yxc+cN9tTkJlZ0rKfn73hSYMIDvi2jcuUwptfvmiC23yXGvNuUAzjYFaKsL45lqG22yGkrPa6PWbUf75rsA+6FGGdcPdx5R5+b0fRXsGcV+vuN99p8JQVvAvcXB999xnPvtvpUj23qYsEkICBxDFXSmamFnVBb87cHNqpVSp7+uGHdf31r/9XpdJj74DvWIaQP/7x3zU2dtz7dP7OFd27c6X52dpsNlusl7Adx9GTJ09UqVQIH8nhnq24GOGOqujZGbYzJaTtFQRH0czrH0bYmVW4A8FvmPUZxWw+ZXMgbre8Wr33JbPcYTQKvcHDZll70RBdVns3l+zHkx6N9g+XQgwitmG028IOW8sB6r2jwXQjwMmTeSX/6kezIBLVzG9l3z64Y0OvX7+u/TA0RBOtiTtXlFNtEG2+3u8nJ1P66KN3Yzu1797eK/8UvW6jdGZqsXVlXVlZyanOfOTHjx9XtVolfHRJiDeKTJmG8ufm/3SbO6SiarMAFQb44NdNGV+5tRMSi6r1my51cbnzZpmn26hfXyWswZBR7UrYtOV3jMtYrW5Lm3V0OUAQc0xdSEqdcNsNQfexJdXuMbLMfjWQWTW+307ZhMMo68112V2NmVf0J9HSnmNFps1jfMl3jLcPFxaZggASPIikzMH0ar0CjXsQKZUea3XV8e/Q55pN0+sJISmzgV9V4zPVhI9kBJB6gSSjN3OBextT3obqj3r7ng3obWM3peaDmb/zlFlcGmXeepY2dcnxLG+pDxrlbsivd8OzTXNgL1GFD+1/PmtSh5NeJ9LmOza6Ad6mp8GHcLe777oUWOMUQOrVv3SdY7yfe4zvqB4SQKIPI24QyXifHx4+qg8/PKcLF87F8r4iDx8+1fffr/mfLqh2NaRlo3JlZSVtNrQ84SM+3G0ZlDkAoOsCBZBBb3cTQMIJIjnV6Z40Ojqsjz+e0MTE6dgt88ZGRffvr/oH0pdNCLFKvisrKxnVboqTI3zQGAVlDgAEEAIIAaT7QSSvOndwnpg4rUzmfOyuhuztvdL9+//QxsYL/6+WVeuW5dgGEXMPEdAYBWUOAAQQAggBpAdBZF6+cRLDw0eVyZyP5dWQhw+f1ptW2JHl2BDQGAVlDgAEEAKILabhjcDU4sEcyUX3udrVhtV63Z567sMPz+k///NDjY+f9D6dUu2eId+aLmYAAADozCargADSlvf/9Oe0RQgpTy3qkmo3NnTc59fWnutvf3vonw6350ZHh/Xppx/o448n/F3FMpLumfuGEEQAAADaV2IV0AWrnfAxr9plthuSFp7cvea0+hszde9t+ebtz2TOa3IyFbvvuLf3St9//5N/ul5XUdIN24Hq6B6641DmAICeuS27+/9cklRkDAgBJEj4mDYVzOVIuvHk7rUFm7+/c0Wzqs0adWByMqVM5nwsv+/W1o7++79/qjdI3Q0iX04t9t0dRWmMgjIHAAR1T3Y3iCWAEEAChY+MqVypOr8uSZp5cvdaySKEZEyISbvPjY+f1Cef/CaW9wyRalP2/vDDeqMgUpa5Y+vU4kDezZfGKChzAAABhAASevhImYqVkaQjR2pBoVp9azD5gmpXRJwWIeTQ+0nS2NhxffrpB7ENIRZBRKpdFbklqWA7hS9ojIIyB4B+2CVbvu6sJIcAQgCxCSCH+vWdn/itRkZO6Jnzkza31v0vL8n+asiSPHcTHx4+qk8//UBjY8djvT4qlT09eLCutbXnzWb0Kkr6yoSRMrWIxigocwDoUxlJ39q2vWl3E0Bswse8aoPOJUnj587rzNi7B7/f2dnWz08fa3f3pf9Pbzy5e23eIoTMyjMuJCkhRKoNVl9be66HD5+2mtWrbALJ15JKU4vMAEFjFJQ5APSNQ225JoqqdcEigBBAmoaPaXkGnZ8+dU7vvjNZ97XPnJ/0zFmrV9G+sOiSlZe0lMQQ4qpU9vTo0YbW1p6rUtmT5UZYUm0+7KIkh2BCYxSUOQAk0CN5xvY2sSBpjnY3AaRZ+MjIM+h8ZOSEzk/89mD8Rz27uy+19q+y9vd3vU+XTQgp9XsI8YaRtbXnWlt73my8SF1Ti6Ii0hgFZQ4ASTEru6sfUu3ecAXa3QSQRuEjJd+g89+c/0jHjo20/Ntq9ZU2nj7W8+2n3qcdSXNP7l5bDhpC/vjHf4/1wHQbGxsVbWy80M8/V7S1tdP0TvAEEBqjoMwBoA/Dh2QGoNPuJoA0CiBvDTo/fvxUoPfY3FrXxtPH/qfnWt0zxB9CkjA7VlCVyp62tna0tbWjzc0dra09d39VNHePB41RUOYA0MtgcVW1LuLf6e27l2ckfS67aXddy5JmDhrgBBACiC98zKvJoPMgdndf6vHa3/3T9S4/uXttJmgI+eyzD/tyfW9sVPTNN2UCCI1RUOYAEBe29/QI4pIJNLS7JR2hjh0KH9Pe8HH61Lm2w4dUGzfym/MfaWTkhPfp/Pt/+vNSs7+bWtSyzCAlqXZH8lLpMQUEAAAQrVQE4aPgDR8ggHjDR0aeqw4jIyc0fu58x+977NjIwX1DAoaQBdUu10mSVlcdra46FBQAAEB0wg4fjjwnlUEA8YaPlAkfKak26Hzi1+mmM14FWslHjur8xG91+tS5oCFkxpuYS6XHre63AQAAgPZ9FvL7zUjckJkAUt+SzIxXkjTx67TVjFdBQ8i770wGDiGqTdl2UHHv319tOosUAAAA2jYdcvgosEoJIG8xg84PKtv4ufOBZ7wKImgImVqUY0KIpNoMUowHAQAACF1adjcUbKUs6aI8XelBAPGGj2mFOOi8wxAy2ySElOTpP7i29lwPHz6l9gIAAIQnpc66S5UlzUu6oLen7gUBJLpB57bGz533D0y/+f6f/pxvEkIW5LmM9+DBuiqVvcSXw+bmjn/DBQAA6IWSCQ8XVTvxW1Dz2asc8/sF1abZvSDpBquxtWMDGj5SinDQuVXyMwPTH6/9Xbu7L70hpPTk7rVGqXlGtdkZUnt7r1QqPdann36Q6LLY3z80nuVHNknAHvdvAoDIgkjJBAtE0Q4e0O8d+aBz2xDiCz4pSbdNQHqLGQ9ycBPDjY0X3ruIAwAAAASQuOn2oPNW3PuEeKQl3W70+qlFFeTpivX992vMigUAAAACSEzDx7R6MOi8lZGRE3r3nUnvUzkTlBqZU63foSqVPT16xIB0AAAAEEDiFj4y6uGg81ZOnzrnnxnrulnmt0wtqizpS/fxDz/0x4B0AAAAEED6JXyk1ONB5zbGz533j0VpNh5kXp5Zox48WKc2AwAAgAASE7EYdN6yMEww8kjL02WsjoN7g6yuOlwFAQAAAAGk1+I26LyVkZETOpua8D4126QrVkGe+amTeBWEAfQAAAAEkH4KH9OK4aDzVs6m3vPfpHCpycsPbniTxKsgm5u/eB8W2SQBAAAIIEkNHxnFeNB5K78+PCtW5v0//Xm23uumFlVUwq+CAAAAgACS9PCRkm/Q+a/fmYzdoPNmRkZO+K+CXG80IF2eGbEYCwIAAAACSPcdGnT+7juT/sZ8rFWrr/Rk7e/a3X3p/1XdAGLGgpTdx//4h0PNBgAAAAGkG/yDzs+mJnRy9Exiln9396X+8fiBXu5se58uSbr45O61cpM/PTQWBAAAACCARB8+puUZdH5y9IzOpt5LzPI/336qx2t/1/7+rvfpZUmXWoQPSSrIc3f0tbXn1O4BMzQ0pKGhIVYEAAAggHQpfGTkG3T+7uGB3LG28fSx1n9eVbV6aFrauSd3r808uXvNafX3U4tyTAiRxFUQAAAAEECiDB8pJXTQuTveY3Pr0OxVjmpdrhYCvt3BYPS1tefcYwMAAAAEkIgkctB5k/EeF57cvVYK+n5TiyrJMxg9Cd2wtrZ2vA/LbJIAAAD97VjSv0BSB50/336qjaeP/V2ulp/cvTbT4VsXJM26AWRyMhXr9eC9SjO1SAABAADod4m+ApLUQefrP6/WG+8xE0L4kKRb7g90wwIAAAABJLzwkVHCBp1Xq6/0j8cP9Hz7qfdpR7XxHsthfIa/G9bGRoVaDgAAAAJIh+EjpYQNOt/dfan/94//7b+5YEltjvdooeD+wHS8AAAAiJOkjgFJ1KDz59tPtf7zqv/p5ZC6XNXztcw4kI2NF9RyAAAAxEbiroAkbdC5O97DZybC8KGpxTdXQCqVPVUqe9R0AAAAEEDaCB/TSsig8wbjPcoKcbxHC0X3B66CAAAAgAASPHxklJBB5w3GexRN+Ch1aTG+dn/w3WsjNpihCwAAYPAkYgxIkgadNxjvsfDk7rW5Li/KQdDZ3PwlluW6tfWLP6ABAACAABILsR90Xq2+0sbTx/Wm2J3rUperhgGELlgAAACIi9h3wXr/T3+eVcwHne/v7+rx2t/rjfe41KPw4d5V3HEfx7UbFgAAAAggcQofOUk33cdxHHS+s7Otfzx+0OvxHo0cfD4zYQEAACAOYtsF6/0//Tkt6bb7OI6Dzje31rXx9LH/6V6M92gWQHJS7YaEw8Otx8xsbu5of7/14PCff259h/W9vVdceQEAAED8A4gZdH5bMR10HsPxHg3zhPvD6qqj1VWHGg8AAICeimsXrJuK6aDzOI73aKKYkHroyNNdDAAAAP0rdldAzKDzvPs4ToPOd3a2tfavsqrVV/5G/hdP7l5z+qSRX5b0o8XrSvIMcm9kapHpdQEAAPDG0OvXr2s/DA3FIXzkJN1zH58cPaP3fp2OxYpqMN7jxpO71+apRkD03H0VAABItthcAYnroPMm4z1mnty9VqAKAQAAAAkLIHEddL6/v6u1f5X9U+yWTPgoUX0AAACABAYQxXDQ+YvKptZ/XvWP9yiY8OFQdQAAAIAEBpA4Djp/5vykZ86a/2nGewAAAAAd6ukg9LgNOq9WX2n951W9qGx6n3bEeA+g5xiEDgBAf+jZFZC4DTrf3X2pf/28yngPAAAAoN8CiH/QuSS9c+58zwadM94DAAAA6OMAIt+gc0la+1dZZ8be1Zmxd7oaRBjvAQAAAPR/ALll/p+WuQpSrb7SM2dNz7efavzc+cgHojcZ7/HFk7vXilQNAAAAIHy9HoSeUm0GrKuS0t7fnT51TuMRdctqMt7jiyd3r5WpFkD8MAgdAAACSNhBZNYEkZT7/MjICf065HuCNBjvsSxpjvEeAAEEAAAMQADxBJG0pCVJOfe5I0eO6vzEb0MJIRtPH2tza93/9NyTu9cWqAoAAQQAAAxYAPEEkXlJ18MKIdXqK/30r7Je7mx7n3bEeA+AAAIAAJIZQO5cUU617lMZXyO/JKk8tahywBCSV222rFQnIWR396XW/lXW/v6u9+mSGO8BEEAAAEByAsidK0qrNovV5/J0mWrCUe3eGl9NLapgGUIyqt0p/SCE/I/f/E/rgenPt59q4+ljxnsABBAAAJDUAGKCx3XVZq9qV1nSjalFLVuGkG/dxyMjJ/Sb8x+1/ADGewAEEAAAkOAAcueKUiZ4zNb7/ejosE6cGNGZM7/S8HDtCkWlsqdKZU8bGy+aBZGZqUUVW4SQvGqD0yVJZ1MTOpt6r+5rGe8BEEAAAEDCA8idK8qYAJDxPj82dlyTkylNTJzW6Ohw0w9aW3t+8G9v75X/1wtTi5prEUJuesPPb85/9NZ4EMZ7AAQQAACQ8ABiwsfBOAypdrUjk/k3jY+PBv7Avb1XevToqX744a3uUUVJX0wtymkQQFKqdcVKS9KJ46f0/sRvD37faLzHk7vXZihmgAACAAASEEDqhY/f/e5dffTRux1/cKWyp/v3V7W1teN9uiTpUpMQkjPLI0k6P/FbHT9+qtF4j5knd68tU8QAAQQAACQggPjDx/DwUX3yyWRbVz2aKZUea3X1UN5YnlpUw6sW7//pz0syA+BPHD+lV9VX2t196X2JI+nSk7vXShQvQAABAADxcqTek2bA+ZI3fHz66Qehhw9JymTOa3Iy5X0qf+dK/YHuxg33h5c72/7wUZJ0gfABAAAAJCiAqDbbVcZ98MknkxobOx7ZQmQy5zUxcdr71E0z3e9bzGDy5Tq/Wn5y99pF7u8BAAAAJCiAmIb/rPv4d797N5IrH/VCiG8mraUmL7/lezzDYHMAAAAggQFEtasfkmrT7IYx4NzG8PBRZTL/5n0qd+dK/Tusm/t5lFUb73GRweYAAABAAgOIufqRdx///vcTXV2Y8fFRjY+f9D51ucnL58R4DwAAACBRDs2CZQZ/35RqVz8+++zDri/QxkZF33xT9j51ttG0vAAGB7NgAQDQH/xdsA6uOPhmpuqa8fFR/1iQaYoJAAAA6M8AknF/8M1K1VW+z/4DxQQAAAD0WQDxDvgeHR32X4XoKt84kAzFBAAAAPRZAJHe3HfjxImRni6U754jOYoJAAAA6OMA8s47oz1dqF5efQEAAADQnQACAAAAAAQQAAAAAH0cQPb2XrFmAAAAAEQaQIruD5ubv/R0oTY2Kt6HZYoJAAAA6L8A4rg/bG3t9HShKpVdAggAAADQzwFkalElN4Ts7b3qaQhZW3vuffg1xQQAAAD0WQAxiu4Pq6tOTxZob++VvwtWgWICAAAA+jOAfPUmgGz2ZDD62tpz7+eWzZUZAAAAAP0WQKYWtSxPN6xHj552dWH29l7pwYN171O3KCIAAACgTwOI8aX7w8OHT1Wp7HVtYR49OvR5jqQFiggAAADo7wCyIDPz1N7eK5VKj7uyIFtbO/rhh0NXP76cWnwzMxcAAACAPgwgptE/5z7e2HgReQipVPb0zTc/ep8qTS1qnuIBAAAA+jyAmBBSkLTsPl5ddSILIZXKnu7fX/UOPHckzVA0AAAAQP8Zev36de2HoaG3fnnnir6VlHEfT06m9PHH72l4+GgoH761taNvvvnRP9vWjBkMDwAH3H0VAABItmMtfn9J0j03hKyuOtrc3NHvfz+h8fHRjj74wYN1/5gPwgcAAADQ55peAZGkO1eUknRbUs77/ORkSh9+eE5jY8etP2xv75XW1p7rwYP1erNrET4ANMQVEAAABiSAeILIvKTr/ufHxo7r/fdPa3z8pMbGfvVW96ytrR1tbu5oY6Piv8mgqyzpC244CIAAAgAAAcQfQjKSbsp3NaRNjmr3HFlgul0ABBAAAAggzYJITtJVSdMEDwAEEAAAEGkA8QSRlAkhn6k2UD3TIHCUJH0tqTi1qCKrHQABBACAAQ8gAAAAABC1I6wCAAAAAAQQAAAAAH3n/w8AmB1j3tEUq4sAAAAASUVORK5CYII='; + /* tslint:enable:max-line-length */ + var imageHeight = width * 3 / 8; + var oldAntialias = this.getAntialiasing(); + this.setAntialiasing(true); + ctx.drawImage(image, 0, 0, 800, 300, x, y - imageHeight - 20, width, imageHeight); + // loading box + ctx.strokeStyle = 'white'; + ctx.lineWidth = 2; + ctx.strokeRect(x, y, width, 20); + var progress = width * (loaded / total); + ctx.fillStyle = 'white'; + var margin = 5; + var progressWidth = progress - margin * 2; + var height = 20 - margin * 2; + ctx.fillRect(x + margin, y + margin, progressWidth > 0 ? progressWidth : 0, height); + this.setAntialiasing(oldAntialias); + }; + /** + * Sets the loading screen draw function if you want to customize the draw + * @param fcn Callback to draw the loading screen which is passed a rendering context, the number of bytes loaded, and the total + * number of bytes to load. + */ + Engine.prototype.setLoadingDrawFunction = function (fcn) { + this._loadingDraw = fcn; + }; + /** + * Another option available to you to load resources into the game. + * Immediately after calling this the game will pause and the loading screen + * will appear. + * @param loader Some [[ILoadable]] such as a [[Loader]] collection, [[Sound]], or [[Texture]]. + */ + Engine.prototype.load = function (loader) { + var _this = this; + var complete = new ex.Promise(); + this._isLoading = true; + loader.onprogress = function (e) { + _this._progress = e.loaded; + _this._total = e.total; + _this._logger.debug('Loading ' + (100 * _this._progress / _this._total).toFixed(0)); + }; + loader.oncomplete = function () { + setTimeout(function () { + _this._isLoading = false; + complete.resolve(); + }, 500); + }; + loader.load(); + return complete; + }; + return Engine; + })(ex.Class); + ex.Engine = Engine; + /** + * Enum representing the different display modes available to Excalibur + */ + (function (DisplayMode) { + /** + * Show the game as full screen + */ + DisplayMode[DisplayMode["FullScreen"] = 0] = "FullScreen"; + /** + * Scale the game to the parent DOM container + */ + DisplayMode[DisplayMode["Container"] = 1] = "Container"; + /** + * Show the game as a fixed size + */ + DisplayMode[DisplayMode["Fixed"] = 2] = "Fixed"; + })(ex.DisplayMode || (ex.DisplayMode = {})); + var DisplayMode = ex.DisplayMode; + /** + * @internal + */ + var AnimationNode = (function () { + function AnimationNode(animation, x, y) { + this.animation = animation; + this.x = x; + this.y = y; + } + return AnimationNode; })(); - ex.ColorBlindCorrector = ColorBlindCorrector; })(ex || (ex = {})); -//# sourceMappingURL=excalibur.js.map \ No newline at end of file +//# sourceMappingURL=excalibur-0.6.0.js.map +; +// Concatenated onto excalibur after build +// Exports the excalibur module so it can be used with browserify +// https://github.com/excaliburjs/Excalibur/issues/312 +if (typeof module !== 'undefined') {module.exports = ex;} \ No newline at end of file diff --git a/sandbox/web/src/game.js b/sandbox/web/src/game.js index 016a6de4c..a9a8a3911 100644 --- a/sandbox/web/src/game.js +++ b/sandbox/web/src/game.js @@ -33,7 +33,7 @@ * Excalibur.js team */ var logger = ex.Logger.getInstance(); -logger.defaultLevel = 0 /* Debug */; +logger.defaultLevel = ex.LogLevel.Debug; // Create an the game container var game = new ex.Engine(800, 600, 'game'); game.setAntialiasing(false); @@ -93,39 +93,40 @@ var Animations; Animations[Animations["JumpLeft"] = 5] = "JumpLeft"; })(Animations || (Animations = {})); var currentX = 0; +// Create the level for (var i = 0; i < 36; i++) { currentX = tileBlockWidth * i + 10; var color = new ex.Color(Math.random() * 255, Math.random() * 255, Math.random() * 255); var block = new ex.Actor(currentX, 350 + Math.random() * 100, tileBlockWidth, tileBlockHeight, color); - block.collisionType = 4 /* Fixed */; + block.collisionType = ex.CollisionType.Fixed; block.addCollisionGroup('ground'); - block.addDrawing(0 /* Block */, blockAnimation); + block.addDrawing(Animations.Block, blockAnimation); game.add(block); } var platform = new ex.Actor(400, 300, 200, 50, new ex.Color(0, 200, 0)); -platform.collisionType = 4 /* Fixed */; +platform.collisionType = ex.CollisionType.Fixed; platform.moveTo(200, 300, 100).moveTo(600, 300, 100).moveTo(400, 300, 100).repeatForever(); game.add(platform); var platform2 = new ex.Actor(800, 300, 200, 20, new ex.Color(0, 0, 140)); -platform2.collisionType = 4 /* Fixed */; +platform2.collisionType = ex.CollisionType.Fixed; platform2.moveTo(2000, 300, 100).moveTo(2000, 100, 100).moveTo(800, 100, 100).moveTo(800, 300, 100).repeatForever(); game.add(platform2); var platform3 = new ex.Actor(-200, 400, 200, 20, new ex.Color(50, 0, 100)); -platform3.collisionType = 4 /* Fixed */; +platform3.collisionType = ex.CollisionType.Fixed; platform3.moveTo(-200, 800, 300).moveTo(-200, 400, 50).delay(3000).moveTo(-200, 300, 800).moveTo(-200, 400, 800).repeatForever(); game.add(platform3); var platform4 = new ex.Actor(200, 200, 100, 50, ex.Color.Azure); -platform4.collisionType = 4 /* Fixed */; +platform4.collisionType = ex.CollisionType.Fixed; platform4.moveBy(75, 300, .20); game.add(platform4); // Test follow api var follower = new ex.Actor(50, 100, 20, 20, ex.Color.Black); -follower.collisionType = 0 /* PreventCollision */; +follower.collisionType = ex.CollisionType.PreventCollision; game.add(follower); // Create the player var player = new ex.Actor(100, -200, 32, 96); player.enableCapturePointer = true; -player.collisionType = 2 /* Active */; +player.collisionType = ex.CollisionType.Active; follower.meet(player, 60).asPromise().then(function () { console.log("Player met!!"); }); @@ -134,10 +135,10 @@ player.scale.setTo(1, 1); player.rotation = 0; // Health bar example var healthbar = new ex.Actor(0, -70, 140, 5, new ex.Color(0, 255, 0)); -player.addChild(healthbar); +player.add(healthbar); // Add Title above player var playerLabel = new ex.Label('My Player', -70, -69, null, spriteFont); -player.addChild(playerLabel); +player.add(playerLabel); // Retrieve animations for player from sprite sheet var left = spriteSheetRun.getAnimationBetween(game, 1, 11, 50); var right = spriteSheetRun.getAnimationBetween(game, 1, 11, 50); @@ -151,13 +152,13 @@ idle.loop = true; jumpRight.freezeFrame = 0; jumpLeft.freezeFrame = 11; // Add animations to player -player.addDrawing(2 /* Left */, left); -player.addDrawing(3 /* Right */, right); -player.addDrawing(1 /* Idle */, idle); -player.addDrawing(4 /* JumpRight */, jumpRight); -player.addDrawing(5 /* JumpLeft */, jumpLeft); +player.addDrawing(Animations.Left, left); +player.addDrawing(Animations.Right, right); +player.addDrawing(Animations.Idle, idle); +player.addDrawing(Animations.JumpRight, jumpRight); +player.addDrawing(Animations.JumpLeft, jumpLeft); // Set default animation -player.setDrawing(1 /* Idle */); +player.setDrawing(Animations.Idle); player.setCenterDrawing(true); var jumpSound = jump.sound; var inAir = true; @@ -166,10 +167,10 @@ var airSpeed = 130; var jumpSpeed = 500; var direction = 1; player.on('update', function () { - if (game.input.keyboard.isKeyPressed(37 /* Left */)) { + if (game.input.keyboard.isHeld(ex.Input.Keys.Left)) { direction = -1; if (!inAir) { - player.setDrawing(2 /* Left */); + player.setDrawing(Animations.Left); } if (inAir) { player.dx = -airSpeed; @@ -177,10 +178,10 @@ player.on('update', function () { } player.dx = -groundSpeed; } - else if (game.input.keyboard.isKeyPressed(39 /* Right */)) { + else if (game.input.keyboard.isHeld(ex.Input.Keys.Right)) { direction = 1; if (!inAir) { - player.setDrawing(3 /* Right */); + player.setDrawing(Animations.Right); } if (inAir) { player.dx = airSpeed; @@ -188,15 +189,15 @@ player.on('update', function () { } player.dx = groundSpeed; } - if (game.input.keyboard.isKeyPressed(38 /* Up */)) { + if (game.input.keyboard.isHeld(ex.Input.Keys.Up)) { if (!inAir) { player.dy = -jumpSpeed; inAir = true; if (direction === 1) { - player.setDrawing(4 /* JumpRight */); + player.setDrawing(Animations.JumpRight); } else { - player.setDrawing(5 /* JumpLeft */); + player.setDrawing(Animations.JumpLeft); } jumpSound.play(); } @@ -205,8 +206,9 @@ player.on('update', function () { game.input.keyboard.on('up', function (e) { if (inAir) return; - if (e.key === 37 /* Left */ || e.key === 39 /* Right */) { - player.setDrawing(1 /* Idle */); + if (e.key === ex.Input.Keys.Left || + e.key === ex.Input.Keys.Right) { + player.setDrawing(Animations.Idle); } }); player.on('pointerdown', function (e) { @@ -220,27 +222,27 @@ newScene.add(new ex.Label("MAH LABEL!", 200, 100)); //newScene.onDeactivate = function(){ // console.log('deactivated newScene'); //}; -newScene.addEventListener('activate', function (evt) { +newScene.on('activate', function (evt) { console.log('activate newScene'); }); -newScene.addEventListener('deactivate', function (evt) { +newScene.on('deactivate', function (evt) { console.log('deactivate newScene'); }); game.addScene('label', newScene); game.input.keyboard.on('down', function (keyDown) { - if (keyDown.key === 70 /* F */) { + if (keyDown.key === ex.Input.Keys.F) { var a = new ex.Actor(player.x + 10, player.y - 50, 10, 10, new ex.Color(222, 222, 222)); a.dx = 200 * direction; a.dy = 0; - a.collisionType = 3 /* Elastic */; + a.collisionType = ex.CollisionType.Elastic; var inAir = true; - a.addEventListener('collision', function (data) { + a.on('collision', function (data) { inAir = false; //a.dx = data.other.dx; //a.dy = data.other.dy; //a.kill(); }); - a.addEventListener('update', function (data) { + a.on('update', function (data) { if (inAir) { a.ay = 400; // * data.delta/1000; } @@ -251,23 +253,23 @@ game.input.keyboard.on('down', function (keyDown) { }); game.addChild(a); } - else if (keyDown.key === 85 /* U */) { + else if (keyDown.key === ex.Input.Keys.U) { game.goToScene('label'); } - else if (keyDown.key === 73 /* I */) { + else if (keyDown.key === ex.Input.Keys.I) { game.goToScene('root'); } }); var isColliding = false; -player.addEventListener('collision', function (data) { - if (data.side === 2 /* Bottom */) { +player.on('collision', function (data) { + if (data.side === ex.Side.Bottom) { isColliding = true; if (inAir) { //console.log("Collided on bottom with inAir", inAir); - player.setDrawing(1 /* Idle */); + player.setDrawing(Animations.Idle); } inAir = false; - if (data.other && !(game.input.keyboard.isKeyPressed(37 /* Left */) || game.input.keyboard.isKeyPressed(39 /* Right */) || game.input.keyboard.isKeyPressed(38 /* Up */) || game.input.keyboard.isKeyPressed(40 /* Down */))) { + if (data.other && !(game.input.keyboard.isHeld(ex.Input.Keys.Left) || game.input.keyboard.isHeld(ex.Input.Keys.Right) || game.input.keyboard.isHeld(ex.Input.Keys.Up) || game.input.keyboard.isHeld(ex.Input.Keys.Down))) { player.dx = data.other.dx; player.dy = data.other.dy; } @@ -276,7 +278,7 @@ player.addEventListener('collision', function (data) { player.dy = 0; } } - if (data.side === 1 /* Top */) { + if (data.side === ex.Side.Top) { if (data.other) { player.dy = data.other.dy - player.dy; } @@ -285,7 +287,7 @@ player.addEventListener('collision', function (data) { } } }); -player.addEventListener('update', function (data) { +player.on('update', function (data) { // apply gravity if player is in the air // only apply gravity when not colliding if (!isColliding) { @@ -299,22 +301,22 @@ player.addEventListener('update', function (data) { isColliding = false; //console.log("Player Pos", player.x, player.y, player.getWidth(), player.getHeight()); }); -player.addEventListener('initialize', function (evt) { +player.on('initialize', function (evt) { console.log("Player initialized", evt.engine); }); game.input.keyboard.on('down', function (keyDown) { - if (keyDown.key === 66 /* B */) { + if (keyDown.key === ex.Input.Keys.B) { var block = new ex.Actor(currentX, 350, 44, 50, color); currentX += 46; - block.addDrawing(0 /* Block */, blockAnimation); + block.addDrawing(Animations.Block, blockAnimation); game.addChild(block); } - if (keyDown.key === 68 /* D */) { + if (keyDown.key === ex.Input.Keys.D) { game.isDebug = !game.isDebug; } }); var paused = false; -game.addEventListener('p', function () { +game.on('p', function () { if (!paused) { game.stop(); } @@ -389,10 +391,10 @@ game.input.pointers.primary.on('down', function (evt) { //emitter.focus = new ex.Vector(evt.x - emitter.x, evt.y - emitter.y); }); game.input.keyboard.on('up', function (evt) { - if (evt.key == 70 /* F */) { + if (evt.key == ex.Input.Keys.F) { jump.play(); } - if (evt.key == 83 /* S */) { + if (evt.key == ex.Input.Keys.S) { jump.stop(); } }); diff --git a/sandbox/web/tests/animation/animation.js b/sandbox/web/tests/animation/animation.js index 9dc6acfe4..1d53e1704 100644 --- a/sandbox/web/tests/animation/animation.js +++ b/sandbox/web/tests/animation/animation.js @@ -22,4 +22,3 @@ engine.input.keyboard.on('down', function (keyDown) { }); engine.start(new ex.Loader([playerTexture])).then(function () { }); -//# sourceMappingURL=animation.js.map \ No newline at end of file diff --git a/sandbox/web/tests/audio/index.js b/sandbox/web/tests/audio/index.js index 6313c0800..215ca7633 100644 --- a/sandbox/web/tests/audio/index.js +++ b/sandbox/web/tests/audio/index.js @@ -1,7 +1,7 @@ /// // uncomment to hint fallback implementation //(window).AudioContext = null; -ex.Logger.getInstance().defaultLevel = 0 /* Debug */; +ex.Logger.getInstance().defaultLevel = ex.LogLevel.Debug; var game = new ex.Engine(); var loader = new ex.Loader(); var testSound = new ex.Sound("loop.mp3"); @@ -25,4 +25,3 @@ game.add(button); } });*/ game.start(loader); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/sandbox/web/tests/collision/index.js b/sandbox/web/tests/collision/index.js index 2a265a2ba..ee7f36869 100644 --- a/sandbox/web/tests/collision/index.js +++ b/sandbox/web/tests/collision/index.js @@ -1,13 +1,13 @@ var engine = new ex.Engine(600, 400); var active = new ex.Actor(0, -50, 100, 100, ex.Color.Cyan); -active.collisionType = 2 /* Active */; +active.collisionType = ex.CollisionType.Active; active.dy = 100; active.ay = 900; active.on('update', function () { //console.log('current dy', active.dy); }); var fixed = new ex.Actor(0, 50, 100, 100, ex.Color.Green); -fixed.collisionType = 4 /* Fixed */; +fixed.collisionType = ex.CollisionType.Fixed; fixed.moveTo(0, 100, 300).moveTo(0, 50, 300).repeatForever(); engine.add(active); engine.add(fixed); @@ -19,4 +19,3 @@ engine.start().then(function () { console.log("loaded"); engine.currentScene.camera.setFocus(0, 0); }); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/sandbox/web/tests/culling/culling.js b/sandbox/web/tests/culling/culling.js index 4c3dd9366..8dac9dd10 100644 --- a/sandbox/web/tests/culling/culling.js +++ b/sandbox/web/tests/culling/culling.js @@ -11,36 +11,35 @@ player.currentDrawing.anchor = new ex.Point(0.5, 0.5); //TODO what if we don't d //player.currentDrawing.scale = new ex.Point(0.5, 0.5); engine.currentScene.add(player); engine.input.keyboard.on('down', function (keyDown) { - if (keyDown.key === 68 /* D */) { + if (keyDown.key === ex.Input.Keys.D) { engine.isDebug = !engine.isDebug; } - else if (keyDown.key === 38 /* Up */) { + else if (keyDown.key === ex.Input.Keys.Up) { player.dy = -speed; } - else if (keyDown.key === 40 /* Down */) { + else if (keyDown.key === ex.Input.Keys.Down) { player.dy = speed; } - else if (keyDown.key === 37 /* Left */) { + else if (keyDown.key === ex.Input.Keys.Left) { player.dx = -speed; } - else if (keyDown.key === 39 /* Right */) { + else if (keyDown.key === ex.Input.Keys.Right) { player.dx = speed; } }); engine.input.keyboard.on('up', function (keyUp) { - if (keyUp.key === 38 /* Up */) { + if (keyUp.key === ex.Input.Keys.Up) { player.dy = 0; } - else if (keyUp.key === 40 /* Down */) { + else if (keyUp.key === ex.Input.Keys.Down) { player.dy = 0; } - else if (keyUp.key === 37 /* Left */) { + else if (keyUp.key === ex.Input.Keys.Left) { player.dx = 0; } - else if (keyUp.key === 39 /* Right */) { + else if (keyUp.key === ex.Input.Keys.Right) { player.dx = 0; } }); engine.start(new ex.Loader([playerTexture])).then(function () { }); -//# sourceMappingURL=culling.js.map \ No newline at end of file diff --git a/sandbox/web/tests/group/group.js b/sandbox/web/tests/group/group.js index 47874590f..3c6ba1801 100644 --- a/sandbox/web/tests/group/group.js +++ b/sandbox/web/tests/group/group.js @@ -10,12 +10,12 @@ var blockGroup = engine.currentScene.createGroup("blocks"); var blockSprite = blockTexture.asSprite(); blockSprite.scale.setTo(.2, .2); var player = new ex.Actor(width / 2, height / 2, 30, 30, ex.Color.Cyan); -player.collisionType = 4 /* Fixed */; +player.collisionType = ex.CollisionType.Fixed; engine.currentScene.add(player); for (var i = 0; i < numActors; i++) { var actor = new ex.Actor(Math.random() * width, Math.random() * height, .2 * 64, .2 * 48); actor.addDrawing("default", blockSprite); - actor.collisionType = 3 /* Elastic */; + actor.collisionType = ex.CollisionType.Elastic; actor.on('update', function (e) { if (this.x < 0) { this.dx = Math.abs(this.dx); @@ -48,4 +48,3 @@ blockGroup.on('collision', function (e) { engine.start(new ex.Loader([blockTexture])).then(function () { // do stuff }); -//# sourceMappingURL=group.js.map \ No newline at end of file diff --git a/sandbox/web/tests/input/gamepad.js b/sandbox/web/tests/input/gamepad.js index a03ca08de..d39c15e7b 100644 --- a/sandbox/web/tests/input/gamepad.js +++ b/sandbox/web/tests/input/gamepad.js @@ -2,8 +2,7 @@ var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var game = new ex.Engine(800, 503, "game"); var padTexture = new ex.Texture("gamepad.png"); @@ -114,4 +113,3 @@ var CircleActor = (function (_super) { }; return CircleActor; })(ex.Actor); -//# sourceMappingURL=gamepad.js.map \ No newline at end of file diff --git a/sandbox/web/tests/input/gamepad.ts b/sandbox/web/tests/input/gamepad.ts index 2b4ce5c77..b78f5b31b 100644 --- a/sandbox/web/tests/input/gamepad.ts +++ b/sandbox/web/tests/input/gamepad.ts @@ -18,11 +18,11 @@ function start() { }); // Log when pads disconnect and connect - game.input.gamepads.on("connect", (evet: ex.Input.GamepadConnectEvent) => { + game.input.gamepads.on("connect", (evet: ex.GamepadConnectEvent) => { console.log("Gamepad connect"); }); - game.input.gamepads.on("disconnect", (evet: ex.Input.GamepadDisconnectEvent) => { + game.input.gamepads.on("disconnect", (evet: ex.GamepadDisconnectEvent) => { console.log("Gamepad disconnect"); }); diff --git a/sandbox/web/tests/input/index.js b/sandbox/web/tests/input/index.js index 85665cfde..b2e2492e9 100644 --- a/sandbox/web/tests/input/index.js +++ b/sandbox/web/tests/input/index.js @@ -7,23 +7,27 @@ game.input.gamepads.enabled = true; // Move box with Gamepad axes and D-pad box.on("update", function (ue) { var pad1 = game.input.gamepads.at(0); - var axesLeftX = pad1.getAxes(0 /* LeftStickX */); - var axesLeftY = pad1.getAxes(1 /* LeftStickY */); + var axesLeftX = pad1.getAxes(ex.Input.Axes.LeftStickX); + var axesLeftY = pad1.getAxes(ex.Input.Axes.LeftStickY); // Right/Left - if (game.input.keyboard.isKeyPressed(39 /* Right */) || pad1.isButtonPressed(15 /* DpadRight */)) { + if (game.input.keyboard.isHeld(ex.Input.Keys.Right) || + pad1.isButtonPressed(ex.Input.Buttons.DpadRight)) { box.dx = 20; } - else if (game.input.keyboard.isKeyPressed(37 /* Left */) || pad1.isButtonPressed(14 /* DpadLeft */)) { + else if (game.input.keyboard.isHeld(ex.Input.Keys.Left) || + pad1.isButtonPressed(ex.Input.Buttons.DpadLeft)) { box.dx = -20; } else if (!axesLeftX && !axesLeftY) { box.dx = 0; } // Up/Down - if (game.input.keyboard.isKeyPressed(38 /* Up */) || pad1.isButtonPressed(12 /* DpadUp */)) { + if (game.input.keyboard.isHeld(ex.Input.Keys.Up) || + pad1.isButtonPressed(ex.Input.Buttons.DpadUp)) { box.dy = -20; } - else if (game.input.keyboard.isKeyPressed(40 /* Down */) || pad1.isButtonPressed(13 /* DpadDown */)) { + else if (game.input.keyboard.isHeld(ex.Input.Keys.Down) || + pad1.isButtonPressed(ex.Input.Buttons.DpadDown)) { box.dy = 20; } else if (!axesLeftY && !axesLeftX) { @@ -39,4 +43,3 @@ box.on("update", function (ue) { }); game.add(box); game.start(); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/sandbox/web/tests/input/keyboard.js b/sandbox/web/tests/input/keyboard.js index 4e8f426e0..828d627d9 100644 --- a/sandbox/web/tests/input/keyboard.js +++ b/sandbox/web/tests/input/keyboard.js @@ -2,7 +2,7 @@ var game = new ex.Engine(800, 600, "game"); var label = new ex.Label(null, 400, 300, "48px Arial"); label.color = ex.Color.Chartreuse; -label.textAlign = 2 /* Center */; +label.textAlign = ex.TextAlign.Center; game.add(label); game.on("update", function (ue) { var keys = game.input.keyboard.getKeys().map(function (k) { @@ -11,4 +11,3 @@ game.on("update", function (ue) { label.text = keys; }); game.start(); -//# sourceMappingURL=keyboard.js.map \ No newline at end of file diff --git a/sandbox/web/tests/input/pointer.js b/sandbox/web/tests/input/pointer.js index d01ce32b5..53a4c5602 100644 --- a/sandbox/web/tests/input/pointer.js +++ b/sandbox/web/tests/input/pointer.js @@ -3,7 +3,7 @@ var game = new ex.Engine({ width: 800, height: 600, canvasElementId: "game", - pointerScope: 1 /* Document */ + pointerScope: ex.Input.PointerScope.Document }); var box = new ex.Actor(200, 200, 100, 100, ex.Color.Red); var cursor = new ex.Actor(0, 0, 10, 10, ex.Color.Chartreuse); @@ -59,7 +59,7 @@ var paintBrush = { }; function handleTouch(color) { return function (pe) { - if (pe.pointerType !== 0 /* Touch */) + if (pe.pointerType !== ex.Input.PointerType.Touch) return; paintBrush.paint(pe.x, pe.y, color); }; @@ -76,4 +76,3 @@ game.add(box); game.add(cursor); game.add(uiElement); game.start(); -//# sourceMappingURL=pointer.js.map \ No newline at end of file diff --git a/sandbox/web/tests/label/label.js b/sandbox/web/tests/label/label.js index a63f5abff..cb7dc8aa3 100644 --- a/sandbox/web/tests/label/label.js +++ b/sandbox/web/tests/label/label.js @@ -11,4 +11,3 @@ label.color = ex.Color.White; label.font = '20pt Consolas'; engine.add(label); engine.start(); -//# sourceMappingURL=label.js.map \ No newline at end of file diff --git a/sandbox/web/tests/rotation/rotation.js b/sandbox/web/tests/rotation/rotation.js index c1384d4ed..cca0e1ea7 100644 --- a/sandbox/web/tests/rotation/rotation.js +++ b/sandbox/web/tests/rotation/rotation.js @@ -2,20 +2,80 @@ var width = 600; var height = 400; var playerTexture = new ex.Texture("rotation-sprite.png"); var speed = 100; -var engine = new ex.Engine(width, height, 'game'); +var rotationType = ex.RotationType.ShortestPath; +var engine = new ex.Engine({ + width: width, + height: height, + canvasElementId: 'game', + pointerScope: ex.Input.PointerScope.Canvas +}); engine.backgroundColor = ex.Color.Black; -var player = new ex.Actor(width / 2, height / 2, 30, 100, ex.Color.Red); +var labelCurrentRotation = new ex.Label(rotationType.toString(), 500, 100); +labelCurrentRotation.color = ex.Color.White; +labelCurrentRotation.textAlign = ex.TextAlign.Center; +labelCurrentRotation.scale = new ex.Vector(2, 2); +engine.add(labelCurrentRotation); +engine.on('update', function (ev) { + labelCurrentRotation.text = ex.RotationType[rotationType]; +}); +var player = new ex.Actor(width / 2, height / 2, 100, 30, ex.Color.Red); var playerSprite = playerTexture.asSprite(); player.addDrawing("default", playerSprite); engine.currentScene.add(player); -//player.rotateTo() +// rotation type buttons +var shortestPath = new ex.Actor(50, 50, 50, 50, ex.Color.White); +shortestPath.on('pointerdown', function (e) { + rotationType = ex.RotationType.ShortestPath; +}); +engine.add(shortestPath); +var labelShortestPath = new ex.Label("Shortest Path", shortestPath.x, 100); +labelShortestPath.color = ex.Color.White; +labelShortestPath.textAlign = ex.TextAlign.Center; +engine.add(labelShortestPath); +var longestPath = new ex.Actor(150, 50, 50, 50, ex.Color.White); +longestPath.on('pointerdown', function (e) { + rotationType = ex.RotationType.LongestPath; +}); +engine.add(longestPath); +var labelLongestPath = new ex.Label("Longest Path", longestPath.x, 100); +labelLongestPath.color = ex.Color.White; +labelLongestPath.textAlign = ex.TextAlign.Center; +engine.add(labelLongestPath); +var clockwise = new ex.Actor(250, 50, 50, 50, ex.Color.White); +clockwise.on('pointerdown', function (e) { + rotationType = ex.RotationType.Clockwise; +}); +engine.add(clockwise); +var labelClockwise = new ex.Label("Clockwise", clockwise.x, 100); +labelClockwise.color = ex.Color.White; +labelClockwise.textAlign = ex.TextAlign.Center; +engine.add(labelClockwise); +var counterclockwise = new ex.Actor(350, 50, 50, 50, ex.Color.White); +counterclockwise.on('pointerdown', function (e) { + rotationType = ex.RotationType.CounterClockwise; +}); +engine.add(counterclockwise); +var labelCounterClockwise = new ex.Label("CounterClockwise", counterclockwise.x, 100); +labelCounterClockwise.color = ex.Color.White; +labelCounterClockwise.textAlign = ex.TextAlign.Center; +engine.add(labelCounterClockwise); +engine.input.pointers.primary.on('down', function (e) { + if (!shortestPath.contains(e.x, e.y) && + !longestPath.contains(e.x, e.y) && + !clockwise.contains(e.x, e.y) && + !counterclockwise.contains(e.x, e.y)) { + var vector = new ex.Vector(e.x - player.x, e.y - player.y); + var angle = vector.toAngle(); + player.rotateTo(angle, 1, rotationType); + } +}); +function distance(x1, y1, x2, y2) { + return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); +} engine.input.keyboard.on('down', function (keyDown) { - if (keyDown.key === 68 /* D */) { + if (keyDown.key === ex.Input.Keys.D) { engine.isDebug = !engine.isDebug; } }); -engine.input.keyboard.on('up', function (keyUp) { -}); engine.start(new ex.Loader([playerTexture])).then(function () { }); -//# sourceMappingURL=rotation.js.map \ No newline at end of file diff --git a/sandbox/web/tests/scene/lifecycle.js b/sandbox/web/tests/scene/lifecycle.js index de012e0f3..292a08d23 100644 --- a/sandbox/web/tests/scene/lifecycle.js +++ b/sandbox/web/tests/scene/lifecycle.js @@ -1,4 +1,4 @@ -ex.Logger.getInstance().defaultLevel = 0 /* Debug */; +ex.Logger.getInstance().defaultLevel = ex.LogLevel.Debug; var game = new ex.Engine(300, 300, "game"); var scene2 = new ex.Scene(); game.add("scene2", scene2); @@ -8,4 +8,3 @@ var actor2 = new ex.Actor(60, 60, 20, 20, ex.Color.Red); scene2.add(actor2); game.start(); document.getElementById("goToScene").addEventListener("click", function () { return game.goToScene("scene2"); }); -//# sourceMappingURL=lifecycle.js.map \ No newline at end of file diff --git a/sandbox/web/tests/zoom/zoom.js b/sandbox/web/tests/zoom/zoom.js index aa690b86e..067b142c8 100644 --- a/sandbox/web/tests/zoom/zoom.js +++ b/sandbox/web/tests/zoom/zoom.js @@ -24,25 +24,24 @@ target.on('pointerup', function (ev) { }); game.add(target); game.input.keyboard.on('down', function (ev) { - if (ev.key == 107) { + if (ev.key == 107 /* + */) { game.currentScene.camera.zoom(currentZoom += .03); } - if (ev.key == 109) { + if (ev.key == 109 /* - */) { game.currentScene.camera.zoom(currentZoom -= .03); } var currentFocus = game.currentScene.camera.getFocus(); - if (ev.key == 37 /* Left */) { + if (ev.key == ex.Input.Keys.Left) { game.currentScene.camera.setFocus(currentFocus.x - 10, currentFocus.y); } - if (ev.key == 39 /* Right */) { + if (ev.key == ex.Input.Keys.Right) { game.currentScene.camera.setFocus(currentFocus.x + 10, currentFocus.y); } - if (ev.key == 38 /* Up */) { + if (ev.key == ex.Input.Keys.Up) { game.currentScene.camera.setFocus(currentFocus.x, currentFocus.y - 10); } - if (ev.key == 40 /* Down */) { + if (ev.key == ex.Input.Keys.Down) { game.currentScene.camera.setFocus(currentFocus.x, currentFocus.y + 10); } }); game.start(raptorTex); -//# sourceMappingURL=zoom.js.map \ No newline at end of file From a48bdccd45f6adb61d824c56168ffa7b81f88a01 Mon Sep 17 00:00:00 2001 From: eonarheim Date: Sun, 3 Jan 2016 15:42:00 -0600 Subject: [PATCH 4/9] Update dists, potentially final --- dist/Excalibur.0.5.1.nupkg | Bin 275706 -> 0 bytes dist/Excalibur.0.6.0.nupkg | Bin 0 -> 563494 bytes dist/Excalibur.d.ts | 743 ++++++++--- dist/Excalibur.js | 1163 +++++++++++++---- dist/Excalibur.min.js | 16 +- dist/excalibur-0.5.1.min.js | 14 - ...alibur-0.5.1.d.ts => excalibur-0.6.0.d.ts} | 743 ++++++++--- ...{excalibur-0.5.1.js => excalibur-0.6.0.js} | 1163 +++++++++++++---- dist/excalibur-0.6.0.min.js | 14 + 9 files changed, 2948 insertions(+), 908 deletions(-) delete mode 100644 dist/Excalibur.0.5.1.nupkg create mode 100644 dist/Excalibur.0.6.0.nupkg delete mode 100644 dist/excalibur-0.5.1.min.js rename dist/{excalibur-0.5.1.d.ts => excalibur-0.6.0.d.ts} (89%) rename dist/{excalibur-0.5.1.js => excalibur-0.6.0.js} (92%) create mode 100644 dist/excalibur-0.6.0.min.js diff --git a/dist/Excalibur.0.5.1.nupkg b/dist/Excalibur.0.5.1.nupkg deleted file mode 100644 index 56549f34d39ca348fc4d70a717597699ee4e3955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275706 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ⅈ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Ȋlmvg2w}1jC`k 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�k!&q^gjKro9Vg7J# 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 z%0D+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 P@OL1bDdxQJ1_%5fYj?Ki diff --git a/dist/Excalibur.0.6.0.nupkg b/dist/Excalibur.0.6.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..5472702541af4a73527cfec8bce9c4d3b91f4038 GIT binary patch literal 563494 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έZV2KrtXRAfbJG6ExyGQiG0jfC*5#4XM%d{~zHH>ElIi3^Hp)F|S z%v~8cq+n6*Fma}%aBlXzXvz-4tm}Iu2=g#ZU~XXXIeoVcQE(T1FQ`IpxQF(9*Z%2; z_VGt!cN15XEGx3G(JHS<2;)Hyn!}>U&DhWRW9R>|%I1MO&0$)oLO-sWmQt#1RygT1 z&<9b|KZ-Hfy>1u~9OlA6$+tAdP@}JV*x<0>KW50_s(oTIQ_?n5jX5L{iPc&pYEz@ae zOQ|iZZfGJEMMh?`tQh@M$nl0HhApD_WMmL4Q%ufC&zv0dv--Fe{!+`hUH*WCOEJy16?=Z`r<`=g!OPqRV|bn(}3NO{%9%1j9M| z&IPzPs$W2DdBYq#Oswi@0DctU>4C@65X39C3Bc3>o(HErOlVl^wvLPwA`&Q>WCI{0 z+>?giO0WkfhK{($V}|i(-Ud*}-rxd6b_dJi;FhzjGY++%avdu`ZT~^S8xd!bRr(ne zo+v&%>Z1jGaC6|~OI1l%`<@6dAgA8?z%AgT$sxA#1XsWg%no4S^M?aKZ=r?m)*QB1 z)_AoxFVsEU{@QEb1)&j;x}t@FU;Qaog#)Z+YsyVft!})2ZSo}Ysj$&6$YTz#`dd44 z7p}ba3O^~Ero3t`@3EB6FlCj`e`y0CmMh`JE!kEiDHiDAGz~72%7RZDp8sx_=GKAc z*1_i9spfq0e3zH!S(KqEq|33vnjWY1{Vw?@ zcHv+ddpcT%0;;a$m;)wETI*7Caa_y8CgUDaUXifBfd&VNKp^LMTzkXthRzAxYUKO0 znhE;g+0?O)VhayAOwrdmJ|0e4;xW@C7^nf44`cZOqGb%(Yn3ggw904FK>hp++Yh@0 zWeeDx)IZZ^0Yw6LCCx&|%E7^`GJ_d>sf91RjVmYoHye=_Q|_Bj!@O+?M`NByw|xB# zVIg&os2O;7Q}q;4C%nOO?KG#&nGWh0%1lp{>rF6Q-AwV72hSkXwnTbhTeTp+W1G6g zBi><1a5tN}`%cBn)7FQAZ~E}suJ=6fx(|=+9=Qt1#;Axm{)8I`4FhQn4<@nQHAZ1p2~bx?_tdh?k1q)6!lbCej1jli`jwv=b6Xe zKv1JkLs$nJx;MJ0W(%?#f)WJ-4GERka6GC-a15cu(Mdx)s#b#!+SHky(Sc>=(R(Dd zC9<;J%~AVR0Q=BTDX92F$M{u-B13d3x+tMWL8V9!%h*`_tpiFGO!r~e5z-J+6OTKL z*SFfO7zaK6F~|fY^=8RL-4d+Rp#Ue(;AEI)6hu*EKnz86HGs3)q>#O`yM+6r`0+um z=hi~uyPo5_q2aAO4=yFW%?Wg*sB?W;K?SJi9_ifb&~C9vlujjOtaJ--hjthDcVYFg zPwdq}gc==vhqLZbIU9x9K1RP~RLkcV7i>c7lHH+4h3Jmlm`Xa0V{h+4v*b-#*H^dBW0Alylw%WDVnWh0)Kh@98J zRse;=zzztO??G&2$wD)S?eIQbOctKI`@+4DfOE`+1V?yye(vELCiRyD>~Cpo<= z(yowaUCeL`-xkd=n3Z)@vY8eiL^bC-mky#>%}9%j0U3GoRkGW{8eBDXhqE?;kxepB zU}R@5znJS#u9Udfl^E$F2={d?UsmDkPZG;Mc-nZ55$W(O?YfEGgcoI?z(INhCB$!$ zAswfWSi1NrlAp7-8#+rLv2^)cWPD3+m@@elOXk1298v7B!5^EjQj9|-n18LTUA!(M zx7(b4ys!M1!0SbEQS#ow50Uh9Ru#Ns@I!VBoE=1`;Fs)D)?~Tp68!2iq`0rdOGZfX zc82;uNTwz=X$#_jUYO68OH$171#symAm9>?f70-vKwOeBo~z31&U4|NAv`xawC-db zu!!cQVIzy;jp%yPvEL-{FqE=&uAG6gXtIraGjaCrA+Hn` z0Xw%QPx!4LVN=#5^e$|h>gv*}8~&rbbnN4@KhTTR8xQ<$Rk#H=PW99WqV7WIs&KK6 zAtJrH8dn{#m`KVch;_o)YdCRzXjHqWv_HgNGxSW}Z95!@_}GNQ5oXMDXne6jaBa43vv0 zh%H>^OnS>7Q0n$}Pkq5CqEAj|wedYYWBcz_!JjOW5t|DJHPMMt_q5w1r_EWfd)8rU zC#=UXeADI_wI-_iDGIfuh{q^1DtL(KsLSBRV>v3Kdf2T*(I@qhFXTg?K5Buj6b03!(vJcFYDn3xF3+>*=<(x3{nzc4Y-h$*uIMQ4 zbz?+Yqh#CdoK|Pa(Qug5Y%kFh=#rmjZ$fr1$S5T!QdO{OAVHB5jK6!FS<%@YU$M(+6ab;|yN$G#`^7KbvbWJmOWt&KZ_10P51+^Y$h4bQ6JaF!FF?dLGN+4)*nQq_ zG`JJ2LgSLnu4OjgIw0SPa!l+NO!|rDGv55HwfPN=@7CHgTF-EUGu~i+&;FjT8n)e0 z9fm+ZWK(yM#6hS$;Xni$IY(o4Pc*U{T7M!ECk%u@VZ~8c-V=qUT(V8M#9<+Pg0_zQ z8+D&Vw7ldk&wr1W|7v2Qi?+R2*cv9&v4Xt3py#+OMql9hH=K zsO`}?@j9xVbWs}e&BavXra>AfUG&sOSKI;Wx(Ub*Z?dEf-d+!d%embj)WEhLS)7Bg z<&mXhh-a-|($bfgbT~xZJ9%TNh8s)hg%qD{*naY!6u_mGYlO2hho}IIW7}%mI8Q%d z?a|SLp^WD(kZ`y~9e1a#uyx5xz76IS`V7x@Sdo}3b zxTwmj*WW#9cSq#|qEo@*2UWhuH~aJzfW!ayzmKESVgFBA|KjZ95$oG-AIJaa5T3-+ zvC$b9Ujc!@Ek?5EGOHl!MiUiq^>Xxe%%lxUI}&LXPJ1NM7U@Vk?w@`IcUKp<)K|RJ z;nCyAv0y$GDkHwL&Nx&IngzM(h}bt^QXz&SZ(iD=Ktc~okJNdne3(HNQ}}@qg$>3@ zC+SEurW22Lo0&Cj#y*Du$4 ze@p8%_W^0h7izzT-q)LYPrft;{Vf<=t#YP`F7wbkwTy2MA~L9efrS%HC3#t8U7D;* zkyWd#bCY#0vPy&*>9t3@` zUVU+75<|EzDXf29nxE&%NM34npSNL9v&+yGCLpA6I;ogMU?c?c$@^xIP(#AGNH~Xt z5)!hWZ07K27m_vQ8!kRvA5(eIS7}4)Fz$7`y>7z9jP%E_vtpcg?&K*<1e+?yx$O2< ztOD}$SeSCVy#~X|1n{^!hHQ}=cb&5(Z4LH@M>Q& zZx`@Pfs-u>@)Ip{wmrbPe>AyIz;5KyS>~PmwyNCBKPoyuU1x=pr^nzYTG2Um@*n@{ zPk;P(HAWyq+{%&|PZwF$RAl9J_>YFpZ^5lbMbhxNKon9(TM+Q)K2KXLbQA)mP~}LW z^38SXOsGxg3eT>v+3aRaef#b^;vQ}X1}05(`Y`<*ruRE#!PI{ei0w$y{MSdgQ-YhT|1z#jvW;I-x^86JGf5p>F){iWeEp@OH`sXr`iF%K0N|f zFg}%V&#fU40UUQ4r+nm`<#=SZ1W0R%-}G;v{E)E^R1R*~e`^(%l6&xR%c>0A z`&k~XPSi$f1Eakcw=?WOVL}_=7p7_zq)%D3bc8yUzmRwE<+lyCl9}@R6Bx|dx65k; zcB*4vr}quMwga~Y@9roA--eqmH$CYAc5^@vN92)oJyoe|oLZU3aQUZIMMdL~;xv$_ zfYugJF@CWb0Ju_*bCf^YT$1xd@`HE{89QAQ<;gFeK5>0wg#)%U8?=-?EzTyj)Pnc- z9hTr>;x;n{4(kIQsaw&%(@T$JP+9O-?o4h=6{m8*k&u6SmVXJk-{15K1x&0h4+HR5 zkOC#}>;-m|4$ZXHp&45pvBQ7C{rFSy$J}I5KIX+hJ`pDVh6*(0GUfl;neTY!xd>6C ze)vUb*kfF%#L%&@W4+Ed_Y>YS3@^cld^AkJExbTJ*PKS^W`!+cWzF40tmj<(lvXo_ z9C#OtpTb8NJccsxyX8K{`b+odAs%WxI-OH8zUHMm8 zajML^{(PYSAvP%5VTYbPM>1-$%(RuBGt z0xhQDSh4&Lh1f4BHsJeAJ6I^Vfo&_3(+iS58Y)DxIr%ovF3oFT)oYOG>g&?_I=8+u z{-xc*L{GQlC`Q!|OUtSF22`HMP8tsbhYHuM5N?;`*|H|{A67Y7ZzuyiwA&%5+f=T< z@L`j=kU8?(A!jLbRf63kG&U*%k4dtNI#k+JRP(P=8dQSAzDnUx2?6fS)FTuq(HiZ@ z?p@V)F{|Q3hj5ZJoSK(j%}c-Ld8p>OSM%JjDL4)flv|``%Xh;WX{Mv?vNm{1?xswK za`n@-ASJT-EW$PVc5x3wimr`QrSpfAvY*YzZg# zNHU!2+Ln%B%MC>?HILMDD0z0ZjL@JR7($Im|0{T}EAdJ14o(yxs@H%TsRPpUiYN9> zGu@cQ263W|9-B(Vp*ajkTz;4B5IwtM9Y{JfQzTV0IZ~Xt)y5yD9Y+eT;h-MMQ*bcs$>FcyF3KeV$b^GVHPMp z3Eoi76NOeY>bA9#zSftiuOV7>w`m3XZoi`y1XFukfE|cN{}7pLkB)elyH{qNkb`K2 zJ&pp2CXRjxztBQ0_gun;;?G7eB@P0S*NAP>-#FiE^w7}*c{X&F+Je%4akm{Uzmx9G zRB>_FxuU9HL6Rr)O6>a{*acF6VN1@H-}qx;88w7PY^h;tYAe+0wpGSCraSE}B@ScHb2xSPedO183DrjG@=Cy=H*SgNWxc_x_4=2r(Oo;MCTRIShaN;+Xv`QE|&G73w zfp*lEScBvRBd4|l-8~Q%Z%1;sIvM$$v&@U)HJmF(){M31D>%YztizZQ%Ls6iu_qqe zz-+2-78g0|;M}S@FjwZ`)JlHyyYcA7Of-p7JdNUF1I{A4N0cp8KnucU4 zZ`jrNS_ToRa%eH)5X3Ttlxh=N%!j;uzJpZF2Gtd~8M zc40II{m`VNZ%A{zTDuRV?i^N5ruxNbOM;5ntQUEyUwn4z#cj$?FtxuOoTI1$DXZt% zY_ah*XA-Lyob4rILtToR5bKV*p4zkk3yN}E^KU%)?_q!<9t!mvnsZH11Y2xa38euTFSlP3Q^U#BU%$*@Yt)SBdh9XLBHfZy=Ev^ z4+KO;Q9qPs&)}zAx^buiP5E_Rp5$Vexv zIW1*GBPl=t3$cHUx_^b3ecbu@XL8=*g*zup3Ql+Yikq6i;KudhYMJwWLMiTKj(u?7 zX50eYIcM8Vc#=~9l-ugfKnr=%Gob0R5&fymS6AUz*Ch~B%3FDe>jJUoRBL@G=2gvB zwZDD9m7suIt8VOP=)6H;`H`BY5PL4qfwMSQZ459+-0)(DxOo- zXYxQ}G8YY*Q=s>>e#tY83m3JXsookFz>JfIAf+#yq7c2${d|JJ4`Xll+zw}N$+^NQ z3Qs)2ROMu0g0hY$R9u-ra}O^Jl&u6K^;Cl?6W-5mXJK8!QC&Eaa$r1eGD9}>q(VTd z$n&9urtP%iBqbAykB}TnF*Wsr0N!kuMW3%tZs~AZymVXCF2zS(cEH8 zge~cpA6|anG|SiIA55WYCSa~$o7C=i&);?vJs06MJQ0d~Sr#?nhcMmqygY{h%^Sof z2@6W%O&fE)=x7KxAwlG@?Ph%p5n^H8l5Y%uo6%f6A`SIBoH8AF#bZ^?NT&;TngHEy zrzRD=IV~`TccoUtUfNLfzP6h{9VbB#XnQF*KCH1C~ZF_n~!f7aia;v~j0iH{opmHoHuVkWw7W z7$}Ux0=aHX!ZyWzCW@y@rBlKmXUh5fT}BJd?&qtE3(G-UXg@fCD=pn_s|I4(=tBwy zO9D#Gx2PN-58-yg@3cQbog)^}2A7OLDvaH6K%X!%Om^KQ_<)6|5GmypSZAU|JSbu!ih+#1(l z2VIYVxT|KBo-oiK^-4XHfpR|Dv7N;W0({H?0WMJXIxi5Komo}ZHR~9?q=gvfq_Zwp zovT&dbQUH1hkaF|s^A6wy=bm--jBa$A2Nv1v}_pacf0PkL)z(swf+s7iH>@v2x{#t zgF^WU=eRd~W<-{OVj!6j%WErN^h$To%99~RBP@nuTiV%0%v`A(xaf4CQ}M$|K{pl z#6Z8jwUw~JIa|8LxxV&BF^Hx#p(b8~OdMQS*^*b@tcD?GlDNb$38k*Uk7+MA$C zPN_b)srW&cI$sMWp7U#+>O)=Zgnb{&68AdAhkP@K%@v>rJRu{0i~F9Ex8J~vLL5V! zVBh$}IW1Q{sWHj%`b0IX25U8&G1cX%G|Qp*m=#A?WrP&JjmqYo_RxY!8nBh{Lu49j z8PJ&M2XNIH!s`c*T>(Q9di+9KRZfZh_yswWMn>KqEG&D??d@Kpc3UcVhk5Z+hEG=| z68R!vvVg}ZOw5?zhK8vF1%61h?4=_HAWiFI)WW#zRlS7@xyWNpKrRqGTG)C~#Q|(A z9!sSGW3o_=)rqRtV?Y9RnPyVhSIeOb_*h1UD9{dyF3aeago%*9gcVEYU@;kDE?XMx z0V$SG(BqX3q>l7tP)ZTEuZZETMylI(n39It6thgUNgviGQeJG@IGZ43V$&${A{s+U z78{D>18-7LNB80V;`;+RY3+BLo@NE8y%HKz370}1Fubz{ltjp7$|1`T)jI;9ezHRD zqqs(D3kfxHEmER|`8loGLanL%U^@j$(P)SObOQlIo2>^q zkn2RBK#*O!?FBef60Mm8@^D{71O)NUfz-r4i&rFaGZL@J@0ln8#-3p9#N}*1XB(WS zjQMn!^EumzB5TV|Hjs^`j#+uN%!y6^4R(<5Nr-=#A$?Q!G}3-V+~>mm(cgEOKt|TF z$qeZ5gb^gLz#jhR@qb<)r0l;#y=pc7w`aUs#@%Bl#dZ3Djf-dK zliHd*K7Ipb$Xst-jjf`mM|X#V2>H~UV>V8TkR?a2;I2VObBf&fXlg|Um9hTGPcjOd z21;nP_p+&>@I$~$n@YfbM*olg;ov7GmCn~g^hzvHGiI9Pa?0)P~X#0>hWJLwC z51IWMPSs{2A|@gqSy(NemDj@jflCuKz4)b0n|q$hET4Z=PcRyyMRWjCNVAG-m}epY z%vEjj)Srt^7eXt3=yazs{wS{{-k&EJS5R8oak=E7TY;r$o5U1nNojcV?;59T_adcE z5dqKnhrnVe{qS>H!6KpSZovez9mT@5lRC&D{s9uWWv98l~K?|^ac8yBL z&=X7+lVZ_Ix{Ebk;D9nP+oU>ZZ)f!0!?AFJ$z)Z571iI6WVO71)~XKiY#FLaO*|g0 zNkH8gGnAmsC56pp5!zgeuw?YKus4?ldRg)JRXVmD=7i=k$+`OaE#()BWa@RMOfx?g z;%%DN8kQRhwVh7*Dcvk902UOF=xKcx8`o0=2y#SN(mOv_n-m=z5Hk1AOCq#*W$Dj~ zbq6jpFNi!J0egJish4C%FDRLhyNQ0T4<1WQ0xg_04Y^u2oE6K?s%GmA-0+A)lt3Bs zq|c5JX!$rrK7a%}&mfxFHyzma!yKG*P>eGV2M7N-h)z%Xf6My64f}sO>&5@)kW0EN zxzRcuX&VJqz(H||x|}wL-Ci9Z?+wS=>Q*8*kr4Ar0?BRFoN;J%#Z*yAYB>f;C#&n# z6?a6`iQHKbMn$*~zRfPX5IK^yyp!UK{S?gZTI#{Jb119OU2x{@+Gk4K6v~_bnTdJ9 z-~0On`_J)PaKULXOo%$5HYe1m#Sh|*s2!UOG{Kvet`jXdFjny{g|wfNa&}ZfnuHnl z{vMS{M>4T zdLIrFX4=_j|s4cQwIac*1K3Q!`vO^_!x@qXs36e)4^7neJsMP`7xa;Ny zM@>{cYTyYj*EX`ck^>ijtu-ggZ$`zWmkw_mc$eE8dE85k7?zSZLhQb8mM)mPx%(4C zgmHy=hvPh4j`EzTE9FlB&G{TSi(1 ze7iN=I-!c4;W;S7^^r~&9y9(tG3MI$v z<4(R5TQY$)U(JYvmFR_npy2k1{DI)yC92dArN$F1JS2tTVIm?4y zx$MR-H2F;_q((yvtt33~=5#E+V}(dy@ZtV@p`|xR=QCW=mlExQo6z2py1`GNvyCO( z;}Xdq#lziignB#noXxhqlr9-_FWPI+Bjx-s(tWd>jS}}elTIydEe5Qi4K{;z58+&c zAHKCawaJZuX1P7(oM)ASDQy9{OTcdS*DC*1dWd(J*bD-z0hrOc+^%rAEH1mTezdI% zt&LI6T~Z3eTMz@;0|u_kM6U2_*x&C~p&(@9mWxgCwL$XXwUI^7y&D;{LUa;e%79Kgl=v`wR8@ z^7f^4{c$Z^UT(j^2K?&f^`Ae(&D41(9|zDv0}#Rce;2jU!>5?}$3MP2v6cPfk2(>2 zzwy(jS-bG`JUw}u9Nt;#{`m%KcK^pD^SvolHUekS)595f0`gJZ{s;cBOn>A6uTRpz zvI))9zdSOLOGL>}w$-)fUa0H3s5cxN>g4R7z>*3t_PzboI)H57$e`|ipMljWfeH=4 zA)ykuG>?8g&)Z7}f@=qE$l~=w%5Oml{9o?;=T-3^0kH75+n+o=w|}ZuH0!6xj!PR% zP~lgooIZ~qc46ZpSOxy=s1;9R!QL4pf6#;dKho3zu@~gk^!zEATYmoX`s4#>Je?#% zc!&DMKBN0*sIr3o`(OS;(mO!Kw65}Fkh7=T*!o}%8kJUGe0_O&JfZ~H@}Kx6x$j^3 zB25SV_s1H~`&YU zz&jM3)wBLL|L#uU`9|e`|M|^+_yleMU|$nEtyZtn@gty00O?bU4``BcjTl%L{tB3M z@S6?YT;iVs=hwiUhZ(^I?;CHv!g7vMQ5d2ZLE{dk~ zQuBG&mmbbX=e29XtEJYRSE=Matnb_7jrA(Z``z*9r9vneKAtGUbAo4=KtGnOLaRT7 z>U(rbc^8@VU*$@2#^RT|o?rV7F#XewgW!rdZXydjtks|sx5bBGmel&ix-1Y|Dz@~G zGSu#E7JvsjL4}!>ruObW_${yxi|S=4&NTAn_1CmoC;_rA=K*!pNZzjut$)aD?SpZ5 zA4WWahTZU?HtH@<&`XPM_*5lUz6ncf?&`5hE>-gHBuFivs>D`cy*EG-_^nL7;i|!H zeK#oWy)SR~#@?6YZy$i1hEWM4_^n!ybSU4sC6M)Vl`-%w3&>&+%<8d9=C+Zi8#dU8 zl(1f3t8Ce_0hiVz59C9@Z{Di{d=s(@2F|uAaEtzrc`w!1?ueJzoE%%jMGf*Euv{`e|rFkaZLL zrjBO$cJopeDSg-3&;8ilA`8kjpSF3Az-Q8P*k!eu46ET&)Y*Vebo z+WYl>DSkVz(qHe^?6TRf4*L$KSO?hZN;zOAWPeVUC6ha%|5j+sXTV&Rck|#eBFAbdJlEeu$5IIPc4k=S_KKbaM`$b2Bu_ z+1|ZGLmi~u&fnvYA|e2}&d;&ZZ_*#^BhMdRgSvaKpVaU(Ue^Iu zgqh()r#(X~X%RTqx_jvps8Pz5%F9+k$g}U(Y#T zZ@czObrSgY%p5<3^FOIK+SM^ac`2^s3uW0aFBY6dABXDo_469-s}Z|LK%Dl|({`Mk>e{5$#r)z)XUw^aY@mnZ11&jZR9>+seu0gwY;o&r|4 za*OH;u-kV2?oiYvuK0dd<&Td>o&Rw>?koIzBT|=mHYWGgJ{^^+;@7YBpbREIIxM?n z`eOrgsZ#up4$Y<7*?(woE)@>`qr-ElR`{O{(3fYG@1UIVk>pG9YqO-&XhI z_$;gXNb0wheTqpSzQup3V}1bP?4|(w*wIh2U^|~=RReX&yaz@9ctQN153APMT=4$P z^h5s7INUZoc;@`!wX-VlGyZyScz9Vk)8FsmE@Sh2dhqc8+Wn{CDGJ>W0UIh|^rySX zelxigxZkQcbk7H=JS7djCG|OI>B%V7K{a0<%EJTB!y~c5#N*pP{8xBvQEK=^KZ&3% z89apB!NcGWO#AlZ>X7ycd^fc6_I>DJ=_l}=lYb1tPo`!GWqr3Pf>tl}n4e!E>6Q~H zdHtj>H^lt|eSxK)^yQrVV}1E#D*qM6@8;PLz*&`l0_ip5$6);n@dUzqPyHX**3B#^ z@5okuTR>IknRv+uI}2D-1xuw7tR200?;t~W?ZwZvpF-D8l{!4_m&XMcMy1m050*dn z!ST&}zou4EHmBh{jJK8$hOq@*gxSfL+u%*`q~rDN?5N!YZJMAOcy?QM9pI$e;eh=T z3^WJ1PZ=#hPrqQV&+%=)ZJ|q~C)m6Si?`UU!&1l3vFVi#W*)J5X0kefR1w@&hMAC-?qQM|BQdFq?S4w(9=TS z85(GW`IPeR_S!eJcYlWdNP7viPJcR+7q4|ty{{8tA=3^i%;n!c*+ry z&#B_$2aqEK{|Sx&&13$Rlt=W_@J18$_26vWb1Q?Y;WYzyI*gV6G&I zi;31l2mIg9)tXnek4;GJI{N@=ikp3AK**orb6pYpaxZ8X~1t zy|v#Nh>dpj)_G?j8alOg$vXr4FV)5&?+om?T)lPQ83=H25EFhUDrbcA*{#*c_i`nla?05NC zk6&WG6Yz8JP$}wr_Ax0H^zfmaTyNF$qXAv|!HoWcT6<$3-|ZjPqJu`NRsF-=+8=1@ zUmFPSMWYShZuREy{a(3#jv4wHc%Q1LZ|&p0)mpcY$`fOo#SeG|^WkVDTp;h`Vsj{F!wP}9|%22LnL{!W7P3f!ed;h+Y=ld=QO?e{y zJUh0xHe6ajneTL~+A-gD?6PKl+O;e09(r-^U%B&t*2Cb(dsqP$eBMWBlAXX3e?Epp z`AoTW0qsFcRS(HI_1o1+=~>3OA(Vfn-_o;k={aCtxV2v1u7TyN&wopQ{}AofPRlv{ znGOkl_TXbfPZZc~`>8LhhhAPqD0si@!ERTwx8JGbuf7Lxj4KlRP9*@XkJa3X7NGw| zsK-`yj{KjMEgsn8y*I9>r+#+ntp0k*sP=#YQ~nX?x$o*}SY9=PY%wzDEsK zDzg21bFV>#jk=9{q&&Mb1;>~RtXXZs{Z}|mAG~uueEb1%H36MbbfG8g&I}!hsE^(F zm!H(|Yx>r=9yQ|s_#DRbtwF5viG008c($q04|W1AM}P$XEUHv>vJ36H0US`}{O9W> zE)Mv*+H(GT6ldx_UPJ|ov+S(Gq`Y2mGbAgBE;XL^VZ0wg5aMA>F z(m(#Ve?Ny#{m635j(wi@eqYaR`xgw>V3$QJaiy|Xe={qEJG|(YyuJk4&M0rv*8~sm zjRAJ0zr%;OvYnb;JN zp^4&8e=%P^5n%n~`Lqx(8THKgbUHw<0RCSem43FSU5-$%i|oha(`(-Iqf?lFIW`R* zm+qUKha*#nO?X`D-wV4XH#xJYkK*}>`|=r4Ur|)=Os`+v;O9OVX@!z^>_=27Ni`fF zx0N?{^e)za@Fc)~$6xO|4CeYj-|Y{3+uDrv)BWM~>kps8(f!o(SlPYw;&f}Er`|8R z0s8j(|2-f1U$L+DGY!E9057r2Z(w`u*p>XAepmxne)Wvj-h;QhJqc9O>ZXmCrn}`+ zt+@q{L}|8LK3x;Z(!RKSx+XSC>*Dh1s)ppVU1Z1QRln=&jYhK0r_O50+XC=|Y3!Fi zHt4#7`u(Pca|z~L#a)rg{lYt2Dz~@gI(WTI*}T6@3G1JvK2(*TEv?Jfo5t$w%Z<&O zd=Vga7QN#TGu87oy;L&dWSw(W)WWw?S&KL7ysN?%zSZ|bsXDV#06aj$zuf-$#r~zD zno1>GKi`{6*NM*!$xEmg?{}SCJm6qij{EiX5ebW{iTUmK*MwzB4madS0T9r&#K7WBeqw0S(avoep-Ia!#C8$HFN`^sO zPxWo$U2t`U=P#ZKiJlDq*Z>Jz);vl={Va@eoFikjF}Q3FFzfA zf=;`u539HU!7YIIX|;p@g(2S1aMHjwM*7)R86N^DW=kEvrggJ-L`PY88 z;IuPu{P?^~!Z<#@RdG{4_ddVfRzYAZw`d^KwxRPFIB6~u4e*Y0%SLD&?|fgFuW$OD zzrEdhnepZu|OJ z3#fhy26Lc4@vZ&{M_up}NPeuEyRy%r+1by7);$Lal>QW;AFk=R^Zdy^s1min zM(C_kz6;Y(eg-D~+sirZrw#UOY4Q_vPgFoxiqJFY+kH*%(5ce-WXpq*);{*^0iNnK z`@y2V;xZq7L{<&G-aP*Tq|8wPw#FgY7p2E9{#k8Q!{q;7ZHX-#x^nvIKI_{{WjuBj ze4dxIfB%5hyAGT+Hczhw)GP1f;Mcid?&3P#S5OwXIuSqfjkkwl<;Y))RfO=YSV^|G z1uHrRMG1hU$3QICf)$UylL2ofz#E5FA4mIthNr5Izlo|_j`7#nx}7=SL)iV?|5&;N z_^xb)Hc;{zl|3u>6pfcf_HoMG6X{I&8*EgxKtsqTfE@4D@%U>rjFS4 zAAqJ3`hOUls`!IToKI}ipWQzDH9rnjPcY52$yZ!f* z-FJG|$tPRt_q$CsX#0MjR^RmoLXIE2zhKefaZ_0pfRZpkNb!D&i1nQ=l$*vM>_O%F zvFgABvaid^2l738!*o8XMeh6j#~*(^9(UCIX{ldtLBHFh{_)2h#_F5)XZOiZsRhQS z_|yy*`u08D2LKBmg&55T#9L|#s?wEL)W2vgxL4f0)b28Gi3ci#9;gXAT1~m290DEg z^x?&ukJ?%2Gqln#S1S5VZASU^ED3jTldG8dzwvP`Wq zE*t*k+-_~0bek1jZ}Py4NWa?Wl+umN*9QQ~#H&-0+ltOGo!hvK{l|eUL%I1|KRs4g z+3tq)@?ABdZir}?R9gFA0kS_a>8Q3 zuivTn{LwX-9rSa1J69fqkUZ7fKFpzeH?G(6uOFQ2-4f>$^U5bD3F!sQD$?j*6{rGM z$loir3s2uKlYCO-gRu6zOAjL3XVBNo?mNKWl==+z+ak|Fe_+**hJ^NY4C)h`iyi9O zV7~g~OmIqUSEe@C{X*@zvMj9w1@tRG2n~L3=O0<%&mf;anqZyRMVh%bSlzLRiUI&r&Xe8AcDDEVS17rsB6 zLG?A0FEH8~_ANYH48`B#bAQhbl)eQ){m@(!dHD&R(S5m*CX(M^#_zv=O#1pV1Y7d~ zTtwi414D)3*#C|Z9IK5i?^|dqldquab58(feo4dfVC@U>3O@(`z5aRbm3KCHxf^{?@^FHw4Y7@9$>hAOZucz86>fWg#Z43VcugTnStN!9O{ z%k}Kwk)oc2w!J~v%Kvsv2^3j*Z9%6zGV@w97d#!|Ybz1BC46A|mPx}0VZqDu#Q-J= z;D4jSZE3yM9%l8X#8y;sUe!BI%pixML2~Y7HWX!vKN`d;GCDJklh%5m4Fj#MMC~<6 zlKEJeG<PQn6kA|| z5JxR81Eb~+K>FC1XA#GZ8PJ|AABPQ2o~*#P9d>K7>?F%tBNGf7-`E*4n@v<|ylfkS zfFF3=TJ*g}c-m|hy@N_D)vmYOa9I)TR-I{&A9AS6vIQ7zVcZ@|u8S&7d(arg2{Rgo zG$C%;l#baBdhGhkOhG6UiOm+Ils4w164DotQzzsYKIBt$FK-!l94_3ieCO!C8R1a=gV^!vR0mWqoRLjjY(t8{!%- zL^Se*F2ncwM_y3J{E>5~%Za4>T-*1z?t1OIi`{b3kj=KtgHl~V?E3t8EN`;$aONIn zVKkH5nk+eT({yFZ!w;P-YB7Moj&6SJoj=CpYg$P+hWzC`(xl8_}v<#8U4#`kRrfwpvhU+8K@?-88AH02` z?F%t$1o)Cg4pyN~+}VN?rpuOv$?kGY@sqYUn75ear02Slpkgg6><){K=(Q!Gd+bg3 ztqkkN;TSR1<#H__JlvD}f--M~?6iO28Na2phDUYc&j!aXvs1av?hv)7lUCa8U^{9e zBb#KuO0WqZt~YF;uR7V0Kka6K0mMgnu?g&{NQug(gQy<6O?tt+%bEJLF+=2VmPGrB z7i?Rj8AhqA?N03Snm*EJDG`R63iwY`2MF=fZ7-iK?XYzk(^4x@dJ{X-F&%L@&;k=$K&q6S3dxElNENdjs4)&GOM~ zwPvLT6H_dyt9Chd=HtlZ?EA0^PBYm;m`thWfj`x@o=Tkjn zbQ>TLZ)bSGxGKdTurOE%mb7Z1BYs5&v*vb6>SixGtcJ=o#$%t}>-5YBjkIMk%`8Ib zWe`(f5>o?%c5K@q1H?Nt`zSs`=Oi7Wnk2T}PEr&bK1~KE&t(r&?O>b=tIs+HtF^_2 zIpkDY^S1NOqOqKeGpoghO|7$@EtPdA=qyHqO@kmihN-W+?s5lMb$@C{LnewQQ)9R5 z=}TrRrh@}Z4o-T1h({ZIcft<%sUPeR+rX*ZNeN!J+d#bE`$X2!x=A+Hqiv9-@geiH zkech-Qqv+U!SpoHu`M2FX-1plh}n)d7##=cDkvE7kS04~Z?KmZdv_aOUk` z=~+R_&a(ocr}=8w%mQMFPBBSbIxBIXSaT0YOlEv+i_v_P()uYnWeQ2Qn_VO76V~!{ z5EVjH)~ToTd!X4s8yOg81#QBn%!YFE<*Ykt^!xqDMEX%;98yxw?Qzdiw8O$~(^x*Y zcFf2qG9n~sG#h4A#DtC+umu(zclLZbJYfSxRuO(oSuIqc5N*)Oomiq26+`$Hvk2s4 zbKR%fi`cS@l-9_7Zh6eXM4D^r7$5_raVki1-M8l&IvBD7dF(s=DLc%AEz%~jAu6NI z4NAr+rV4>8%=lF?>bkQIKQHVIrYzH=QX?XL0U0uF3UKo_Uf8-cD)LD?I_Oc~lao=j;-<1U8g-|II_CC!ULSNFd1@W! zBOwR`$?OKQkB*0FMt?G1jW~9cP zw(0}MsqT$XYlk6z45egeZ8btiPs^Y;TERH6`H(S>r(>F_L+X?VD4MnsdD2+*h-kU$ zYe&qQkMw5T38`d#0NeJY*Er1Dy~b+J?+Z4Q_e5_;YEwE-HOkJM7~9z!Ja#pPKZboi zRogLLq?(Y;+m4-^ID%VK+yxYh;7e!U3C0Q1UhaCaH#ORnsX0wIB&GGX)3EYmjI7A+ z1l#L*E1OT1RodOrwgH46$`B)czeV(gxN8gvYmbRmbDoY!yt!Ezeaad3h8g2BE3np% zP^Is)E8Xdy5{yys$wpJgGi0k0Oxm~7xwJq!%$V^~CRdgiGh7&R=0u`Xrkkg!#%bCR zpBviBNxKN6kP1zA_gT=`g3N`EkBo(s9tvf`p_n8WG=Ve03?GvdMH^4n&1Fnu=IC%h z5Huol>xd19F0QRtr%uBk7Go*c(2m(9QPUQuv2KM2CLXmU?9e2nxoP!@NZ92)eH^9J zU7i}tZAMSo0>La}PX;kNZYGXM6`0cAQj>f*JI({0UiPOO!a1HAM{B#nn~u*=WJff@ zc*RhJG9rmkF%X1qNmCEoEKnbCqFl^J3#Hevl-`j*W>byv7P~!5F9>pPjY1ZUl2YQcS;lJiaf%%qD4x#k(Ui1uXGj~U({7>*r=0?R=R3_) zk}<@>446H^PML$#Y>BCAZAEhFXbPSqcC?vBcL!Q{=P;YY zZn{C)7Dug5XlHQhTM69Hxl7EOOo7a5`(WQD3nIsf6beLtceDZfxEXj7_i%SOiok}E zxAM&vZI8j@h;Mhtt@g|w#tAuVo?5sgFlfi&7CGngt;TNZvW-JFwkOdvJ$0d&F&=I= zY->7a=F|14hw*lj^zB(=9_`lT=(x!Ytsx3CY%yH9(YBoi?%wybDMF{_2;s~%CZ5)Q zCtXWIvLqS;g%Qkbg-$oQHH#e#)yCs_UrthIZ!&8dWrE>IWN-x4$~`ZKakw-GTQ>NY zW%DJ%f+d6JV-Dk!xOYq+^HaVLA6Zq;OdBe2X8r8_UKrbLX`D z$%X~XbF*u;!6pt3gn_1lZtvS`!W+=Dm~z^<2XM)$Dkr#DQy6a+6I`{|1rqhZ?wRLM zn(MbiKJyw(zZ*<8eTUuvZocbd?qp#=guBWDY%E*SBAj${&NQ?!EqX^v_BvzC!W)U& z%@^x~3S_&3gKO?|CUfut62~VhYi%d1Z6`jZI30~gf#`df)gDi@9zIVOG!n;T*RYm5 zFuE8m}`^n^=TJ+IY^OxuZwiM6KY( z6vUI80+!9CgE(#EtNw81;WE!b?Cu3r-B>+oMjM@j;UF@S_jn9WBbQUcz#gd@7Eh?9 zwO$cUo5;y-t9eYSd|q}&`=!Rhd|hJNYB^XOI&RT}Fe-@j2pA&PgX$MS<~Lr0&ZgbO z&~iW2_IairZR0dvhGP{L;JA&~LfEJ`r*kZ0I@?o$_K(yo&s8wh!37O&Uv{(iF-Wwsw7~LA;$_UqhNMS=QZ;43jJa;Tw zi4BoYi5z^toVKhbuZmvS%=Wk*qe9}Q6AxAmMrF{Iy3%2-U=fxVG6zUOa20OcvCtvU z1T?2sGovvX=m=Vq!IaX%PTi)!v*SURZ0e)gX>RnlLIYGg66b~h(5Ne$RcpLnB1-p2 zv6E5XmTEfg3OJi9Kz?UB$N@9g83XusiUI}>>Xt#>yqj2qmLTv=tAV75W_r7%pto?M z*6>X70DRDzMO*;}hih|)>?V%n(~Hy2M-H>9pgd9b{R4|weP%PF7F8mrD*LWjjyKeW zsIIe669=EinqzyLq`48gYNHyOQET0bnN>_JBeNb)fk(#sHb7)XEz+ZhSBT_fiINI$ z**p%TB%L{OMKnABE9*GuazEhvUF%INwDexoMlZq5K>iu4S~F}j)jATSYFa6=&LA*2raSU%aa_zXWov*XdF^RjiZgj4|6ophJdedeZRAao5;dRJze&3Zp~RYC;)u4R@s&X^OoPyvfOTol#noU zJeoU75N{L}jDOc^wFQ7bCuwOdSu9%1I0Z#=q$_Mz^H8cLuFzUzYvI5e9WMtm?p`(U z5-k<{B>1;w)+Aq42=_Qtc=jxVd8fEsjq7L6ps7(uWXp;lo?E9z)(RRjBy^cCr1?PO zqy^x1y^V4%H|V$9W6n{FY8}-@vO7EfWE>a#7mnqrgwEN&q*I;MK_(}?A*7Sb~;d9*M9 z69Ign%k{0b<_6{j>k!B=J$4aeSP+)hRTiUef7caAvT)3H!*2w%VYG+q&3bQgOSt+1 zKH6+esc_AAxq%249Kneep}264od_;(ax^#)#I(oevxV2tI};ZSr|W{wY(~;)+z}?+ za?gp!$)H10M5G|YK1ihgb#zO&GRX z0*~p7;Y9AaeJUGsXk*s*u@f&#s;cB6M9#9)-w-I+{c9ek&Q&p@QWVHxun%D13$bf1 zR~n~G+U+a7Z;FMLqA9l97qq-xwh+o2RtN@NTW@=YgIgP1?HmYy)pwcGq$C7@R!$g$ zZBQq`1#D#R29n=RF$q zcTTS~b=Ar@q&}52i&30nImRa$*At8o@J-qp>5BvFfTdMEIU-Mhe?@aEg-t&ZNqd}6 zDU6a49BD<0nN9L-w_%+S1w(6kSjdZ%4H}-B^`~$FwmWM;)Y4i5Yb>`UT!n7}!76iy zTw7>Nlrx=9X03`}-13g|^Jnww`g}W=?w_x`!ZleSpG*LK3l^*Oa?OjIF-tSc-fTln z7KpkPI|_Z=c9B$K7sNRB<@u~?kL3cm3(AP2w)P zM*>5knuZx$OJjjki$=OaS8+!h09sX*reG^kR6L4GuUff~6bX9mfSWArKYCdqcY8tcX@-kc^=sZ47Jn_dc`K#|xTa zv}QCpE;^PM6l%ADDwEBgHjs$x%@lgE^mM<0t9h~Z>{ObwDZ81K{KW$c?naj7QDdZd zs4uT~llJDc?l(^OrfXoaJ>!qvHWsSMaE;k>o|;c0IT`oO5f=3lYnZBrq$C=th6HuvNHedS?KV1=Z)7sa z?Od^v2}k;#Dmc!R^sT9BguNEqVx@p$k90o9c|_tAt(ETvq&$ujo7HuX1v^74O%pfs z116!@p%mMQGtQ5B;xiHz?S>PpbJ!homLL&l)z;>s*%~i8iN%1;j})NMj3FBZBw>ag zk*AF!6NmvXI~`jX+F`)nGats{o=N$`yl8LLY>1;Xe}$29RwOo+cUs2SR7^XTx>l^% zC)v{4fSmnsl?-LHNhFv$K8(U8K00jFiNi2-bCoY0qG2_O*2vIF!zLZG032B?Faz}( zWVq-syeDlZn`PUa8XE&!=u9v7)8($~Orz$U88Ew(yqY^h(%;zl6dg1s>Ksh+Y1cHy zJEn|~hkd`+WtKJPb2!fDman?|{2pv}&do@c>{iR&6cx8jGpG!V$@LdW5b@z7pH{pbfDib}_ReYdWM&9sAO}F(V2J8<1-|ahc^X%QS4>9yWMp zVzsT)d>5d@XtiSSz0qIo*Pu zXrn736rWRAXF1qlQH*5CVc6X*hjKsTnH75)B^JJ#cqc8}^;c4#pG5oC_^=U+DUgYV zhoPS>W|NMG;XyoTh9~DlTd6+l5X9!lBVwo3Y!4TWQ)kJL>;T_4Lu|8I5Y09*rfHE~ z%^GYZ5<@&tr6bi_G`nOH)2`oH;@d-j&Zc?TQY^5YF&Im+mJ0_^@Fdn4Z&pao2;~k% zQSw@JJVPQ^K~6?LiP!2(kx5P-4g(6z^|(ohPP5IX2}vIP%mlmWWw7p8+Q~a*CZH{m zo;T+!1dM>Y(uTy?n$ufje(JYPQHsYsd#y;0u;swg3HBLI40ftZb3P`g)P6>$CnfCS zh1tZ}X|&a(JntmgfNI&TVP}O#CllLah}@gBVm|Ze1-^)TO}!u35-P?cr@z`Fh7q?M zkvt7TE}4S`VOU`1LA6_JiQ#!|J541oJaH=8>pBB+dzd6PKA~NNC1f=1XB1APthX8l zVsD?~Csk;(i*?>#C<0g$+Ag8tA-lFmk-*Z3*dX|$BuSi_?}8@3T9YRnYXxrHZCj1L zwC@d8Cv|Py;Ohw)PgOqvFQF zlG$O44}H-}qt@h*h^K8QvRYv;^N;8tCyjoL94HZOlG$+THIE^oj|)1=XliXzqs~EW z4+9=&0kHV}K!zAv;#3WW8Fn+4*{fFO$x38jV+AMGPb^=~-Sc->90> zSp>tho!Hi(y~ijl#&djPELIH(UE6fim@V@$+4WcKki(oo5zxY>)v=RCn75?qdbg1Y zu3%4oz6_NvJz`L$Z`gqqrv@buB)#kb!3qu2;mP#2W>Dyg-8}lMR#ycgemE=ge6$yr z?U+IMmc2@r4%4Cg_B^Iof^HV$Y>&-mIggPVpOWp4+B>9Jfn>;3&YO$wT8dh2Jvtdu zZ{v8RFD?d7eu&w_Vae>KO9aZH9HUX=X*_8f^IprFL@g!uyKJ*XHg+7PE@)+m83{A$ zreIY?_PNn&pT>KlsgGwPWH6`ty#hJe#0cR>)OeiaGGkyI%`~)vV5oFq%R}r)>ox_J zeM?;FLv(ahjss-690fEj_rgK84@|)j8PQtJrerX0_>QdRZ9-&Bq2B-$zSpn;ZD;J7 z!&k0t5R^E~lLd`7fuPDGeI5vj+Fmwg%Q1IHb`>h&yk$h))@s$x2xf*bp(JD~H;p!# z9y);?4O+@ZP1gBn?(~kaZY=gTBKCPi*(*(KJ39$`vp*4(Y%aH4;uQO{2@nVoj9Q{Q zIzDzyFQmy86S?Vp+dz72uot7r*w+GQ54Q-)P(a#C#sPm!b7!)8xp!nmBLp?@%L(JJ zob4nvT8on%Wk+`+s-Znx&x6%T*N+k4*}JVVNxX!dZI?h+Efjk%uTLFnLE3Ui_H&T{ z8?0j5-%#N=+nT#=-(9F9brE}OOJtqtjLSOf1~HP?^PZWrV~&r+?s28=x`&M1utsMd z+MT35+uO|s*Ge}0CKtyV(iW37GQ}HYPDQ?W432%AB(hUtDW^e@kv^X#Z7*b}v9UY& zopel#3k6@cBytYK$8BdOPL|$59+GP83_SJ}cejY{3Ikuhj}gtL#s_J%$4rVGBeVL+ib3O z{8Pk@a&ES;bJ-tT16w3q#5Hy)j`dhRR%okXhem--$!H|7CWeZgqq1%sXYObN#J}84 zoJ~#w*|k9|2g!WBq_ByYwu!?IpY0;#U`jhZRHuzi>oif&6Tj%p71xuBIkoeZMnCK< z`Z%&$E~dnx-)pemVxCMFMN^_xjtwQoJ>@%jN3ozQ!f3{U2E(J%@`%CFZI32`M5ycV zuxT77g1M_&2Z*~uum<%+v!K{ zQBijG=&%@w2NtX{MS}`-zs)u~WaHRgXIh8Bm&0umMIs^(rX6obh+&gTmQ#Zik8YIn zJ0FXCC=w5nIH0kRRrj5a$FFj-n;3gq-v*}I7mNcQkUME`inoZ+-@1o}n|3;IKd%pX z0%iK%xRLBIVm&eo5yg(&i9IkC+nvZ!*S2C}KFGBI zkEUB?F?5|diBQ_M&9Mj(uF|z;&a(EPYh(RRSGVSwH$3(yO)?mVlY?;Ng48ewQX(7K z%p`|n~Jtl86XZgCbx08 z!vG;$`f9!CDV;*Jw5<{EjsiX3;Zv}WM;(7TW&6oM&xECBV+lDOOrZc`o&teC9#St> z9d6XkR3MVirc~P8qsmD^D8pyLJmCFRFvjM+(HgAIvu1h>qA1k{gTAE7b4BK)O%#Nr zkN0+Cs>!IRE*`0@8zzmGZWlA2@K2|iPa6tglWNE6u^Ous^VV^S+tf5|teF#~os9IP z<@+Ms6x_xgOlLyDFUb*enf)wAsZD1U6wPU(s28*)keFBDK3q zp5ukd$n*|Fj66{(Ivx*O+x<|dThiW*G$74-hvj-b7fvB%>wY>&iA|@uoHXVmw{R`J zN5@Ts)Mssr9HMALT`B=%kDKhAnP-|aYKa99Lzk1*Xt6v*C(BBEl$02(eH2@6zRpGm zmRS;#gbp?h(jM(R*IWfBsd&c446&F8NJMhf*{C>x@1GLqu@uEGE^IMY408jzvn-iQSy8O=jOuJd@YA^L;Tqw3pLjv+%dV z5M@@bg=W}v?D0z>M=%%THNcc8QZ*JCFDd>s2|28_QL_o}#MEXKX^U7}=LX{?g@EgT zj%XV*jgEj?9-1^Xa^>kt`#>e>E=ic)k=<+iEj!(eWNH+wkI|BK=!9^)Qq$PAhX`{z zh2z{tlF>R@Z%&edsleEFn59hNrr~GS$gz<9 zPLDul~HHqly!m#^+7>D>_FHCu4;VyDDJ4{@_WWqFJ zVdomN;lxN5PRd7Zu8Xi8N{!`0Wx7L#W168Zt&vz1*(Mbb@%&^@UBxvR1kH7FSU^UZ zaf8j^s6_JIX0Yvc#$e3QMGVR#Nk1Y+CV%J~%}&lGv2b2<$#W?K&9yb zYsAHnTmt!DD2-^8iknl^OCE6ihKSm>@e_b}4YW>%j0YkM;! zz}`!xcX%h>pkiaL%7!BbeVnD`0gK3~&*)5UhaM)L7<)8vH^|mlWAjZROv?7QhZOH& z$&MvQHfbmDe9E_vy|LrUlqsxeRKYiW$sA3XhMHz3<)lilSuhrA#hFGB&X713F)sF- zVmIB6dW0i$=3*=sbGWXGPSnZu>E!utq-!SDm}buZp#Rpkqw9Wu$UKeu19O{FaxVDW@$;oEV%JG3u#3p6hV|2W;@1;6D4!3EmKX3__oG-TiR!nq3A-VmD^oAVNf94cgD9OpntS*+NyvUuH1>Usrj7j^* z$W?eVUo31?WC+IS>yfslnpyH0#_~kn72>439k#s=qvsoXOcBc13I_>5 zdX|fpN%UC3?oXMR2OISrU}fzw%3@uxqEWM$9d8EsPO@ez@z4uYJJ9s)BBqh7wMN#X zac|1><>_W6Sz1JJtA3`_IZvZPF6uPW1M;*m1Y}Z3t>t>}P2F_0lXEidU^`;Z^{M)UQ6L70r*+l~`PZJ`HvJsL+5)tv1$RhHP6 zwpujjwq`WVxgtctym^}Q<4sO*&Gr^|BK;6{IC8@rdYala$0xqA8dIBKs4o_CT6V_F z!NL)r^haIZr@27fo)o3+tb%o8FZNb!lMc*~%*1(Dm<(Eunu47VF&Hbs!75zWDXjIV z7mX(lRd@-5QH_32u$^%B$Sj*oY+f@lC<5`Xv3`n_>EQ}7K^|{ktv1v=;2dULw z_FQdg;H|7l^#t<7^)b~J_oJDJr<)>b^oZEWBY~3}4Sj^{DB0dQ=xG&`!BoRpykiDE zsb@3Icz9x_2f65MP9%w8Mvlylb~a=pK2(9A&}^tlOf-R{sH(XuFIHm5S~Fm6857xZ zXr3HF%JlwLM@&XhI3~$}oH56fF~1cC*~(4#V|Ue@o7|8Et6BRPu>^fI2C?5I*r>y5 zq!#F*lAS^z3OTVkYxFg5oeb8_a7r4>jN43m!=^q%kX|Fo0UZxI`Cethen2L8(O-4A z(Kdj*#d0LycAAZiln>GUYAlR`&W;zsK2_}rYdsw7n#7{FlefogJ)~@Obkbtm;8LDA zEs2dx+$48J zI^A%atqHc;E>%#onP4f%VdqM7z>x>jc22Erf%X~mh@#B0JDM-X{5&bvGLVT_)5%FI z^hh+AsD9yXv{J#$pjFH@CbK54uty=)(+YEH@?Fe5udhe zHt$ao_qyl`#C@*JsSJ1&O*P_vd!kQ|g>6jDw!93zg=_b84+Ib3Tt6>Os@|`)JUyU} z#CD7uK~Ncrs~vhe3-kK0&2;O_wyGi$ycFt{k6&AREqRYI!WjLr>elDAay*vhw8YRNmIJBRzsh<#Y$mI6qkR+l&Q_UEXQA`0@ zmAPT5s3d4-)gA|SyY&FP(Dy{srwwhDwnek|jgle0 zzR<+J#PKi%9lbFF*0e-AN^j+Q4l(8=s#Q1QWNRl42rm_SX&hau*DL67Gt*^Ko4SKq zS|+(jNEn!lG382AP<&F1u)JM@WXOW0zdoM#+c?C>^YjcN-)2NTfcKzjjgD2iltp~p zT(zOeNdcg;)L!tzeR^+U*78;5#O^w;pPv^ld!VI;^2@NG@&yzw+>JKoprJK37e z{=l*q^)@09QR)sfL*wKb7iD63!z2fvF5_p)&>h%Xjk5 z=(}^DeCY*jMde4BTs)s|D5Dmdbu+xa?(mDEK%liO3rbrUTW+h8TDHAKtmzHvt6aRX zx2|~JBTIx$DgvdvPFeS?Q0``-5_AtmMnjc4fX6X=MiqVsP)n@EVJT)$s-(+J>dx6k z%OCZM~BO>gzMXuc+&i27NGXxGn-(tQ7mJ83Kg!Z%{#JfVu;2V zLPmt*PA4PFlhbV?mnFld7byrf%(^ga!Pzok9f~G$iucPY(?H~q8WgMD3@opns#Ez3 z@2hgKK~v-eY=~Nhvx=e=t}3_0Zz6c`@oy5x_2C{aW3)AUM}-oPf?1I zR`1JTMPykmbgY=KF7luR;jC-j$R;OYar=p4=PdwI=~M_`==BCwz4qvE*^9DUgKDq& zP3^$GcR2B0hw5rjN5DBQWLz?r@i&f^zHeIg8@wUBodguzu+Ms<|U#RU4+fi6T-*!#7tpB_Rc-7+r*2; zEm`FF?zt*^D@K?7xRchEavK|cDqCHdq%pzpRVaOrpsKHnb1sJUm z(8Z+i#~MSi#sa^u)&VkHvX;i5*5js#OM#W~?7X`vTbe?^@XePNZFac5e4N9}cqPcX zmoRLTs=){;!;74ZCWn!OsIw#`v5~CgorEGJyZfUQyU;RgEZZ@v=`P$7`#j6CYilgi z(m5rD_mA;ZDFVNWXWweV=G?k`#L%&<^_^>VG&D;97vbmtvwoMTB~6Hnr-Y^f(<{C^ zSTgN&V$k|I!RVOs0UGT_t)9o4=8~0_Y!&$fueZ;(#|TN6^nNY_DSGT`XisPJE+g?i z$Vl{PT#w+G^U@ejuzGJO@NaoEq>MM)6knf#O+;+rkXqT&%(%2mG z&HP=w-#iPnZ3i{D^Yw#0nhdb15xm;O)a$j{O-_=4) zFSgo9%$zkaZbiTp72$B>&SpdqTB1oVL{9gcRZs)kY{#RYb`QFy#i(cIZvfZ@{GE1& z$E3S>d7A+6Ag>MXBD%wwF|sDssZU~U)XXeh)x@7~(e;*oPmu?d_6PtnHh*eTp0+>vTT5x?Akvu zExgw+94MXTPTF8Hgmr^(2?=Vk;$HeF@Bz<9cx;ZLN=4atf`>4{jh2}LiX3xh zF06tj$k5^?EnH0ZD$psl-K#ys(FIwqObdl$VHt94fApz3>ILxSgGtK8Ci>b&*z_vQ zQ{=b17a^BwpthHFzYU(U7WpfFi!W!bRh;dy#jEiX!jJD`|JlpXRi`aUh8}jUpm`8! z0SD>r2$O|)hIbijMEgdj*zxAuzHQ}gR)y+$zq~ZJW}}p%WRZlhX7YxJyQ(OuUL0b% zai?>6R!x#KEX~9)QhoKnIG&1}=egz;8lhiFZNNZ@LoZ9I1uX3wtqLRixfxtmf=0ct z>L5kxn`sh#=dg?YLLQNacGTcZjZHei!)XwRz9`iba)yOs7%AoQg(0vu^=#l^ZAp6! zgtd4dCzh`nbWKL$vlHN@lrsWG-?AA=>*z+_#vnHac4-Tp5(BXpu$=k6eBIvsi-W}{ zW=b#3nAI1D2nD~0_6wla)p;4&13wS`IvFzDXRS9O`^vLIRdTdj3qTVn>`3IEBCp(I zBpE`4O>oxLIwLC&@;tjrbgnsS^r;W%kRW zzKmO*v@`+qz)<_vyrqFAHy@|w;_H1k5TNZkD^)#{$HYONaG;5@x2w>W67r46j1DUC> z-OY49JAMb(JQ1Ohi+3i^=ITOCGQ0aHO&nr&fZwdv$P*-3wmpCm)9d?fLbzsA!`RU~H38N#?s3o&OpAJFfM0_5Gez4JgWN~gVU z&g(57_ZH4*n3S;-U7V2$6~<3%o--t=#G13N7tDL*Hf*y_wQhF?U0`heHsqbE+5AW{ zG21StD2sIJ-I=M^HErqK;ni!$lXN8QB#w*727^d2gS&MBK=nXEHx?54x#-;`w){5~ zHDwEnhe#>KvjmgzU3*zQRNS#}j2UTT1Nd6R$A?+rKHI=8bJknzWoRC5%%}8X z*0@I_P+yGiac<`_Q&)JIr<4Ovroci@gJJ=_>9pvJyY9p;UjXP+jB6 z{cA2t#O<^vS@|6qyjFtoE-`kDAqRsv(WghEQQPhGelt~hMKEtHUmBfL+pO2`^CyRn zlPVNaFzULwRdBNPZVnldKrsraR3)WQ2yi;@ow)3C@~M&ups)Ic2*uqUsRmzwg33a- z#iJ3mg}q+Jydh^e6A5HlYyCn#Z1id1wxw2wfn-ml#AjW2qFK9>QDslD`orQfotWIot3UFvHm! z2KZjlDGXpU-odD!aMD!*C@EQCn0O+F#^+ySm*7p@N2pQT`^KKuqHbB7rF@9V3f`Z| zF(m{SkH<8!fP+%OV`W2gC6sDnJ$-2O4 zeD7r%mNh6bo*{>SL3M(^?IzM)q^IIOzLKG2v&$sAl5jAVS>o}lgfW@5qAi=ckxPZ= zA)KuQ9~gw0{Y48iA9sjpv$^8Fo}I4=IthiyGo1=N+H5cB12+alU)}O}@B4fR%Y^d} z1NfLUiyucW-!Z2^Q{ssyEBKV2Nr3s>#|3IhyVwTxw&tvmVDD)Nu!V!Kk$T8nWNEjw z7KFEW68Vg`3{wMkvAOQxc(Eg!a7SOgVHD@xx7*Vn*i>MxQb(;%LZJ9chz8=it7E3w zU{J6pLCktWu0(aYM|932@2|N9c4vQAt}O5!>h~1zu1svO@=o_z(%or)mB;CsDIqMe zk#v8#q4=3sRe3_EvU`}CKEX*AwlGV;FdaeU<5W-OlDuB22)$+NlMGU*dR69U6}^Z% z$xgJn3UjWa^Scf>aDv^M#zit z2WwGoal=+&CwIxwCqtBuM;QY)!Xk&C6@RZ(4c%oDEa1?WJ5Ifqm)5f|zclol})m4#CNphv&g__Zf^jQbmJln`$j(;pW z0ZjbETz%1m9?PYh0@zlVT0fPR9{q*}>$pRRKeVFxE=x$Nzyyf39-& znrnK`dOp^&B`UI2w6rj8Mq1 zIa?MRLnO1m!{o*iA2Czd)m2p7B^0}fHzo<>^lOrl`to*W45F<##Wwwxs&RUy9?fG_3 z;;Fw)bXjb`j*?z?u0-a><;lm7Xiq-S9;Yg>X&A%}LWWSJJPR7=&uFb(xqzX6vc$QY z$%!kkN=PTTs-C5!f}}dN?57C1smdLIactT{7Kd4Fvu8H;dhYd=;mxfN&N!VazgAJ^ zc2N?)zrZ*$&}vFIEB!;hp9unHEHHI4b{q<&>s#P&I;>tQW(uF%n-?q>!?59Owu*N@ ze3l2-;1?_i7HTX>XZTM~PyEJ>MRGyvk(u*opwy zMqy4o*3zd7mCkYToL-zFAa*UH;j{#pmWm}!3T`xPF|s%bl~<2_atRzJk~V$bW`;KX4{&|G|v|h>$(?nD5olotAbRN0iPq;W}$vM z6D3)-3B^nfWB$?YJU2>lg+K41w#~aoEoxA}w8A0|3KTp8!2)Hb&*z&}x90145a}a*1|=8x zA5~I-*vg0Wm z?UJ~Wb`N_kz*cN`rf2478;ugdgRu|^&C(jF3^MErg~T*N=rmUvuG4)NAM)+XIhp6v z6pmTd3^uJiRzlk)#^CRPeTB&u>64?+_B=N5MAl~~qH*c|PLJno{87M0nX~?WfJS(U zZQsQ{`*FUW%aQ0Dw^x$66XIbr1^zCMm=Kr&jFb1?-H*35yEqiExmLj$$5)#zNpzYd zWC6gFr?s3jMN@{?WaOw>H=a#5_u*&14_cVvd zc&50DOP5VpYJC#G?if%$vIl!JMyw0*kz*R;E#5%z!eWU z97*`Z%GUGJxyg~{f3&^7&sA8TYK^c*I>P(Vde%7?>`sq6!RpJMEPL}@eD(W9zlBW^jUCnK^g_Cq zlAbr^JViP@JfDc>8#EPr?R&qi@yGWX`8)5X6HEd}g~|CnHH*$QB4oE?IPI9;w$Q$v z75-~H8`to>RbB1TsL3R;l&cc>mv*KzA9i#@j;r0}K3LK;nBd6uPe7}$P{OmeZHs|& zYk9yudT!}`6lo-CA}$nwFYlYy;= zjrGuu9^MZFO$Ti_*#xKEO!rt}d|`1Z7~*oV2YAlp^+gYGmKY%j;JaHSWsB>v)HV%w zbUHBKgEESRY4U#CI{_nz&(s~$5}TP>UaV;Ba4o!RWi#ONxz6Vr`SMj@(d`dau_x8F zlH0N8`^#NO6~~y?z2>TCOI4U7;`Tno}`A=VU-SNMSF!L?^$wKva#5X?*um2+- z&WEnRaG349$?O-VWeVm3@mHsH4|9%z+cf<61 zU9{;JT^#oFoDbOmxEx%GAzu~5whXU{||H$M`8Da3GgS~`>*#eexZS%J~vB~Z^a)}@YC;~zsEoRzTWtc zrVnNT6hZ#-ODpgn7ytPu831w=BtLp^l(|2cQ-3W(4rFw&Yrf{`Prv-P_y@xJ_IJ?s zt6mO*k#8h|d>Z@|y#MpJqpJE}|1|wB)ZsWDll)a2|9krF?*#pSreC`t`uK z_Sez>ESNw29nbPl_K823aMtf%qy)cj--|!0$xnYh*jE0OuHfG3`gOy9{wMGQ!@q&f z$KjN=A3}97kk@ZNndE;9vnd^ZiwI+ zu$}(6*}r`M{@cIJZIWg{?#aLX`M3Z6I`Dh?ql@1`2mkZ0{})h80|XQR0ssgAT6`l& z7g@(r;Kl#|w5S6BBmf)$V{dMBWo~pYQ)6;zaCCDoWq4y@Y-wV3axE|}H7+qOWG-}b zAfgxmD4-Mo0000000000000000000000000?7jPU+{TeG`ujcS{tsB@oKHh#GSZ&LEUidKc64-?m;pEg3j>S+49W51fB)*$FQ6NPAt~9}jp9fofUd5tuCA`G zu1Av2^0-Q)Wtpt=G)ga{pa0+gCxSnBZ{Ox0qTA8av$J&8)arNr{A7{V(1zbev$%++ zX%w$kd6p(oQ$}&IiKbbzj8{>%jOS@IT{jW+7H37iiPm+RXkce$6}^3XysEM$efLg7 zrKg7lv~RMqFfS$@Y#ybv7$8OsVYQ5lY_-ngCXK52B3fmaXz(3i^ca zX7FISif0Ys4CrsNVy?k9Wr@Hxy5s2SAH%VDog7q12m^;P0gn`DrgSWm@V*M zc(%-%Yz~NMkWSBay-q!&d0eH4`=*3$%8NqN13Ca?^K_XO4Z?r>_K0c5ll1PL26dNz zkeQV^RMYEDv7XK-D;hv9o*@}yn5;aHY67njSgv8D8U-7`UGs|p<6vj^-o=2iI9`o}JwjLzd62-a!#pR2fvm(itphQpyYw`zDiE6Xa$3NsCzrW=3L z&48xF-B02s=B7+BXsbCdg2BY?)_2_pJmOdQ`RMW>D%Q(sT8*QP`B8Us5FM!>_Yb1; zGD{vBSigp6_>k6SjjJHq`>KjJHE?peCv!{eFUXIhDqWW6#K~n2i!dvQWpNQs0+SAs zq^=_k)-Xxk&jlZQ;77%IS~dPrXY`I1uHpeEK;1uThWWc4@=FkJS+ntvxlS8B;y7O| z;;1~Ml`kufKAvaiX~B!HpAyp5U{aL)y&Cz$?Gi#3oiyYnSELvE0bt+gRT!OBy!i@2Dp3FOs^j|!YSnMuveJe!5n zRSc|)yR*;@dID&%@I8E-aPtbpK>`~)J?>=zh3;S;Adm;#Za4!lel-33quRdl2g3n7 zOuLQ8Z$0PFv-zS)i=HW$FLV5`Nb6cnpv>EBM%xytAYUIp@0~H}Z19A^*4`kcc3rdF zj^|8%7NljA)3mur0TEcRJIot{`ttX(T%W|%`yn%zz<1Z2IPU7-^L8Wib{seB3VIA| zlk&E9=W2(^Qtn;^B?;zd)_IESfDCe62s*4F_6R>xx#+MV2%RC0{f`g|?Hi z)R2cfA8@1(AVt7D0&f^9ixid5o5F>m?Tk!8Qa;~G7hvIFmvw$fhveN;WU5ZmZ$Aem#_|he?9QRXmS(Oq0B}0VToKF(fEaDO-aWEJ;u%iINI- z>j1*=H8&kGqyrFD6S00y9E3pNfl%rh%WE`&0oh|^e)SBA%nMf-6q(o3Zu7vX`121p zFf=O{2?+IJSuB~<8(tpk1xLb9q!hfsEG!OkolG;~xc za625QXc!q?KghzV8(4v1%NKx`sTgfV=Bt$NHER5qOe-bqYf(Hc*C3b|*=%8{2dM36 z%WJLHfx@{;b9e!?=I2f~O}UEl^bEGwvMSQ5B`HEfiHq3+6${|4SBTaw<6yHdplmP> z^g>?_>f~4fSKCEZHUzmv8d5k0j88QmAj)2+dSs+`Xf|jI-BET%To~kUfU}(~P@$=9 z%O!9?Rl<+ZqfrzeJOOyHMk+SV174SncZtrLOIA32Eqo2=>I56umnAsV3%WCd{&Bp% zmK)V_Gqj~e9egzcWI>mWi}SdCt#EzJs6Kcyj(ke2L(d&l)WgEkBH@TQtFkFAe>!o= zwbLqFrFm8mGiT=Jv#W(3VyhGU$ksy{%191^^vyU*@pJ=B|CIj4<7tliw;qk9dYhVR|9 zY?^WzYRPYdjV~V~SJu8)oA9g47g^zL5_o?3BEIy0?|+W)-;`CJggObn#GZOuc3);S zs|PR7&W`C^)yo6>zGFp_PS^7%Ti5E<`518HGoLWf0DhinR->)NaNfg@y%a5p@Hk$9 z4w2HnmR3NRvuxgXMwRa)X@JW)O3!K7qh-9o^I>|qN{bq{`Tq!QF*62&jh|B6_7wiw z6@;%~b1CO^u2^y3s$bb^h-NL(Cu`gp<8LQ!LAJ&O6VMriUYI{M%bKuCj(Tqy22x*OncOZ58<2uf> zX5*V5Zf{MGX0RFe6P_UgTaT!LVWzFS=^+X_VFDxR+V*P}bv*GPI2+KPZcy?aMx%S< z=-z(65WypCHjDn5R^<>WLKcx)uLhj-bpe}a4!dKsP$t-RUbQJfHUVYKKi zO3pjB!0`&Fu3QS8y#?;*{7Xw5ZRN9X(CCt9KcyC10A`CARM$9K#&h70bwXR{{g7ZN z6pTT8*)iISOmDYp7SQIJv<65%THtf%N)_-FGu0xsP@RS@TD;nt;muI9Mv#u zPvA*|T`JFF7GJOv^h}FaJJXMJ zpDJCUk-RVpgzhldA8AcPG)vz(NJys+LblR>orBQ8LyA!=x6TKLfz+gftNBJHd=ZPq zAYP^t5)sKGAmw>hu6rETMJ0DS52>_Oym6c~W-*3;6xvH8E!eUl`JwNx|FEXIU2JjmU1rKIwy7^9w{PqM#A~Ihli4SJ)5Pq z%NRfa=uDbtj;FyghQIN44WzF@g|6PRrC*~b^oXW>ds5PQEkHF5a+H&q?K#_?uOL5Q zf*kzV^Gjdc*=PrFnWqg46#T|IMA(cOS|awGcsU*iX0!Y>oo7Xt>0v|IF3p6{1R`p) zeP+%h9;6%q&>1(!ZD?rY0L$Cs8C%2X<9T}$>%3g0PTz8>L0y@nPu1t*nvni9(%P+6=$2Qk2GvB54GWJ;u?Afu}jqT6v z*(uM{Dvww7$l!Tkq2av|0t&q3X5m(C!oYt_m)p^|O_qa{rcge9V!Q&^>K&f|Kn{(8 z&FKPL$8|ynz-!G6i2y;h>P^x)zWeA{2lm%`oaH#g1Zv5?<@(F8S zBT>Buw0O;5jzn+U+Jg20)*ePF%<9)CFP=Z;yQ9`_pqs$q_ozviC*@%Ud-h*W{yNIw z*MsN;)IEFxKfQg|SwV)Lp`^X>sV{LW<6%!c+;2N$}fiq=lcK_ zgWOVX-&3;!<~`1j$z*iIzpw#GHVEwnG>vEP$!DY*rW0C_y^i=AT_Qg0V}0l9b-jpE zb)6}CIPT^qh{&C`HexFPFcJX3S->DC16&1lkJ|jPQ=jE(w6!C%FVEmu)(i$tUk^HY zK3%Sw%tV810gFz3qwV)3jwW+eZc!f}i$!#>5{xdKJT-U~6f3*?j9oPSZ0`DQs^;Xl z*;Fa$&H*Il%fqghX5Yjf6*U~GuZ<}>WD+E1zAfno@Ix2NF&~qMbNmfc7J-Ir1@v+! zqI!^=qU=6PtF(0;s5O51E_yn6!o}T|zjtNEz(o-=*IO1I6X4Uo{2Ja3No>4**T-KC z-x#3|iykc1Mh{hv5&ph(+!gGj5$IrfjtiCSh3F?tSB&vY%i3rKyB;lLLuM_06`z1e zM1K^T$+6fkF|b4oG?;p1UX)cDGNePNPod8d;&c#M6dy+}cSK+OwX5R!sPke?7wW$& zx?naHA&Dl@lJIo!7{n$^IDTA>T01ziu=iXy0nVYFv4%~sO8R4p8|@$rpI{OgSg;dd zSNswd!wM9H3uqOOPhZ4SvG?`oKghJ1qL5#N(Q$0u+`SXbCH0OLRof9#Y7`iDQT zJ&|Y22|2Tp`k=j>a?ix}=r-j#DpJntBNu&n8Dl;GA10INd-#49o6|1fRbav&^Z6vM zHFN;_<2swY2mRC6Ignw)@Z_}y%iam-B|!J1KqjjhXX0Tt(#qI`Ene^+U~{(4qwEZU zYls&yi^jb=&t~afgiiTrAg+`tFfJsU5t zj%M61Xe=1iLH=e&3*>K_%U5~40U4*i6GD#m?!ppGoBD2Zd3QzMOjgBw&$QQY?%t(Y zi}-s7Jk6#B{5kzTQoZ_t(HWGm*H7`62|XV%$o&b<{YW2IM*I4-U|>ZEO;5czz>kP0 z_N|W)Q63>rGN7vv)a*3!py~%dTh~pw+yY<7A+S|%J;v`9i&#zH@(qFaGK-Fv50^%AvRUt?!>jy9AJZ)%cm^@q>K0^Xg`1dqj;a;=^X*~uBTp93H z3UiO{K=gD~UWoe-k__~65<^SSPGD1mW%&5jw;DPxb&$TKawgGY4IFA^-0D)~sJR8> zX)p@7N@wMAiH4YjFAkYwidGIX=yJNw@&u8m3|$IsCz{u+FO={l96j*X&WDO~u$I}e zeO7(3uC>qZSNq(A>QH=U9SoK)f?e4fJR&*|SD9i|f* z^T7gkgFW3yXl`g8g3};ubr5;O{2Z-V9Uv*3o9$NgqbTpzms_Gww*`D^)?f;;?Xu^6 z;|+cw+d4*_2Vd5-0eM3llB{YrOoIVd9onn;u0x%~`I+!G1!2=_#(6((2jUx7BFQbs zAyWE|(aARDZMQM)HoLUruwrWGMi`5L@ZC`8#uDg@jaxClJ*`9LE9NOtH^!Fe8Cw!( z+!8e7wtVqgyiiA=Oa*nX)yvKyVYVE}HO4#6)f1WpNFYhTMq)P@>No30Rj0*kBfEQ^ zy}1H4z&PbchO^bRG1)!$9k;kL8kl&ajl}h{fDFp~aRyzxIW(>~23PCZX&i`mol6b~ z;?=%HYz{8|q-;Tt55e(91}v$-foI^VsVBNR z$hOQA*BzA3J7Ih3xalW)hO}e$iQ&U*Ti{#6(Mk*DX3+T_dShrlYTk*h{1I$ory z$2ui%YkEspDzUQUE>qmrvwBGe7qs8vyscICd1aig$$!e0B+05o z7TQ?Zfa;01Gyfu&189t^P-&aPS3g;a?a@`Zya3(w2eblJ3He#dp2}@$q&{1nG7`pl zU6S$KSjC^g6hoJsE{23$IzxX2INv6=8C+n~hya2HP5z{B-#(A0Y5oiST?ed%)|G(; zvh$_y-avJ(FAw@J4LUHdYA8or9ouP-l05ADGIMv=hacDHrZDTn->`-AGeFm_5 zEa#4`UM;w2bpOF;%bM{(W=|8p-5$Hprdq(Lh2vzNHv09mvO0ugAd(wUdhl5Y8B_t) z)(8?=NFCSF9x}|H^|9Q(7!&=7KN+4SXz=%kjGa}{G+eSIZ5CxB z6*i_RU9405Z0mlLrJg0N`39qPcVXs7&o###+Luhc5oMLWJ1Prtd?S;F?tl`508YBX ziiHO5K7y*KV3`6TnYl!4O`@;M3v@&n%e`r3F`a>?#+ub?pPc9A6jfDFMPQ-2H^E(E zlB&0{o&9ecI|-w17!BiSrkGS0wn7rMzwid-+Y8;@=wDQh5(}Ukhj8<6C|3Qrbyx3$ zJD=`<5JYA1D@@1HC%fa@77q``(Wfvq9|m6~Uj*Z~jPj@N2BD2USZ(nijaKmcomE-P zKOA~Y*EW)&J?h0eZ!%0A1FOcP{TsDkYuYF#_F5|To@mC)GzPhcX%O!;<(&#mi(|}; zh`({xFiVQ!>0jKmeo8C&AO@i}jzISYV0p^-*>snJnT*LL3Z+<`=6pOl%c{DOg%9G( zY$g0;@BZG{IPA_T&V`(T)cbpT+HWRG<2plcm^hzt6)V~XjN{>L-ZYuNl%q>VB7O-C z4m`XNMPH${>dE9>BBv_mBl0 zYDx?=$VD=RAjJQJ5WR37eA<5~q9j8baTsHH_>$WSZy61^00DT$NG10ddKM7(|9YVmjr z@V;Sr2e?;u9vhZSp63m&JNxpUkGJYL?_4@}{P5|@dH9{|j<>S*!P9}K*jH)+smNXZ zT=WR110Nh5dZh6(aOn9^Aoc1EU);Jkx8yTvl`|W3i@V}$_^5S{y9=y=ce+9e1OIimo3R} z3L~yT?Z+%aXe!KV+@F~}cxUK??nX0uw()lUJHcE{`P+A6#>}!SYA83!4x(epWvbE- z9hl-AOY#~&G9nxWy2Q8!9ryK|Z=H4~g%1Yx$X60lNl~H}*uc}o?|I{~^#2wPiL~yt zhdpX*bIl?ji%UdzZu5vCgOL?#Xtwm&oo!B#ZA5u$vdUS>XpBMUYdwOok_C!uL@&tP z_0^IQy#nDn@<7eb&NH*?w8+`3Ju6qC_iKp_u|r?%ntCl^N-5-(kAFZcyG!=UB06iY zvY;6DP4i!wD+&&m$GaJ?b>23=HD#Gw4!n=JCmde%2sN&>dN*1$&FbLp z-HVHhNxm$~)od~=mv}JXz-rbL^n-t3==vYL~#6pK|!DvFK^dZ{IcvzeQ4X#Ul zlC6?XNK`W+^}Nawy0eQj-Up-%VxBgb62kG@uh%Pd@Ha=nm$=OF3&yu;p)3b3e-uXB zLS@Zw>+;4QpU@fPGs+bhqd)LCGWCmfNL8#O6NCfWw8wd0t@fkk)CsSma$8ahyIq`@l53x|}yIwj$-+SZcZC}ap40$PV zr5h<)UA^~Ew8(Gp?g@MRs6iX{0*%;)bmolOP*%_zM|;Rc$UMk1$STMo$Qa-MGeToY zwNA-^^ye|mIsSjEkt;{}>Ka5kXz@3OWccf7@9Q+r%ZO5^@2T*PVx8w>0ukz1?b%sz zCv;Oo-CZF>w3SJcdUSL`F zBP!qCd4K!%%R=^J=pmwREsf$WHH-dm|IZJ2tF2+Lodf>sDebeV+Gu{L@9ItGE|-eG z3ytV0&PO6~=ccC;A*5WZ9+Rnwg4U%&dQ9&7M%g1#FlD(Ndqqz0TZ z->BcQ3)++GNkn5&sXlpple)~aIJkoc0^MySaxP6eUkl>y|kOU*Z_aa6Gm zz(lMBX%VF$J4)9C0gw6Vq^#y-a}c3V!M96`k=WdONwh=+@YBB?zx-z623*r=ir$-( z{A)SC|3X%kY!;~pEfpD<5wmD&@N)DZRPyv31ki*MLs(3#x}BzM9Exi)^$^z?VZh^$j_u z+j%usB}dA$oag0-f&~dnsYNOdhYyPuOFd;>lU6Wh{AzClV&iIB@)qqViFlBay$VGs zs^#f1vSNlg!&BL=ULW0fGhg_|dEzhEUwA4D%w z(xq6Fr)5Otw=k%P(g7lGTu{}&Y>r81MrW33O@n2bTJq+~vIKr--2vq&S=vyjU=(5M z@$`ekyvI_E#)9+=uM$o+tMqtQWvj*%4wLvrK%RN#EF~8ZotfXjS*@ozWuej~$ACOf z5OU_E3`HBn4CVO&eSw@{zB1SN_!+VUJNXgtVJAO=!s96My`d%Tdo>U}O-Ki`%-h#0Mk+aZMtKfhebatrYo2|$ z*#@!~?(Q;^1miL9C)P%Qt@KhLc6U}&hyYTR5_bVPucGOX@`U>=i28uIw3+yz#ncad zEgF^#lbw@t^yh`EVMw8pB$7k>?K0CiQR^Q^}6R@cp!JQjRYM-92|LcS3T zDQ=(2m<#7h+)DHn6RB=u(wL@zUD^dVQ%alPBg*=cc16+R6Ve>k4Q7R*F$Ze4*e7?gecW2WpxdrtGODCD}3!!s;A z9C|Gb?6v1dwoSgxahNiIH&mYcc9NeEPSiv*9R9Y2-?UILs$KUZn7{Qhm8}caHWNcD zx8aU!ht0YzV01xMyW&M|%4c-`<2}%x=ZIg>M@LD3WIC1w&q(lnFNe+32DftV@lrb2 z>|3hqsHq*PW62%o=lnG) zoUQ2sD3KU@9pR`B(Gxi~KPfK?Y=$9;a=EAh3**k^{H@a(UZ^9xoVzO8AjTpnja;Nx zr$FUXITw2`ZeE_9-Qf(0s(|oTE0i+OvhrURaA?)>V3>u&BnRaCvsI)jC6>jVRyIaX zKZpkq^r(S}0ASe?EnHZL*CYpHOGZs*X>wj>S9arrKsQ@_S~XL%p0llL5*=pROqQZszAM)^Qf61b3!3{48U{L5^S&fa&=Keh{sChmmnb4e;kLTZZ9 zK`Muf6{=LTEici2*~WB2#wmSZmJE*^P9>rBHT%z7#X#P^>tq{HsK&Y*dMeBVq!(0+$A!lTl-qgZ&c)$MBiSwr_dQ{3* z8Q@^nZ`JH`L(v8Bbp!B%>V045n@;DOkJq{8L*2RMb>6zt zLB(dIFJbnt+@HDfY4z8>`MHS>-Mg=_*S}iJR~i($+XecdcQ??7wE(0K`-%89bQ28| zj2#M=8)qJ26}Q*w|vQ%gXP_eY=X99Ff)%yNU`&ex8~; zBjr@WyB_)z;5~_Z=ZV#`?BZwWGQ=64IkR<7QZCx~oSO5y7BJE_VsySG<$u(=n-1l0 z5rvza{nN{iPb|K>3J!3P=q6d|si8zle;`N66>-3dV|=y2HLWmt2L}*a7>ylJN=G=w z$vZ{;qu?_OXv(M!uZ!R`YC3ZHuwg@CyLrb;J4tigmUhpFqc2t51mKjs9atNQV%yro zNpDzmD983exo-&RwpepK+v`l-G~`%3@R|v2u0$k#!VyBj21&_^DBa=}=rov0PJXjN z*^xR)>fKSveYEmfLT%oNFN76x*N^QJ%`KG`t7cn{KC*TcSn+SSbXZF!|J}&yPQ+l> zYVMhx?(PL3nY^$MxPJY$wUvc|9H}6fP!`7sdm?@TSb7v7j){+*~Yqm z7l#Qt&tAkE|B(!bd6o0n&Y7E?{nTC?cvAJ{hSp)WX3_aWZKt>!)x!@hU!{~zE~3Lk5Tz3XY>61FQMVu=uK_cxugP+oE2Scu5Jzt4RUIV^FWUw_UMsB}~H>!vnghi2OB<_>aDF)1>8kYP9GYobGW zFi8tj+&rjn%5Q0TCJwLOlLDg}ljN~-d9y_SH!;RGei7ZXjsj1(4&veAqemy8L1Q`$ z>+LZo3Is+wyv*>z& z!-3n3;J~Kukaf+Kx-Xc{`hZ!hI79UI&oDQP!Jk0;D9de$IQ(OOv25v~9?{39f_zt# zxT$jnG5KN6o>E5DT&Y@CB&WMkoQ}R_NoJ>@iJz;{TItc5Koj&?x&xXQXZ0C=_8=1} z{PC$q^e#>OUhWu{kAHmH555bvtHiwN>yY1tTJq5RJ<7Xw(|`(q1N+kK=76sC8zEu+ z&Y-=8OM8oWs?V@U;dtT8C9whScMm`W^=4QL?#)2X8=4jRVe zayiY4wD#<&6n!k?YRWkel=mREKH`o4wt3*@-XYDn>)@#9?T7%h$2CkJW}RU-l|hfs zwV&>4WIxY?JG=vTC)@f}RhDb22-n$eCB*OWWVd}%+X86)+O_~&#`8;AwC+(1b79ap z0V^y+?^qfzoyaA>2_E2C`nYQ;Ta3rN4X5l~1w?ZP4+I zBc9l1YXu%jV&Ft08ajNX?syKO)&K)CthXc>*;oVvw3y-QGjU%0L~_cW$5oa#n|9VP zYD?Zxx{L^2#XXELwupY`FVwy^P4n_XU~;r!!`3=~<|u6Z4N@zjzf~XSQhnQ?=xe=z zna)u=h?rRVf%4A7K)VYefD53U!YLY2`<8sIXqqQFF?Sk=%1>kU8ie*-s5#OjFt;6o z1=d@}mvAij3f@yQsX17W(tqD954?9gNqMa&naF(^xNJ(Illzl;Si=bF*{{oPK zXG$H>mtzE5DITUL2e?X!p-8WdX($0SKG6?o%;Cs0`LLA)V5^6Ub%P5MYyfI^Tp62OX&Kp0{F(^R_V zlcejREOVYD8KYohvzc(LXsUueWl>+GCNcnz>&<3G`aU{?oW9tQOV(*{`kjvL#9;gc zo&NUs!Jp%Q0~@4&(~5v9Mj>9 zu;mz5!hB6f&Hc{zzmEHmWDh0_ztr|&@*{iqZgiy1wkj15!|{LonC^?#D>}hznuMG1 z@PHIei4!^D4<|UEGF%tQhkXN-iGaOvl9%(*-m#)A+FtYj*z*v~dGKowcnS;AoI#Nx z{M+dMy?f)R^%tegnH>JKuF_VgCg!8t2k^TIGv?3_5_BroT-EV7l_<^AsNTS7>ykfB zO7cF%k6lBLYH0lH(H$2-)a{D3K3S(qoE&n9pBy6OoJT2|IO!esI#_y+!y6d}AifCl1S$uihW zW^pC`M)x8xd)-Mz$_MBrp0-<@MllBx4EXh$Qicz*x;;isGPj5|21X|(i_L!<*cvP1 zkMuH~t+{AmXi^E*ZVnD@7XcK%ule%akq%0W9yOREsWE=$MjrBKsOsWJP57e}E1@Gf z8CEUdy?wWTV0FcO@t4L3Bm$m~YC&y_KM9>}{UmJAL(i_x|4VhCLiZ*H}T9OFNDtbR|M4e#zWq z?}+vDG(H=3%*)O-jW`F9W01`vW$7PA0l(IPY-)`BJ8!#R1IRlF7j=rcdI4(#BgmH9 zKVvRu9kdmX()yOU(feh0^XC4CfStxU3c(Q)%|X>ep#JNTAJ?#{I=zjx9st{=T$nN% zxOJ+Hu}hVB^B6Xm5&U})y^c2+kbS8HQJc#EC&ZF&%@oScD*k9o(_+(W2tKW}B@9k~ zjBq`yGh9ISef2*6L?4 z#5z3}StD9RwxgXUvsZyPSwtx|l2plEf#?A-kY!e6%k`4u5%Spadnip+X$pDZD14oy z4^Fmde%=R5M zo}k;)l00iN<$LYW-*Kz$MQfIHe7>F~GcKh-s>x(zXJkbq28A!{)?};-4N6JGtIMDm4kxj%&hMkRPWdgT zS0MiYb6u?}h1wY>2-HNu)bdON#T<5I$Y)mvO2{FV(-TU=epb%bEW$QU>{_B2LW8=H z3>tfQQ^Ns`djzKCPgDbTslJ!)MmAaKm&?>n6JO5Wr->#2F&svP0qd%VxDTx4rrpX@ zVupnVGEX`Tn?7;Vz;rXN5?S~Q{as6^G9DG?JvHH5wWOMqW|NtqHHjW=Fb!F}&YQ8F zrjcvrs)PVmK&ii5NjptOYs%@)BPr7wQ@2XE0HqS*011-=v6aC@!=ps~FrUHklVKos z`kfF5{6c^0q`91Wq(P>T;0$3P6U%4~f?Pp#nhznLQ`UIo^ay067boR2Saaot6npN2 z-G%Us5%y$zJi=@xJT;Wml==`KAdQkqpeZ?bI0Vs3ZW8Ag@urSqyW-t#MGh57Cvm-Q zDitrH>h@MjEvvg54H#CHDvJPf5$EiX@2N@6*ovlalfx;l%@92H3gv^)eaD zXl+Ch7+&j;k=87Fq)<|F72pImF#68el;%_ejI(yG@{&{?Sfnv$X4jdFH9V=xp|I*3 z-t)BT=D^*5(GpSn{GvMeLCfk{T95CTs1UKf2UjKlTLQ2Ip4x8_^lSQwR*fy~)Zg}dl|5~E zTdh+>+*bc?H*8mO4N)1t9hs3BS{n?_Gu6}ZX+YuP%mbwapc2}0^J-|#>J?@*3`~N{ zoJW)oNe|xk=A&~B<=kf#JIal4u`Mm>3c4h!QH#fcZXmKRt?IhmlMb98jVJF3k?Z6=`Igin2xxVxl(J*K8|xh&BV zfc4K0q7|Giao+91if%nQZQj!P`ThEFXt%ufXenc*rEiqxxb7O|jHyU%VDH{NH1>3+ z6L2mb#@UG9Z#LORJF1)1t(Vl4t2+rE4(WG4Rc*AdPS=6{9*6AK+6oGc`J_gg6#O6@ zzq`E{Clixruyrs+x813T7pWY@(gsuJmQs6E`c^in7KsSlYxx$P68j>K)OXQ&7DuPY zXmv^J<`tYMPkF+XNdK6gm&M#aB&uR|oe>34wR&u&H0j6mF|OE)3~R>{oLNCssI#bEtI`Iil?aJ9U6Nd_T5?OlOwrtp2(NJrT=X$u@>4*fCefJ zl*-RYSgF;qXrq?y+Ol&SbRSPNqtf}-Vt4N1O7#9 zDtku0nAV}(N|mJ#=jNF@r1vQN=$q1$u>1PPqMdC)N(nL-OkPD6Xua~kN-_?>2{<^p zK0E#_WogMIdm!U{>j1 z-f{aL%8g-;17)YNxDJ1{IFB&%<-oc5Dfdimh!Z+f{%G^jro4AbLi5-Jq}5IF&&Obe z#*!~#PWa|GHv7s^t59aa&+`~l^|GQLD_tS3D@srdB~E7Kp4eH^;!r)>FE z7<%(*4U;7SuDI^5;>r?CwtPeUgRp+z+;h{c;r93@u8)<$bQk`4k*3Dijv!rwX+DP7 zp>x>pS?dTgKxLUH0u0qjZ!~NpL^DC3RLbFS-uJ$?>tjp956oO4 zLHUsw=qgNpb*3A32K_Br>`9u(+Zb$TJ_;T+w&Wg25Sb4sBMAQQdp;iJS@C}8f=BlH zM^a1F zjl{&7GaZg4;g!p{$X1dC-HK3+lXE;gCFsIb5iVBjm-Y(NK}(X4K;hbQ+9MkI{p$`5 zW;@?NAP&A)g4SWsMy8W-9d>{W+4|xn8FBZTbAx#?wth#IumleetIpHLda2im^#$xc z-vEdC7eGkzZ{K5faV*rl-C;?}>yWRJ8O>K1e2x{kF?tmkO9JnsJ(CO>N+fKEKz655Qsn73k?0LOiZC!92B>R-k*w_ryIvTN(12KETpISTXB8zu0ZWB z$&ufbre9YPv7*9jE_uqEjY%X}R_X)lrdqEW_N?V7a(~<=c7y9ry6=3W22c3d@vOvnc1RzpE|KS<{R=22P&#Wp`7j*BQfqz9@L%BFXD{D zmp|#gBTy<&;MW(FoJIIR`B}sfUUdW)6bC#LpUDU~%uY?ARk4}o+DaJOS~9#eji4}Vlw>1^ z-gegkIXbJ<#|unMfv(lr>QqJgNz5*L>Nm`PwUdfs6<=^&qsF+w3brCyRoDouD+>6> zv?xI2+7^;oQ>XbEF_%tr%DtZPlx$nWvLq4toz`$!99a%~=1ck;^YO0OIr?pjV=y@{ zz~|!b4}j$!+}j`bee)T7^XZmv9(*>AKH2ikpW&O&TMYcpFEL=v(e&WlSo7k1LksW{ z28iQ)d+*)k@?rP=#(KXA_N8_MOR)`o3X^()l8lHus^7z;ar!34m(X;Fh%#k_^O2#a z`a}5VFU-?Xvk{Y1jK1&0PBK8M$5yJvq^*n)So699&c3E zjb)4pH&DKo)qJ0%C22BBae?2bzJvQgxX$x<==O zy<^>!rkzxvN}cl;CMl9EOC^oZ&Moa|h@6u>q#vS|j#G>&gLt0Rwq(?0lwko)xve3a zO+jhOV@grM72Kr+0|2P71_RE;*_y(#Xiq`-u#a(Gw*p-q&D>IMa*Tph5ers+y%b~C zje4!mul69iv{4&5oPyUxXLB4zJ(Sq@R^8S|nP=K(6!(Y(w*%TF-3uyk%Bh8& zO?=5qK7Vk9^b;IW zrOX1EDD2kyP>l~!8_|6Y%M!7q7@7cMI8Ha$;0rQA_HhR7F;)VVRv8voPE_pp`1=$T zwri&338Jx~QIn~Fs+S%_&w7_X0s@q;3bYNF-Hd9yasCUne;WdM=@XdyO5E2+16-g# z!t|pwP!hla=$8iD=Dan}4#eNxob!UW=X~qJ*R}Z^P8hc8EAb8w%=}HQd(L+gp7$CQ z*rBW5WHHJxZ5Zb5-68-SU}44>&J1mUTN#7KXHx%Aia|{Z%0V+|zc0^pb7!IVk|Z$m zHG5f)5H;J~5`G=-;`^al!j=Sf+IEI{T}dDl-er&LOMq?p~Bsv<)*OMR_K8#vnxoOgilP-2>foOnG zo$>TBiVfd*eD=b(sIXff+Iv)9xaqX8k6JTKfSKvt=(;|uH^$$$>ZoK7OLG^^=lrbE zejuDO(PcxHdQuxbk)(`?^kFMqb*nmoeJ)?$V(sEP_WlKsja?-mBnOuJ%s>p~0tEO2~#g(o!9M^%l4i3qw zX?V8IbxwU=Al(PTFlx+f2xMr9+mWhd} ztE$>$*A7`rwZHSI>pOgHDes)NR3S@DRd^=So4KZ?(@8mH#XY`alC;(7V&3MtRIhZv zQ9|9u*84TlglD$~{hE`G_2CYI$&2M>0W@oMS)ylW2M$$Mra24nfanHKBzQg%YZkF_7556Fe zCN%+|0c5loTg-?xnLvi`Ez`8wYflp$`uzqko+M{(5X7}_FFf<1DXh`-IrM{x`@=UtC_oOMsYNS^$N#Xv^W@R=)g*?7hxqK zu3vF?e>wRpFccVnkjK-#GMuBXg2tfl_`6Yw|02{}g}Lg}yzo&dz#(eYqpF zbeVy6P_D9>0o85a4N)j*N2#|5n$6SZ1vAlTU(cTV{xy|<;;-~a?k7|pm>_fu1rMr} zdW;So$#d9$KyY|nE1(yQ90Iu=h;qi_zX3jX+6H3yK+YwjlozmyUFs=SLZ4%WT$m4T zwC|E+WEB_Y)!@+89+$v@2JK}x93QDd9K?v%-=mG8LmPM~7rU(7AY>DxgSf3%1HMG! zy~qkI%u8R}A7M-taamQx8?%cz?dh9FO8a8?U%k$ox|IW7BJJVyR&BgBvK2I-yRVZZ zZenle>6tfRk^J8R3~2EJmPo@09v&Z%{;y-HwCJ7TU_?{bmOgMQ1dI72fKkv zPXHA|Y(&O|LGKw~FOvX>=YTscd5QD0V0%nkok93;0h zLtqYDlK}eTRp(&`<%kPab~KhwxD^6I8&X-@aZGT;D7B(gtD_#nj54DcX|K2m7uHRi zc(tHh*9oe{q~l`c3Q)~s%*&q9^;V4K#j4zdaK#eXSWu)A7R-!ZVig7RyymWzb18?n zC3L-!RPlwUM8L^rg$ke42%xwlF`s3{EMH@-TP`Yx(b~mYJcsFKl8O$%gS44>eGw0n zM2@FrrE6{w?9SKET0x!SMNK#p_A(Nx#zHkom7leBY~EwM=M@mwRQ4l^zkU0(m}gW$ zRBZ5|(Be559lhgv6H#eO0QuuOo4rSpCdpl~H46SML*s3&@$*b{hID#*`h#&~Mjv`A zP7+05s5l5lX*8KkJdsiqvXRFd;4ztF=IWbN*O-YG zWr^?ao3E%_A7ww-T$y1rF8V$H>Yp9!UC;a=cp0EoJEuFvd;HPfSibI?Z9kOuj5}D6 z^;c*&%VF)+7Uztm5GwhOyFlmVNy+n}5cG5q3~p1--?d-*KT~B0lmoUDN}-!+a>ysc zxO`Gz@FdroGNO}%%Z;o+R}B@k!3SK!#~tfCl|f)(E1vKubKx}MdXI;Sef|xd$vGsC z8CyK;8(B-leT=9z^(Ho$Lffn=CkBqDIzy{3GBnYsO-I7%^Ssstoy!7G%%}uNbq8C3 z8Z=@<4ruZujXRB^GEdZ=_bm-geQmt6`ME4f@-FB?6UAhG2gz8 zxf74cli#QeHg|PmZ(qRq@CD4A9lA$|dPDcr!m%*35VAh>#rUN(B?m@)?MFX*1E`=E zs>jZ^focoJ(W@%hqxSUf`}$ThIl4kemsvBoA2a=KPo6&2mR6b??5eFDFJpumT7_|C zfjC3%Q`0rtZ|`oFe9>*TY+AQ(|1Ca`>mGJ#?LwMazR+wkVZIstd=)OS+2cT$wvB{S zh?e7>rcKcjGh#&TxpO*JykU2Hg$|Q+c$bDvI-MGh@oWkohZ$g-;dSp6>@@Fps&C(} zH|Fjw6s?9PbY0<|i-Xl#wDU2dE8w1|aaHg(#zl7QetwaP(440wT9g-Tvrok9YRM5$ z)-ux-umgqJh#r<;WCO2tUhLj}=<5b5WTpACX@Gy|AV&8GAmZ(IwjJHF)b&{TspKL0 zh_y=}>MG?`=kU_*ia$NDilX)2>!jAH&F-&D8x6{4G>#xK(`+ zN&5jkk?nrRe(2;3y;v-Of8Nr;o(;3_4)|8U>i^dsTn=Y5EM+BXjR^r{5g0&2?W8Pj zwvP1MBRQnnCvi1WD&L0=W0g9+VrX@s<8^lE8u)wqezRbcgRW7fBnEo7OtEyDB{u^7 zWwqHLlKwK+WI4ualQ0Kp0`i(B@iGyEAz$-tnD;W}eU|6JBw4rv_#^vfc&-aK>|Ea1 zHYJ|VFV%$h1@9@vTQ<~bdZw~aaTq_F9ZWJSt+5+ID!C-LMp2%L-@a2t*GdWP8VHWQo#t^Ye?^dc$>KBFq_u86FF zI#6J?BmA1KuUtmgDJh(8$J*zvC?l+WgF!xN?-ckJg7VGZVJ(Oo#BR&M9hh1XdT4z^ zV*Y|j=pP%eo1X>vuiKE{b*1P5sKs(~xciod%!_~Sx6I6LYs8)z|1udkwp|ue@9_FZ zxBH?ZDKJ8}4NLTZ0!k?dS6MnEmG;}CF)8}w+fHhKoYM`nN`%oGA>G{LZ8~gfWtCuT z1jY-1elIGMr0K!i?rfH=$i7`f`T$kDq}naVVrNi42v51?y6I- zBR*Ob>79wI^|||wWBGaSxFJ5qBllIejLyE@i{y3oZE1TQp>)GiwKLZ@fa1-`%?@_g zoM%U$44#AoYGmKE!dLBWlK#D_0^n0xF5-$r)?;?@PB6N)D)AbcZq|W6eVjoj?pdcE$Q6tsCnsWX+JecT0oz z6vv`V&B&hBQKPmWgdS58M>bx>iiyRN?=Z2th$`Y`@N$A+QDesie!pwM4+mM8-r-c+ z)7d<2uGo`V62p38&h&P+gFvmZGinTiEkQH0IIr7uGtT#RLJVv zB-K(wz(g!Z#ec2i#J-Ad@Ge@ViAS@pbsLU%;DB73V=_}oE&UV7TAlF8f&FsbYy&=e z5Z#I3q1#0~Q(ZtC4hdVt`5CC9lEB*FV8!w9aJF{(muT`?^kwvbhKBz?i0<5v{uqru z#q7ZNWZyGtgA$S&IWs)&qvG*;ia{EEM7<_qdwUq&xg&$X|Nk+%f3x)6GCCpfry2n! z@~8p&-rwg*$45Zz_HTWt4xu~DeAR5H`}LVR+{=9!iA(=JX1XeW_l;8M|G9$z&jBKb z&xa#8jOtl2km}c_d{0lbh&u!O0Mzdttx*5|pE_8mDflD544~SU(vC06Qxf&hw4}E@ z5Ngb;HjAETMH*w6nwS$#oLb9tx%m%F;$ohqMbdhrsyXV50F038Ml*1SPpwVl#yjm4 zJkwojG5?VV`djrYGWVnQYDE3VC-O(>c()=+W#!M=f3*VL(~cY;1>iBo$ROQyKjW6Ia1ih-3&FAcC>-!)KTsp-N|sFZM!$$4A(Psf~Hi zn=GyO4ZRY{-fz>vB7oDe3TY~fJ0XI&j@d(kGwfYW=NIBe`W62=NwCJqXTgvP>8a;( zr!TN(YrsO!6z^fc*d6lp+_UEQR-WrLKBw$_c}ln`#-t6=j+TN2Hm6)Y6z+g!#^%Hs zm5z15d4LmaysC);$|7hhl0&ItqH7FfHBA6NQSeY2dBwob|*=5GpDSPtj6nm#6f+h^~ zl$67wUdy&H#lSup1Mh-atz@^kYP#*l)?HLtlbXVtX7{|nfh^+HDn)C!q#2Ao^?FXc z5igf9-<^cE5{zEIgyJM-14+D0M#>BXsk~7??3A$_Kf~DKiApBuCk>>>WZN&_!a$IWYM5jRoRpc@R3a0 z1m}pTI*$Gq&*1hAL_$mk?jI<@gGU1il@=+_b;oK-A122k4Hb2oq%3ZkO+za%r`Y^- ztS+}5_2=zd&}{@^iHdvs7W28NN4B7{4#*_$fZ1TrsPDpKcIK6B%Xposgus`Oz!Ik^-`Le(Nazjyihy=aA= z21}rG2i~sd5^Eh{+;7^bY`%LEF1n`}-1?H%tKrR27g=v9X6RsJC)%LigrSW3Ad|CG zcY1=HSlVq>hg(d3s8@=Ixz%JIFVeKZD7Z2w_XRZYr85;L#q3cl{y-+qQ=9dSf+k4? z4A2RdoL4A-EIG_`W-PoWwkuI`-Wv7g_A1?dOm&pxsgxmQ6qT1d*)Sww4e3d>80WM+ zxnb7R%f=#!4l3$&8by|!4F|#Bo75==h=*OU!8rPC3`aOvP*fH;z^}$exg7;PC0M%F zMa(m|dZWMpAlSRH11WC>BE?{3g3Qf_D?G-%UH<=ohzk=^Giz6)Ux3qDExpUM=*79cZGagbJy<$m9>3_00Re>v1;R9SAy+NCtr zwaHYj62`L^npmB5q!`uomHO~iG|f1r7&2ft+kn{~1fZNDMG3@$s{DXZu=BWC*tNyRLYzQTg`CVjptXj9<3!#pJyD~er>rXD?k z#WnM8Rwf^Yx-#18@~-sL3k*pmjr+a1W6`qAYR_7!Qu$L(B+MhyC~6E}&?TnP>H7u2 zR*QPHo0YqL1hkM{Wh>$==M&mz)EoF|T`xwm^@fIKt7h%)P!n8{qavmU(h$&4((QI; zzvlC`(_+HjsaLU7|H0uN&R5;}=;Y;-mt#o^NUUl_OkSl%GSA#pQtrYJm#OAP&V1~t zjr^z2cQ1|nr_Vc;k)iwJv}vrGJG^S8I6JaG;D#Ar@bsFXS)H%HJt%$hr%!js2^wjn z+GU!{s++xKdwTA+XXp`-b*6nosYpqt47YU}3icGYhGl$tq$^Zz$<(nfvLDx!Q?qC= zvwUULR~$>AqiiVnOWQQ+6mFoTtWlcG(@Kjd7HWM|}h4YCbXipHs4&#=M+@+=>je8@1ITrlg*zVM6YmMzI-W*w3SC$ zzq!bgX0e4wbgfZ`1^x9++cifmzoCJ>zzMfq_O{*O-To@KLzfqqrsUN4!O~pq%8GP& z<}~_SB?LC`RPoirA%OjZsfWvoo9Jz**tiUL!?iy8`$>k5>bm_5ACKeB+S}Lv{~)vs zhtJhb^fqK{X17(bMvlRGwb;~hmnw4jJWDUo1242a)-TV_j>++ANPyAFLdtDsxlEx_ z%meVxRW-+9u$7Wz0iHy!(AvyJ?3Bi&EgF^*uF?+3`PG3~r1Q9(26%tZ;YF#puIPMtP1(NEV|P714-0OV91+%gP2l4wV`{etYB z$l-Znb@;H|tfvx6C&a8Q&eI~JTsBoZtBqVCb2hI4qWtn8dfra?<(KG`)wXl7;uddo zM7p<1j1M-PBvYxYD5d{`T+E+t&pU`Gq3?ngc~CZ5+lv zvX07hwtH2Pr>uVX?%jTfa6B_ z6!(rYI6I7}eCHoF>*(^ycRm^IeDVDdDgHty6tzoe>1b_j?g-%xM~zzc05z1hyYowP2e|ZoEGamSI#plUTt_kWDupxt!awf<i&tp~2U z0wc*;mNgzYLJQqUU zTmiq%yyRKT0rscuPEUWU>AB|o>^MQrqWExxmYUP9Zbcp@;^r*ll^8bKnXO9eu1xGC zQ=wW*l?u*)L624~C9#9iSAlM!J61Onh9*_?)!x+m>|bDyfi6(i6KU z;Tlc4op2nGIOr;v9=DIh>WJo8<7AqQhe#zsqHOT&Lk3QMP#n|EM*BvZ=1iS%&(bB%g9^D83VxK!K~4IS-LALW z)tb~rdO<%7&oO>jp%(-!C<>h8Fc5PzDvfjgSe2n8&lB=zv#u3b-S#K1w^V5ynK!|| z^c-w24^I}|4F4EUrtPXQjA=Z3A2g$x<4^QPj`~$fM^mY)bc$8LPXmN@!el(U`G9KS zTa%T>mLZ-Jy-ggh16>*kn6$sDk^LOVXn)8Os^rFQG#Slmwdr&aq}EHklu`F(c9T)P zZ&(}1h`D3kEE?=?s~t958d2PA>sltCn5E4%Eo6FBRp-*+s)_oXgn8ZRxnZ%CUJ6Tm&xYQXnR!pmXfrx`~yq%%+>;|etLa%6pt%~jX~*?{|=L`-T8+22wBD3x6Z5XfgQkh z=;HNY-qC$1hrxk8oRq8G;7`kj^n>ADJfar6^>WERda8#**;bgIJZ$w$rZIo!ur)Z`djZ0|@V-F4ke9?2qoR9?P&XNx<1=;FY@CUiui zc?B3XVqih*yU}oRA=511-PjkXCJathi0QdPx{RXl?3*rB7@>n`ghiQg672c%+AZKD z`u+7FR4EAII_1di?$9~|qVQ$=K4rufzztT;t(zW~3MqkeY27-R9|essZK1c_@M$wf zO-WtaS`8;ykf0U1k*S@q4u=-{J>P6+H7Vg_GZoKE4k+hJMwZqUX0T(x>KW*0M+)>v zccSze7%6_Wh3h;{aSKWuMfz>xriqjNwhEEQv9OcotKe+0cUs^TuLb9u0M>5+FC1Rm z~tD~prv!zC6M1JzQiqx!2+(F+O1?GKVj4A6rbQGL)-xF=BZTxwH@8RpB|L?ZAcGM!!Q=>n;A-V*1BFzdBw)eGXju zIGE=aVRd~)y%F;4l{RODr<+c9R<#-g?tpaQY$;I@oPZ%`U0KQ%hQ_euYA#B(@8Hgq zll$5trn|fJ$90_R`+`hz0vIkQ=AtA`#5>_tjDHS8>sQ-tRR_@%^^nI@w38V zgt3NaS;+?Y5W)M3r~gOveob_Ms$NNbdKjk8uf&OVXnj%f%pePkRPlCiY7D_oFF9`H zbaQG_>8nU)2eN6S61eIxGS0~V_H8Q-vLrQ;#9}ODTptpr13T+f<@)wSx0nLAqBBsO zVOKnSb%YcxRk9bvhQe^$zHn_Ps7T!N^K!;xpd#ewb~&Hcg;mQ3DiV+TodIa7>53p| zleRrwoC`I(_8Ep=>i&R(?MjoruDJ5Rvsod&8r^vz4+t^A>f}T!z`it!y5@-hcVhPK zlQN($wiEr14Psw@uoS}kL)@fqV2!X#xT}>wlQcQCT8@mkS*7SYjZ?P&`&$*)ToYGZ z5kxL&&OiIerN9L^kP7{TIFO(od}PkRV}}EEmR5MIicS^Vo)Tl&t9ZZTQ`ebo2jsuy z;ShP)Vv|Rkfr9EPoWh~pJ-ou+)gu#ixGyq9$&J8nYqj`&3K1IEYr#;0fN`j(oib72 zCx3KjTM`(C0uXCo^r4O&H3ag~C#3NbLLe_}qyzF|tUJSy645(7X*rCM&4&2`zI~dVmv&2>rq4Mpxj516A~+miVXhg@DQ$pTxdzAgU8KXP$uB2XhHrYK-K|dEfx7*2#mOP^%~+>%V?N~QLBWpWIRRSS=Q#QJb9{3g&cIyLX?Ga6vyf|@Yl9Kpoh6yk-y&GA?Fx=~oz&zKz zetC0zZL$T>!dzhST(%fySYbqNhv*{NWj_f7sLFG?fZ?lV5~km?evkl*QgvzA1ExYOiOF z+O8~z1_UX%vjVjxasrD)~ifUak0mCs$Nk*<4yO4+YfU7mB zk`+j(YMM1wTy6AcbzpvjLoqR+YbV=?N}?)b0qP~}JbK30r?MJm9>C)$o1|D4ji)EB zDylRUQ_MhGH|SGA##$y~6`!Y7ZPHqXu3TWuFKCn_9_#^DOZnoj;?#CU!R{PYt8|qj zmgoX2!CAs3E$vOhauv52y|}fjO;lu_dCq;f@|&*78~gmAS)CBV;NSB!s5A!@on6F9 zNHeHId$mO>n@*Y}#(~G;v?I)-z=iyrx*PZA(ja(eiXV}Fa1-18jc~=5S@X=4 z18vt$phJyk-2bkUCPap_60tCD2aTh8powafesOsTea?@oq$Ng_tAe3{jvVpM5e=I5MB&2_bQ6ae<~C|aBgQ+fs~vtESv{D$<0Cl>a&#i#be&TE;jdO+o&`-9G%pHp4 zm3Ar*7ZC;`^I8UFb5>8u=fsy;L)4$EubnT0LuFL465}o-JfsxnW`O>&5qj2q zwT5TURX21F+p45Qn7`d2f_zgi;;OBZJNRKfm1nTsCK}ZcA-DyWtlWhTPf;ReGeZc$ zcoEC7yQccMwZ>=+r^H#hk_2I>lyuejJ&X*RrF-gRP_D=|Bee|W?63weGwX&qxxAZf z%po<7ikPZ}tCZw?l;m7TZLeBYu#LS|$-9bj$5-VPt5T;tPHTq6J6ELJo_?_>VX8Fs zQmli@H;A(q)#?aMf{+tt;gelv!JXlO%-D|2>|@5s);=wphD+BqYB=EqEF5gZq!}#U zqxhu<-AkStIchIk0!R$6zl-^{fJyM@J&6yN^YlfjF_o664+i*7OfnvnjYI3$v=yl% zMc@@%BR^CvU2mw|B}`%RKOO5$3;s*eS&s5?No5+KBekE{n;B+9rI>iC;!2Cl6!;`; zn^>2Bv3DwH_?+5Uo75BBVOv7~s5mQIQt}NJ191h$)2b?~7W+Pnn>cqz)yDpqv-xv9 zu7)gXq+i47x#k>!3#y4Ym+Ldm9*oOW57JcbGULYEq?!`pHg_`R3s2QO3XBCm#JZ|n zx{ho2aUNsy*uZ>}qG5{7hi~5=SuIV87rTBdAsWk9rkc8jM@8HzfBb=(y3RLl$x5lh zp)x^2A2Qb?d2~Qiq>D9R4qr}@i^Z*uqrIrAP4!>&Q;^p734`W@6G9E^)#j|gFx z9^)yh7lZmuaX|z-rseX1dOpKt7wnl9<(|JDr&H&HVcXI{oj9cg$A7EJfWAYiUII=+ zU#srTF8PWr-Z!#t(w1|iYr-cEERX|O_OeC;gAQT9U4F{<13)8z_C&2FENm(30y)yn z7UvvC%z8S|;&f2(xC+c>LfQqIpZ8_JmhYYE9*_@P68WI-Wk-aOd{rrZ)STf9E=}z^ zfV!y`6rho6hq-s<#{tJl6I@~X)o~TQiNHCqLNyu?S^*T|Ja@zkZ0}-4Qq7w0c*;_i zPN?d$Q;g0kS!prQyr!~hjyKtO!BJH)=cTXa>!nJ3tH?_?G%}RHaP^vko=1e#n85cf zp*LLaGA3-TaU>uSRV>;-YY*4=Ct8`D9m}U?Ze!o^rEGTjt-nKjW#VU z1Wcv+87r%I*?`tA#zp53(1=qbbo zAP|AH;9Jsv_wDKbBiL-HSwq?AwJCtk)#iGg&i0bu44qKOZtvIyG$@k*?$sie^7Wwh zV--_qe-@u}PI+QuQwP#El~7{0wn0B+B!7y6`5#$&@v5wvmf_^-W!6})Yy--peBH61 zl(Thh*-!A#w|o`$Mf92VkW8%n_)pg3CuwY6{Mj+-sLbo|;`6X|<`H_N8v-M_%$bWU zH8dk+*0bj!F-DU~i=Hejbhf-cv3df0la}i)91MpbZKZ5UL-iexQdP_Jj=L#W*-QoQTkC&F+V8;W+5tH* zfq0l+-xl@NDYhjNmU(dJ2waL-fXt60t}{Q_5kE;*Aa_dh_$$?M~5N-2!QVJAz{0WAY6j_Y${ z(`#&zY3!xWE?mIQC9*w~_SVEMAbt@;uLexN;~lYm(kxFFb9%HLHT*s;1IX#RY3#I0 z*bR*AqU7WpDiMQDiC$_MMPUHNT#uXWBoqIkeg~qi?@)kDtr9Z3@X@ijfk&b)nV7Xs z!%TCqSanP^m+6w;%-4L&hsC{a=I;KO9cUo58s(By4V$ZzC zVPZh^`LvA)TsmC0ek@7LI87DiK1<-+Wtw1-04!b3@dxT~i2l^;Y3{gO!tr9Wl7hFJ za(yeI1UhfuQZf4pwR@rwdG}7F_p$_`DF;Q%0nFNZvI4$W<#7ZYmTCQ-`ltY3OqL?tTRY~@B68IyE5U*cA~sp5&k3_D&(#zY z4^pMIGYW)V!695>-)z`xaL#E7i4Q7rL}ka0u?3f!e|x07R{QVSd2Mhvoe#yoMY9^t zN^4TE*eQM1<%|8OF4-|;7MpR`ux=!-nbd0K{o$66SItye#aC{1#L=<@Lfvi3^=z^4 z%+p4SVo9kM5sFLH-PQTY^1tLYfVl-dWK#9D;vB|-dGN^|&06GpWF24_27m-7M+efn zen8(S=uhPlV;?6C_LNUhrxL@6NNWO11Clz#Q?g`gwPvh3U0sA---z?L!YXr{6ip|% zDWsPZnkh8Nn>%j({oT7D=!n>@Qk33GBDV$h#8-q8I>gj@-agEU7mF3}_es0dc3>ci0x#+{iDfOVSLaus( zKlAf_4}8mm!YhAXt*3X7*Hf0&9s8tzEt)N&EsWHqk%{YL`N-ajB3+EUQ0b%D698a9 zpTD0y6zB6QoyQbjdx}p^_bIYbqOJ;SozEPbm-Yt03UFhUHL?RV)1h5Db#=K)yKDJ2 zUWQ`9oZF^859XPJ9g+-xYqGeb5eCphTMIAIHJZQ2sOFFqs?&-h2kpH~kzt$s0M5`m zol+4h(Wuhps!_Cc1P%>Xi<{Q;jD8Mqpj{0xZc73LYcD$hZ?A^l<<76I72xZgf@b|I zo6M?CFIn?-(G1!AEox%@Lez| z`=sw0=>k>977*`;Y*+TZfhpL2oZ;qtm{DbHbgc4J(jI|AwaQWs$5z{tE|=HVjRzcj zEL(WrwbHBh4ANdmZM~;;DSCH0Z{2;tJ)8OmPrhZS}~Ny z?RxcjbVbs)Zv`?I22=8({#T|Hs(3dyvaZ`n|p&* zYJb5OD;O~u2tph}R?n8@z_5z7o*0^WGisaF7a*w-ogTX0OzBqp0;WxDtjok@isS|P zznj>5A49m2)%K1wW@{k{Cq)%qAlqQknwgh)Ubw*611Focuc2t#apSqiyXtIP@V891 zwU8QIe&Wj%O2H>$Su7Jr7wx(B{P^U)s*&>OngiEZ~Qo@VCm&(?+^Fr&t3>$`=e*i0xs}2HQ(4a zwg5$s$u9V}_&jDsIZDb@GIgw1D|GWU5TuMS5yMw+@Js z(vRKF>Fp%?8aDNF^m@X5>>{pG6$~hcKZLwqVLkE^jOT4!y}zZu~4c zZk|p~1(J}27$jJNl*C;1zrUTY-C1B40A(k)_nhlCwgfC@cV~BJ=X>yre!!2+9v0Y# ze}w;az=jX{f&MYWWFds!&LyMP-B7<@;tm9;hhKC;rPke0-$JU{-@`CFLB55I%3bh& zfaL#y+yl%Z@{J4!Qp~PyV0@2|v5C^CJ}y7s ztz&)%SAA-@rmH|=WW9ntfZ)A1H*8S^M$rQX3JaM;1~#}Ct5tA3zW&?;CDjhaU1N$K z2!=T%Z6+~?gGUcP`{IjWnZ(P4%b?*7+UnCWeLBWXv(=aEu0`@i_|wOu=sDAx)}{03 zzjQy2-H&N62mk+FkdIjqCVW;h-C|98Q26@NOhQYOTxGYc`{`O4Xqh}eIpL|%N21xn z+#$cez&}Guu2jPb#4q>~aSJ*?@HPFZ+Hk$5+p!U^sv;%(e$_eI1ZXA<+JR}`;})=aW`G_ zkaqW3jjZ}@<}%It&c?O8$9!Is4Jk*0>?SeiL_Ovdn+6rtVa4TNQmd{>5hzt>w(*tD zFS#yq7{z9Qt$5UZ_7%Ee_82-Hzh7hQnwG*>V-wLXlo_Y(MA$`Oq}PEFI0= zsq5H&QXHhz=e9_2DM8`(=6l;-9du z>gO#&smr;GWT{7rGz^@OgfulwZ=~ely2{>{%L4KUa|z)_G2t!t`YAabHVsSig8U&Q z3$#JqMULm+x&NUp!mqq;uwIcT1sNPI)U-+-jMuA`LGOcM@}M%*bz<5+K)WS)kg%U* zc5wkN*K`k&S?Srv=3!dZ28}%#YEQ9=WTOOo4*C*+Q#weI7@Kf*Mpz%^mE@iQUxW;~ zhjVbKJ#RN`rqX$%Rns#VJs6*A&$2<-&S-rAeP4+^=Y&_zc|8Wo5zjVD0LVGmj?O)o zF8;2e)MRVn7?+}P*o+LKf3+=(c;!a zmwaI{CR3KrhvqZ-&!WRTZ%3&u@Ib~&o8YOoiZ}pjS##vZepT1jr296TMtprUHqwQ2 zq^sVkT=tX1&!sGN^te7P4&XER>j{`lnqA`YNT<^QLsjczU!^*@vHmU6$3YKwN7)uF z_l=}q!)>dG8kdv^s0GDMuqzjOu<)=eJbn>aR_{Z<RZUWd|JNI*N=bew0y+L z+iiG}bpxX?XgSQ4#0h58Vg1xY0$T~lh#h~gPhOXB2@Pu;m%h1H5)5hxa)S_L$`SY& zeGDExMv}T-fPm!k=;K84x%nbDS7GLtrTDZr?~pP1jZ|NO3w9_|4PMaqOWJO?yEq(C zjSMfj;3vq0e&4*~+vYk6sza^Z=e1QWv;KCvT~Fp|f)b!XV!uKVM{Am}pAe%GsGbXM8v(8jqOT zuQmN-suT#;mt@m{SLtMu6`54FYP?=>M^b1uEq<`D8q}BtENL5PaRFIj0^Q(q$YK_< z{nRR>sW;=y9JS|423GIP7LU9s@{24qwse}kEYiz5LyTyU!@7KH{t3OfjJ+7gUZk-X zjK;=;Uyp1J>Z_mA^Ao&;m{rq^++EI_1L0Eb<1c8UJM`1-4)32 z$@fJU;r{qq5td3Y7Mp_FJ6o2FTMB{0O!Sw)2OBzzt1Bl6Sz4W(8Zd@d53W|L#lil5CSh_vS0giqeZlU- z6}H>o?FjjuVlhe#Xc6I{N3G`rT4(NU;lTM_=g`3m6RbGG$%^&<(ru+4MMlj9N z>6_l8(5*k!NM=T!nHlbvW|$WCGK!4BwErQ7TyrlW7Fw5Q9w^V6vbdS2YM?j7rj~+!jkIN06{bC_! zAc4uvRc`vlz=2Ak-E@3u7JQB2SlAjPzOOTuN-+Tn-&y$*aTv92wa6Vk5JXZLNl*y| zFMB6V^e*;jS#4r$JP{dfyMup$r+z{aMs6@UnEGg}kne5`%JpE~>H2_T!r}cymfnN} zWE-)mbrCP~&Aq#0VzO0t>Fs^HLs@BVW3Br3*d}gw6EP~WzEy{D8NRc-YC%N`Fwv`{ z8+;hdY4$$<&l}3-ki4PdSLBB^2WKY3|8)>I5vL71-H@pJ&~~d)vMQ&#IMzbdS!ag5 zD;?T>h5#4Xx{@f`^n*FBB;mPKnrCOKPqKfVovCg|q+*Mf9icAnvt=zxmR1wRMO8Z( znXNQfO|OxuVU|`@Efr1b4Z4a1NUAg~jTmAsCK+QC3((4`$-3!&FZ)Gcv-GoHw0sz~ zU$lG^w_mhx=TB@mr)0gtmRml_>6ZGG4dn)^es#NW^E%L1A%as zh@V=W-Fngk4_;hlgtcX?h!W5|ITa)7IxKEJ-kR}0!cvjX{OHlZD^f6tb_q-~MT#zl zW)Nh{FfGB^3;c>CRUi4kS!ffn_oGN%6zhu58ii$!3~`$qHi-lIp-L8kq|i;!S+Pg< z*%{p@Cs$dvf;@hPtDJNMPlM4~X47c+TvS|VXQu|4>m|@|R+W+82ywqlNVo!pv&O7#7og!G zcG7DBJ_r`r%W`>G6#a6q`5qRu&j&Sq+3FTRQ_`;EX`$LP{sueykWg_|?XPb40Z|Vr zA=ks)v>q+ymysl6fTM)I^g2Y`Dg7LwbWk5hL`R2Lk(aYb+2{%M?g$oR;4(D%$(iCw z=>lCQ%2|T>tqPWeZo@Bt*IUm(%lp{eh&RLJt4FtAJ>uOJ>=UMji|RU8E8W1tF!^E# zhU2du!G9eCw7WPNJpSy9Sw-U@9%45-8oRU1h-zaDY`g(!z771?U_gy1K7f!yhfs}$ zK@Hp;)tD2znGcSr{eYSbL!)c!j{5+KRqu?%Ie1Wua3Z=`egRsSx(UFxu=(JoQ+r%r zVB5RO`;scTX{v>}Vb_;e>^9bj^|zBAk&mu{fa#9hbDIZXl>Akt5*^w!*0}>}Sp9r~ z<>!g^fyNmNqHuT!Ij71LfT%%=+7!~YUt{JqEilX$>0}jlw{#mxSC@gM#gvXMCht=x z%`jo+jRRT8B~9r`mh~Wu@Z~?(`Q(G|K@lg-F`WgCrxFw5*-vc_{1OZU@d8jB5;Zw= z`UW*MQZzmaPHCU8K-S9>bnqCtHBu`aHmv;_V?61rmrKll(=?k3*HjkM(|o37E3@oZ zAf94!OU--6P2kleMJBZNMYrUEDi*toSo$c+a>0BE`O!%BE*GvsJaY$>RhX=%T@VhkuUUC1X4md zmEkn4Dtnwp7pCP8{5F0hbgMoHuJ>>DQT_{XVUZDhXWzGv!LBQB<@uCU0!Rx|x)r%^HtRWR$JIkq{)wuSPfG7hftWMJ#4Ujj6mC-s6#3aTfz@6BkX}MhRJ2kfsO6 ziAo5k_XH2=<;=?nUmuc%*P}M99tSZ)!9ma~K^Jj1loBd72p9dd#RwosC)hvAz0y4) zf>Rq*vTSf)tW>TDw~RCJjkJr|78C{j*CV2~7(RXp`uBTI0ft;*fjah}=O8Unei`5f zLMjQ=Qp#=b4Tn>%O*=xAc%UCKSBasGPF1&qR1G$UipD;fU>pw0FjrM9j5{8JyTwpB zP_}EN(Cpp=jfUB7F-{vi8YEYK2&;^(*Wg-WO}9Z~);hpxJ<4{gA+`p@b`27uRJ+BUn-{)rTVgwb> zH*}BLbCTG@B@`>V#!zHx7-bi#BaWKwmV5qIu98`nQq29B>UUA?K4i+L8QAj{nc+>6 z(;Uj=_`^2*6F4u}!aI;7aqcm#0CB<^9Xs_>aw4)I&_r?ap8_&6Nh8^PXxm9-IQap! zMuWD+KlzX^%vrh0(y5ocz=hDTRMCg;=cdU^s~V~dc!D0gP)vgXefMz&oluNv_r?VM zZRKnHQmkC#qC$&u!kg5k;SbWM+lDPveIa_X(1)9bEwtl9ZBaI_g7LMzOjDy{DH+8& zKUEC<1S7DNF3=qHA3%wo4X*JY)sw3d%MD+dGdu9qJB?O(1<2>n{XmohOl%ij3Emi* zZluyboA0$l;{pt#gJ$n5({r0M{J6uom($m2aL&x2(ouI|zMGC4CNux~*7qn2ftZr?pvE^-G z;L!;a_Zqqkx$eF{o8=%2+8SMgCtBl8$f;5&V? zjNDchP-@(dA%2_vOqp_A$S?eP!#=N1lh6D>V8!wYHcr3x%ENC1^Q~fC1;*J=^A;>mqgRvx(s9xhOp&t);tSK&-+AO#bK0&Ni z$$(bX{^9>Yd8$@?6+Q2`iG0)eRx-|D283yuq}66VxmuR<68!4R*isgf z@?kQE<$@Pz`eggV{RM>BfGf^Qg3VXW90N_4NYq|B>X99*Qo2}8+~@u^46l}lpCBC5q6W(T+_7?pHT+#d9VqH* z>TYk*GO%3D__!dSp<10}wkQH8bUI;8pD1pk_*xw<@m--^;=JXZV|uaw&mJ6XIlD z<0L{5{H>a32tQ|&764k!{3%#JpKKPLl;7_fh?hD#xyW0ztpwIx1-B1vT zlIy0KEoEQu7r59Ez=4JxD-4X1XY0IJJybP%t=}x|BP2<#q4#u1WZ`S136o4MYt430iscbQj3o%K+B5V z$OQ*3GDacGNmMuUI#;F?27>n1Dr^v_TZw?frLxSxT`6(v19AGYj(WpA6>ClSVlMB5 zFAa6B!B)s2Iid-+ThSL|9wBEB-`;L{a@t8z*HF>&Hr0Mx(A965bjfKCBo(ex0}PqQ zc)beuO=YB<9K6XrRSWGiOByXnb!6xzdgE;fo;j!BrLs~dh8$$g4lQRhu!2t|8I(5~ zOv|y%qDlp?aW4KwiilRFgqDmm#gnHtu#UWji=he$iC;H~k7y9S!lz-JG++_ZfKV|?s{bHRy=qa!N3|9JFsRnB*Y z$xaGhY~&BHkI!l`dXbPh+gVsmlde`N`jslBg*ooXwV|%Y+wyyE>?3Y2 z!(|gy*$8+*ym|w3fO#1}@MdHMg0Zjj< ztMyF)2z@xk0gR?CqKrEBb6=@&G6XoHis|@sYtrXtgkn(L;i)HN*VOeBp}R3+?=|bW zDCbp1$rBo{$A)QnZZ=33vSh&87+&2ooPdJiAbC|+H1v;0v7zG_Z_j_gqU88*k1U1d zPd6!Ya6xaK`RXA)ftd4KWRmspno7(RIS5L%f5{BxaE zai_ef={d92DB_2}2`cKSAHVkC&lU`dvrxiR zpP4xi*2_HXVTk9X)wK|Lzu%bk>!p|yp2GBjJb5Xx_T%Mm2v^>$NhUNKYjT{d;liklY&R(pxl_IZU?ZVbew@cO zV6|&wz(geAAJx;G+rd2c@Q&(T=Yd4d7)$0-36x`05%lHBFm5Qsk!hGAR*8%Wu&h-l z&t!o%c_&xgqmy|O6eLuso8p9N{DyCXF7aMeq1`E`K?O-~2DFiGZN;y-pki0|oY+e4 zZIo8hLPhSXxHyiuvM?oCdnfm{imm9Iv=X^nWr%3uLeW7LI5$oX;pLWa1Cx{OBwsZP zhX`U@@>L%z&+7I~Em1)zCj*DkM=~+Ard)Va3yW`IS^AmnwoIL~Q=AsQ9i zP@a3H>wwV(dKDDg!w|bF=xy9nrjL77)s>0tO-X4FrcT^pE4^GSF}?>j!$DHt7eS9I zzRB8bbKnzjALCv(|E!s3|ElTWa=&*5ZlZC#a7dhxNyFB)*!Et0?kC`A)i(Mq8QLB? zM#0ms#%DHYks6=emC)Wx!x!)uLbZ8}onf8&w#*E2fEJXkc3TZ8J_`MLR!g)@LXZaf zY;p+GNc9?EcP!9t*q#u(Lo5j}IV7TYaS2rzO^Qd5QE$s3@ON$e0XG`KZFUEL0djgV z2Gx8@*W^(K6u_kt0(g!&FwK}dcsPZIquJsK=$iuXZ_;agyB!DNkK+^a5kBA%IaY3W z-ILF7NOv;SF)E`L=i-J_#cw6KP@7J_*nZb!R-otR%e)Ah3ma-1`{pJUch~Rd-{n&y zQT`g2Egr!GZ%MpJmNtV+O;O`~e(-!@k_n931idfFwLo3JpeTyiXvmAhd=66woDJY( zRh+wbDoeN)E5kPxd4+5l3D9Eh988LQF*3()nBY(5@bOP()9rG)4Iq{H6~3_6L|`be zg`KTIu^IO`FY?tU9#rqHZ17Hj;mN$te$sdJN0^>YB&nO0tGAzdzvxjIqL)DgdE3wy_S2G_WGhzxU`C*};sQN=&3kNi!YcTT z(lPB!wb|jn9*Sdh9SuVqPgoAH1H+xlql=8GJ6fu-$Dmk-8Wu2P(-N_=%#0KnQ?AAQ z@7v)suh#-M;J+UN8{%{=qV8#a4D}OWTlGYK1*SDhyT6VzsG1A&vqXB#Dl;COHl)H* zs}Sd$S2Je8kOP}h`6cavlDfhuunD1N-$;W*jg`k-V(7nE?Ky)_52sf#1ZPZ^MzOSQB zt5tU!3X5{)a+3_kP>5);1Q&l&gd2>1fZTC=AK5zSwBN|*|DTSl;Gtco;C^_ z=*%>oifE;4+M1Oc2VeYWtJ5U=UGH|-(tF-$5W^T^pB3rID1NnZ}|AuuhsC2WY zY1{Tss-<(!4%e~$_*AUGkr-+=GJN)6=UdEG3Lir)-7T4Y+LzsyQs;3^Gk;}xvmiqq z3uBcJF;8`rlHdgD3=Bav^igMl~;!52C!*CQfBaytn z(mW$l&>pO%?fRPow+Nq%zoc9`mcTI8W-`SCZ$n7p%%x<~h|DN-I@Emn4z!8otw&su znL7xn{%v>ym0J^kNm_EotY@?d2j%$ZZPj-?H;6AyjQQGI^ak7&{?JA1Er~4Wd=_ax`$I6vOk;iMx|xNNFjA(DB=3mYF0pw znadfa)y2H@>t!+08c^4RfqR{q8+@Er81q)RC^uWVahzjRtj*MhZg=Nk4u1#?$ z>__HgjUaZ=?1sh8xnoMGVYS*6+0z|LfM?rN*1T1Df@?F_-8mm6&!jg>><@eN8e)Pi zz`vx|DfntHR^S{18xI3EgBR&3%{05O(~{H?Zul-qvYdm8QN3u93$DyE6i!r7m>>>&tak;E-DSJ`2n|y0} z9{RXFU?!xbv%T8_YagLL`3=31{2A76Gos?M;|TF=nd4e5&;+&_9BQYP5M1zXf#OV* z3o%V5Mi7Jm5l)h#Z!~*F!Ig{Uuqe5kyEUvbkIUukDt9vqe-B
i>!1w=ZLJ-tb? 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

?hRV=tp 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

sF@*tzr)u8Uv>brZg$NieE>u3=>9c zkpGpl`+fBE;TO|WNH-;VDg}1%v%TF}gq}Xs&{K-{%hA&ZZ5bi?>>ny`0`}B3q!8>m z6pAu6$p>+wTAfhhLc3s<|MXK+bQsPHLL!+^0nBR#ztwI}G+{9>M>*jYKVcJlW}lMc z<;^GDn3S4Dokk?z^P!@6Qa!@=>1UItw5oKsX7AJW#C>{S?CbmVU3H(XiudVR7NX?n zD$#}7nR-}Wls}dKED^|m#}!6n8z8`pu82Ec3tUpwjf8~ycnqwh|BrG1-)G$6g#yvJ-p~5DoG!65ovn+(u?RJx`-ZL>mt$< zrWetA_L7ST#=#hHMhLUO?V`)X2cu!nCQ7J|b{wSbJT&jsK?M{rE%VD~`7lc=HMn9( zI;di)iNm7Hdkc30Px1%&g2NxAk*JIapG)hZq(D&e)kgRn%jEv3ABiZ1q$$nHN!`QHBwF$i<)mnC#?vrfv7q@=v`19Z$!PyjL zFc#WXn0b}gZ32Y{>vkl)4w0~;spgfA{0a`k; zy8JXZ?@T|9T&0Y|@?pqH$pkp);ofE!nMs@3GogGFJ3XD0_@DRgsi~LeCfLgJDm7X> z!FE0|5jh$UTttpmqnFLvHt@nENh_vcMta}Dj1H_YcquO zU3Q&So-i6RCF2=~e!1#R9n->ixiGOYxs7bF%+(IKY5Jzu4HSLE-4vhmdFF14Q6(e{ zZ%wn$;BFYgtKmYKyP;%Y>jI1pTW>PI;=3#a01cW40Das6AzU=D#yGqC%1_MiQDrOo zdw)9-uk=%cl#-@g%QxeyjW5`1g8ERci>w7v?uYqe1na@sAiwlr6 zQCu*qYuFPc8a#fUvR;2tvpAhdofCNRXhN_fvqhyXYVK+rX0*y)7Paqn9=!@kGav7( z>n_UI^eV-QC^f8CL16#cCU`*cO`1jel$~U#@~b0_v3ew(?g`A6lQ9H$Hvrtl%k zOjvn6N51lG#l^sSJ!Z|kpdm6)V+V`LYYNV556z1~>@cfY)^D=!;E#x%wc- zya8POQ`VfVf6Ts>U6iO(RJF>xfQ|3O2Uyc_oz?<1AA1RT|6iC%Qrt(MS1l5y%*XE3nonS;)u5XEBN1!U(ZbXFA8r#r!x*NxkTmT*5g=FBdv~H-(Dd7KkhfLx z5gpjzjN9&7f+JFP%RZNq#~lzXM-eCK|nfxZpu#ymtJ+nOQ7G47pIk6$EKHiOKl$PN?ihgHPvHqj4suI zx5>G}h!RabD8S4vvM8Ru?wJ7*VN47dA~>bu#nMI`M7#pyB+v^&DK%Ny?T3yhd|tnM z#VnbG6?~2T9Oxn>500jbz$%_!un4VhMN>QA=vRz+)(Ub}nHymRB>A0?0${=>w(|$+ zF}mRPxJcQ^yJ}!d`5J*O@7I#A%6Y^aOHVSujN2w7FfBg@lF)G&W&fi|>0vS8t1C;2 zCwlEJ&|>hiiCXwIoG3I;nksuxYO4v+9xgzGsjlngtj0N8Q35e(#dlfh(%`l?UEtyg z68TFD`;-@`74S{DR|&|?`G)dJ>705s#(Mdu{AblawLT0(alTK`8(tHv?+9Uu_mi2}o_vWeIyFj5AzT~d1lXsoyxBg{ z^b~Oh54eWrtHL{a+J=DhJ6ic9`uf|;?I`B!LXO-k$cJcke%p<#eHY$U`fNV;SQ_YX z+nThbUUYFW?|KlPx6^o9N?X?;CZ{;hAoRZ)_t$A=meSI=F&DP=OV7kMNlkC4$^BA1y*HE zHO-F@)UrUXhGrI7yl=_-ljd-WNlS7b0InNt@U5k|TUAeb?=|4T&mbuG*P&mo91n5@ zoi3x4W@+*vc}qW7msg2;2(P^Y_1IS8l_^YfmMwC&lgz(&<$kU6oc2w|R0<0eX^et$ z!+w0b^l0CYOP{c`Ay2l(ODD`EUGOIiV=-n9B=}P7fbea=hsLf5L{0WN7Da1vV(r(8 z%x}ws`L;44Puntv(PJsOsYK+cJpLisrcEhdsSed5vSWH&DqkWeofqZM!g7G*G6DG> zsu$;?g3}ccq@Enx7_g;jCM`H~dKyQuV%&sMKvVa2m%%eRI>N3>z)s33tN8SH7Ianif89J#gi zi2Vw~cB*0*efl1|Cvi=T$ff1SBB%+Ur~M}CQ4l*rrX?4GWDz&8(D{-Uu?$;wn_v;@ z7ZDe&f%i{t{XM$D-$Q|dv>FBOGBZohunuD8KX9D%7N=u=0=}zy;A7MKfpY=tMrS6C1yqk^ z%!}-;4BNuprUB+~ePaFtf1`+bSD=;PM6zb-UiRWn5Geu$;&IaNUE_di{UN4y7xi2t z6?~BDr+H7@MjE7xyoPV#miG4y!$tgrBNKcWct!Qa9i$me(7RFb8h#vYz-Q*R{>93jz->hu%-p09a z0PQ6Em7I@7O;p;e>UjFC@}kUzDg9YY3P|yC<9tC#-fn)I>)AZ15Ukog&vmoik-cN} ztV{W~yON@EdW`*4YKVK3RLhx>jn6A*aJV+cHP5cra>8VEcf z2H0t&_NN9KUq)6LrZ3u(RovgM+ty39ZmY3cXq3o|pz${IimC$&jZ*;{``}FZTfN@| z8dC&~J02Pv1{yaKG|oLVZYtGixrY4>01ZuvP<9L*Bhn;x#m1Dx!7JsvO!SJ4Q&A>P zMN^DBUGi4lE8~ECVZKb1A&T$Jmo;TXgfsKyT$%gt$$WWMp=Pd{DRUCvnlG#9o#=~J zt6!QgQ}o69iRdqLRVA#^U$)TPqTZrkqUl7vMYEP?5Ow`f-fs`N{!*UwXgb!t-TZ>O z_P<=V%b!Xnv;FD?JUgwEc1I7lqtV#MA6;H59e*^vR3QFH|4{}ZK6G1G{m&+`Oz+PZ z6|Mho(7Mnu3HlO!%C4U>bLfZqlx*(kBr_2^aFV%O)8=9zMQBH@Y3Exj79{m4JoDOC zBQS-U1Hk5C=wShi%#JX#Uud;Y)VWXT5bNW0TN4Ep*_kpI7I=+pNu$x#o8OL^J0!WzmB}w4nU7x7xacwNl}>)&LjD^9J8an zdLKd>5(4^znF8RX(AJmJ*r{6xCY!J~kB;Q$yDXSNdm+`Y;nbjgbPRq7sr8SoA}X4S z{pAoOr8L?i|BII+E;E8;Q%>_)y&*Y-q@8F^Dx_LE+p{bcwrn;OHuW1i}j*|%+!g8ghd_AitIR_NOQ z1UdQKcPEx_te%Bfk#M2&2(AycQY-k|)H) z-m`b0gaVH2G?|-~!kA$}U(ZF{mq)6bY!R#)SqGp-w^fs=SNVL&>o~oPI9-ULG$W3t z?vNrU>Y%~1CT|CQ+aje9<_Qi5PJa%`y_74JnB5h7QYcuf$g9XULO;_}Yz9P_Lf@7# zlp3V?_i!{ABysrGpC`tU-Wyp57zs_K%T$Opuxwq!!}z8I{hN%wKg*l#e=N*J*4R#h zPI^;rpHRpR7W3#T{0n$@Bu8|b^Z-h0lrC7QtdWO7+CP0nE%eC}yIN7PnuRZwA>RIX z*gCMPjIPbhV=I}@tbOv@GTMDs2jV4jM_bbsPK2yBoV9|*~okkVu*spQ)NG2Acls$1X(C1V) zR%IH+6z&``E=?xL`a(QsF-YO13H3BXd&#*kBkhq7(VX4rzDcsGl^EFp164bg-Ds-H z^Dr#deALFVcP9GD0iUjxI=3gnLxk92>FqIKhSP}Pik2^jSay37B`{1d2Msz)XTW)g z-0S7KuGmXW*45eZYBh7kHou+e1+Y$G+W;fOEQhUY)&FXQGL+B5F97D&BAm&3-gw9U+%aw^qd|2BF0ckdIZjy)u^kw zH)?a<6{kvOMCH{KNLljcgEJ|7E&bmVhXCtO(ssg;4w5^cbec>~9NQN6J zY>u)6$pE`>ydNX$#c8(a`95>!8yde7OTVT5Y3cJFisSyzV-i%ir7&rlHETP9)EW9p z={x=@^C}+*X(69?J!yDU%{rLRN-XVBdOZiVD}VKfR2xj@N#LD+uQtS_-n z4ZId2Z2;mkdBsW-z|a&BVe%^~mM^6Jh7%?(APxI~3JoOklB{em*&ygYaZ&|azt#pJ z$I)j|2AUwe52iB^a6PcObjw}eP?wp$Ztil^@oiqbY`5t(w8XLLY*aa4{Ss*6IXSgbeA5iy0`;`1f!lm_s)%2_vfUYaFu1svN zQSWQy(=iV=l4pv%pyN~PGToYvtvy3=v{b4H1fNTqH|_*W$~}rLW1*6fQ(QNpE4+*E zJ^Y3z5(e38HglS1{uroiai`A>XCCiX%mH{D5~@~?OkLEkA%3#FF^4_F9qo~u!ny@) zCVWRFEw7)(guR973n>@w=S)6_l9wQBfKmQ_501RKODi8=$O^oR7So-4721*2o z&azlJ8-dd(XRoucOM_bQuqGe|8vc%{S-ib>8?4o@ZvxiW$>)*QrDyvcP&dM(O4)Z) zCzK^*j3VeuZ4h^5;EwT}2?&Xcy)t+x=|kYnLOlt!hDSBvMxcAPbZFCJhxyq&!GBEb zk@;kr6gGssrK~17Gz4?r5mYTru39QJVM3?=vW_|vg~RYh)B`_ZTHNP8!%^vtEX)R+ zp?3IE7{OFIl&Uy77+v%g#K@D$XvTVpC>PP|*?3w}&>(}}Ff{s8DN`g@H-lPp} z@)knIXW&ABT_PYr;9rP6bSM1go+{zaO4Bt-w`^RSC=bQjKk;RZrQ{~Z57O6W#yZ-E zbpNqwp#?-uKcNUrPjVWWITs;`st9&H21-y@jCy135b2&h&%X4#kX%t87ivACWB}|t z)Cuv2hJsE~J5!5L6YxrZ(doVg*G165RXUOnRVt9zMY%DEm}r82oQfXyLH|mMPdG;@ z7q~<@n_PwTSKg%ovT^0YHcOCin&e{zbnY(ldn&gF9`d^(Ku2Z<)n0964?qq})Gtg$ zv4(4lnja5Xs-|yY~+x^g+MLx-H%Y>ey za0=lD^^Pv#t}4`v;PgZMWn~05=l$oxIa^-@R>BCCdNjvK+SjX9L{I@vqvgR{77?2rIeAv-0<| z>USNoXe@c=+rKS_T*0XdT)6?qX~y|XgvI}aUlLgnXi%+w;WnW$uVLCaVVIc^B4=^7k)+sfi}J865k{EraU(_-A9Z|{!Ptrud%#13oE+zdp2lN* zy=(FZGllbLSvL9%h$nJm1Jbg-UE^r~N2Jizr__?0Z&siCwwc>W-JMFwF7}qdI=e++ z1hT1Pe}h%*M;FDynukwORQZ z;-Y#`U4L(_AClAd$lE+=^=?UCx!wU(!}e3IE_{h>eoE z3oa9a0t#?&Ebh#ACcb*NA!mB-s4R_;q0jl4OL`iNfT*cd^$323ljme-5Jm^DeToW# zZ(Nw&qmmbb*348cq^teu+Q3*RILE}h0oPz7hzg09w`wf~unUSu@Hw12Y(t+zs);5v zYs)8xIy(*H3$(~LG8`VNGjdnHQ(N}xcyGVGE9?c_*~}OsPj9gy3_#aoZBbz#G9h}X zky)iR(U-%&Hy(kPnOW*2D>!UKayvk!0uyB@ut3?yrbK3BX)nV@chfYB{X9G}Cn_I0 zYjuxYE%ZIiFKwgoBz_6bnNojt#vN`(a4rqX(K#$ckJ=(Yt*?I;tEe@j{W+cuTn~iF zRVBLDYm>dFe#*)ITiw(-y+!eZ3qbIQKZS_DyPfGXU4H3C`TA$;Sw4R<{MI@$2{_7p zwVqAQdu7{^OKrBVA6K$gOaBOJ7z_-D-vuQ~tZHJ|>dvyOlEr6AnLOp7p3D%|lYy=7 za!^lZ2oR#B`oulkGXLKI6jO`+3rW5HC=hkRmds*1@I2W0bhUayVC>xI)`rRyaWpw`0lQZe-sbYA`c=l}ix08mQ<1QY-Q00;nDd?QF?^Mc?B>Hq+k zJq7?K02}~gZ*FvDZgekGV{&P5baO9dcw=E~X<~J9Eif)NE-)@?b1rRRa3G=>04Sgo z00000000000000000000000000PMYKR~tDKF#2ES>u^IzAcQxc+>4D_LL7$>=brb> zF~%_lV>`B4@1MU~T2e_>rEVKYGV?I!gmG(EsZ^UvrT_1*oBnJ*oQ(haKX2Fm`Y{~! z|N1|F_3wJ!(eU(o_W!(o_3qW{R~PfY*8ZALu4lde=gDLtO4#rDU;pR-{p;1M_4%x~ z-X9N!`w)PihIPFtc{0PU2ehJ za{G}@&n8#HIo&cOwg;2$8HZOAza@X5@?<@FQfd)2?V|yb3>C#7TkW3qNuu^?GGB-( zi6KkuSZ{)Fx|8O3dc9b0=ITp*@TDR&T^HEz-=9vpGZN6cL__T1X_qXZhahwQ@7iC2 zh-h}(zY_)fcdrWG>3zIv%)0k;!M^)U@~fWM8H?GqgfLg+dV1Df^gj*n`Xj$cb1X>K zf=c6?E%MnmkEY$;aB)v2@~xTzY_n>+4Ilb+D&Mdz!M1!b9GoxuV=|F%*A!rz&APM8 zuvMMLH(KPgZMM5Y?hsjYD&MXx!H>2-C);-Ekx{!cZ2R@$h)ChvRJo`%EmpzbuZ-|V zCgS$P0=f&G=fuSD8@B`UhI1`E2?4UL1V~iktbckvkTl#ILnv@YGufG-f^bGf8DCzF zWU;*j#i%}zs9TcF_l1kX{-lhof2q-cpSVSxyqJ9LhiNk@AHjBBb6b8+_*L#7=m7;o(Tb|JMQ_3^}GWSbN`?G0ZuLZ>Lo2Ec%F+1ShXSz zu7&B@0sC|J-u}Qqm5B-`=Y2ChnKbAxKtBgV)0q5)8&RpEN_#Y!_Wh&-!MPXb#j?*P z7ZA1GH-ULBPmr3~s5_mb4AK0N&eK^^T5`W$op$H_cboaRH!%pWl6#}>6{zs)OwbiK zL6tP?j?X4n&GF~%ctE8ua8|E7o{Wb*g>7Kfv|>5Q`U62?=3d(8?%A+AhG`1u^PvNf zN)@=+T=cKLOlq^4SxP;c{*?d?ohRVA=nliykET=Ee&3M*l_LoTT$dmbFHTtCpILuy zcUhP@y`G;lIg=^Z;k7|Mlr`#inNcV-9(PA=b}0RkVp=t(Z2>PU&4qay*s;8P1o&uJ zWPw%)Wd4}U@@|g-(v`t(%_QM(yf8)jKO>=0D7HWM(kD=~EYb$Pd|adsfnZxC{jd^< z?Hx*#MdAnwgGJgIkmQOaUsy8b`ed@$09vZ?QVXEtjDNb*>FD0m1S(Gg8HK!~jcVQpAr%!F zv;IKH2>lsaC|6U+O=o?-aXHVlKN_ipF^Xo8$5a3e)Z}?`UyhiXTF@V0lYY+CsTB(R42UH#C!`s*FKDiQ8nM6pe7RFy zUpTXN$K*}5ki^vkV8odal6brTTqqL)Cddq6qfFW0CxNIcS(1KfQIzJ-{|YHR-uIoTe`dDVmDTZ-VV$5TSD_B4QY1+fKR#cN$4(v9O-R+G*qF3w zJ(h<@z?3s2uB4EYWSAoTo9^h^PL3%A=g$;DdV9bB(F)_{i_&9@oZ z8yZ&-E*Mv4I8P^6(^0>y98kx&BJ+i@9iS4@G|kRmXI7YhQ7}5KqD<+uigKl6j!s+_ zN$#VW6{nTlmrqNSsWdH7u4G!GL~L4+GBKGIrd1S-POB&r8E#RcbmB$1=xX(&Syfg_ z7K^WwEK$BnvQ%u1WPWTaiY)Ov%4AoVk}VpYmMv8}HCr+=JzJ)HitO$(*_EeQw!>_x zic^g5GFv7#Ma5>>MJ#eFOwg2!&d(Goot`NenVl(8IyrXvirlJ`D_cBMsM_S>OJ|D2 zCYSX`U2bYBufoK1x#+ZXkz=W!qDv{bbg?-1>MDJ>j5EnnF%Bp5qsTU77k*e}BC=E*&4v}GAq&M&Y#5(J+8vD! z`-}6*S!sa^Qv!vfGXv#HCkV<`n@E)Y_ow|X%i2_C70#s##`%^mQ_i(?xzaJmnX)QU zpUnE!A`vfBd6K4lg}Iud6{l>9m(JW2i~&IZzjfWe<~ju>Doh@hwhj)_QqUF??_65{ z<7z1^K2U~CiZ65Sp+DWZ zhaCnu(9vmPa~}4uPW!Vk^|SJR(Ro1@JWg~D>)|(HR&#kjhUNeUB>qFD4*Iz1f2c$Y zPFN5g2Y_@9>*QY2`R+`*apS6RJz%;d0%Nnl;qVWKV|VBQGDj4I{&A_vaNM2U`)4M8 z8etsv^94-y`}btloX--qvhJeGRb%s%x7QDH^s*kCCs7L=-lB>i^H5n&Jx?1i2}8us zmM3)QeLHbK6M{tDs{lU<)K$roaWgQGnsiAIZk#Jik(%|pM7rmmsZxLog#HfBmd%*p zajZ&nD6c*}j5P&{3l_K>ks*qw=flxikmk8wz$VxXx)poW>bDUj>*G_DJe;c}1!;e= zW`dsg0nydTV)ap)?hz#yJ6b~AojAh9@^gZVHe@0xNq9e*5(JXz^nZHi{obYETZLQk z(R9%q!vgg2xoH%BU0UZZ{XLxTiH-NsHIaRanKiSf@(ynJRJfaHMRkqC^68S zoq=_NgW&T6w-%cSJRoe>C@naawFSvU-3>icNBV5i=dcM$nkM1clgVOXj?moLC$rJn zH!86cBsNBq)9whIuz`jh!?w5wh>0yI55A;Kssw81BW&tumyeU-;@tU^`guOirJzQ* zPG%8zg`6?6;s;u1qV}!$9(wppisd3bke{U&w=XvrDL{g?4%U7tBp(~ka=%z84~ryU z4wfG6T_1G5+^d}1eb8b#SAocrZ*58_*UAokc~;ID%CU0O`SNQ)Z{#X(tds+XCCIc@)4cki@j(<$Ngxl_H>?QPPvtWcjgy3YH^TZ@3qrN||Adzw|@C(>s z>T5H8YknFfzj*n!EqVJ+F^%Apa?w{@5EOH)=*>K+D8VK^(Hj-<>XU4cbNN4NT?uK(* z)20%bcYQkV&4#BCRDK$9<6t}|YK5u9ogqP9genK>z!Y45cX)QzhkyVH5pN$*!A~P* z5@JadL!96TY6OY2iR#Ah#Y-Z*x2#?Q>I8|zWy8DS;_I+~`$;IUpdLylYD#f}s*2Ky zy8az=GO@JQtLe4i!{%m6nCa{!VU9&OI{SKDQs8ztW2?G6b?FxTBvG%p3-`H^gh{(b zf(A+L1DNDp)6hxqmWEF8Z(|gt`c&%G^+=%Pbad}khnG233cOXKQ@SFdJMh|COxlZ? zm7$9n2xX+bxF2~1!Q~4vI{-5CMQm@AQvj|OBrhgx;;ZxP{+rq0wAi#zQ#Jt$@Lq3n z3LK~cr0ycTf%ieV$Lb9K5~)u6=d3^|E&KYJ;HH5|@#V2xpuO0CP8u^o75p!P{h1u6 zN7^JfOq=M2Vv>r!$wajgW7*S%c2M@n2WBquJ_Cmx`5pUVkuf4K~N0St^4 z-Sl#K(*M-cUA!FQgh}PKDFA{)CjeFDZ5pPEwZ25{YE1ds9bNa)Q0JG!DS{M6k5^Od zAyOAQ;%T>cS-U3QI~G z1WbUomEwcE0knvBiD+J@@+8l_v3^Bf0nCOteCV2;0Hg&2)9c7c- zv8y9*qh1^7yZ9g^uOh>riAhDRz3R@ri?-6{3Vu?@p(?pMmPlD2j$lOuC!HE>4x8wZ zUMB^Jt`i+{7vBz{i-s0qD{$gE%}ra!v4X!TYn@6DCsQN~X78gFPM>=j|IDwiQW-74 zPxi-IB!&Z33F?pYFEO#U{4YvhHZi&S20g#@ucjj>kQZMR5*0Zi3~YwFTCIOWRmkT5 z)0w)W!H94I*ukFq)wXrH194?k)|){ zhakIK)Pyu?s(0so@TtO?fu96wspR5bIylVH>Hmx-lgsOA(218v^+;W0*BQhe_F`aC z_+;t;Q0NpV&J{!XAvD4)NDTA>6($Y*d{vzP!HYv6SsU?)jCOBAR`5(sVLHXJL76#~ zR#xYgyk$gY_%3>0R+p{;Vuu7dg78l#1FpG(!5vP-x^e)prM^tAd*`L4O29c+2P(w} zIQ9$+%@qy!GKsG;k;H+0zkfduzR?&>TBHpX#*a!XtAm!?X5i(vS=yH+9JkK9mB&?r zr}ydM4ClN35uGJ!e(sOtsi2o%7_sM68aF$eAI{EZ2vTw=GOw<$oPGbta3Iy*p}#?G zm4EswQfX~`c8oyd3JvGQZ=psG$%(vT+PD5;K{{Rto7JT!C)P*xUIMycbGkVwYu+cW zqRl39iKLP>5*VS0B7rrgh&&`mgcD@C*b9D^h8$nDxIP}#*5$nHKiiX7jOr$|JuIj*qh$m12Ka(ri=pm>-r3IqQtuP{!xUMF5TFKICOGQkynFAtXp zy*G+fZK?h;QBD-;WHJ*nN_XLd|JAL`lpU#HflQ%)tb0guFKzo`IS#G&o+%UFsWqdJ zb}5yi9EZYjvw8o(&1%w|Twz*wIulHJb=4gTJ!mowvcd#4>-qU)fxD5?q73uVorTjW za-`&9+@QQ7PWVKyvPk@qPV#oZ|6Tj*N(hvqtNCC5=dYUhZ!NFY^0l;9OZA_lTJ31< zuvR-<+ppF3*G_7+6Ob$ad}!9vi&U3s)M{i=wH2Bt*3MSdNQ}6TM+-YGxIag zs*Isot2K45Yx-wWtNl!f;caEI)DbN8p(XlEK=K=r{3iL(sior-B;ShUTa~;>*N$to zLLfYwjVvsqaL!MY^P9r?U5bfZs%dY)to_UcZe{XgmaV-Ph2EELNOBHs1f`JG`I8XHAscbip_X5E06R+{~ zCbRuyYqxc=kLoh{t`6E(V|S?JcPeYnlC_B_G-;?cZLCd1#zZwgO~Dpx7+M0hg#(yr z>_IdpCOpYi{oHSi!czrM)sBKM2FEBR!J+D@F@@VwK>z~gUi5pf2K11JV{i=`>e>j# zUO zIt1$8i*0eA$&ZI@?NT&x*-*d}8%EUlnHCi0Z&BxORcAdRHw=N3x=S&y{Hwt+@gb2c z3NlyiZ0()s>Rqm?ZRcz6M9#ZZe-#T!^{s}dx^M#}hFsu?`I)WF#T@6FpCmyo3Gh$$ zmn|xY-UCD+@$Uf8pG`5vO+|mUXih`X4Qg{Y6>(%s8!FQVFg2v|Jagn)qR=TxR#elj zeMeon#x-$!cT>xfR*n&!; z{||qc?SWl(zbh!%uKfM5OAg2piqc&s2qIhB@p3sbC5F(P$!#1S?Fv%XQIyOht`yIj zi*Dw=e2}i!L*!Il23Y3W2zIy24W^I_l_3L&u1e=}xf~RFyxw5TmYYNV|-SpRoh%3w7`D#n@C%v6{6Q z#ck+ZSL1DB(sWtaF6=Kp;-@Vco8h9qOm84v6YJ#n)K-)aeC*bhIIOU)mYI6B+Lugj zfVN8iB9LmBsHGDKIMdZ@HAN3=7)_hvZwsL5CxND$E1~K14@J{uLBAxz6?6aZ^dsf` z415Tr>k>HkIolK9ZmIOo0z(AvJCuvj8pTmA&yPNQ=&PiTqPY@TuM$OC`)Zc8AIchl6ouFUK{`U&d8+TuL~~`F+|a_UT#nRrJ1SeV$o