phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
1,694 lines (1,479 loc) • 1.66 MB
JavaScript
window["SpinePlugin"] =
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./SpinePlugin.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "../../../node_modules/eventemitter3/index.js":
/*!************************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/node_modules/eventemitter3/index.js ***!
\************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"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 (true) {
module.exports = EventEmitter;
}
/***/ }),
/***/ "../../../node_modules/process/browser.js":
/*!********************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/node_modules/process/browser.js ***!
\********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;
process.listeners = function (name) { return [] }
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
/***/ }),
/***/ "../../../src/const.js":
/*!*************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/const.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* Global constants.
*
* @ignore
*/
var CONST = {
/**
* Phaser Release Version
*
* @name Phaser.VERSION
* @const
* @type {string}
* @since 3.0.0
*/
VERSION: '3.60.0-beta.18',
BlendModes: __webpack_require__(/*! ./renderer/BlendModes */ "../../../src/renderer/BlendModes.js"),
ScaleModes: __webpack_require__(/*! ./renderer/ScaleModes */ "../../../src/renderer/ScaleModes.js"),
/**
* This setting will auto-detect if the browser is capable of suppporting WebGL.
* If it is, it will use the WebGL Renderer. If not, it will fall back to the Canvas Renderer.
*
* @name Phaser.AUTO
* @const
* @type {number}
* @since 3.0.0
*/
AUTO: 0,
/**
* Forces Phaser to only use the Canvas Renderer, regardless if the browser supports
* WebGL or not.
*
* @name Phaser.CANVAS
* @const
* @type {number}
* @since 3.0.0
*/
CANVAS: 1,
/**
* Forces Phaser to use the WebGL Renderer. If the browser does not support it, there is
* no fallback to Canvas with this setting, so you should trap it and display a suitable
* message to the user.
*
* @name Phaser.WEBGL
* @const
* @type {number}
* @since 3.0.0
*/
WEBGL: 2,
/**
* A Headless Renderer doesn't create either a Canvas or WebGL Renderer. However, it still
* absolutely relies on the DOM being present and available. This mode is meant for unit testing,
* not for running Phaser on the server, which is something you really shouldn't do.
*
* @name Phaser.HEADLESS
* @const
* @type {number}
* @since 3.0.0
*/
HEADLESS: 3,
/**
* In Phaser the value -1 means 'forever' in lots of cases, this const allows you to use it instead
* to help you remember what the value is doing in your code.
*
* @name Phaser.FOREVER
* @const
* @type {number}
* @since 3.0.0
*/
FOREVER: -1,
/**
* Direction constant.
*
* @name Phaser.NONE
* @const
* @type {number}
* @since 3.0.0
*/
NONE: 4,
/**
* Direction constant.
*
* @name Phaser.UP
* @const
* @type {number}
* @since 3.0.0
*/
UP: 5,
/**
* Direction constant.
*
* @name Phaser.DOWN
* @const
* @type {number}
* @since 3.0.0
*/
DOWN: 6,
/**
* Direction constant.
*
* @name Phaser.LEFT
* @const
* @type {number}
* @since 3.0.0
*/
LEFT: 7,
/**
* Direction constant.
*
* @name Phaser.RIGHT
* @const
* @type {number}
* @since 3.0.0
*/
RIGHT: 8
};
module.exports = CONST;
/***/ }),
/***/ "../../../src/data/DataManager.js":
/*!************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/DataManager.js ***!
\************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
var Class = __webpack_require__(/*! ../utils/Class */ "../../../src/utils/Class.js");
var Events = __webpack_require__(/*! ./events */ "../../../src/data/events/index.js");
/**
* @callback DataEachCallback
*
* @param {*} parent - The parent object of the DataManager.
* @param {string} key - The key of the value.
* @param {*} value - The value.
* @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
*/
/**
* @classdesc
* The Data Manager Component features a means to store pieces of data specific to a Game Object, System or Plugin.
* You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
* or have a property called `events` that is an instance of it.
*
* @class DataManager
* @memberof Phaser.Data
* @constructor
* @since 3.0.0
*
* @param {object} parent - The object that this DataManager belongs to.
* @param {Phaser.Events.EventEmitter} [eventEmitter] - The DataManager's event emitter.
*/
var DataManager = new Class({
initialize:
function DataManager (parent, eventEmitter)
{
/**
* The object that this DataManager belongs to.
*
* @name Phaser.Data.DataManager#parent
* @type {*}
* @since 3.0.0
*/
this.parent = parent;
/**
* The DataManager's event emitter.
*
* @name Phaser.Data.DataManager#events
* @type {Phaser.Events.EventEmitter}
* @since 3.0.0
*/
this.events = eventEmitter;
if (!eventEmitter)
{
this.events = (parent.events) ? parent.events : parent;
}
/**
* The data list.
*
* @name Phaser.Data.DataManager#list
* @type {Object.<string, *>}
* @default {}
* @since 3.0.0
*/
this.list = {};
/**
* The public values list. You can use this to access anything you have stored
* in this Data Manager. For example, if you set a value called `gold` you can
* access it via:
*
* ```javascript
* this.data.values.gold;
* ```
*
* You can also modify it directly:
*
* ```javascript
* this.data.values.gold += 1000;
* ```
*
* Doing so will emit a `setdata` event from the parent of this Data Manager.
*
* Do not modify this object directly. Adding properties directly to this object will not
* emit any events. Always use `DataManager.set` to create new items the first time around.
*
* @name Phaser.Data.DataManager#values
* @type {Object.<string, *>}
* @default {}
* @since 3.10.0
*/
this.values = {};
/**
* Whether setting data is frozen for this DataManager.
*
* @name Phaser.Data.DataManager#_frozen
* @type {boolean}
* @private
* @default false
* @since 3.0.0
*/
this._frozen = false;
if (!parent.hasOwnProperty('sys') && this.events)
{
this.events.once(Events.DESTROY, this.destroy, this);
}
},
/**
* Retrieves the value for the given key, or undefined if it doesn't exist.
*
* You can also access values via the `values` object. For example, if you had a key called `gold` you can do either:
*
* ```javascript
* this.data.get('gold');
* ```
*
* Or access the value directly:
*
* ```javascript
* this.data.values.gold;
* ```
*
* You can also pass in an array of keys, in which case an array of values will be returned:
*
* ```javascript
* this.data.get([ 'gold', 'armor', 'health' ]);
* ```
*
* This approach is useful for destructuring arrays in ES6.
*
* @method Phaser.Data.DataManager#get
* @since 3.0.0
*
* @param {(string|string[])} key - The key of the value to retrieve, or an array of keys.
*
* @return {*} The value belonging to the given key, or an array of values, the order of which will match the input array.
*/
get: function (key)
{
var list = this.list;
if (Array.isArray(key))
{
var output = [];
for (var i = 0; i < key.length; i++)
{
output.push(list[key[i]]);
}
return output;
}
else
{
return list[key];
}
},
/**
* Retrieves all data values in a new object.
*
* @method Phaser.Data.DataManager#getAll
* @since 3.0.0
*
* @return {Object.<string, *>} All data values.
*/
getAll: function ()
{
var results = {};
for (var key in this.list)
{
if (this.list.hasOwnProperty(key))
{
results[key] = this.list[key];
}
}
return results;
},
/**
* Queries the DataManager for the values of keys matching the given regular expression.
*
* @method Phaser.Data.DataManager#query
* @since 3.0.0
*
* @param {RegExp} search - A regular expression object. If a non-RegExp object obj is passed, it is implicitly converted to a RegExp by using new RegExp(obj).
*
* @return {Object.<string, *>} The values of the keys matching the search string.
*/
query: function (search)
{
var results = {};
for (var key in this.list)
{
if (this.list.hasOwnProperty(key) && key.match(search))
{
results[key] = this.list[key];
}
}
return results;
},
/**
* Sets a value for the given key. If the key doesn't already exist in the Data Manager then it is created.
*
* ```javascript
* data.set('name', 'Red Gem Stone');
* ```
*
* You can also pass in an object of key value pairs as the first argument:
*
* ```javascript
* data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 });
* ```
*
* To get a value back again you can call `get`:
*
* ```javascript
* data.get('gold');
* ```
*
* Or you can access the value directly via the `values` property, where it works like any other variable:
*
* ```javascript
* data.values.gold += 50;
* ```
*
* When the value is first set, a `setdata` event is emitted.
*
* If the key already exists, a `changedata` event is emitted instead, along an event named after the key.
* For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`.
* These events will be emitted regardless if you use this method to set the value, or the direct `values` setter.
*
* Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings.
* This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
*
* @method Phaser.Data.DataManager#set
* @fires Phaser.Data.Events#SET_DATA
* @fires Phaser.Data.Events#CHANGE_DATA
* @fires Phaser.Data.Events#CHANGE_DATA_KEY
* @since 3.0.0
*
* @generic {any} T
* @genericUse {(string|T)} - [key]
*
* @param {(string|object)} key - The key to set the value for. Or an object or key value pairs. If an object the `data` argument is ignored.
* @param {*} data - The value to set for the given key. If an object is provided as the key this argument is ignored.
*
* @return {this} This DataManager object.
*/
set: function (key, data)
{
if (this._frozen)
{
return this;
}
if (typeof key === 'string')
{
return this.setValue(key, data);
}
else
{
for (var entry in key)
{
this.setValue(entry, key[entry]);
}
}
return this;
},
/**
* Increase a value for the given key. If the key doesn't already exist in the Data Manager then it is increased from 0.
*
* When the value is first set, a `setdata` event is emitted.
*
* @method Phaser.Data.DataManager#inc
* @fires Phaser.Data.Events#SET_DATA
* @fires Phaser.Data.Events#CHANGE_DATA
* @fires Phaser.Data.Events#CHANGE_DATA_KEY
* @since 3.23.0
*
* @generic {any} T
* @genericUse {(string|T)} - [key]
*
* @param {(string|object)} key - The key to increase the value for.
* @param {*} [data] - The value to increase for the given key.
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
inc: function (key, data)
{
if (this._frozen)
{
return this;
}
if (data === undefined)
{
data = 1;
}
var value = this.get(key);
if (value === undefined)
{
value = 0;
}
this.set(key, (value + data));
return this;
},
/**
* Toggle a boolean value for the given key. If the key doesn't already exist in the Data Manager then it is toggled from false.
*
* When the value is first set, a `setdata` event is emitted.
*
* @method Phaser.Data.DataManager#toggle
* @fires Phaser.Data.Events#SET_DATA
* @fires Phaser.Data.Events#CHANGE_DATA
* @fires Phaser.Data.Events#CHANGE_DATA_KEY
* @since 3.23.0
*
* @generic {any} T
* @genericUse {(string|T)} - [key]
*
* @param {(string|object)} key - The key to toggle the value for.
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
toggle: function (key)
{
if (this._frozen)
{
return this;
}
this.set(key, !this.get(key));
return this;
},
/**
* Internal value setter, called automatically by the `set` method.
*
* @method Phaser.Data.DataManager#setValue
* @fires Phaser.Data.Events#SET_DATA
* @fires Phaser.Data.Events#CHANGE_DATA
* @fires Phaser.Data.Events#CHANGE_DATA_KEY
* @private
* @since 3.10.0
*
* @param {string} key - The key to set the value for.
* @param {*} data - The value to set.
*
* @return {this} This DataManager object.
*/
setValue: function (key, data)
{
if (this._frozen)
{
return this;
}
if (this.has(key))
{
// Hit the key getter, which will in turn emit the events.
this.values[key] = data;
}
else
{
var _this = this;
var list = this.list;
var events = this.events;
var parent = this.parent;
Object.defineProperty(this.values, key, {
enumerable: true,
configurable: true,
get: function ()
{
return list[key];
},
set: function (value)
{
if (!_this._frozen)
{
var previousValue = list[key];
list[key] = value;
events.emit(Events.CHANGE_DATA, parent, key, value, previousValue);
events.emit(Events.CHANGE_DATA_KEY + key, parent, value, previousValue);
}
}
});
list[key] = data;
events.emit(Events.SET_DATA, parent, key, data);
}
return this;
},
/**
* Passes all data entries to the given callback.
*
* @method Phaser.Data.DataManager#each
* @since 3.0.0
*
* @param {DataEachCallback} callback - The function to call.
* @param {*} [context] - Value to use as `this` when executing callback.
* @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
*
* @return {this} This DataManager object.
*/
each: function (callback, context)
{
var args = [ this.parent, null, undefined ];
for (var i = 1; i < arguments.length; i++)
{
args.push(arguments[i]);
}
for (var key in this.list)
{
args[1] = key;
args[2] = this.list[key];
callback.apply(context, args);
}
return this;
},
/**
* Merge the given object of key value pairs into this DataManager.
*
* Any newly created values will emit a `setdata` event. Any updated values (see the `overwrite` argument)
* will emit a `changedata` event.
*
* @method Phaser.Data.DataManager#merge
* @fires Phaser.Data.Events#SET_DATA
* @fires Phaser.Data.Events#CHANGE_DATA
* @fires Phaser.Data.Events#CHANGE_DATA_KEY
* @since 3.0.0
*
* @param {Object.<string, *>} data - The data to merge.
* @param {boolean} [overwrite=true] - Whether to overwrite existing data. Defaults to true.
*
* @return {this} This DataManager object.
*/
merge: function (data, overwrite)
{
if (overwrite === undefined) { overwrite = true; }
// Merge data from another component into this one
for (var key in data)
{
if (data.hasOwnProperty(key) && (overwrite || (!overwrite && !this.has(key))))
{
this.setValue(key, data[key]);
}
}
return this;
},
/**
* Remove the value for the given key.
*
* If the key is found in this Data Manager it is removed from the internal lists and a
* `removedata` event is emitted.
*
* You can also pass in an array of keys, in which case all keys in the array will be removed:
*
* ```javascript
* this.data.remove([ 'gold', 'armor', 'health' ]);
* ```
*
* @method Phaser.Data.DataManager#remove
* @fires Phaser.Data.Events#REMOVE_DATA
* @since 3.0.0
*
* @param {(string|string[])} key - The key to remove, or an array of keys to remove.
*
* @return {this} This DataManager object.
*/
remove: function (key)
{
if (this._frozen)
{
return this;
}
if (Array.isArray(key))
{
for (var i = 0; i < key.length; i++)
{
this.removeValue(key[i]);
}
}
else
{
return this.removeValue(key);
}
return this;
},
/**
* Internal value remover, called automatically by the `remove` method.
*
* @method Phaser.Data.DataManager#removeValue
* @private
* @fires Phaser.Data.Events#REMOVE_DATA
* @since 3.10.0
*
* @param {string} key - The key to set the value for.
*
* @return {this} This DataManager object.
*/
removeValue: function (key)
{
if (this.has(key))
{
var data = this.list[key];
delete this.list[key];
delete this.values[key];
this.events.emit(Events.REMOVE_DATA, this.parent, key, data);
}
return this;
},
/**
* Retrieves the data associated with the given 'key', deletes it from this Data Manager, then returns it.
*
* @method Phaser.Data.DataManager#pop
* @fires Phaser.Data.Events#REMOVE_DATA
* @since 3.0.0
*
* @param {string} key - The key of the value to retrieve and delete.
*
* @return {*} The value of the given key.
*/
pop: function (key)
{
var data = undefined;
if (!this._frozen && this.has(key))
{
data = this.list[key];
delete this.list[key];
delete this.values[key];
this.events.emit(Events.REMOVE_DATA, this.parent, key, data);
}
return data;
},
/**
* Determines whether the given key is set in this Data Manager.
*
* Please note that the keys are case-sensitive and must be valid JavaScript Object property strings.
* This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
*
* @method Phaser.Data.DataManager#has
* @since 3.0.0
*
* @param {string} key - The key to check.
*
* @return {boolean} Returns `true` if the key exists, otherwise `false`.
*/
has: function (key)
{
return this.list.hasOwnProperty(key);
},
/**
* Freeze or unfreeze this Data Manager. A frozen Data Manager will block all attempts
* to create new values or update existing ones.
*
* @method Phaser.Data.DataManager#setFreeze
* @since 3.0.0
*
* @param {boolean} value - Whether to freeze or unfreeze the Data Manager.
*
* @return {this} This DataManager object.
*/
setFreeze: function (value)
{
this._frozen = value;
return this;
},
/**
* Delete all data in this Data Manager and unfreeze it.
*
* @method Phaser.Data.DataManager#reset
* @since 3.0.0
*
* @return {this} This DataManager object.
*/
reset: function ()
{
for (var key in this.list)
{
delete this.list[key];
delete this.values[key];
}
this._frozen = false;
return this;
},
/**
* Destroy this data manager.
*
* @method Phaser.Data.DataManager#destroy
* @since 3.0.0
*/
destroy: function ()
{
this.reset();
this.events.off(Events.CHANGE_DATA);
this.events.off(Events.SET_DATA);
this.events.off(Events.REMOVE_DATA);
this.parent = null;
},
/**
* Gets or sets the frozen state of this Data Manager.
* A frozen Data Manager will block all attempts to create new values or update existing ones.
*
* @name Phaser.Data.DataManager#freeze
* @type {boolean}
* @since 3.0.0
*/
freeze: {
get: function ()
{
return this._frozen;
},
set: function (value)
{
this._frozen = (value) ? true : false;
}
},
/**
* Return the total number of entries in this Data Manager.
*
* @name Phaser.Data.DataManager#count
* @type {number}
* @since 3.0.0
*/
count: {
get: function ()
{
var i = 0;
for (var key in this.list)
{
if (this.list[key] !== undefined)
{
i++;
}
}
return i;
}
}
});
module.exports = DataManager;
/***/ }),
/***/ "../../../src/data/events/CHANGE_DATA_EVENT.js":
/*!*************************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/events/CHANGE_DATA_EVENT.js ***!
\*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* The Change Data Event.
*
* This event is dispatched by a Data Manager when an item in the data store is changed.
*
* Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
* a change data event from a Game Object you would use: `sprite.on('changedata', listener)`.
*
* This event is dispatched for all items that change in the Data Manager.
* To listen for the change of a specific item, use the `CHANGE_DATA_KEY_EVENT` event.
*
* @event Phaser.Data.Events#CHANGE_DATA
* @type {string}
* @since 3.0.0
*
* @param {any} parent - A reference to the object that the Data Manager responsible for this event belongs to.
* @param {string} key - The unique key of the data item within the Data Manager.
* @param {any} value - The new value of the item in the Data Manager.
* @param {any} previousValue - The previous value of the item in the Data Manager.
*/
module.exports = 'changedata';
/***/ }),
/***/ "../../../src/data/events/CHANGE_DATA_KEY_EVENT.js":
/*!*****************************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/events/CHANGE_DATA_KEY_EVENT.js ***!
\*****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* The Change Data Key Event.
*
* This event is dispatched by a Data Manager when an item in the data store is changed.
*
* Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
* the change of a specific data item from a Game Object you would use: `sprite.on('changedata-key', listener)`,
* where `key` is the unique string key of the data item. For example, if you have a data item stored called `gold`
* then you can listen for `sprite.on('changedata-gold')`.
*
* @event Phaser.Data.Events#CHANGE_DATA_KEY
* @type {string}
* @since 3.16.1
*
* @param {any} parent - A reference to the object that owns the instance of the Data Manager responsible for this event.
* @param {any} value - The item that was updated in the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
* @param {any} previousValue - The previous item that was updated in the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
*/
module.exports = 'changedata-';
/***/ }),
/***/ "../../../src/data/events/DESTROY_EVENT.js":
/*!*********************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/events/DESTROY_EVENT.js ***!
\*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* The Data Manager Destroy Event.
*
* The Data Manager will listen for the destroy event from its parent, and then close itself down.
*
* @event Phaser.Data.Events#DESTROY
* @type {string}
* @since 3.50.0
*/
module.exports = 'destroy';
/***/ }),
/***/ "../../../src/data/events/REMOVE_DATA_EVENT.js":
/*!*************************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/events/REMOVE_DATA_EVENT.js ***!
\*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* The Remove Data Event.
*
* This event is dispatched by a Data Manager when an item is removed from it.
*
* Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
* the removal of a data item on a Game Object you would use: `sprite.on('removedata', listener)`.
*
* @event Phaser.Data.Events#REMOVE_DATA
* @type {string}
* @since 3.0.0
*
* @param {any} parent - A reference to the object that owns the instance of the Data Manager responsible for this event.
* @param {string} key - The unique key of the data item within the Data Manager.
* @param {any} data - The item that was removed from the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
*/
module.exports = 'removedata';
/***/ }),
/***/ "../../../src/data/events/SET_DATA_EVENT.js":
/*!**********************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/events/SET_DATA_EVENT.js ***!
\**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* The Set Data Event.
*
* This event is dispatched by a Data Manager when a new item is added to the data store.
*
* Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
* the addition of a new data item on a Game Object you would use: `sprite.on('setdata', listener)`.
*
* @event Phaser.Data.Events#SET_DATA
* @type {string}
* @since 3.0.0
*
* @param {any} parent - A reference to the object that owns the instance of the Data Manager responsible for this event.
* @param {string} key - The unique key of the data item within the Data Manager.
* @param {any} data - The item that was added to the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
*/
module.exports = 'setdata';
/***/ }),
/***/ "../../../src/data/events/index.js":
/*!*************************************************************************************!*\
!*** /Users/justintien/workspace/github/justintien/phaser/src/data/events/index.js ***!
\*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2013-2023 Photon Storm Ltd.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
/**
* @namespace Phaser.Data.Events
*/
module.exports = {
CHANGE_DATA: __webpack_require__(/*! ./CHANGE_DATA_EVENT */ "../../../src/data/events/CHANGE_DATA_EVENT.js"),
CHANGE_DATA_KEY: __webpack_require__(/*! ./CHANGE_DATA_KEY_EVENT */ "../../../src/data/events/CHANGE_DATA_KEY_EVENT.js"),
DESTROY: __webpack_require__(/*! ./DESTROY_EVENT */ "../../../src/data/events/DESTROY_EVENT.js"),