iwmlib/lib/3rdparty/pixi-ease.js

4091 lines
136 KiB
JavaScript
Raw Permalink Normal View History

2019-05-14 13:56:05 +02:00
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var wait = require('./wait');
var angle = function (_wait) {
_inherits(angle, _wait);
/**
* animate object's {x, y} using an angle
* @param {object} object to animate
* @param {number} angle in radians
* @param {number} speed in pixels/millisecond
* @param {number} [duration=0] in milliseconds; if 0, then continues forever
* @param {object} [options] @see {@link Wait}
* @private
*/
function angle(object, _angle, speed, duration, options) {
_classCallCheck(this, angle);
options = options || {};
var _this = _possibleConstructorReturn(this, (angle.__proto__ || Object.getPrototypeOf(angle)).call(this, object, options));
_this.type = 'Angle';
if (options.load) {
_this.load(options.load);
} else {
_this.angle = _angle;
_this.speed = speed;
_this.duration = duration || 0;
}
return _this;
}
_createClass(angle, [{
key: 'save',
value: function save() {
var save = _get(angle.prototype.__proto__ || Object.getPrototypeOf(angle.prototype), 'save', this).call(this);
save.angle = this.angle;
save.speed = this.speed;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(angle.prototype.__proto__ || Object.getPrototypeOf(angle.prototype), 'load', this).call(this, _load);
this.angle = _load.angle;
this.speed = _load.speed;
}
}, {
key: 'calculate',
value: function calculate(elapsed) {
this.object.x += this.cos * elapsed * this.speed;
this.object.y += this.sin * elapsed * this.speed;
}
}, {
key: 'reverse',
value: function reverse() {
this.angle += Math.PI;
}
}, {
key: 'angle',
get: function get() {
return this._angle;
},
set: function set(value) {
this._angle = value;
this.sin = Math.sin(this._angle);
this.cos = Math.cos(this._angle);
}
}]);
return angle;
}(wait);
module.exports = angle;
},{"./wait":11}],2:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Angle = require('yy-angle');
var wait = require('./wait');
/** Rotates an object to face the target */
var face = function (_wait) {
_inherits(face, _wait);
/**
* @param {object} object
* @param {Point} target
* @param {number} speed in radians/millisecond
* @param {object} [options] @see {@link Wait}
* @param {boolean} [options.keepAlive] don't stop animation when complete
*/
function face(object, target, speed, options) {
_classCallCheck(this, face);
options = options || {};
var _this = _possibleConstructorReturn(this, (face.__proto__ || Object.getPrototypeOf(face)).call(this, object, options));
_this.type = 'Face';
_this.target = target;
if (options.load) {
_this.load(options.load);
} else {
_this.speed = speed;
}
return _this;
}
_createClass(face, [{
key: 'save',
value: function save() {
if (this.options.cancel) {
return null;
}
var save = _get(face.prototype.__proto__ || Object.getPrototypeOf(face.prototype), 'save', this).call(this);
save.speed = this.speed;
save.keepAlive = this.options.keepAlive;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(face.prototype.__proto__ || Object.getPrototypeOf(face.prototype), 'load', this).call(this, _load);
this.speed = _load.speed;
this.options.keepAlive = _load.keepAlive;
}
}, {
key: 'calculate',
value: function calculate(elapsed) {
var angle = Angle.angleTwoPoints(this.object.position, this.target);
var difference = Angle.differenceAngles(angle, this.object.rotation);
if (difference === 0) {
this.emit('done', this.object);
if (!this.options.keepAlive) {
return true;
}
} else {
var sign = Angle.differenceAnglesSign(angle, this.object.rotation);
var change = this.speed * elapsed;
var delta = change > difference ? difference : change;
this.object.rotation += delta * sign;
}
}
}]);
return face;
}(wait);
module.exports = face;
},{"./wait":11,"yy-angle":22}],3:[function(require,module,exports){
'use strict';
var Ease = {
list: require('./list'),
wait: require('./wait'),
to: require('./to'),
shake: require('./shake'),
tint: require('./tint'),
face: require('./face'),
angle: require('./angle'),
target: require('./target'),
movie: require('./movie'),
load: require('./load')
};
PIXI.extras.Ease = Ease;
module.exports = Ease;
},{"./angle":1,"./face":2,"./list":4,"./load":5,"./movie":6,"./shake":7,"./target":8,"./tint":9,"./to":10,"./wait":11}],4:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Events = require('eventemitter3');
var Angle = require('./angle');
var Face = require('./face');
var Load = require('./load');
var Movie = require('./movie');
var Shake = require('./shake');
var Target = require('./target');
var Tint = require('./tint');
var To = require('./to');
var Wait = require('./wait');
var Ease = function (_Events) {
_inherits(Ease, _Events);
/**
* Main class for creating eases
* @param {object} [options]
* @param {boolean} [options.noTicker] don't add the update function to PIXI.ticker
* @param {PIXI.ticker} [options.ticker=PIXI.ticker.shared] use this PIXI.ticker for the list
* @extends eventemitter
* @fire done
* @fire each
*/
function Ease(options) {
_classCallCheck(this, Ease);
options = options || {};
var _this = _possibleConstructorReturn(this, (Ease.__proto__ || Object.getPrototypeOf(Ease)).call(this));
if (!options.noTicker) {
var ticker = options.ticker || PIXI.ticker.shared;
ticker.add(function () {
return _this.update(ticker.elapsedMS);
});
}
_this.list = [];
_this.empty = true;
_this.removeWaiting = [];
_this.removeAllWaiting = false;
return _this;
}
/**
* Add animation(s) to animation list
* @param {(object|object[])} any animation class
* @return {object} first animation
*/
_createClass(Ease, [{
key: 'add',
value: function add() {
var first = void 0;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = arguments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var arg = _step.value;
if (Array.isArray(arg)) {
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = arg[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var entry = _step2.value;
if (!first) {
first = entry;
}
this.list.push(entry);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
} else {
first = arg;
this.list.push(arg);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
this.empty = false;
return first;
}
/**
* remove animation(s)
* @param {object|array} animate - the animation (or array of animations) to remove; can be null
*/
}, {
key: 'remove',
value: function remove(animate) {
if (this.inUpdate) {
this.removeWaiting.push(animate);
} else {
var index = this.list.indexOf(animate);
if (index !== -1) {
this.list.splice(index, 1);
}
}
}
/**
* remove all animations from list
* @inherited from yy-loop
*/
}, {
key: 'removeAll',
value: function removeAll() {
if (this.inUpdate) {
this.removeAllWaiting = true;
} else {
this.list = [];
}
}
/**
* update frame
* this is automatically added to PIXI.ticker unless options.noTicker is set
* if using options.noTicker, this should be called manually
* @param {number} elasped time in MS since last update
*/
}, {
key: 'update',
value: function update(elapsed) {
this.inUpdate = true;
for (var i = 0, _i = this.list.length; i < _i; i++) {
if (this.list[i] && this.list[i].update(elapsed)) {
this.list.splice(i, 1);
i--;
_i--;
}
}
this.emit('each', this);
if (this.list.length === 0 && !this.empty) {
this.emit('done', this);
this.empty = true;
}
this.inUpdate = false;
if (this.removeAllWaiting) {
this.removeAll();
this.removeAllWaiting = false;
}
while (this.removeWaiting.length) {
this.remove(this.removeWaiting.pop());
}
}
/**
* number of animations
* @type {number}
*/
}, {
key: 'to',
/**
* default options for all eases
* @typedef {object} EaseOptions
* @param {object} [EaseOptions.options]
* @param {number} [EaseOptions.options.wait=0] n milliseconds before starting animation (can also be used to pause animation for a length of time)
* @param {boolean} [EaseOptions.options.pause] start the animation paused
* @param {boolean|number} [EaseOptions.options.repeat] true: repeat animation forever n: repeat animation n times
* @param {boolean|number} [EaseOptions.options.reverse] true: reverse animation (if combined with repeat, then pulse) n: reverse animation n times
* @param {Function} [EaseOptions.options.load] loads an animation using an .save() object note the * parameters below cannot be loaded and must be re-set
* @param {string|Function} [EaseOptions.options.ease] name or function from easing.js (see http://easings.net for examples)
*/
/**
* ease parameters of object
* @param {PIXI.DisplayObject} object to animate
* @param {object} goto - parameters to animate, e.g.: {alpha: 5, scale: {3, 5}, scale: 5, rotation: Math.PI}
* @param {number} duration - time to run
* @fires done
* @fires wait
* @fires first
* @fires each
* @fires loop
* @fires reverse
*/
value: function to() {
return this.add(new (Function.prototype.bind.apply(To, [null].concat(Array.prototype.slice.call(arguments))))());
}
/**
* animate object's {x, y} using an angle
* @param {object} object to animate
* @param {number} angle in radians
* @param {number} speed in pixels/millisecond
* @param {number} [duration=0] in milliseconds; if 0, then continues forever
* @param {object} [options] @see {@link Wait}
*/
}, {
key: 'angle',
value: function angle() {
return this.add(new (Function.prototype.bind.apply(Angle, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.face class; see Ease.to class below for parameters */
}, {
key: 'face',
value: function face() {
return this.add(new (Function.prototype.bind.apply(Face, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.load class; see Ease.to class below for parameters */
}, {
key: 'load',
value: function load() {
return this.add(new (Function.prototype.bind.apply(Load, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.movie class; see Ease.to class below for parameters */
}, {
key: 'movie',
value: function movie() {
return this.add(new (Function.prototype.bind.apply(Movie, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.shake class; see Ease.to class below for parameters */
}, {
key: 'shake',
value: function shake() {
return this.add(new (Function.prototype.bind.apply(Shake, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.target class; see Ease.to class below for parameters */
}, {
key: 'target',
value: function target() {
return this.add(new (Function.prototype.bind.apply(Target, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.angle tint; see Ease.to class below for parameters */
}, {
key: 'tint',
value: function tint() {
return this.add(new (Function.prototype.bind.apply(Tint, [null].concat(Array.prototype.slice.call(arguments))))());
}
/** helper to add to the list a new Ease.wait class; see Ease.to class below for parameters */
}, {
key: 'wait',
value: function wait() {
return this.add(new (Function.prototype.bind.apply(Wait, [null].concat(Array.prototype.slice.call(arguments))))());
}
}, {
key: 'count',
get: function get() {
return this.list.length;
}
/**
* number of active animations
* @type {number}
*/
}, {
key: 'countRunning',
get: function get() {
var count = 0;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = this.list[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var entry = _step3.value;
if (!entry.pause) {
count++;
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return count;
}
}]);
return Ease;
}(Events);
module.exports = Ease;
},{"./angle":1,"./face":2,"./load":5,"./movie":6,"./shake":7,"./target":8,"./tint":9,"./to":10,"./wait":11,"eventemitter3":12}],5:[function(require,module,exports){
'use strict';
var wait = require('./wait');
var to = require('./to');
var tint = require('./tint');
var shake = require('./shake');
var angle = require('./angle');
var face = require('./face');
var target = require('./target');
var movie = require('./movie');
/**
* restart an animation = requires a saved state
* @param {object} object(s) to animate
*/
function load(object, load) {
if (!load) {
return null;
}
var options = { load: load };
switch (load.type) {
case 'Wait':
return new wait(object, options);
case 'To':
return new to(object, null, null, options);
case 'Tint':
return new tint(object, null, null, options);
case 'Shake':
return new shake(object, null, null, options);
case 'Angle':
return new angle(object, null, null, null, options);
case 'Face':
return new face(object[0], object[1], null, options);
case 'Target':
return new target(object[0], object[1], null, options);
case 'Movie':
return new movie(object, object[1], null, options);
}
}
module.exports = load;
},{"./angle":1,"./face":2,"./movie":6,"./shake":7,"./target":8,"./tint":9,"./to":10,"./wait":11}],6:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var wait = require('./wait');
/**
* animate a movie of textures
*/
var movie = function (_wait) {
_inherits(movie, _wait);
/**
* @param {object} object to animate
* @param {PIXI.Texture[]} textures
* @param {number} [duration=0] time to run (use 0 for infinite duration--should only be used with customized easing functions)
* @param {object} [options]
* @param {number} [options.wait=0] n milliseconds before starting animation (can also be used to pause animation for a length of time)
* @param {boolean} [options.pause] start the animation paused
* @param {(boolean|number)} [options.repeat] true: repeat animation forever n: repeat animation n times
* @param {(boolean|number)} [options.reverse] true: reverse animation (if combined with repeat, then pulse) n: reverse animation n times
* @param {(boolean|number)} [options.continue] true: continue animation with new starting values n: continue animation n times
* @param {Function} [options.load] loads an animation using a .save() object note the * parameters below cannot be loaded and must be re-set
* @param {Function} [options.ease] function from easing.js (see http://easings.net for examples)
* @emits {done} animation expires
* @emits {wait} each update during a wait
* @emits {first} first update when animation starts
* @emits {each} each update while animation is running
* @emits {loop} when animation is repeated
* @emits {reverse} when animation is reversed
*/
function movie(object, textures, duration, options) {
_classCallCheck(this, movie);
options = options || {};
var _this = _possibleConstructorReturn(this, (movie.__proto__ || Object.getPrototypeOf(movie)).call(this, object, options));
_this.type = 'Movie';
if (Array.isArray(object)) {
_this.list = object;
_this.object = _this.list[0];
}
if (options.load) {
_this.load(options.load);
} else {
_this.textures = textures;
_this.duration = duration;
_this.current = 0;
_this.length = textures.length;
_this.interval = duration / _this.length;
_this.isReverse = false;
_this.restart();
}
return _this;
}
_createClass(movie, [{
key: 'save',
value: function save() {
var save = _get(movie.prototype.__proto__ || Object.getPrototypeOf(movie.prototype), 'save', this).call(this);
save.goto = this.goto;
save.current = this.current;
save.length = this.length;
save.interval = this.interval;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(movie.prototype.__proto__ || Object.getPrototypeOf(movie.prototype), 'load', this).call(this, _load);
this.goto = _load.goto;
this.current = _load.current;
this.interval = _load.current;
}
}, {
key: 'restart',
value: function restart() {
this.current = 0;
this.time = 0;
this.isReverse = false;
}
}, {
key: 'reverse',
value: function reverse() {
this.isReverse = !this.isReverse;
}
}, {
key: 'calculate',
value: function calculate() {
var index = Math.round(this.options.ease(this.time, 0, this.length - 1, this.duration));
if (this.isReverse) {
index = this.length - 1 - index;
}
if (this.list) {
for (var i = 0; i < this.list.length; i++) {
this.list[i].texture = this.textures[index];
}
} else {
this.object.texture = this.textures[index];
}
}
}]);
return movie;
}(wait);
module.exports = movie;
},{"./wait":11}],7:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var wait = require('./wait');
/**
* shakes an object or list of objects
*/
var shake = function (_wait) {
_inherits(shake, _wait);
/**
* @param {object|array} object or list of objects to shake
* @param {number} amount to shake
* @param {number} duration (in milliseconds) to shake
* @param {object} options (see Animate.wait)
*/
function shake(object, amount, duration, options) {
_classCallCheck(this, shake);
options = options || {};
var _this = _possibleConstructorReturn(this, (shake.__proto__ || Object.getPrototypeOf(shake)).call(this, object, options));
_this.type = 'Shake';
if (Array.isArray(object)) {
_this.array = true;
_this.list = object;
}
if (options.load) {
_this.load(options.load);
} else {
if (_this.list) {
_this.start = [];
for (var i = 0; i < object.length; i++) {
var target = object[i];
_this.start[i] = { x: target.x, y: target.y };
}
} else {
_this.start = { x: object.x, y: object.y };
}
_this.amount = amount;
_this.duration = duration;
}
return _this;
}
_createClass(shake, [{
key: 'save',
value: function save() {
var save = _get(shake.prototype.__proto__ || Object.getPrototypeOf(shake.prototype), 'save', this).call(this);
save.start = this.start;
save.amount = this.amount;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(shake.prototype.__proto__ || Object.getPrototypeOf(shake.prototype), 'load', this).call(this, _load);
this.start = _load.start;
this.amount = _load.amount;
}
}, {
key: 'calculate',
value: function calculate() /*elapsed*/{
var object = this.object;
var start = this.start;
var amount = this.amount;
if (this.array) {
var list = this.list;
for (var i = 0; i < list.length; i++) {
var _object = list[i];
var actual = start[i];
_object.x = actual.x + Math.floor(Math.random() * amount * 2) - amount;
_object.y = actual.y + Math.floor(Math.random() * amount * 2) - amount;
}
}
object.x = start.x + Math.floor(Math.random() * amount * 2) - amount;
object.y = start.y + Math.floor(Math.random() * amount * 2) - amount;
}
}, {
key: 'done',
value: function done() {
var object = this.object;
var start = this.start;
if (this.array) {
var list = this.list;
for (var i = 0; i < list.length; i++) {
var _object2 = list[i];
var actual = start[i];
_object2.x = actual.x;
_object2.y = actual.y;
}
} else {
object.x = start.x;
object.y = start.y;
}
}
}]);
return shake;
}(wait);
module.exports = shake;
},{"./wait":11}],8:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var wait = require('./wait');
/** move an object to a target's location */
var target = function (_wait) {
_inherits(target, _wait);
/**
* move to a target
* @param {object} object - object to animate
* @param {object} target - object needs to contain {x: x, y: y}
* @param {number} speed - number of pixels to move per millisecond
* @param {object} [options] @see {@link Wait}
* @param {boolean} [options.keepAlive] don't cancel the animation when target is reached
*/
function target(object, _target, speed, options) {
_classCallCheck(this, target);
options = options || {};
var _this = _possibleConstructorReturn(this, (target.__proto__ || Object.getPrototypeOf(target)).call(this, object, options));
_this.type = 'Target';
_this.target = _target;
if (options.load) {
_this.load(options.load);
} else {
_this.speed = speed;
}
return _this;
}
_createClass(target, [{
key: 'save',
value: function save() {
var save = _get(target.prototype.__proto__ || Object.getPrototypeOf(target.prototype), 'save', this).call(this);
save.speed = this.speed;
save.keepAlive = this.options.keepAlive;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(target.prototype.__proto__ || Object.getPrototypeOf(target.prototype), 'load', this).call(this, _load);
this.speed = _load.speed;
this.options.keepAlive = _load.keepAlive;
}
}, {
key: 'calculate',
value: function calculate(elapsed) {
var deltaX = this.target.x - this.object.x;
var deltaY = this.target.y - this.object.y;
if (deltaX === 0 && deltaY === 0) {
this.emit('done', this.object);
if (!this.options.keepAlive) {
return true;
}
} else {
var angle = Math.atan2(deltaY, deltaX);
this.object.x += Math.cos(angle) * elapsed * this.speed;
this.object.y += Math.sin(angle) * elapsed * this.speed;
if (deltaX >= 0 !== this.target.x - this.object.x >= 0) {
this.object.x = this.target.x;
}
if (deltaY >= 0 !== this.target.y - this.object.y >= 0) {
this.object.y = this.target.y;
}
}
}
}]);
return target;
}(wait);
module.exports = target;
},{"./wait":11}],9:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Color = require('yy-color');
var wait = require('./wait');
var tint = function (_wait) {
_inherits(tint, _wait);
/**
* @param {PIXI.DisplayObject|PIXI.DisplayObject[]} object
* @param {number|number[]} tint
* @param {number} [duration] in milliseconds
* @param {object} [options] @see {@link Wait}
*/
function tint(object, _tint, duration, options) {
_classCallCheck(this, tint);
options = options || {};
var _this = _possibleConstructorReturn(this, (tint.__proto__ || Object.getPrototypeOf(tint)).call(this, object, options));
_this.type = 'Tint';
if (Array.isArray(object)) {
_this.list = object;
_this.object = _this.list[0];
}
_this.duration = duration;
if (options.load) {
_this.load(options.load);
} else if (Array.isArray(_tint)) {
_this.tints = [_this.object.tint].concat(_toConsumableArray(_tint));
} else {
_this.start = _this.object.tint;
_this.to = _tint;
}
return _this;
}
_createClass(tint, [{
key: 'save',
value: function save() {
var save = _get(tint.prototype.__proto__ || Object.getPrototypeOf(tint.prototype), 'save', this).call(this);
save.start = this.start;
save.to = this.to;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(tint.prototype.__proto__ || Object.getPrototypeOf(tint.prototype), 'load', this).call(this, _load);
this.start = _load.start;
this.to = _load.to;
}
}, {
key: 'calculate',
value: function calculate() {
var percent = this.options.ease(this.time, 0, 1, this.duration);
if (this.tints) {
var each = 1 / (this.tints.length - 1);
var per = each;
for (var i = 1; i < this.tints.length; i++) {
if (percent <= per) {
var color = Color.blend(1 - (per - percent) / each, this.tints[i - 1], this.tints[i]);
if (this.list) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = this.list[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var object = _step.value;
object.tint = color;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
} else {
this.object.tint = color;
}
break;
}
per += each;
}
} else {
var _color = Color.blend(percent, this.start, this.to);
if (this.list) {
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = this.list[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _object = _step2.value;
_object.tint = _color;
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
} else {
this.object.tint = _color;
}
}
}
}, {
key: 'reverse',
value: function reverse() {
if (this.tints) {
var tints = [];
for (var i = this.tints.length - 1; i >= 0; i--) {
tints.push(this.tints[i]);
}
this.tints = tints;
} else {
var swap = this.to;
this.to = this.start;
this.start = swap;
}
}
}]);
return tint;
}(wait);
module.exports = tint;
},{"./wait":11,"yy-color":23}],10:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var wait = require('./wait');
/** animate any numeric parameter of an object or array of objects */
var to = function (_wait) {
_inherits(to, _wait);
/**
* @private
* @param {object} object to animate
* @param {object} goto - parameters to animate, e.g.: {alpha: 5, scale: {3, 5}, scale: 5, rotation: Math.PI}
* @param {number} duration - time to run
* @param {object} [options]
* @param {number} [options.wait=0] n milliseconds before starting animation (can also be used to pause animation for a length of time)
* @param {boolean} [options.pause] start the animation paused
* @param {boolean|number} [options.repeat] true: repeat animation forever n: repeat animation n times
* @param {boolean|number} [options.reverse] true: reverse animation (if combined with repeat, then pulse) n: reverse animation n times
* @param {Function} [options.load] loads an animation using an .save() object note the * parameters below cannot be loaded and must be re-set
* @param {string|Function} [options.ease] name or function from easing.js (see http://easings.net for examples)
* @emits to:done animation expires
* @emits to:wait each update during a wait
* @emits to:first first update when animation starts
* @emits to:each each update while animation is running
* @emits to:loop when animation is repeated
* @emits to:reverse when animation is reversed
*/
function to(object, goto, duration, options) {
_classCallCheck(this, to);
options = options || {};
var _this = _possibleConstructorReturn(this, (to.__proto__ || Object.getPrototypeOf(to)).call(this, object, options));
_this.type = 'To';
if (Array.isArray(object)) {
_this.list = object;
_this.object = _this.list[0];
}
if (options.load) {
_this.load(options.load);
} else {
_this.goto = goto;
_this.fixScale();
_this.duration = duration;
_this.restart();
}
return _this;
}
/**
* converts scale from { scale: n } to { scale: { x: n, y: n }}
* @private
*/
_createClass(to, [{
key: 'fixScale',
value: function fixScale() {
if (typeof this.goto['scale'] !== 'undefined' && !Number.isNaN(this.goto['scale'])) {
this.goto['scale'] = { x: this.goto['scale'], y: this.goto['scale'] };
}
}
}, {
key: 'save',
value: function save() {
var save = _get(to.prototype.__proto__ || Object.getPrototypeOf(to.prototype), 'save', this).call(this);
save.goto = this.goto;
save.start = this.start;
save.delta = this.delta;
save.keys = this.keys;
return save;
}
}, {
key: 'load',
value: function load(_load) {
_get(to.prototype.__proto__ || Object.getPrototypeOf(to.prototype), 'load', this).call(this, _load);
this.goto = _load.goto;
this.start = _load.start;
this.delta = _load.delta;
this.keys = _load.keys;
}
}, {
key: 'restart',
value: function restart() {
var i = 0;
var start = this.start = [];
var delta = this.delta = [];
var keys = this.keys = [];
var goto = this.goto;
var object = this.object;
// loops through all keys in goto object
for (var key in goto) {
// handles keys with one additional level e.g.: goto = {scale: {x: 5, y: 3}}
if (isNaN(goto[key])) {
keys[i] = { key: key, children: [] };
start[i] = [];
delta[i] = [];
var j = 0;
for (var key2 in goto[key]) {
keys[i].children[j] = key2;
start[i][j] = parseFloat(object[key][key2]);
start[i][j] = this._correctDOM(key2, start[i][j]);
start[i][j] = isNaN(this.start[i][j]) ? 0 : start[i][j];
delta[i][j] = goto[key][key2] - start[i][j];
j++;
}
} else {
start[i] = parseFloat(object[key]);
start[i] = this._correctDOM(key, start[i]);
start[i] = isNaN(this.start[i]) ? 0 : start[i];
delta[i] = goto[key] - start[i];
keys[i] = key;
}
i++;
}
this.time = 0;
}
}, {
key: 'reverse',
value: function reverse() {
var object = this.object;
var keys = this.keys;
var goto = this.goto;
var delta = this.delta;
var start = this.start;
for (var i = 0, _i = keys.length; i < _i; i++) {
var key = keys[i];
if (isNaN(goto[key])) {
for (var j = 0, _j = key.children.length; j < _j; j++) {
delta[i][j] = -delta[i][j];
start[i][j] = parseFloat(object[key.key][key.children[j]]);
start[i][j] = isNaN(start[i][j]) ? 0 : start[i][j];
}
} else {
delta[i] = -delta[i];
start[i] = parseFloat(object[key]);
start[i] = isNaN(start[i]) ? 0 : start[i];
}
}
}
}, {
key: 'calculate',
value: function calculate() /*elapsed*/{
var object = this.object;
var list = this.list;
var keys = this.keys;
var goto = this.goto;
var time = this.time;
var start = this.start;
var delta = this.delta;
var duration = this.duration;
var ease = this.options.ease;
for (var i = 0, _i = this.keys.length; i < _i; i++) {
var key = keys[i];
if (isNaN(goto[key])) {
var key1 = key.key;
for (var j = 0, _j = key.children.length; j < _j; j++) {
var key2 = key.children[j];
var others = object[key1][key2] = time >= duration ? start[i][j] + delta[i][j] : ease(time, start[i][j], delta[i][j], duration);
if (list) {
for (var k = 1, _k = list.length; k < _k; k++) {
list[k][key1][key2] = others;
}
}
}
} else {
var _key = keys[i];
var _others = object[_key] = time >= duration ? start[i] + delta[i] : ease(time, start[i], delta[i], duration);
if (list) {
for (var _j2 = 1, _j3 = this.list.length; _j2 < _j3; _j2++) {
list[_j2][_key] = _others;
}
}
}
}
}
}]);
return to;
}(wait);
module.exports = to;
},{"./wait":11}],11:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Easing = require('penner');
var EventEmitter = require('eventemitter3');
var wait = function (_EventEmitter) {
_inherits(wait, _EventEmitter);
/**
* @param {object|object[]} object or list of objects to animate
* @param {object} [options]
* @param {number} [options.wait=0] n milliseconds before starting animation (can also be used to pause animation for a length of time)
* @param {boolean} [options.pause] start the animation paused
* @param {(boolean|number)} [options.repeat] true: repeat animation forever n: repeat animation n times
* @param {(boolean|number)} [options.reverse] true: reverse animation (if combined with repeat, then pulse) n: reverse animation n times
*
* @param {number} [options.id] user-generated id (e.g., I use it to properly load animations when an object has multiple animations running)
* @param {Function} [options.load] loads an animation using an .save() object note the * parameters below cannot be loaded and must be re-set
* @param {Function|string} [options.ease] function (or penner function name) from easing.js (see http://easings.net for examples)*
*
* @emits {done} animation expires
* @emits {wait} each update during a wait
* @emits {first} first update when animation starts
* @emits {each} each update while animation is running
* @emits {loop} when animation is repeated
* @emits {reverse} when animation is reversed
*/
function wait(object, options) {
_classCallCheck(this, wait);
var _this = _possibleConstructorReturn(this, (wait.__proto__ || Object.getPrototypeOf(wait)).call(this));
_this.object = object;
_this.options = options || {};
_this.type = 'Wait';
if (_this.options.load) {
_this.load(_this.options.load);
} else {
_this.time = 0;
}
if (_this.options.ease && typeof _this.options.ease !== 'function') {
_this.options.easeName = _this.options.ease;
_this.options.ease = Easing[_this.options.ease];
}
if (!_this.options.ease) {
_this.options.ease = Easing['linear'];
}
return _this;
}
_createClass(wait, [{
key: 'save',
value: function save() {
var save = { type: this.type, time: this.time, duration: this.duration, ease: this.options.easeName };
var options = this.options;
if (options.wait) {
save.wait = options.wait;
}
if (typeof options.id !== 'undefined') {
save.id = options.id;
}
if (options.pause) {
save.pause = options.pause;
}
if (options.repeat) {
save.repeat = options.repeat;
}
if (options.reverse) {
save.reverse = options.reverse;
}
return save;
}
}, {
key: 'load',
value: function load(_load) {
this.options.wait = _load.wait;
this.options.pause = _load.pause;
this.options.repeat = _load.repeat;
this.options.reverse = _load.reverse;
this.options.id = _load.id;
this.options.ease = _load.ease;
if (this.options.ease && typeof this.options.ease !== 'function') {
this.options.easeName = this.options.ease;
this.options.ease = Easing[this.options.ease];
}
if (!this.options.ease) {
this.options.ease = Easing['linear'];
}
this.time = _load.time;
this.duration = _load.duration;
}
/**
* pause this entry
* @type {boolean}
*/
}, {
key: 'end',
value: function end(leftOver) {
if (this.options.reverse) {
this.reverse();
this.time = leftOver;
if (!this.options.repeat) {
if (this.options.reverse === true) {
this.options.reverse = false;
} else {
this.options.reverse--;
}
} else {
if (this.options.repeat !== true) {
this.options.repeat--;
}
}
this.emit('loop', this.list || this.object);
} else if (this.options.repeat) {
this.time = leftOver;
if (this.options.repeat !== true) {
this.options.repeat--;
}
this.emit('loop', this.list || this.object);
} else {
this.done();
this.emit('done', this.list || this.object, leftOver);
// this.list = this.object = null
return true;
}
}
}, {
key: 'update',
value: function update(elapsed) {
var options = this.options;
if (options.pause) {
return;
}
if (options.wait) {
options.wait -= elapsed;
if (options.wait <= 0) {
elapsed = -options.wait;
options.wait = false;
} else {
this.emit('wait', elapsed, this.list || this.object);
return;
}
}
if (!this.first) {
this.first = true;
this.emit('first', this.list || this.object);
}
this.time += elapsed;
var leftOver = 0;
var duration = this.duration;
var time = this.time;
if (duration !== 0 && time > duration) {
leftOver = time - duration;
this.time = time = duration;
}
var force = this.calculate(elapsed);
this.emit('each', elapsed, this.list || this.object, this);
if (this.type === 'Wait' || duration !== 0 && time === duration) {
return this.end(leftOver);
}
return force || time === duration;
}
// correct certain DOM values
}, {
key: '_correctDOM',
value: function _correctDOM(key, value) {
switch (key) {
case 'opacity':
return isNaN(value) ? 1 : value;
}
return value;
}
}, {
key: 'reverse',
value: function reverse() {}
}, {
key: 'calculate',
value: function calculate() {}
}, {
key: 'done',
value: function done() {}
}, {
key: 'pause',
set: function set(value) {
this.options.pause = value;
},
get: function get() {
return this.options.pause;
}
}]);
return wait;
}(EventEmitter);
module.exports = wait;
},{"eventemitter3":12,"penner":13}],12:[function(require,module,exports){
'use strict';
var has = Object.prototype.hasOwnProperty
, prefix = '~';
/**
* Constructor to create a storage for our `EE` objects.
* An `Events` instance is a plain object whose properties are event names.
*
* @constructor
* @private
*/
function Events() {}
//
// We try to not inherit from `Object.prototype`. In some engines creating an
// instance in this way is faster than calling `Object.create(null)` directly.
// If `Object.create(null)` is not supported we prefix the event names with a
// character to make sure that the built-in object properties are not
// overridden or used as an attack vector.
//
if (Object.create) {
Events.prototype = Object.create(null);
//
// This hack is needed because the `__proto__` property is still inherited in
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
//
if (!new Events().__proto__) prefix = false;
}
/**
* Representation of a single event listener.
*
* @param {Function} fn The listener function.
* @param {*} context The context to invoke the listener with.
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
* @constructor
* @private
*/
function EE(fn, context, once) {
this.fn = fn;
this.context = context;
this.once = once || false;
}
/**
* Add a listener for a given event.
*
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
* @param {(String|Symbol)} event The event name.
* @param {Function} fn The listener function.
* @param {*} context The context to invoke the listener with.
* @param {Boolean} once Specify if the listener is a one-time listener.
* @returns {EventEmitter}
* @private
*/
function addListener(emitter, event, fn, context, once) {
if (typeof fn !== 'function') {
throw new TypeError('The listener must be a function');
}
var listener = new EE(fn, context || emitter, once)
, evt = prefix ? prefix + event : event;
if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
else emitter._events[evt] = [emitter._events[evt], listener];
return emitter;
}
/**
* Clear event by name.
*
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
* @param {(String|Symbol)} evt The Event name.
* @private
*/
function clearEvent(emitter, evt) {
if (--emitter._eventsCount === 0) emitter._events = new Events();
else delete emitter._events[evt];
}
/**
* Minimal `EventEmitter` interface that is molded against the Node.js
* `EventEmitter` interface.
*
* @constructor
* @public
*/
function EventEmitter() {
this._events = new Events();
this._eventsCount = 0;
}
/**
* Return an array listing the events for which the emitter has registered
* listeners.
*
* @returns {Array}
* @public
*/
EventEmitter.prototype.eventNames = function eventNames() {
var names = []
, events
, name;
if (this._eventsCount === 0) return names;
for (name in (events = this._events)) {
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
}
if (Object.getOwnPropertySymbols) {
return names.concat(Object.getOwnPropertySymbols(events));
}
return names;
};
/**
* Return the listeners registered for a given event.
*
* @param {(String|Symbol)} event The event name.
* @returns {Array} The registered listeners.
* @public
*/
EventEmitter.prototype.listeners = function listeners(event) {
var evt = prefix ? prefix + event : event
, handlers = this._events[evt];
if (!handlers) return [];
if (handlers.fn) return [handlers.fn];
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
ee[i] = handlers[i].fn;
}
return ee;
};
/**
* Return the number of listeners listening to a given event.
*
* @param {(String|Symbol)} event The event name.
* @returns {Number} The number of listeners.
* @public
*/
EventEmitter.prototype.listenerCount = function listenerCount(event) {
var evt = prefix ? prefix + event : event
, listeners = this._events[evt];
if (!listeners) return 0;
if (listeners.fn) return 1;
return listeners.length;
};
/**
* Calls each of the listeners registered for a given event.
*
* @param {(String|Symbol)} event The event name.
* @returns {Boolean} `true` if the event had listeners, else `false`.
* @public
*/
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
var evt = prefix ? prefix + event : event;
if (!this._events[evt]) return false;
var listeners = this._events[evt]
, len = arguments.length
, args
, i;
if (listeners.fn) {
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
switch (len) {
case 1: return listeners.fn.call(listeners.context), true;
case 2: return listeners.fn.call(listeners.context, a1), true;
case 3: return listeners.fn.call(listeners.context, a1, a2), true;
case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
}
for (i = 1, args = new Array(len -1); i < len; i++) {
args[i - 1] = arguments[i];
}
listeners.fn.apply(listeners.context, args);
} else {
var length = listeners.length
, j;
for (i = 0; i < length; i++) {
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
switch (len) {
case 1: listeners[i].fn.call(listeners[i].context); break;
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
default:
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
args[j - 1] = arguments[j];
}
listeners[i].fn.apply(listeners[i].context, args);
}
}
}
return true;
};
/**
* Add a listener for a given event.
*
* @param {(String|Symbol)} event The event name.
* @param {Function} fn The listener function.
* @param {*} [context=this] The context to invoke the listener with.
* @returns {EventEmitter} `this`.
* @public
*/
EventEmitter.prototype.on = function on(event, fn, context) {
return addListener(this, event, fn, context, false);
};
/**
* Add a one-time listener for a given event.
*
* @param {(String|Symbol)} event The event name.
* @param {Function} fn The listener function.
* @param {*} [context=this] The context to invoke the listener with.
* @returns {EventEmitter} `this`.
* @public
*/
EventEmitter.prototype.once = function once(event, fn, context) {
return addListener(this, event, fn, context, true);
};
/**
* Remove the listeners of a given event.
*
* @param {(String|Symbol)} event The event name.
* @param {Function} fn Only remove the listeners that match this function.
* @param {*} context Only remove the listeners that have this context.
* @param {Boolean} once Only remove one-time listeners.
* @returns {EventEmitter} `this`.
* @public
*/
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
var evt = prefix ? prefix + event : event;
if (!this._events[evt]) return this;
if (!fn) {
clearEvent(this, evt);
return this;
}
var listeners = this._events[evt];
if (listeners.fn) {
if (
listeners.fn === fn &&
(!once || listeners.once) &&
(!context || listeners.context === context)
) {
clearEvent(this, evt);
}
} else {
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
if (
listeners[i].fn !== fn ||
(once && !listeners[i].once) ||
(context && listeners[i].context !== context)
) {
events.push(listeners[i]);
}
}
//
// Reset the array, or remove it completely if we have no more listeners.
//
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
else clearEvent(this, evt);
}
return this;
};
/**
* Remove all listeners, or those of the specified event.
*
* @param {(String|Symbol)} [event] The event name.
* @returns {EventEmitter} `this`.
* @public
*/
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
var evt;
if (event) {
evt = prefix ? prefix + event : event;
if (this._events[evt]) clearEvent(this, evt);
} else {
this._events = new Events();
this._eventsCount = 0;
}
return this;
};
//
// Alias methods names because people roll like that.
//
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
//
// Expose the prefix.
//
EventEmitter.prefixed = prefix;
//
// Allow `EventEmitter` to be imported as module namespace.
//
EventEmitter.EventEmitter = EventEmitter;
//
// Expose the module.
//
if ('undefined' !== typeof module) {
module.exports = EventEmitter;
}
},{}],13:[function(require,module,exports){
/*
Copyright © 2001 Robert Penner
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other materials
provided with the distribution.
Neither the name of the author nor the names of contributors may be used to endorse
or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function() {
var penner, umd;
umd = function(factory) {
if (typeof exports === 'object') {
return module.exports = factory;
} else if (typeof define === 'function' && define.amd) {
return define([], factory);
} else {
return this.penner = factory;
}
};
penner = {
linear: function(t, b, c, d) {
return c * t / d + b;
},
easeInQuad: function(t, b, c, d) {
return c * (t /= d) * t + b;
},
easeOutQuad: function(t, b, c, d) {
return -c * (t /= d) * (t - 2) + b;
},
easeInOutQuad: function(t, b, c, d) {
if ((t /= d / 2) < 1) {
return c / 2 * t * t + b;
} else {
return -c / 2 * ((--t) * (t - 2) - 1) + b;
}
},
easeInCubic: function(t, b, c, d) {
return c * (t /= d) * t * t + b;
},
easeOutCubic: function(t, b, c, d) {
return c * ((t = t / d - 1) * t * t + 1) + b;
},
easeInOutCubic: function(t, b, c, d) {
if ((t /= d / 2) < 1) {
return c / 2 * t * t * t + b;
} else {
return c / 2 * ((t -= 2) * t * t + 2) + b;
}
},
easeInQuart: function(t, b, c, d) {
return c * (t /= d) * t * t * t + b;
},
easeOutQuart: function(t, b, c, d) {
return -c * ((t = t / d - 1) * t * t * t - 1) + b;
},
easeInOutQuart: function(t, b, c, d) {
if ((t /= d / 2) < 1) {
return c / 2 * t * t * t * t + b;
} else {
return -c / 2 * ((t -= 2) * t * t * t - 2) + b;
}
},
easeInQuint: function(t, b, c, d) {
return c * (t /= d) * t * t * t * t + b;
},
easeOutQuint: function(t, b, c, d) {
return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
},
easeInOutQuint: function(t, b, c, d) {
if ((t /= d / 2) < 1) {
return c / 2 * t * t * t * t * t + b;
} else {
return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
}
},
easeInSine: function(t, b, c, d) {
return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
},
easeOutSine: function(t, b, c, d) {
return c * Math.sin(t / d * (Math.PI / 2)) + b;
},
easeInOutSine: function(t, b, c, d) {
return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
},
easeInExpo: function(t, b, c, d) {
if (t === 0) {
return b;
} else {
return c * Math.pow(2, 10 * (t / d - 1)) + b;
}
},
easeOutExpo: function(t, b, c, d) {
if (t === d) {
return b + c;
} else {
return c * (-Math.pow(2, -10 * t / d) + 1) + b;
}
},
easeInOutExpo: function(t, b, c, d) {
if (t === 0) {
b;
}
if (t === d) {
b + c;
}
if ((t /= d / 2) < 1) {
return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
} else {
return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
}
},
easeInCirc: function(t, b, c, d) {
return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
},
easeOutCirc: function(t, b, c, d) {
return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
},
easeInOutCirc: function(t, b, c, d) {
if ((t /= d / 2) < 1) {
return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
} else {
return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
}
},
easeInElastic: function(t, b, c, d) {
var a, p, s;
s = 1.70158;
p = 0;
a = c;
if (t === 0) {
b;
} else if ((t /= d) === 1) {
b + c;
}
if (!p) {
p = d * .3;
}
if (a < Math.abs(c)) {
a = c;
s = p / 4;
} else {
s = p / (2 * Math.PI) * Math.asin(c / a);
}
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
},
easeOutElastic: function(t, b, c, d) {
var a, p, s;
s = 1.70158;
p = 0;
a = c;
if (t === 0) {
b;
} else if ((t /= d) === 1) {
b + c;
}
if (!p) {
p = d * .3;
}
if (a < Math.abs(c)) {
a = c;
s = p / 4;
} else {
s = p / (2 * Math.PI) * Math.asin(c / a);
}
return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
},
easeInOutElastic: function(t, b, c, d) {
var a, p, s;
s = 1.70158;
p = 0;
a = c;
if (t === 0) {
b;
} else if ((t /= d / 2) === 2) {
b + c;
}
if (!p) {
p = d * (.3 * 1.5);
}
if (a < Math.abs(c)) {
a = c;
s = p / 4;
} else {
s = p / (2 * Math.PI) * Math.asin(c / a);
}
if (t < 1) {
return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
} else {
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
}
},
easeInBack: function(t, b, c, d, s) {
if (s === void 0) {
s = 1.70158;
}
return c * (t /= d) * t * ((s + 1) * t - s) + b;
},
easeOutBack: function(t, b, c, d, s) {
if (s === void 0) {
s = 1.70158;
}
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
},
easeInOutBack: function(t, b, c, d, s) {
if (s === void 0) {
s = 1.70158;
}
if ((t /= d / 2) < 1) {
return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;
} else {
return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;
}
},
easeInBounce: function(t, b, c, d) {
var v;
v = penner.easeOutBounce(d - t, 0, c, d);
return c - v + b;
},
easeOutBounce: function(t, b, c, d) {
if ((t /= d) < 1 / 2.75) {
return c * (7.5625 * t * t) + b;
} else if (t < 2 / 2.75) {
return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b;
} else if (t < 2.5 / 2.75) {
return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b;
} else {
return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b;
}
},
easeInOutBounce: function(t, b, c, d) {
var v;
if (t < d / 2) {
v = penner.easeInBounce(t * 2, 0, c, d);
return v * .5 + b;
} else {
v = penner.easeOutBounce(t * 2 - d, 0, c, d);
return v * .5 + c * .5 + b;
}
}
};
umd(penner);
}).call(this);
},{}],14:[function(require,module,exports){
// A library of seedable RNGs implemented in Javascript.
//
// Usage:
//
// var seedrandom = require('seedrandom');
// var random = seedrandom(1); // or any seed.
// var x = random(); // 0 <= x < 1. Every bit is random.
// var x = random.quick(); // 0 <= x < 1. 32 bits of randomness.
// alea, a 53-bit multiply-with-carry generator by Johannes Baagøe.
// Period: ~2^116
// Reported to pass all BigCrush tests.
var alea = require('./lib/alea');
// xor128, a pure xor-shift generator by George Marsaglia.
// Period: 2^128-1.
// Reported to fail: MatrixRank and LinearComp.
var xor128 = require('./lib/xor128');
// xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl.
// Period: 2^192-2^32
// Reported to fail: CollisionOver, SimpPoker, and LinearComp.
var xorwow = require('./lib/xorwow');
// xorshift7, by François Panneton and Pierre L'ecuyer, takes
// a different approach: it adds robustness by allowing more shifts
// than Marsaglia's original three. It is a 7-shift generator
// with 256 bits, that passes BigCrush with no systmatic failures.
// Period 2^256-1.
// No systematic BigCrush failures reported.
var xorshift7 = require('./lib/xorshift7');
// xor4096, by Richard Brent, is a 4096-bit xor-shift with a
// very long period that also adds a Weyl generator. It also passes
// BigCrush with no systematic failures. Its long period may
// be useful if you have many generators and need to avoid
// collisions.
// Period: 2^4128-2^32.
// No systematic BigCrush failures reported.
var xor4096 = require('./lib/xor4096');
// Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random
// number generator derived from ChaCha, a modern stream cipher.
// https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf
// Period: ~2^127
// No systematic BigCrush failures reported.
var tychei = require('./lib/tychei');
// The original ARC4-based prng included in this library.
// Period: ~2^1600
var sr = require('./seedrandom');
sr.alea = alea;
sr.xor128 = xor128;
sr.xorwow = xorwow;
sr.xorshift7 = xorshift7;
sr.xor4096 = xor4096;
sr.tychei = tychei;
module.exports = sr;
},{"./lib/alea":15,"./lib/tychei":16,"./lib/xor128":17,"./lib/xor4096":18,"./lib/xorshift7":19,"./lib/xorwow":20,"./seedrandom":21}],15:[function(require,module,exports){
// A port of an algorithm by Johannes Baagøe <baagoe@baagoe.com>, 2010
// http://baagoe.com/en/RandomMusings/javascript/
// https://github.com/nquinlan/better-random-numbers-for-javascript-mirror
// Original work is under MIT license -
// Copyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
(function(global, module, define) {
function Alea(seed) {
var me = this, mash = Mash();
me.next = function() {
var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32
me.s0 = me.s1;
me.s1 = me.s2;
return me.s2 = t - (me.c = t | 0);
};
// Apply the seeding algorithm from Baagoe.
me.c = 1;
me.s0 = mash(' ');
me.s1 = mash(' ');
me.s2 = mash(' ');
me.s0 -= mash(seed);
if (me.s0 < 0) { me.s0 += 1; }
me.s1 -= mash(seed);
if (me.s1 < 0) { me.s1 += 1; }
me.s2 -= mash(seed);
if (me.s2 < 0) { me.s2 += 1; }
mash = null;
}
function copy(f, t) {
t.c = f.c;
t.s0 = f.s0;
t.s1 = f.s1;
t.s2 = f.s2;
return t;
}
function impl(seed, opts) {
var xg = new Alea(seed),
state = opts && opts.state,
prng = xg.next;
prng.int32 = function() { return (xg.next() * 0x100000000) | 0; }
prng.double = function() {
return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
};
prng.quick = prng;
if (state) {
if (typeof(state) == 'object') copy(state, xg);
prng.state = function() { return copy(xg, {}); }
}
return prng;
}
function Mash() {
var n = 0xefc8249d;
var mash = function(data) {
data = data.toString();
for (var i = 0; i < data.length; i++) {
n += data.charCodeAt(i);
var h = 0.02519603282416938 * n;
n = h >>> 0;
h -= n;
h *= n;
n = h >>> 0;
h -= n;
n += h * 0x100000000; // 2^32
}
return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
};
return mash;
}
if (module && module.exports) {
module.exports = impl;
} else if (define && define.amd) {
define(function() { return impl; });
} else {
this.alea = impl;
}
})(
this,
(typeof module) == 'object' && module, // present in node.js
(typeof define) == 'function' && define // present with an AMD loader
);
},{}],16:[function(require,module,exports){
// A Javascript implementaion of the "Tyche-i" prng algorithm by
// Samuel Neves and Filipe Araujo.
// See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf
(function(global, module, define) {
function XorGen(seed) {
var me = this, strseed = '';
// Set up generator function.
me.next = function() {
var b = me.b, c = me.c, d = me.d, a = me.a;
b = (b << 25) ^ (b >>> 7) ^ c;
c = (c - d) | 0;
d = (d << 24) ^ (d >>> 8) ^ a;
a = (a - b) | 0;
me.b = b = (b << 20) ^ (b >>> 12) ^ c;
me.c = c = (c - d) | 0;
me.d = (d << 16) ^ (c >>> 16) ^ a;
return me.a = (a - b) | 0;
};
/* The following is non-inverted tyche, which has better internal
* bit diffusion, but which is about 25% slower than tyche-i in JS.
me.next = function() {
var a = me.a, b = me.b, c = me.c, d = me.d;
a = (me.a + me.b | 0) >>> 0;
d = me.d ^ a; d = d << 16 ^ d >>> 16;
c = me.c + d | 0;
b = me.b ^ c; b = b << 12 ^ d >>> 20;
me.a = a = a + b | 0;
d = d ^ a; me.d = d = d << 8 ^ d >>> 24;
me.c = c = c + d | 0;
b = b ^ c;
return me.b = (b << 7 ^ b >>> 25);
}
*/
me.a = 0;
me.b = 0;
me.c = 2654435769 | 0;
me.d = 1367130551;
if (seed === Math.floor(seed)) {
// Integer seed.
me.a = (seed / 0x100000000) | 0;
me.b = seed | 0;
} else {
// String seed.
strseed += seed;
}
// Mix in string seed, then discard an initial batch of 64 values.
for (var k = 0; k < strseed.length + 20; k++) {
me.b ^= strseed.charCodeAt(k) | 0;
me.next();
}
}
function copy(f, t) {
t.a = f.a;
t.b = f.b;
t.c = f.c;
t.d = f.d;
return t;
};
function impl(seed, opts) {
var xg = new XorGen(seed),
state = opts && opts.state,
prng = function() { return (xg.next() >>> 0) / 0x100000000; };
prng.double = function() {
do {
var top = xg.next() >>> 11,
bot = (xg.next() >>> 0) / 0x100000000,
result = (top + bot) / (1 << 21);
} while (result === 0);
return result;
};
prng.int32 = xg.next;
prng.quick = prng;
if (state) {
if (typeof(state) == 'object') copy(state, xg);
prng.state = function() { return copy(xg, {}); }
}
return prng;
}
if (module && module.exports) {
module.exports = impl;
} else if (define && define.amd) {
define(function() { return impl; });
} else {
this.tychei = impl;
}
})(
this,
(typeof module) == 'object' && module, // present in node.js
(typeof define) == 'function' && define // present with an AMD loader
);
},{}],17:[function(require,module,exports){
// A Javascript implementaion of the "xor128" prng algorithm by
// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper
(function(global, module, define) {
function XorGen(seed) {
var me = this, strseed = '';
me.x = 0;
me.y = 0;
me.z = 0;
me.w = 0;
// Set up generator function.
me.next = function() {
var t = me.x ^ (me.x << 11);
me.x = me.y;
me.y = me.z;
me.z = me.w;
return me.w ^= (me.w >>> 19) ^ t ^ (t >>> 8);
};
if (seed === (seed | 0)) {
// Integer seed.
me.x = seed;
} else {
// String seed.
strseed += seed;
}
// Mix in string seed, then discard an initial batch of 64 values.
for (var k = 0; k < strseed.length + 64; k++) {
me.x ^= strseed.charCodeAt(k) | 0;
me.next();
}
}
function copy(f, t) {
t.x = f.x;
t.y = f.y;
t.z = f.z;
t.w = f.w;
return t;
}
function impl(seed, opts) {
var xg = new XorGen(seed),
state = opts && opts.state,
prng = function() { return (xg.next() >>> 0) / 0x100000000; };
prng.double = function() {
do {
var top = xg.next() >>> 11,
bot = (xg.next() >>> 0) / 0x100000000,
result = (top + bot) / (1 << 21);
} while (result === 0);
return result;
};
prng.int32 = xg.next;
prng.quick = prng;
if (state) {
if (typeof(state) == 'object') copy(state, xg);
prng.state = function() { return copy(xg, {}); }
}
return prng;
}
if (module && module.exports) {
module.exports = impl;
} else if (define && define.amd) {
define(function() { return impl; });
} else {
this.xor128 = impl;
}
})(
this,
(typeof module) == 'object' && module, // present in node.js
(typeof define) == 'function' && define // present with an AMD loader
);
},{}],18:[function(require,module,exports){
// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.
//
// This fast non-cryptographic random number generator is designed for
// use in Monte-Carlo algorithms. It combines a long-period xorshift
// generator with a Weyl generator, and it passes all common batteries
// of stasticial tests for randomness while consuming only a few nanoseconds
// for each prng generated. For background on the generator, see Brent's
// paper: "Some long-period random number generators using shifts and xors."
// http://arxiv.org/pdf/1004.3115v1.pdf
//
// Usage:
//
// var xor4096 = require('xor4096');
// random = xor4096(1); // Seed with int32 or string.
// assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits.
// assert.equal(random.int32(), 1806534897); // signed int32, 32 bits.
//
// For nonzero numeric keys, this impelementation provides a sequence
// identical to that by Brent's xorgens 3 implementaion in C. This
// implementation also provides for initalizing the generator with
// string seeds, or for saving and restoring the state of the generator.
//
// On Chrome, this prng benchmarks about 2.1 times slower than
// Javascript's built-in Math.random().
(function(global, module, define) {
function XorGen(seed) {
var me = this;
// Set up generator function.
me.next = function() {
var w = me.w,
X = me.X, i = me.i, t, v;
// Update Weyl generator.
me.w = w = (w + 0x61c88647) | 0;
// Update xor generator.
v = X[(i + 34) & 127];
t = X[i = ((i + 1) & 127)];
v ^= v << 13;
t ^= t << 17;
v ^= v >>> 15;
t ^= t >>> 12;
// Update Xor generator array state.
v = X[i] = v ^ t;
me.i = i;
// Result is the combination.
return (v + (w ^ (w >>> 16))) | 0;
};
function init(me, seed) {
var t, v, i, j, w, X = [], limit = 128;
if (seed === (seed | 0)) {
// Numeric seeds initialize v, which is used to generates X.
v = seed;
seed = null;
} else {
// String seeds are mixed into v and X one character at a time.
seed = seed + '\0';
v = 0;
limit = Math.max(limit, seed.length);
}
// Initialize circular array and weyl value.
for (i = 0, j = -32; j < limit; ++j) {
// Put the unicode characters into the array, and shuffle them.
if (seed) v ^= seed.charCodeAt((j + 32) % seed.length);
// After 32 shuffles, take v as the starting w value.
if (j === 0) w = v;
v ^= v << 10;
v ^= v >>> 15;
v ^= v << 4;
v ^= v >>> 13;
if (j >= 0) {
w = (w + 0x61c88647) | 0; // Weyl.
t = (X[j & 127] ^= (v + w)); // Combine xor and weyl to init array.
i = (0 == t) ? i + 1 : 0; // Count zeroes.
}
}
// We have detected all zeroes; make the key nonzero.
if (i >= 128) {
X[(seed && seed.length || 0) & 127] = -1;
}
// Run the generator 512 times to further mix the state before using it.
// Factoring this as a function slows the main generator, so it is just
// unrolled here. The weyl generator is not advanced while warming up.
i = 127;
for (j = 4 * 128; j > 0; --j) {
v = X[(i + 34) & 127];
t = X[i = ((i + 1) & 127)];
v ^= v << 13;
t ^= t << 17;
v ^= v >>> 15;
t ^= t >>> 12;
X[i] = v ^ t;
}
// Storing state as object members is faster than using closure variables.
me.w = w;
me.X = X;
me.i = i;
}
init(me, seed);
}
function copy(f, t) {
t.i = f.i;
t.w = f.w;
t.X = f.X.slice();
return t;
};
function impl(seed, opts) {
if (seed == null) seed = +(new Date);
var xg = new XorGen(seed),
state = opts && opts.state,
prng = function() { return (xg.next() >>> 0) / 0x100000000; };
prng.double = function() {
do {
var top = xg.next() >>> 11,
bot = (xg.next() >>> 0) / 0x100000000,
result = (top + bot) / (1 << 21);
} while (result === 0);
return result;
};
prng.int32 = xg.next;
prng.quick = prng;
if (state) {
if (state.X) copy(state, xg);
prng.state = function() { return copy(xg, {}); }
}
return prng;
}
if (module && module.exports) {
module.exports = impl;
} else if (define && define.amd) {
define(function() { return impl; });
} else {
this.xor4096 = impl;
}
})(
this, // window object or global
(typeof module) == 'object' && module, // present in node.js
(typeof define) == 'function' && define // present with an AMD loader
);
},{}],19:[function(require,module,exports){
// A Javascript implementaion of the "xorshift7" algorithm by
// François Panneton and Pierre L'ecuyer:
// "On the Xorgshift Random Number Generators"
// http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf
(function(global, module, define) {
function XorGen(seed) {
var me = this;
// Set up generator function.
me.next = function() {
// Update xor generator.
var X = me.x, i = me.i, t, v, w;
t = X[i]; t ^= (t >>> 7); v = t ^ (t << 24);
t = X[(i + 1) & 7]; v ^= t ^ (t >>> 10);
t = X[(i + 3) & 7]; v ^= t ^ (t >>> 3);
t = X[(i + 4) & 7]; v ^= t ^ (t << 7);
t = X[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9);
X[i] = v;
me.i = (i + 1) & 7;
return v;
};
function init(me, seed) {
var j, w, X = [];
if (seed === (seed | 0)) {
// Seed state array using a 32-bit integer.
w = X[0] = seed;
} else {
// Seed state using a string.
seed = '' + seed;
for (j = 0; j < seed.length; ++j) {
X[j & 7] = (X[j & 7] << 15) ^
(seed.charCodeAt(j) + X[(j + 1) & 7] << 13);
}
}
// Enforce an array length of 8, not all zeroes.
while (X.length < 8) X.push(0);
for (j = 0; j < 8 && X[j] === 0; ++j);
if (j == 8) w = X[7] = -1; else w = X[j];
me.x = X;
me.i = 0;
// Discard an initial 256 values.
for (j = 256; j > 0; --j) {
me.next();
}
}
init(me, seed);
}
function copy(f, t) {
t.x = f.x.slice();
t.i = f.i;
return t;
}
function impl(seed, opts) {
if (seed == null) seed = +(new Date);
var xg = new XorGen(seed),
state = opts && opts.state,
prng = function() { return (xg.next() >>> 0) / 0x100000000; };
prng.double = function() {
do {
var top = xg.next() >>> 11,
bot = (xg.next() >>> 0) / 0x100000000,
result = (top + bot) / (1 << 21);
} while (result === 0);
return result;
};
prng.int32 = xg.next;
prng.quick = prng;
if (state) {
if (state.x) copy(state, xg);
prng.state = function() { return copy(xg, {}); }
}
return prng;
}
if (module && module.exports) {
module.exports = impl;
} else if (define && define.amd) {
define(function() { return impl; });
} else {
this.xorshift7 = impl;
}
})(
this,
(typeof module) == 'object' && module, // present in node.js
(typeof define) == 'function' && define // present with an AMD loader
);
},{}],20:[function(require,module,exports){
// A Javascript implementaion of the "xorwow" prng algorithm by
// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper
(function(global, module, define) {
function XorGen(seed) {
var me = this, strseed = '';
// Set up generator function.
me.next = function() {
var t = (me.x ^ (me.x >>> 2));
me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v;
return (me.d = (me.d + 362437 | 0)) +
(me.v = (me.v ^ (me.v << 4)) ^ (t ^ (t << 1))) | 0;
};
me.x = 0;
me.y = 0;
me.z = 0;
me.w = 0;
me.v = 0;
if (seed === (seed | 0)) {
// Integer seed.
me.x = seed;
} else {
// String seed.
strseed += seed;
}
// Mix in string seed, then discard an initial batch of 64 values.
for (var k = 0; k < strseed.length + 64; k++) {
me.x ^= strseed.charCodeAt(k) | 0;
if (k == strseed.length) {
me.d = me.x << 10 ^ me.x >>> 4;
}
me.next();
}
}
function copy(f, t) {
t.x = f.x;
t.y = f.y;
t.z = f.z;
t.w = f.w;
t.v = f.v;
t.d = f.d;
return t;
}
function impl(seed, opts) {
var xg = new XorGen(seed),
state = opts && opts.state,
prng = function() { return (xg.next() >>> 0) / 0x100000000; };
prng.double = function() {
do {
var top = xg.next() >>> 11,
bot = (xg.next() >>> 0) / 0x100000000,
result = (top + bot) / (1 << 21);
} while (result === 0);
return result;
};
prng.int32 = xg.next;
prng.quick = prng;
if (state) {
if (typeof(state) == 'object') copy(state, xg);
prng.state = function() { return copy(xg, {}); }
}
return prng;
}
if (module && module.exports) {
module.exports = impl;
} else if (define && define.amd) {
define(function() { return impl; });
} else {
this.xorwow = impl;
}
})(
this,
(typeof module) == 'object' && module, // present in node.js
(typeof define) == 'function' && define // present with an AMD loader
);
},{}],21:[function(require,module,exports){
/*
Copyright 2014 David Bau.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
(function (pool, math) {
//
// The following constants are related to IEEE 754 limits.
//
var global = this,
width = 256, // each RC4 output is 0 <= x < 256
chunks = 6, // at least six RC4 outputs for each double
digits = 52, // there are 52 significant digits in a double
rngname = 'random', // rngname: name for Math.random and Math.seedrandom
startdenom = math.pow(width, chunks),
significance = math.pow(2, digits),
overflow = significance * 2,
mask = width - 1,
nodecrypto; // node.js crypto module, initialized at the bottom.
//
// seedrandom()
// This is the seedrandom function described above.
//
function seedrandom(seed, options, callback) {
var key = [];
options = (options == true) ? { entropy: true } : (options || {});
// Flatten the seed string or build one from local entropy if needed.
var shortseed = mixkey(flatten(
options.entropy ? [seed, tostring(pool)] :
(seed == null) ? autoseed() : seed, 3), key);
// Use the seed to initialize an ARC4 generator.
var arc4 = new ARC4(key);
// This function returns a random double in [0, 1) that contains
// randomness in every bit of the mantissa of the IEEE 754 value.
var prng = function() {
var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48
d = startdenom, // and denominator d = 2 ^ 48.
x = 0; // and no 'extra last byte'.
while (n < significance) { // Fill up all significant digits by
n = (n + x) * width; // shifting numerator and
d *= width; // denominator and generating a
x = arc4.g(1); // new least-significant-byte.
}
while (n >= overflow) { // To avoid rounding up, before adding
n /= 2; // last byte, shift everything
d /= 2; // right using integer math until
x >>>= 1; // we have exactly the desired bits.
}
return (n + x) / d; // Form the number within [0, 1).
};
prng.int32 = function() { return arc4.g(4) | 0; }
prng.quick = function() { return arc4.g(4) / 0x100000000; }
prng.double = prng;
// Mix the randomness into accumulated entropy.
mixkey(tostring(arc4.S), pool);
// Calling convention: what to return as a function of prng, seed, is_math.
return (options.pass || callback ||
function(prng, seed, is_math_call, state) {
if (state) {
// Load the arc4 state from the given state if it has an S array.
if (state.S) { copy(state, arc4); }
// Only provide the .state method if requested via options.state.
prng.state = function() { return copy(arc4, {}); }
}
// If called as a method of Math (Math.seedrandom()), mutate
// Math.random because that is how seedrandom.js has worked since v1.0.
if (is_math_call) { math[rngname] = prng; return seed; }
// Otherwise, it is a newer calling convention, so return the
// prng directly.
else return prng;
})(
prng,
shortseed,
'global' in options ? options.global : (this == math),
options.state);
}
math['seed' + rngname] = seedrandom;
//
// ARC4
//
// An ARC4 implementation. The constructor takes a key in the form of
// an array of at most (width) integers that should be 0 <= x < (width).
//
// The g(count) method returns a pseudorandom integer that concatenates
// the next (count) outputs from ARC4. Its return value is a number x
// that is in the range 0 <= x < (width ^ count).
//
function ARC4(key) {
var t, keylen = key.length,
me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];
// The empty key [] is treated as [0].
if (!keylen) { key = [keylen++]; }
// Set up S using the standard key scheduling algorithm.
while (i < width) {
s[i] = i++;
}
for (i = 0; i < width; i++) {
s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];
s[j] = t;
}
// The "g" method returns the next (count) outputs as one number.
(me.g = function(count) {
// Using instance members instead of closure state nearly doubles speed.
var t, r = 0,
i = me.i, j = me.j, s = me.S;
while (count--) {
t = s[i = mask & (i + 1)];
r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];
}
me.i = i; me.j = j;
return r;
// For robust unpredictability, the function call below automatically
// discards an initial batch of values. This is called RC4-drop[256].
// See http://google.com/search?q=rsa+fluhrer+response&btnI
})(width);
}
//
// copy()
// Copies internal state of ARC4 to or from a plain object.
//
function copy(f, t) {
t.i = f.i;
t.j = f.j;
t.S = f.S.slice();
return t;
};
//
// flatten()
// Converts an object tree to nested arrays of strings.
//
function flatten(obj, depth) {
var result = [], typ = (typeof obj), prop;
if (depth && typ == 'object') {
for (prop in obj) {
try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}
}
}
return (result.length ? result : typ == 'string' ? obj : obj + '\0');
}
//
// mixkey()
// Mixes a string seed into a key that is an array of integers, and
// returns a shortened string seed that is equivalent to the result key.
//
function mixkey(seed, key) {
var stringseed = seed + '', smear, j = 0;
while (j < stringseed.length) {
key[mask & j] =
mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));
}
return tostring(key);
}
//
// autoseed()
// Returns an object for autoseeding, using window.crypto and Node crypto
// module if available.
//
function autoseed() {
try {
var out;
if (nodecrypto && (out = nodecrypto.randomBytes)) {
// The use of 'out' to remember randomBytes makes tight minified code.
out = out(width);
} else {
out = new Uint8Array(width);
(global.crypto || global.msCrypto).getRandomValues(out);
}
return tostring(out);
} catch (e) {
var browser = global.navigator,
plugins = browser && browser.plugins;
return [+new Date, global, plugins, global.screen, tostring(pool)];
}
}
//
// tostring()
// Converts an array of charcodes to a string
//
function tostring(a) {
return String.fromCharCode.apply(0, a);
}
//
// When seedrandom.js is loaded, we immediately mix a few bits
// from the built-in RNG into the entropy pool. Because we do
// not want to interfere with deterministic PRNG state later,
// seedrandom will not call math.random on its own again after
// initialization.
//
mixkey(math.random(), pool);
//
// Nodejs and AMD support: export the implementation as a module using
// either convention.
//
if ((typeof module) == 'object' && module.exports) {
module.exports = seedrandom;
// When in node.js, try using crypto package for autoseeding.
try {
nodecrypto = require('crypto');
} catch (ex) {}
} else if ((typeof define) == 'function' && define.amd) {
define(function() { return seedrandom; });
}
// End anonymous scope, and pass initial values.
})(
[], // pool: entropy pool starts empty
Math // math: package containing random, pow, and seedrandom
);
},{"crypto":25}],22:[function(require,module,exports){
// angle.js <https://github.com/davidfig/anglejs>
// Released under MIT license <https://github.com/davidfig/angle/blob/master/LICENSE>
// Author: David Figatner
// Copyright (c) 2016-17 YOPEY YOPEY LLC
var _toDegreeConversion = 180 / Math.PI
var _toRadianConversion = Math.PI / 180
/** @constant {number} */
var UP = Math.PI / 2
var DOWN = 3 * Math.PI / 2
var LEFT = Math.PI
var RIGHT = 0
var NORTH = UP
var SOUTH = DOWN
var WEST = LEFT
var EAST = RIGHT
var PI_2 = Math.PI * 2
var PI_QUARTER = Math.PI / 4
var PI_HALF = Math.PI / 2
/**
* converts from radians to degrees (all other functions expect radians)
* @param {number} radians
* @return {number} degrees
*/
function toDegrees(radians)
{
return radians * _toDegreeConversion
}
/**
* converts from degrees to radians (all other functions expect radians)
* @param {number} degrees
* @return {number} radians
*/
function toRadians(degrees)
{
return degrees * _toRadianConversion
}
/**
* returns whether the target angle is between angle1 and angle2 (in radians)
* (based on: http://stackoverflow.com/questions/11406189/determine-if-angle-lies-between-2-other-angles)
* @param {number} target angle
* @param {number} angle1
* @param {number} angle2
* @return {boolean}
*/
function isAngleBetween(target, angle1, angle2)
{
var rAngle = ((angle2 - angle1) % PI_2 + PI_2) % PI_2
if (rAngle >= Math.PI)
{
var swap = angle1
angle1 = angle2
angle2 = swap
}
if (angle1 <= angle2)
{
return target >= angle1 && target <= angle2
}
else
{
return target >= angle1 || target <= angle2
}
}
/**
* returns +1 or -1 based on whether the difference between two angles is positive or negative (in radians)
* @param {number} target angle
* @param {number} source angle
* @return {number} 1 or -1
*/
function differenceAnglesSign(target, source)
{
function mod(a, n)
{
return (a % n + n) % n
}
var a = target - source
return mod((a + Math.PI), PI_2) - Math.PI > 0 ? 1 : -1
}
/**
* returns the normalized difference between two angles (in radians)
* @param {number} a - first angle
* @param {number} b - second angle
* @return {number} normalized difference between a and b
*/
function differenceAngles(a, b)
{
var c = Math.abs(a - b) % PI_2
return c > Math.PI ? (PI_2 - c) : c
}
/**
* returns a target angle that is the shortest way to rotate an object between start and to--may choose a negative angle
* @param {number} start
* @param {number} to
* @return {number} shortest target angle
*/
function shortestAngle(start, to)
{
var difference = differenceAngles(to, start)
var sign = differenceAnglesSign(to, start)
var delta = difference * sign
return delta + start
}
/**
* returns the normalized angle (0 - PI x 2)
* @param {number} radians
* @return {number} normalized angle in radians
*/
function normalize(radians)
{
return radians - PI_2 * Math.floor(radians / PI_2)
}
/**
* returns angle between two points (in radians)
* @param {Point} [point1] {x: x, y: y}
* @param {Point} [point2] {x: x, y: y}
* @param {number} [x1]
* @param {number} [y1]
* @param {number} [x2]
* @param {number} [y2]
* @return {number} angle
*/
function angleTwoPoints(/* (point1, point2) OR (x1, y1, x2, y2) */)
{
if (arguments.length === 4)
{
return Math.atan2(arguments[3] - arguments[1], arguments[2] - arguments[0])
}
else
{
return Math.atan2(arguments[1].y - arguments[0].y, arguments[1].x - arguments[0].x)
}
}
/**
* returns distance between two points
* @param {Point} [point1] {x: x, y: y}
* @param {Point} [point2] {x: x, y: y}
* @param {number} [x1]
* @param {number} [y1]
* @param {number} [x2]
* @param {number} [y2]
* @return {number} distance
*/
function distanceTwoPoints(/* (point1, point2) OR (x1, y1, x2, y2) */)
{
if (arguments.length === 2)
{
return Math.sqrt(Math.pow(arguments[1].x - arguments[0].x, 2) + Math.pow(arguments[1].y - arguments[0].y, 2))
}
else
{
return Math.sqrt(Math.pow(arguments[2] - arguments[0], 2) + Math.pow(arguments[3] - arguments[1], 2))
}
}
/**
* returns the squared distance between two points
* @param {Point} [point1] {x: x, y: y}
* @param {Point} [point2] {x: x, y: y}
* @param {number} [x1]
* @param {number} [y1]
* @param {number} [x2]
* @param {number} [y2]
* @return {number} squared distance
*/
function distanceTwoPointsSquared(/* (point1, point2) OR (x1, y1, x2, y2) */)
{
if (arguments.length === 2)
{
return Math.pow(arguments[1].x - arguments[0].x, 2) + Math.pow(arguments[1].y - arguments[0].y, 2)
}
else
{
return Math.pow(arguments[2] - arguments[0], 2) + Math.pow(arguments[3] - arguments[1], 2)
}
}
/**
* returns the closest cardinal (N, S, E, W) to the given angle (in radians)
* @param {number} angle
* @return {number} closest cardinal in radians
*/
function closestAngle(angle)
{
var left = differenceAngles(angle, LEFT)
var right = differenceAngles(angle, RIGHT)
var up = differenceAngles(angle, UP)
var down = differenceAngles(angle, DOWN)
if (left <= right && left <= up && left <= down)
{
return LEFT
}
else if (right <= up && right <= down)
{
return RIGHT
}
else if (up <= down)
{
return UP
}
else
{
return DOWN
}
}
/**
* checks whether angles a1 and a2 are equal (after normalizing)
* @param {number} a1
* @param {number} a2
* @param {number} [wiggle] return true if the difference between the angles is <= wiggle
* @return {boolean} a1 === a2
*/
function equals(a1, a2, wiggle)
{
if (wiggle)
{
return differenceAngles(a1, a2) < wiggle
}
else
{
return normalize(a1) === normalize(a2)
}
}
/**
* return a text representation of the cardinal direction
* @param {number} angle
* @returns {string} UP, DOWN, LEFT, RIGHT, or NOT CARDINAL
*/
function explain(angle)
{
switch (angle)
{
case UP: return 'UP'
case DOWN: return 'DOWN'
case LEFT: return 'LEFT'
case RIGHT: return 'RIGHT'
default: return 'NOT CARDINAL'
}
}
module.exports = {
UP: UP,
DOWN: DOWN,
LEFT: LEFT,
RIGHT: RIGHT,
NORTH: NORTH,
SOUTH: SOUTH,
WEST: WEST,
EAST: EAST,
PI_2: PI_2,
PI_QUARTER: PI_QUARTER,
PI_HALF: PI_HALF,
toDegrees: toDegrees,
toRadians: toRadians,
isAngleBetween: isAngleBetween,
differenceAnglesSign: differenceAnglesSign,
differenceAngles: differenceAngles,
shortestAngle: shortestAngle,
normalize: normalize,
angleTwoPoints: angleTwoPoints,
distanceTwoPoints: distanceTwoPoints,
distanceTwoPointsSquared: distanceTwoPointsSquared,
closestAngle: closestAngle,
equals: equals,
explain: explain
}
},{}],23:[function(require,module,exports){
// yy-color
// by David Figatner
// MIT License
// (c) YOPEY YOPEY LLC 2017
// https://github.com/davidfig/color
var Random = require('yy-random')
/**
* converts a #FFFFFF to 0x123456
* @param {string} color
* @return {string}
*/
function poundToHex(color)
{
return '0x' + parseInt(color.substr(1)).toString(16)
}
/**
* converts a 0x123456 to #FFFFFF
* @param {string} color
* @return {string}
*/
function hexToPound(color)
{
return '#' + color.substr(2)
}
/**
* converts a number to #FFFFFF
* @param {number} color
* @return {string}
*/
function valueToPound(color)
{
return '#' + color.toString(16)
}
/**
* based on tinycolor
* https://github.com/bgrins/TinyColor
* BSD license: https://github.com/bgrins/TinyColor/blob/master/LICENSE
* @param {string} color
* @returns {object}
*/
function hexToHsl (color)
{
var rgb = this.hexToRgb(color),
r = rgb.r,
g = rgb.g,
b = rgb.b
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 { h: h, s: s, l: l }
}
/** based on tinycolor
* https://github.com/bgrins/TinyColor
* BSD license: https://github.com/bgrins/TinyColor/blob/master/LICENSE
* @param {object|number} color {h, s, b} or h
* @param {number} [s]
* @param {number} [l]
* @returns number
*/
function hslToHex(color)
{
var r, g, b, h, s, l
if (arguments.length === 1)
{
h = color.h,
s = color.s,
l = color.l
}
else
{
h = arguments[0]
s = arguments[1]
l = arguments[2]
}
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
}
if (s === 0)
{
r = g = b = l // achromatic
}
else
{
var q = l < 0.5 ? l * (1 + s) : l + s - l * s
var p = 2 * l - q
r = hue2rgb(p, q, h + 1/3)
g = hue2rgb(p, q, h)
b = hue2rgb(p, q, h - 1/3)
}
return this.rgbToHex(r * 255, g * 255, b * 255)
}
/* darkens a color by the percentage
* @param {object} color in hex (0xabcdef)
* @param {number} amount
* @return {number}
*/
function darken(color, amount)
{
return this.blend(amount, color, 0)
}
/** based on tinycolor
* https://github.com/bgrins/TinyColor
* BSD license: https://github.com/bgrins/TinyColor/blob/master/LICENSE
* @param {object} color
* @param {number} amount
*/
function saturate(color, amount)
{
amount = (amount === 0) ? 0 : (amount || 10)
var hsl = this.hexToHsl(color)
hsl.s += amount / 100
hsl.s = Math.min(1, Math.max(0, hsl.s))
return this.hslToHex(hsl)
}
/** based on tinycolor
* https://github.com/bgrins/TinyColor
* BSD license: https://github.com/bgrins/TinyColor/blob/master/LICENSE
* @param {object} color
* @param {number} amount
*/
function desaturate(color, amount)
{
amount = (amount === 0) ? 0 : (amount || 10)
var hsl = this.hexToHsl(color)
hsl.s -= amount / 100
hsl.s = Math.min(1, Math.max(0, hsl.s))
return this.hslToHex(hsl)
}
/**
* blends two colors together
* @param {number} percent [0.0 - 1.0]
* @param {string} color1 first color in 0x123456 format
* @param {string} color2 second color in 0x123456 format
* @return {number}
*/
function blend(percent, color1, color2)
{
if (percent === 0)
{
return color1
}
if (percent === 1)
{
return color2
}
var r1 = color1 >> 16
var g1 = color1 >> 8 & 0x0000ff
var b1 = color1 & 0x0000ff
var r2 = color2 >> 16
var g2 = color2 >> 8 & 0x0000ff
var b2 = color2 & 0x0000ff
var percent1 = 1 - percent
var r = percent1 * r1 + percent * r2
var g = percent1 * g1 + percent * g2
var b = percent1 * b1 + percent * b2
return r << 16 | g << 8 | b
}
/**
* returns a hex color into an rgb value
* @param {number} hex
* @return {string}
*/
function hexToRgb(hex)
{
if (hex === 0)
{
hex = '0x000000'
}
else if (typeof hex !== 'string')
{
var s = '000000' + hex.toString(16)
hex = '0x' + s.substr(s.length - 6)
}
var result = /^0x?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null
}
/**
* rgb color to hex in the form of 0x123456
* @param {(number|string)} r first number or 'rgb(...)' string
* @param {(number|null)} g
* @param {(number|null)} b
* @return {string}
*/
function rgbToHex(r, g, b)
{
if (arguments.length === 1) {
if (Array.isArray(arguments[0])) {
var number = arguments[0]
r = number[0]
g = number[1]
b = number[2]
} else {
var parse = r.replace(/( *rgb *\( *)|( )|(\) *;?)/,'')
var numbers = parse.split(',')
r = numbers[0]
g = numbers[1]
b = numbers[2]
}
}
return '0x' + ((1 << 24) + (parseInt(r) << 16) + (parseInt(g) << 8) + parseInt(b)).toString(16).slice(1)
}
/**
* returns a random color with balanced r, g, b values (i.e., r, g, b either have the same value or are 0)
* @param {number} min value for random number
* @param {number} max value for random number
* @return {number} color
*/
function random(min, max)
{
function random()
{
return Random.range(min, max)
}
var colors = [{r:1, g:1, b:1}, {r:1, g:1, b:0}, {r:1,g:0,b:1}, {r:0,g:1,b:1}, {r:1,g:0,b:0}, {r:0,g:1,b:0}, {r:0,g:0,b:1}]
var color = Random.pick(colors)
min = min || 0
max = max || 255
return this.rgbToHex(color.r ? random() : 0, color.g ? random() : 0, color.b ? random() : 0)
}
// h: 0-360, s: 0-1, l: 0-1
/**
* returns a random color based on hsl
* @param {number} hMin [0, 360]
* @param {number} hMax [hMin, 360]
* @param {number} sMin [0, 1]
* @param {number} sMax [sMin, 1]
* @param {number} lMin [0, 1]
* @param {number} lMax [lMin, 1]
*/
function randomHSL(hMin, hMax, sMin, sMax, lMin, lMax)
{
var color = {
h: Random.range(hMin, hMax),
s: Random.range(sMin, sMax, true),
l: Random.range(lMin, lMax, true)
}
return this.hslToHex(color)
}
/**
* returns random colors based on HSL with different hues
* based on http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
* @returns {number[]} colors in hex format (0x123456)
*/
function randomGoldenRatioHSL(count, saturation, luminosity)
{
var goldenRatio = 0.618033988749895
var h = Random.get(1, true)
var colors = []
for (var i = 0; i < count; i++)
{
colors.push(this.hslToHex(h, saturation, luminosity))
h = (h + goldenRatio) % 1
}
return colors
}
module.exports = {
poundToHex: poundToHex,
hexToPound: hexToPound,
valueToPound: valueToPound,
hexToHsl: hexToHsl,
hslToHex: hslToHex,
hexToRgb: hexToRgb,
rgbToHex: rgbToHex,
darken: darken,
saturate: saturate,
desaturate: desaturate,
blend: blend,
random: random,
randomHSL: randomHSL,
randomGoldenRatioHSL: randomGoldenRatioHSL
}
},{"yy-random":24}],24:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// yy-random
// by David Figatner
// MIT license
// copyright YOPEY YOPEY LLC 2016-17
// https://github.com/davidfig/random
var seedrandom = require('seedrandom');
var Random = function () {
function Random() {
_classCallCheck(this, Random);
this.generator = Math.random;
}
/**
* generates a seeded number
* @param {number} seed
* @param {object} [options]
* @param {string} [PRNG="alea"] - name of algorithm, see https://github.com/davidbau/seedrandom
* @param {boolean} [save=true]
*/
_createClass(Random, [{
key: 'seed',
value: function seed(_seed, options) {
options = options || {};
this.generator = seedrandom[options.PRNG || 'alea'](_seed, { state: options.state });
this.options = options;
}
/**
* saves the state of the random generator
* can only be used after Random.seed() is called
* @returns {number} state
*/
}, {
key: 'save',
value: function save() {
if (this.generator !== Math.random) {
return this.generator.state();
}
}
/**
* restores the state of the random generator
* @param {number} state
*/
}, {
key: 'restore',
value: function restore(state) {
this.generator = seedrandom[this.options.PRNG || 'alea']('', { state: state });
}
/**
* changes the generator to use the old Math.sin-based random function
* based on : http://stackoverflow.com/questions/521295/javascript-random-seeds
* (deprecated) Use only for compatibility purposes
* @param {number} seed
*/
}, {
key: 'seedOld',
value: function seedOld(seed) {
this.generator = function () {
var x = Math.sin(seed++) * 10000;
return x - Math.floor(x);
};
}
/**
* create a separate random generator using the seed
* @param {number} seed
* @return {object}
*/
}, {
key: 'separateSeed',
value: function separateSeed(seed) {
var random = new Random();
random.seed(seed);
return random;
}
/**
* resets the random number this.generator to Math.random()
*/
}, {
key: 'reset',
value: function reset() {
this.generator = Math.random;
}
/**
* returns a random number using the this.generator between [0, ceiling - 1]
* @param {number} ceiling
* @param {boolean} [useFloat=false]
* @return {number}
*/
}, {
key: 'get',
value: function get(ceiling, useFloat) {
var negative = ceiling < 0 ? -1 : 1;
ceiling *= negative;
var result = void 0;
if (useFloat) {
result = this.generator() * ceiling;
} else {
result = Math.floor(this.generator() * ceiling);
}
return result * negative;
}
/**
* returns a random integer between 0 - Number.MAX_SAFE_INTEGER
* @return {number}
*/
}, {
key: 'getHuge',
value: function getHuge() {
return this.get(Number.MAX_SAFE_INTEGER);
}
/**
* random number [middle - range, middle + range]
* @param {number} middle
* @param {number} delta
* @param {boolean} [useFloat=false]
* @return {number}
*/
}, {
key: 'middle',
value: function middle(_middle, delta, useFloat) {
var half = delta / 2;
return this.range(_middle - half, _middle + half, useFloat);
}
/**
* random number [start, end]
* @param {number} start
* @param {number} end
* @param {boolean} [useFloat=false] if true, then range is (start, end)--i.e., not inclusive to start and end
* @return {number}
*/
}, {
key: 'range',
value: function range(start, end, useFloat) {
// case where there is no range
if (end === start) {
return end;
}
if (useFloat) {
return this.get(end - start, true) + start;
} else {
var range = void 0;
if (start < 0 && end > 0) {
range = -start + end + 1;
} else if (start === 0 && end > 0) {
range = end + 1;
} else if (start < 0 && end === 0) {
range = start - 1;
start = 1;
} else if (start < 0 && end < 0) {
range = end - start - 1;
} else {
range = end - start + 1;
}
return Math.floor(this.generator() * range) + start;
}
}
/**
* an array of random numbers between [start, end]
* @param {number} start
* @param {number} end
* @param {number} count
* @param {boolean} [useFloat=false]
* @return {number[]}
*/
}, {
key: 'rangeMultiple',
value: function rangeMultiple(start, end, count, useFloat) {
var array = [];
for (var i = 0; i < count; i++) {
array.push(this.range(start, end, useFloat));
}
return array;
}
/**
* an array of random numbers between [middle - range, middle + range]
* @param {number} middle
* @param {number} range
* @param {number} count
* @param {boolean} [useFloat=false]
* @return {number[]}
*/
}, {
key: 'middleMultiple',
value: function middleMultiple(middle, range, count, useFloat) {
var array = [];
for (var i = 0; i < count; i++) {
array.push(middle(middle, range, useFloat));
}
return array;
}
/**
* @param {number} [chance=0.5]
* returns random sign (either +1 or -1)
* @return {number}
*/
}, {
key: 'sign',
value: function sign(chance) {
chance = chance || 0.5;
return this.generator() < chance ? 1 : -1;
}
/**
* tells you whether a random chance was achieved
* @param {number} [percent=0.5]
* @return {boolean}
*/
}, {
key: 'chance',
value: function chance(percent) {
return this.generator() < (percent || 0.5);
}
/**
* returns a random angle in radians [0 - 2 * Math.PI)
*/
}, {
key: 'angle',
value: function angle() {
return this.get(Math.PI * 2, true);
}
/**
* Shuffle array (either in place or copied)
* from http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
* @param {Array} array
* @param {boolean} [copy=false] whether to shuffle in place (default) or return a new shuffled array
* @return {Array} a shuffled array
*/
}, {
key: 'shuffle',
value: function shuffle(array, copy) {
if (copy) {
array = array.slice();
}
if (array.length === 0) {
return array;
}
var currentIndex = array.length,
temporaryValue = void 0,
randomIndex = void 0;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = this.get(currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
/**
* picks a random element from an array
* @param {Array} array
* @return {*}
*/
}, {
key: 'pick',
value: function pick(array, remove) {
if (!remove) {
return array[this.get(array.length)];
} else {
var pick = this.get(array.length);
var temp = array[pick];
array.splice(pick, 1);
return temp;
}
}
/**
* returns a random property from an object
* from http://stackoverflow.com/questions/2532218/pick-random-property-from-a-javascript-object
* @param {object} obj
* @return {*}
*/
}, {
key: 'property',
value: function property(obj) {
var result;
var count = 0;
for (var prop in obj) {
if (this.chance(1 / ++count)) {
result = prop;
}
}
return result;
}
/**
* creates a random set where each entry is a value between [min, max]
* @param {number} min
* @param {number} max
* @param {number} amount of numbers in set
* @param {number[]}
*/
}, {
key: 'set',
value: function set(min, max, amount) {
var set = [],
all = [],
i;
for (i = min; i < max; i++) {
all.push(i);
}
for (i = 0; i < amount; i++) {
var found = this.get(all.length);
set.push(all[found]);
all.splice(found, 1);
}
return set;
}
/**
* returns a set of numbers with a randomly even distribution (i.e., no overlapping and filling the space)
* @param {number} start position
* @param {number} end position
* @param {number} count of non-start/end points
* @param {boolean} [includeStart=false] includes start point (count++)
* @param {boolean} [includeEnd=false] includes end point (count++)
* @param {boolean} [useFloat=false]
* @param {number[]}
*/
}, {
key: 'distribution',
value: function distribution(start, end, count, includeStart, includeEnd, useFloat) {
var interval = Math.floor((end - start) / count);
var halfInterval = interval / 2;
var quarterInterval = interval / 4;
var set = [];
if (includeStart) {
set.push(start);
}
for (var i = 0; i < count; i++) {
set.push(start + i * interval + halfInterval + this.range(-quarterInterval, quarterInterval, useFloat));
}
if (includeEnd) {
set.push(end);
}
return set;
}
/**
* returns a random number based on weighted probability between [min, max]
* from http://stackoverflow.com/questions/22656126/javascript-random-number-with-weighted-probability
* @param {number} min value
* @param {number} max value
* @param {number} target for average value
* @param {number} stddev - standard deviation
*/
}, {
key: 'weightedProbabilityInt',
value: function weightedProbabilityInt(min, max, target, stddev) {
function normRand() {
var x1 = void 0,
x2 = void 0,
rad = void 0;
do {
x1 = 2 * this.get(1, true) - 1;
x2 = 2 * this.get(1, true) - 1;
rad = x1 * x1 + x2 * x2;
} while (rad >= 1 || rad === 0);
var c = Math.sqrt(-2 * Math.log(rad) / rad);
return x1 * c;
}
stddev = stddev || 1;
if (Math.random() < 0.81546) {
while (true) {
var sample = normRand() * stddev + target;
if (sample >= min && sample <= max) {
return sample;
}
}
} else {
return this.range(min, max);
}
}
/*
* returns a random hex color (0 - 0xffffff)
* @return {number}
*/
}, {
key: 'color',
value: function color() {
return this.get(0xffffff);
}
}]);
return Random;
}();
module.exports = new Random();
},{"seedrandom":14}],25:[function(require,module,exports){
},{}]},{},[3]);