diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Alloro-1.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Alloro-1.png new file mode 100644 index 0000000..6189585 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Alloro-1.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Alloro.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Alloro.png new file mode 100644 index 0000000..0734e25 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Alloro.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Background1.jpeg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Background1.jpeg new file mode 100644 index 0000000..56fcea5 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Background1.jpeg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Base.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Base.png new file mode 100644 index 0000000..79f157e Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Base.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Bestie.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Bestie.ogg new file mode 100644 index 0000000..02214cd Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Bestie.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Bottone Play.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Bottone Play.png new file mode 100644 index 0000000..7e36bab Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Bottone Play.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Buco-nero-da-convertire-in-OOG.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Buco-nero-da-convertire-in-OOG.ogg new file mode 100644 index 0000000..0507963 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Buco-nero-da-convertire-in-OOG.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Carabinieri 1.2.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Carabinieri 1.2.png new file mode 100644 index 0000000..ff5ab8f Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Carabinieri 1.2.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Copertina0.jpg.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Copertina0.jpg.png new file mode 100644 index 0000000..f2b0973 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Copertina0.jpg.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js new file mode 100644 index 0000000..14139ea --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js @@ -0,0 +1,57 @@ +/** +GDevelop - DestroyOutside Behavior Extension +Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com) + */ + +/** + * The destroyOutsideRuntimeBehavior represents a behavior allowing objects to be + * moved using the mouse. + * + * @class DestroyOutsideRuntimeBehavior + * @constructor + */ +gdjs.DestroyOutsideRuntimeBehavior = function(runtimeScene, behaviorData, owner) +{ + gdjs.RuntimeBehavior.call(this, runtimeScene, behaviorData, owner); + + this._extraBorder = behaviorData.extraBorder || 0; +}; + +gdjs.DestroyOutsideRuntimeBehavior.prototype = Object.create( gdjs.RuntimeBehavior.prototype ); +gdjs.registerBehavior("DestroyOutsideBehavior::DestroyOutside", gdjs.DestroyOutsideRuntimeBehavior); + +gdjs.DestroyOutsideRuntimeBehavior.prototype.doStepPostEvents = function(runtimeScene) { + + // TODO: This would better be done using the object AABB (getAABB), as (`getCenterX`;`getCenterY`) point + // is not necessarily in the middle of the object (for sprites for example). + var ow = this.owner.getWidth(); + var oh = this.owner.getHeight(); + var ocx = this.owner.getDrawableX()+this.owner.getCenterX(); + var ocy = this.owner.getDrawableY()+this.owner.getCenterY(); + var layer = runtimeScene.getLayer(this.owner.getLayer()); + + var boundingCircleRadius = Math.sqrt(ow*ow+oh*oh)/2.0; + if ( ocx+boundingCircleRadius+this._extraBorder < layer.getCameraX()-layer.getCameraWidth()/2 + || ocx-boundingCircleRadius-this._extraBorder > layer.getCameraX()+layer.getCameraWidth()/2 + || ocy+boundingCircleRadius+this._extraBorder < layer.getCameraY()-layer.getCameraHeight()/2 + || ocy-boundingCircleRadius-this._extraBorder > layer.getCameraY()+layer.getCameraHeight()/2 ) { + //We are outside the camera area. + this.owner.deleteFromScene(runtimeScene); + } +}; + +/** + * Set an additional border to the camera viewport as a buffer before the object gets destroyed. + * @param {number} val Border in pixels. + */ +gdjs.DestroyOutsideRuntimeBehavior.prototype.setExtraBorder = function(val) { + this._extraBorder = val; +}; + +/** + * Get the additional border of the camera viewport buffer which triggers the destruction of an object. + * @return {number} The additional border around the camera viewport in pixels + */ +gdjs.DestroyOutsideRuntimeBehavior.prototype.getExtraBorder = function() { + return this._extraBorder; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js new file mode 100644 index 0000000..717b349 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js @@ -0,0 +1,343 @@ +gdjs.PanelSpriteRuntimeObjectPixiRenderer = function( + runtimeObject, + runtimeScene, + textureName, + tiled +) { + this._object = runtimeObject; + + if (this._spritesContainer === undefined) { + var texture = runtimeScene + .getGame() + .getImageManager() + .getPIXITexture(textureName); + + var StretchedSprite = !tiled ? PIXI.Sprite : PIXI.extras.TilingSprite; + + this._spritesContainer = new PIXI.Container(); + this._centerSprite = new StretchedSprite(new PIXI.Texture(texture)); + this._borderSprites = [ + new StretchedSprite(new PIXI.Texture(texture)), //Right + new PIXI.Sprite(texture), //Top-Right + new StretchedSprite(new PIXI.Texture(texture)), //Top + new PIXI.Sprite(texture), //Top-Left + new StretchedSprite(new PIXI.Texture(texture)), //Left + new PIXI.Sprite(texture), //Bottom-Left + new StretchedSprite(new PIXI.Texture(texture)), //Bottom + new PIXI.Sprite(texture), //Bottom-Right + ]; + } + + this.setTexture(textureName, runtimeScene); + + this._spritesContainer.removeChildren(); + this._spritesContainer.addChild(this._centerSprite); + for (var i = 0; i < this._borderSprites.length; ++i) { + this._spritesContainer.addChild(this._borderSprites[i]); + } + + this._alpha = this._spritesContainer.alpha; + runtimeScene + .getLayer('') + .getRenderer() + .addRendererObject(this._spritesContainer, runtimeObject.getZOrder()); +}; + +gdjs.PanelSpriteRuntimeObjectRenderer = + gdjs.PanelSpriteRuntimeObjectPixiRenderer; //Register the class to let the engine use it. + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.getRendererObject = function() { + return this._spritesContainer; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.ensureUpToDate = function() { + if (this._spritesContainer.visible && this._wasRendered) { + // Update the alpha of the container to make sure that it's applied. + // If not done, the alpha will be back to full opaque when changing the color + // of the object. + this._spritesContainer.alpha = this._alpha; + this._spritesContainer.cacheAsBitmap = true; + } + + this._wasRendered = true; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateOpacity = function() { + //TODO: Workaround a not working property in PIXI.js: + this._spritesContainer.alpha = this._spritesContainer.visible + ? this._object.opacity / 255 + : 0; + this._alpha = this._spritesContainer.alpha; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateAngle = function() { + this._spritesContainer.rotation = gdjs.toRad(this._object.angle); +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updatePosition = function() { + this._spritesContainer.position.x = this._object.x + this._object._width / 2; + this._spritesContainer.position.y = this._object.y + this._object._height / 2; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype._updateLocalPositions = function() { + var obj = this._object; + + this._centerSprite.position.x = obj._lBorder; + this._centerSprite.position.y = obj._tBorder; + + //Right + this._borderSprites[0].position.x = obj._width - obj._rBorder; + this._borderSprites[0].position.y = obj._tBorder; + + //Top-right + this._borderSprites[1].position.x = obj._width - this._borderSprites[1].width; + this._borderSprites[1].position.y = 0; + + //Top + this._borderSprites[2].position.x = obj._lBorder; + this._borderSprites[2].position.y = 0; + //Top-Left + this._borderSprites[3].position.x = 0; + this._borderSprites[3].position.y = 0; + //Left + this._borderSprites[4].position.x = 0; + this._borderSprites[4].position.y = obj._tBorder; + //Bottom-Left + this._borderSprites[5].position.x = 0; + this._borderSprites[5].position.y = + obj._height - this._borderSprites[5].height; + //Bottom + this._borderSprites[6].position.x = obj._lBorder; + this._borderSprites[6].position.y = obj._height - obj._bBorder; + //Bottom-Right + this._borderSprites[7].position.x = obj._width - this._borderSprites[7].width; + this._borderSprites[7].position.y = + obj._height - this._borderSprites[7].height; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype._updateSpritesAndTexturesSize = function() { + var obj = this._object; + + this._centerSprite.width = Math.max( + obj._width - obj._rBorder - obj._lBorder, + 0 + ); + this._centerSprite.height = Math.max( + obj._height - obj._tBorder - obj._bBorder, + 0 + ); + + //Right + this._borderSprites[0].width = obj._rBorder; + this._borderSprites[0].height = Math.max( + obj._height - obj._tBorder - obj._bBorder, + 0 + ); + + //Top + this._borderSprites[2].height = obj._tBorder; + this._borderSprites[2].width = Math.max( + obj._width - obj._rBorder - obj._lBorder, + 0 + ); + //Left + this._borderSprites[4].width = obj._lBorder; + this._borderSprites[4].height = Math.max( + obj._height - obj._tBorder - obj._bBorder, + 0 + ); + //Bottom + this._borderSprites[6].height = obj._bBorder; + this._borderSprites[6].width = Math.max( + obj._width - obj._rBorder - obj._lBorder, + 0 + ); + + this._wasRendered = true; + this._spritesContainer.cacheAsBitmap = false; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function( + textureName, + runtimeScene +) { + var obj = this._object; + var texture = runtimeScene + .getGame() + .getImageManager() + .getPIXITexture(textureName); + + function makeInsideTexture(rect) { + //TODO + if (rect.width < 0) rect.width = 0; + if (rect.height < 0) rect.height = 0; + if (rect.x < 0) rect.x = 0; + if (rect.y < 0) rect.y = 0; + if (rect.x > texture.width) rect.x = texture.width; + if (rect.y > texture.height) rect.y = texture.height; + if (rect.x + rect.width > texture.width) + rect.width = texture.width - rect.x; + if (rect.y + rect.height > texture.height) + rect.height = texture.height - rect.y; + + return rect; + } + + this._centerSprite.texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + obj._lBorder, + obj._tBorder, + texture.width - obj._lBorder - obj._rBorder, + texture.height - obj._tBorder - obj._bBorder + ) + ) + ); + + //Top, Bottom, Right, Left borders: + this._borderSprites[0].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + texture.width - obj._rBorder, + obj._tBorder, + obj._rBorder, + texture.height - obj._tBorder - obj._bBorder + ) + ) + ); + this._borderSprites[2].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + obj._lBorder, + 0, + texture.width - obj._lBorder - obj._rBorder, + obj._tBorder + ) + ) + ); + this._borderSprites[4].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + 0, + obj._tBorder, + obj._lBorder, + texture.height - obj._tBorder - obj._bBorder + ) + ) + ); + this._borderSprites[6].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + obj._lBorder, + texture.height - obj._bBorder, + texture.width - obj._lBorder - obj._rBorder, + obj._bBorder + ) + ) + ); + + this._borderSprites[1].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + this._borderSprites[1].width - obj._rBorder, + 0, + obj._rBorder, + obj._tBorder + ) + ) + ); + this._borderSprites[3].texture = new PIXI.Texture( + texture, + makeInsideTexture(new PIXI.Rectangle(0, 0, obj._lBorder, obj._tBorder)) + ); + this._borderSprites[5].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + 0, + this._borderSprites[5].height - obj._bBorder, + obj._lBorder, + obj._bBorder + ) + ) + ); + this._borderSprites[7].texture = new PIXI.Texture( + texture, + makeInsideTexture( + new PIXI.Rectangle( + this._borderSprites[7].width - obj._rBorder, + this._borderSprites[7].height - obj._bBorder, + obj._rBorder, + obj._bBorder + ) + ) + ); + + this._updateSpritesAndTexturesSize(); + this._updateLocalPositions(); + this.updatePosition(); + this._spritesContainer.pivot.x = this._object._width / 2; + this._spritesContainer.pivot.y = this._object._height / 2; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateWidth = function() { + this._spritesContainer.pivot.x = this._object._width / 2; + this._updateSpritesAndTexturesSize(); + this._updateLocalPositions(); + this.updatePosition(); +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.updateHeight = function() { + this._spritesContainer.pivot.y = this._object._height / 2; + this._updateSpritesAndTexturesSize(); + this._updateLocalPositions(); + this.updatePosition(); +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setColor = function( + rgbColor +) { + var colors = rgbColor.split(';'); + if (colors.length < 3) return; + + this._centerSprite.tint = + '0x' + + gdjs.rgbToHex( + parseInt(colors[0], 10), + parseInt(colors[1], 10), + parseInt(colors[2], 10) + ); + + for ( + var borderCounter = 0; + borderCounter < this._borderSprites.length; + borderCounter++ + ) { + this._borderSprites[borderCounter].tint = + '0x' + + gdjs.rgbToHex( + parseInt(colors[0], 10), + parseInt(colors[1], 10), + parseInt(colors[2], 10) + ); + } + + this._spritesContainer.cacheAsBitmap = false; +}; + +gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.getColor = function() { + var rgb = PIXI.utils.hex2rgb(this._centerSprite.tint); + return ( + Math.floor(rgb[0] * 255) + + ';' + + Math.floor(rgb[1] * 255) + + ';' + + Math.floor(rgb[2] * 255) + ); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/PanelSpriteObject/panelspriteruntimeobject.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/PanelSpriteObject/panelspriteruntimeobject.js new file mode 100644 index 0000000..51bb5c0 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/PanelSpriteObject/panelspriteruntimeobject.js @@ -0,0 +1,222 @@ +/* + * GDevelop JS Platform + * 2013 Florian Rival (Florian.Rival@gmail.com) + */ + +/** + * @typedef {Object} PanelSpriteObjectDataType + * @property {number} rightMargin The right margin + * @property {number} leftMargin The left margin + * @property {number} topMargin The top margin + * @property {number} bottomMargin The bottom margin + * @property {boolean} [tiled] Are the central part and borders tiled? + * @property {number} width The object width + * @property {number} height The object height + * @property {string} texture The name of the resource containing the texture to use + * + * @typedef {ObjectData & PanelSpriteObjectDataType} PanelSpriteObjectData + */ + +/** + * The PanelSpriteRuntimeObject displays a tiled texture. + * + * @class PanelSpriteRuntimeObject + * @extends RuntimeObject + * @memberof gdjs + * @param {gdjs.RuntimeScene} runtimeScene The {@link gdjs.RuntimeScene} the object belongs to + * @param {PanelSpriteObjectData} panelSpriteObjectData The initial properties of the object + */ +gdjs.PanelSpriteRuntimeObject = function(runtimeScene, panelSpriteObjectData) { + gdjs.RuntimeObject.call(this, runtimeScene, panelSpriteObjectData); + + /** @type {number} */ + this._rBorder = panelSpriteObjectData.rightMargin; + + /** @type {number} */ + this._lBorder = panelSpriteObjectData.leftMargin; + + /** @type {number} */ + this._tBorder = panelSpriteObjectData.topMargin; + + /** @type {number} */ + this._bBorder = panelSpriteObjectData.bottomMargin; + + /** @type {boolean} */ + this._tiled = panelSpriteObjectData.tiled; + + /** @type {number} */ + this._width = panelSpriteObjectData.width; + + /** @type {number} */ + this._height = panelSpriteObjectData.height; + + /** @type {number} */ + this.opacity = 255; + + if (this._renderer) { + gdjs.PanelSpriteRuntimeObjectRenderer.call( + this._renderer, + this, + runtimeScene, + panelSpriteObjectData.texture, + panelSpriteObjectData.tiled + ); + } else { + /** @type {gdjs.PanelSpriteRuntimeObjectRenderer} */ + this._renderer = new gdjs.PanelSpriteRuntimeObjectRenderer( + this, + runtimeScene, + panelSpriteObjectData.texture, + panelSpriteObjectData.tiled + ); + } + + // *ALWAYS* call `this.onCreated()` at the very end of your object constructor. + this.onCreated(); +}; + +gdjs.PanelSpriteRuntimeObject.prototype = Object.create( + gdjs.RuntimeObject.prototype +); +gdjs.registerObject("PanelSpriteObject::PanelSprite", gdjs.PanelSpriteRuntimeObject); + +gdjs.PanelSpriteRuntimeObject.prototype.getRendererObject = function() { + return this._renderer.getRendererObject(); +}; + +gdjs.PanelSpriteRuntimeObject.prototype.onDestroyFromScene = function( + runtimeScene +) { + gdjs.RuntimeObject.prototype.onDestroyFromScene.call(this, runtimeScene); + + if (this._renderer.onDestroy) { + this._renderer.onDestroy(); + } +}; + +gdjs.PanelSpriteRuntimeObject.prototype.update = function() { + this._renderer.ensureUpToDate(); +}; + +/** + * Initialize the extra parameters that could be set for an instance. + */ +gdjs.PanelSpriteRuntimeObject.prototype.extraInitializationFromInitialInstance = function( + initialInstanceData +) { + if (initialInstanceData.customSize) { + this.setWidth(initialInstanceData.width); + this.setHeight(initialInstanceData.height); + } +}; + +/** + * Set the x position of the panel sprite. + * @param {number} x The new x position in pixels. + */ +gdjs.PanelSpriteRuntimeObject.prototype.setX = function(x) { + gdjs.RuntimeObject.prototype.setX.call(this, x); + this._renderer.updatePosition(); +}; + +/** + * Set the y position of the panel sprite. + * @param {number} y The new y position in pixels. + */ +gdjs.PanelSpriteRuntimeObject.prototype.setY = function(y) { + gdjs.RuntimeObject.prototype.setY.call(this, y); + this._renderer.updatePosition(); +}; + +/** + * Set the texture of the panel sprite. + * @param {string} textureName The name of the texture. + * @param {gdjs.RuntimeScene} runtimeScene The scene the object lives in. + */ +gdjs.PanelSpriteRuntimeObject.prototype.setTexture = function( + textureName, + runtimeScene +) { + this._renderer.setTexture(textureName, runtimeScene); +}; + +/** + * Set the angle of the panel sprite. + * @param {number} angle The new angle in degrees. + */ +gdjs.PanelSpriteRuntimeObject.prototype.setAngle = function(angle) { + gdjs.RuntimeObject.prototype.setAngle.call(this, angle); + this._renderer.updateAngle(); +}; + +/** + * Get the width of the panel sprite in pixels + * @return {number} The width in pixels + */ +gdjs.PanelSpriteRuntimeObject.prototype.getWidth = function() { + return this._width; +}; + +/** + * Get the height of the panel sprite in pixels + * @return {number} The height in pixels + */ +gdjs.PanelSpriteRuntimeObject.prototype.getHeight = function() { + return this._height; +}; + +/** + * Set the width of the panel sprite. + * @param {number} width The new width in pixels. + */ +gdjs.PanelSpriteRuntimeObject.prototype.setWidth = function(width) { + this._width = width; + this._renderer.updateWidth(); +}; + +/** + * Set the height of the panel sprite. + * @param {number} height The new height in pixels. + */ +gdjs.PanelSpriteRuntimeObject.prototype.setHeight = function(height) { + this._height = height; + this._renderer.updateHeight(); +}; + +/** + * Change the transparency of the object. + * @param {number} opacity The new opacity, between 0 (transparent) and 255 (opaque). + */ +gdjs.PanelSpriteRuntimeObject.prototype.setOpacity = function(opacity) { + if (opacity < 0) opacity = 0; + if (opacity > 255) opacity = 255; + + this.opacity = opacity; + this._renderer.updateOpacity(); +}; + +/** + * Get the transparency of the object. + * @return {number} The opacity, between 0 (transparent) and 255 (opaque). + */ +gdjs.PanelSpriteRuntimeObject.prototype.getOpacity = function() { + return this.opacity; +}; + +/** + * Change the tint of the panel sprite object. + * + * @param {string} rgbColor The color, in RGB format ("128;200;255"). + */ +gdjs.PanelSpriteRuntimeObject.prototype.setColor = function(rgbColor) { + this._renderer.setColor(rgbColor); +}; + +/** + * Get the tint of the panel sprite object. + * + * @returns {string} rgbColor The color, in RGB format ("128;200;255"). + */ +gdjs.PanelSpriteRuntimeObject.prototype.getColor = function() { + return this._renderer.getColor(); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/SystemInfo/systeminfotools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/SystemInfo/systeminfotools.js new file mode 100644 index 0000000..516f026 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/SystemInfo/systeminfotools.js @@ -0,0 +1,39 @@ +/** +GDevelop - SystemInfo Extension +Copyright (c) 2016 Florian Rival (Florian.Rival@gmail.com) + */ + +/** + * @memberof gdjs.evtTools + * @class linkedObjects + * @static + * @private + */ +gdjs.evtTools.systemInfo = {}; + +gdjs.evtTools.systemInfo.isMobile = function() { + if (typeof cc !== "undefined" && cc.sys) { + return cc.sys.isMobile; + } else if (typeof Cocoon !== "undefined" && Cocoon.App) { + return true; + } else if (typeof window !== "undefined" && window.cordova) { + return true; + } else if (typeof window !== "undefined") { + // Try to detect mobile device browsers. + if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) + || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) { + return true; + } + } + + return false; +}; + +/** + * Check if the the device supports WebGL. + * @param {gdjs.RuntimeScene} runtimeScene + * @returns {boolean} true if WebGL is supported + */ +gdjs.evtTools.systemInfo.isWebGLSupported = function(runtimeScene) { + return runtimeScene.getGame().getRenderer().isWebGLSupported(); +}; \ No newline at end of file diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/TextObject/textruntimeobject-pixi-renderer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/TextObject/textruntimeobject-pixi-renderer.js new file mode 100644 index 0000000..2a61935 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/TextObject/textruntimeobject-pixi-renderer.js @@ -0,0 +1,166 @@ +gdjs.TextRuntimeObjectPixiRenderer = function(runtimeObject, runtimeScene) +{ + this._object = runtimeObject; + this._fontManager = runtimeScene.getGame().getFontManager(); + + if ( this._text === undefined ) this._text = new PIXI.Text(" ", {align:"left"}); + this._text.anchor.x = 0.5; + this._text.anchor.y = 0.5; + runtimeScene.getLayer("").getRenderer().addRendererObject(this._text, runtimeObject.getZOrder()); + + this._text.text = runtimeObject._str.length === 0 ? " " : runtimeObject._str; + this._justCreated = true; //Work around a PIXI.js bug. See updateTime method. + this.updateStyle(); + this.updatePosition(); +}; + +gdjs.TextRuntimeObjectRenderer = gdjs.TextRuntimeObjectPixiRenderer; //Register the class to let the engine use it. + +gdjs.TextRuntimeObjectPixiRenderer.prototype.getRendererObject = function() { + return this._text; +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.ensureUpToDate = function() { + if (this._justCreated) { //Work around a PIXI.js bug: + this._text.updateText(); + this.updatePosition(); //Width seems not to be correct when text is not rendered yet. + this._justCreated = false; + } +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.updateStyle = function() { + var fontName = "\"" + this._fontManager.getFontFamily(this._object._fontName) + "\""; + + var style = this._text.style; + style.fontStyle = this._object._italic ? 'italic' : 'normal'; + style.fontWeight = this._object._bold ? 'bold' : 'normal'; + style.fontSize = this._object._characterSize; + style.fontFamily = fontName; + + if (this._object._useGradient){ + style.fill = this._getGradientHex(); + } else { + style.fill = this._getColorHex(); + } + + if (this._object._gradientType === 'LINEAR_VERTICAL'){ + style.fillGradientType = PIXI.TEXT_GRADIENT.LINEAR_VERTICAL; + } else { + style.fillGradientType = PIXI.TEXT_GRADIENT.LINEAR_HORIZONTAL; + } + + style.align = this._object._textAlign; + style.wordWrap = this._object._wrapping; + style.wordWrapWidth = this._object._wrappingWidth; + style.breakWords = true; + style.stroke = gdjs.rgbToHexNumber( + this._object._outlineColor[0], + this._object._outlineColor[1], + this._object._outlineColor[2] + ); + style.strokeThickness = this._object._outlineThickness; + style.dropShadow = this._object._shadow; + style.dropShadowColor = gdjs.rgbToHexNumber( + this._object._shadowColor[0], + this._object._shadowColor[1], + this._object._shadowColor[2] + ); + style.dropShadowBlur = this._object._shadowBlur; + style.dropShadowAngle = this._object._shadowAngle; + style.dropShadowDistance = this._object._shadowDistance; + style.padding = this._object._padding; + // Prevent spikey outlines by adding a miter limit + style.miterLimit = 3; + + this.updatePosition(); + + // Manually ask the PIXI object to re-render as we changed a style property + // see http://www.html5gamedevs.com/topic/16924-change-text-style-post-render/ + this._text.dirty = true; +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.updatePosition = function() { + this._text.position.x = this._object.x+this._text.width/2; + this._text.position.y = this._object.y+this._text.height/2; +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.updateAngle = function() { + this._text.rotation = gdjs.toRad(this._object.angle); +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.updateOpacity = function() { + this._text.alpha = this._object.opacity / 255; +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.updateString = function() { + this._text.text = this._object._str.length === 0 ? " " : this._object._str; + this._text.updateText(); //Work around a PIXI.js bug. +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.getWidth = function() { + return this._text.width; +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype.getHeight = function() { + return this._text.height; +}; + +gdjs.TextRuntimeObjectPixiRenderer.prototype._getColorHex = function() { + return gdjs.rgbToHexNumber( + this._object._color[0], + this._object._color[1], + this._object._color[2] + ); +} + +gdjs.TextRuntimeObjectPixiRenderer.prototype._getGradientHex = function() { + var gradient = []; + for (var colorIndex = 0; colorIndex < this._object._gradient.length; colorIndex++){ + gradient.push( + '#' + gdjs.rgbToHex( + this._object._gradient[colorIndex][0], + this._object._gradient[colorIndex][1], + this._object._gradient[colorIndex][2] + ) + ); + } + return gradient; +} +/** + * Get y-scale of the text. + */ +gdjs.TextRuntimeObjectPixiRenderer.prototype.getScaleX = function() { + return this._text.scale.x; +}; + +/** + * Get x-scale of the text. + */ +gdjs.TextRuntimeObjectPixiRenderer.prototype.getScaleY = function() { + return this._text.scale.y; +}; + +/** + * Set the text object scale. + * @param {number} newScale The new scale for the text object. + */ +gdjs.TextRuntimeObjectPixiRenderer.prototype.setScale = function(newScale) { + this._text.scale.x = newScale; + this._text.scale.y = newScale; +}; + +/** + * Set the text object x-scale. + * @param {number} newScale The new x-scale for the text object. + */ +gdjs.TextRuntimeObjectPixiRenderer.prototype.setScaleX = function(newScale) { + this._text.scale.x = newScale; +}; + +/** + * Set the text object y-scale. + * @param {number} newScale The new y-scale for the text object. + */ +gdjs.TextRuntimeObjectPixiRenderer.prototype.setScaleY = function(newScale) { + this._text.scale.y = newScale; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/TextObject/textruntimeobject.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/TextObject/textruntimeobject.js new file mode 100644 index 0000000..b56f897 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Extensions/TextObject/textruntimeobject.js @@ -0,0 +1,513 @@ +/* + * GDevelop JS Platform + * 2013-2016 Florian Rival (Florian.Rival@gmail.com) + */ + +/** + * @typedef {Object} TextObjectDataType Base parameters for gdjs.TextRuntimeObject + * @property {number} characterSize The size of the characters + * @property {string} font The font name + * @property {boolean} bold Is Bold? + * @property {boolean} italic Is Italic? + * @property {boolean} underlined Is Underlined? + * @property {Object} color The text color in an RGB representation + * @property {number} color.r The Red level from 0 to 255 + * @property {number} color.g The Green level from 0 to 255 + * @property {number} color.b The Blue level from 0 to 255 + * @property {string} string The text of the object + * + * @typedef {ObjectData & TextObjectDataType} TextObjectData + */ + +/** + * Displays a text. + * + * @memberof gdjs + * @class TextRuntimeObject + * @extends RuntimeObject + * @param {gdjs.RuntimeScene} runtimeScene The {@link gdjs.RuntimeScene} the object belongs to + * @param {TextObjectData} textObjectData The initial properties of the object + */ +gdjs.TextRuntimeObject = function(runtimeScene, textObjectData) +{ + gdjs.RuntimeObject.call(this, runtimeScene, textObjectData); + + /** @type {number} */ + this._characterSize = Math.max(1, textObjectData.characterSize); + + /** @type {string} */ + this._fontName = textObjectData.font; + + /** @type {boolean} */ + this._bold = textObjectData.bold; + + /** @type {boolean} */ + this._italic = textObjectData.italic; + + /** @type {boolean} */ + this._underlined = textObjectData.underlined; + + /** @type {Array} */ + this._color = [textObjectData.color.r, textObjectData.color.g, textObjectData.color.b]; + + /** @type {boolean} */ + this._useGradient = false; + + /** @type {Array} */ + this._gradient = []; + + /** @type {string} */ + this._gradientType = ''; + + /** @type {number} */ + this.opacity = 255; + + /** @type {string} */ + this._textAlign = 'left'; + + /** @type {boolean} */ + this._wrapping = false; + + /** @type {number} */ + this._wrappingWidth = 1; + + /** @type {number} */ + this._outlineThickness = 0; + + /** @type {Array} */ + this._outlineColor = [255,255,255]; + + /** @type {boolean} */ + this._shadow = false; + + /** @type {Array} */ + this._shadowColor = [0,0,0]; + + /** @type {number} */ + this._shadowDistance = 1; + + /** @type {number} */ + this._shadowBlur = 1; + + /** @type {number} */ + this._shadowAngle = 0; + + /** @type {number} */ + this._padding = 5; + + /** @type {number} */ + this._scaleX = 1; + + /** @type {number} */ + this._scaleY = 1; + + /** @type {string} */ + this._str = textObjectData.string; + + if (this._renderer) + gdjs.TextRuntimeObjectRenderer.call(this._renderer, this, runtimeScene); + else + /** @type {gdjs.TextRuntimeObjectRenderer} */ + this._renderer = new gdjs.TextRuntimeObjectRenderer(this, runtimeScene); + + // *ALWAYS* call `this.onCreated()` at the very end of your object constructor. + this.onCreated(); +}; + +gdjs.TextRuntimeObject.prototype = Object.create( gdjs.RuntimeObject.prototype ); +gdjs.registerObject("TextObject::Text", gdjs.TextRuntimeObject); + +gdjs.TextRuntimeObject.prototype.getRendererObject = function() { + return this._renderer.getRendererObject(); +}; + +gdjs.TextRuntimeObject.prototype.update = function() { + this._renderer.ensureUpToDate(); +}; + +/** + * Initialize the extra parameters that could be set for an instance. + * @private + */ +gdjs.TextRuntimeObject.prototype.extraInitializationFromInitialInstance = function(initialInstanceData) { + if ( initialInstanceData.customSize ) { + this.setWrapping(true); + this.setWrappingWidth(initialInstanceData.width); + } +}; + +/** + * Update the rendered object position. + * @private + */ +gdjs.TextRuntimeObject.prototype._updateTextPosition = function() { + this.hitBoxesDirty = true; + this._renderer.updatePosition(); +}; + +/** + * Set object position on X axis. + */ +gdjs.TextRuntimeObject.prototype.setX = function(x) { + gdjs.RuntimeObject.prototype.setX.call(this, x); + this._updateTextPosition(); +}; + +/** + * Set object position on Y axis. + */ +gdjs.TextRuntimeObject.prototype.setY = function(y) { + gdjs.RuntimeObject.prototype.setY.call(this, y); + this._updateTextPosition(); +}; + + /** + * Set the angle of the object. + * @param {number} angle The new angle of the object + */ +gdjs.TextRuntimeObject.prototype.setAngle = function(angle) { + gdjs.RuntimeObject.prototype.setAngle.call(this, angle); + this._renderer.updateAngle(); +}; + +/** + * Set object opacity. + */ +gdjs.TextRuntimeObject.prototype.setOpacity = function(opacity) { + if ( opacity < 0 ) opacity = 0; + if ( opacity > 255 ) opacity = 255; + + this.opacity = opacity; + this._renderer.updateOpacity(); +}; + +/** + * Get object opacity. + */ +gdjs.TextRuntimeObject.prototype.getOpacity = function() { + return this.opacity; +}; + +/** + * Get the string displayed by the object. + */ +gdjs.TextRuntimeObject.prototype.getString = function() { + return this._str; +}; + +/** + * Set the string displayed by the object. + * @param {string} str The new text + */ +gdjs.TextRuntimeObject.prototype.setString = function(str) { + if ( str === this._str ) return; + + this._str = str; + this._renderer.updateString(); + this._updateTextPosition(); +}; + +/** + * Get the font size of the characters of the object. + */ +gdjs.TextRuntimeObject.prototype.getCharacterSize = function() { + return this._characterSize; +}; + +/** + * Set the font size for characters of the object. + * @param {number} newSize The new font size for the text. + */ +gdjs.TextRuntimeObject.prototype.setCharacterSize = function(newSize) { + if (newSize <= 1) newSize = 1; + this._characterSize = newSize; + this._renderer.updateStyle(); +}; + +/** + * Return true if the text is bold. + */ +gdjs.TextRuntimeObject.prototype.isBold = function() { + return this._bold; +}; + +/** + * Set bold for the object text. + * @param enable {boolean} true to have a bold text, false otherwise. + */ +gdjs.TextRuntimeObject.prototype.setBold = function(enable) { + this._bold = enable; + this._renderer.updateStyle(); +}; + +/** + * Return true if the text is italic. + */ +gdjs.TextRuntimeObject.prototype.isItalic = function() { + return this._italic; +}; + +/** + * Set italic for the object text. + * @param enable {boolean} true to have an italic text, false otherwise. + */ +gdjs.TextRuntimeObject.prototype.setItalic = function(enable) { + this._italic = enable; + this._renderer.updateStyle(); +}; + +/** + * Get width of the text. + */ +gdjs.TextRuntimeObject.prototype.getWidth = function() { + return this._renderer.getWidth(); +}; + +/** + * Get height of the text. + */ +gdjs.TextRuntimeObject.prototype.getHeight = function() { + return this._renderer.getHeight(); +}; + +/** + * Get scale of the text. + */ +gdjs.TextRuntimeObject.prototype.getScale = function() { + return (Math.abs(this._scaleX)+Math.abs(this._scaleY))/2.0; +}; + +/** + * Get y-scale of the text. + */ +gdjs.TextRuntimeObject.prototype.getScaleX = function() { + return this._renderer.getScaleX(); +}; + +/** + * Get x-scale of the text. + */ +gdjs.TextRuntimeObject.prototype.getScaleY = function() { + return this._renderer.getScaleY(); +}; + +/** + * Set the text object scale. + * @param {number} newScale The new scale for the text object. + */ +gdjs.TextRuntimeObject.prototype.setScale = function(newScale) { + this._scaleX = newScale; + this._scaleY = newScale; + this._renderer.setScale(newScale); +}; + +/** + * Set the text object x-scale. + * @param {number} newScale The new x-scale for the text object. + */ +gdjs.TextRuntimeObject.prototype.setScaleX = function(newScale) { + this._scaleX = newScale; + this._renderer.setScaleX(newScale); +}; + +/** + * Set the text object y-scale. + * @param {number} newScale The new y-scale for the text object. + */ +gdjs.TextRuntimeObject.prototype.setScaleY = function(newScale) { + this._scaleY = newScale; + this._renderer.setScaleY(newScale); +}; + +/** + * Change the text color. + * @param {String} color color as a "R;G;B" string, for example: "255;0;0" + */ +gdjs.TextRuntimeObject.prototype.setColor = function(str) { + var color = str.split(";"); + if ( color.length < 3 ) return; + + this._color[0] = parseInt(color[0], 10); + this._color[1] = parseInt(color[1], 10); + this._color[2] = parseInt(color[2], 10); + + this._useGradient = false; + + this._renderer.updateStyle(); +}; + +/** + * Get the text color. + * @return {String} The color as a "R;G;B" string, for example: "255;0;0" + */ +gdjs.TextRuntimeObject.prototype.getColor = function(str) { + return this._color[0] + ";" + this._color[1] + ";" + this._color[2]; +}; + +/** + * Set the text alignment for multiline text objects. + * @param {string} alignment The text alignment. + */ +gdjs.TextRuntimeObject.prototype.setTextAlignment = function(alignment) { + this._textAlign = alignment; + this._renderer.updateStyle(); +}; + +/** + * Get the text alignment of text object. + * @return {string} The text alignment. + */ +gdjs.TextRuntimeObject.prototype.getTextAlignment = function() { + return this._textAlign; +}; + +/** + * Return true if word wrapping is enabled for the text. + */ +gdjs.TextRuntimeObject.prototype.isWrapping = function() { + return this._wrapping; +}; + +/** + * Set word wrapping for the object text. + * @param {boolean} enable true to enable word wrapping, false to disable it. + */ +gdjs.TextRuntimeObject.prototype.setWrapping = function(enable) { + this._wrapping = enable; + this._renderer.updateStyle(); +}; + +/** + * Get the word wrapping width for the text object. + */ +gdjs.TextRuntimeObject.prototype.getWrappingWidth = function() { + return this._wrappingWidth; +}; + +/** + * Set the word wrapping width for the text object. + * @param {number} width The new width to set. + */ +gdjs.TextRuntimeObject.prototype.setWrappingWidth = function(width) { + if (width <= 1) width = 1; + this._wrappingWidth = width; + this._renderer.updateStyle(); +}; + +/** + * Set the outline for the text object. + * @param {string} str color as a "R;G;B" string, for example: "255;0;0" + * @param {number} thickness thickness of the outline (0 = disabled) + */ +gdjs.TextRuntimeObject.prototype.setOutline = function(str, thickness) { + var color = str.split(";"); + if ( color.length < 3 ) return; + + this._outlineColor[0] = parseInt(color[0], 10); + this._outlineColor[1] = parseInt(color[1], 10); + this._outlineColor[2] = parseInt(color[2], 10); + this._outlineThickness = thickness; + this._renderer.updateStyle(); +}; + +/** + * Set the shadow for the text object. + * @param {string} str color as a "R;G;B" string, for example: "255;0;0" + * @param {number} distance distance between the shadow and the text, in pixels. + * @param {number} blur amout of shadow blur, in pixels. + * @param {number} angle shadow offset direction, in degrees. + */ +gdjs.TextRuntimeObject.prototype.setShadow = function(str, distance, blur, angle) { + var color = str.split(";"); + if ( color.length < 3 ) return; + + this._shadowColor[0] = parseInt(color[0], 10); + this._shadowColor[1] = parseInt(color[1], 10); + this._shadowColor[2] = parseInt(color[2], 10); + this._shadowDistance = distance; + this._shadowBlur = blur; + this._shadowAngle = angle; + this._shadow = true; + this._renderer.updateStyle(); +}; + +/** + * Set the gradient for the text object. + * @param {string} strFirstColor color as a "R;G;B" string, for example: "255;0;0" + * @param {string} strSecondColor color as a "R;G;B" string, for example: "255;0;0" + * @param {string} strThirdColor color as a "R;G;B" string, for example: "255;0;0" + * @param {string} strFourthColor color as a "R;G;B" string, for example: "255;0;0" + * @param {string} strGradientType gradient type + */ +gdjs.TextRuntimeObject.prototype.setGradient = function(strGradientType, strFirstColor, strSecondColor, strThirdColor, strFourthColor) { + var colorFirst = strFirstColor.split(";"); + var colorSecond = strSecondColor.split(";"); + var colorThird = strThirdColor.split(";"); + var colorFourth = strFourthColor.split(";"); + + this._gradient = []; + + if (colorFirst.length == 3){ + this._gradient.push([ + parseInt(colorFirst[0], 10), + parseInt(colorFirst[1], 10), + parseInt(colorFirst[2], 10) + ]); + } + + if (colorSecond.length == 3){ + this._gradient.push([ + parseInt(colorSecond[0], 10), + parseInt(colorSecond[1], 10), + parseInt(colorSecond[2], 10) + ]); + } + + if (colorThird.length == 3){ + this._gradient.push([ + parseInt(colorThird[0], 10), + parseInt(colorThird[1], 10), + parseInt(colorThird[2], 10) + ]); + } + + if (colorFourth.length == 3){ + this._gradient.push([ + parseInt(colorFourth[0], 10), + parseInt(colorFourth[1], 10), + parseInt(colorFourth[2], 10) + ]); + } + + this._gradientType = strGradientType; + + this._useGradient = (this._gradient.length > 1) ? true : false; + + this._renderer.updateStyle(); +}; + +/** + * Show the shadow of the text object. + * @param {boolean} enable true to show the shadow, false to hide it + */ +gdjs.TextRuntimeObject.prototype.showShadow = function(enable) { + this._shadow = enable; + this._renderer.updateStyle(); +}; + +/** + * Get padding of the text object. + * @return {number} number of pixels around the text before it gets cropped + */ +gdjs.TextRuntimeObject.prototype.getPadding = function() { + return this._padding; +}; + +/** + * Set padding of the text object. + * @param {number} value number of pixels around the text before it gets cropped + */ +gdjs.TextRuntimeObject.prototype.setPadding = function(value) { + this._padding = value; + this._renderer.updateStyle(); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Festa-di-Laurea-piena-da-convertire.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Festa-di-Laurea-piena-da-convertire.ogg new file mode 100644 index 0000000..ecbd6b3 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Festa-di-Laurea-piena-da-convertire.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fire Empty.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fire Empty.png new file mode 100644 index 0000000..d49254a Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fire Empty.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fire.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fire.png new file mode 100644 index 0000000..4aa1d2b Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fire.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 2.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 2.png new file mode 100644 index 0000000..81f3a47 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 2.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 3.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 3.png new file mode 100644 index 0000000..1e7fd0f Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 3.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 4.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 4.png new file mode 100644 index 0000000..f89496d Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco 4.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco.png new file mode 100644 index 0000000..b9f6d1c Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Fuoco.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/GDevelop.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/GDevelop.png new file mode 100644 index 0000000..30e4238 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/GDevelop.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Gioca ancora.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Gioca ancora.png new file mode 100644 index 0000000..5dd1aa0 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Gioca ancora.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Gioca.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Gioca.png new file mode 100644 index 0000000..78640e6 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Gioca.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Kenney Future Narrow.ttf b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Kenney Future Narrow.ttf new file mode 100644 index 0000000..42f2c33 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Kenney Future Narrow.ttf differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 1.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 1.png new file mode 100644 index 0000000..f59c688 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 1.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 2.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 2.png new file mode 100644 index 0000000..d40611c Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 2.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 3.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 3.png new file mode 100644 index 0000000..f9ec98c Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 3.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 6.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 6.png new file mode 100644 index 0000000..db7add8 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 6.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 7.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 7.png new file mode 100644 index 0000000..a4d4b05 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 7.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 9.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 9.png new file mode 100644 index 0000000..42c657a Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Laureato 9.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Left.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Left.png new file mode 100644 index 0000000..ce0a400 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Left.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Left2.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Left2.png new file mode 100644 index 0000000..4dd3143 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Left2.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Lose-da-converitre-in-ogg.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Lose-da-converitre-in-ogg.ogg new file mode 100644 index 0000000..2ca403e Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Lose-da-converitre-in-ogg.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Sfondo.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Sfondo.png new file mode 100644 index 0000000..e7548df Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Sfondo.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Vicienzo.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Vicienzo.png new file mode 100644 index 0000000..ea3117f Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Vicienzo.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Virus 2.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Virus 2.png new file mode 100644 index 0000000..52d877d Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Virus 2.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Win-da-convertire-in-OGG.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Win-da-convertire-in-OGG.ogg new file mode 100644 index 0000000..d3c1ee9 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/Win-da-convertire-in-OGG.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/code0.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/code0.js new file mode 100644 index 0000000..6ce48e7 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/code0.js @@ -0,0 +1,121 @@ +gdjs.Start_32GameCode = {}; +gdjs.Start_32GameCode.GDSfondoObjects1= []; +gdjs.Start_32GameCode.GDSfondoObjects2= []; +gdjs.Start_32GameCode.GDTitoloGiocoObjects1= []; +gdjs.Start_32GameCode.GDTitoloGiocoObjects2= []; +gdjs.Start_32GameCode.GDNewObjectObjects1= []; +gdjs.Start_32GameCode.GDNewObjectObjects2= []; +gdjs.Start_32GameCode.GDNewObject2Objects1= []; +gdjs.Start_32GameCode.GDNewObject2Objects2= []; +gdjs.Start_32GameCode.GDOptionsObjects1= []; +gdjs.Start_32GameCode.GDOptionsObjects2= []; +gdjs.Start_32GameCode.GDCreditsObjects1= []; +gdjs.Start_32GameCode.GDCreditsObjects2= []; +gdjs.Start_32GameCode.GDPlayObjects1= []; +gdjs.Start_32GameCode.GDPlayObjects2= []; + +gdjs.Start_32GameCode.conditionTrue_0 = {val:false}; +gdjs.Start_32GameCode.condition0IsTrue_0 = {val:false}; +gdjs.Start_32GameCode.condition1IsTrue_0 = {val:false}; +gdjs.Start_32GameCode.condition2IsTrue_0 = {val:false}; + + +gdjs.Start_32GameCode.mapOfGDgdjs_46Start_9532GameCode_46GDPlayObjects1Objects = Hashtable.newFrom({"Play": gdjs.Start_32GameCode.GDPlayObjects1});gdjs.Start_32GameCode.mapOfGDgdjs_46Start_9532GameCode_46GDOptionsObjects1Objects = Hashtable.newFrom({"Options": gdjs.Start_32GameCode.GDOptionsObjects1});gdjs.Start_32GameCode.mapOfGDgdjs_46Start_9532GameCode_46GDCreditsObjects1Objects = Hashtable.newFrom({"Credits": gdjs.Start_32GameCode.GDCreditsObjects1});gdjs.Start_32GameCode.eventsList0x5b6e18 = function(runtimeScene) { + +{ + +gdjs.Start_32GameCode.GDPlayObjects1.createFrom(runtimeScene.getObjects("Play")); + +gdjs.Start_32GameCode.condition0IsTrue_0.val = false; +gdjs.Start_32GameCode.condition1IsTrue_0.val = false; +{ +gdjs.Start_32GameCode.condition0IsTrue_0.val = gdjs.evtTools.input.cursorOnObject(gdjs.Start_32GameCode.mapOfGDgdjs_46Start_9532GameCode_46GDPlayObjects1Objects, runtimeScene, true, false); +}if ( gdjs.Start_32GameCode.condition0IsTrue_0.val ) { +{ +gdjs.Start_32GameCode.condition1IsTrue_0.val = gdjs.evtTools.input.isMouseButtonPressed(runtimeScene, "Left"); +}} +if (gdjs.Start_32GameCode.condition1IsTrue_0.val) { +{gdjs.evtTools.runtimeScene.replaceScene(runtimeScene, "Phase1", false); +}} + +} + + +{ + +gdjs.Start_32GameCode.GDOptionsObjects1.createFrom(runtimeScene.getObjects("Options")); + +gdjs.Start_32GameCode.condition0IsTrue_0.val = false; +gdjs.Start_32GameCode.condition1IsTrue_0.val = false; +{ +gdjs.Start_32GameCode.condition0IsTrue_0.val = gdjs.evtTools.input.cursorOnObject(gdjs.Start_32GameCode.mapOfGDgdjs_46Start_9532GameCode_46GDOptionsObjects1Objects, runtimeScene, true, false); +}if ( gdjs.Start_32GameCode.condition0IsTrue_0.val ) { +{ +gdjs.Start_32GameCode.condition1IsTrue_0.val = gdjs.evtTools.input.isMouseButtonPressed(runtimeScene, "Left"); +}} +if (gdjs.Start_32GameCode.condition1IsTrue_0.val) { +{gdjs.evtTools.runtimeScene.replaceScene(runtimeScene, "Options", false); +}} + +} + + +{ + +gdjs.Start_32GameCode.GDCreditsObjects1.createFrom(runtimeScene.getObjects("Credits")); + +gdjs.Start_32GameCode.condition0IsTrue_0.val = false; +gdjs.Start_32GameCode.condition1IsTrue_0.val = false; +{ +gdjs.Start_32GameCode.condition0IsTrue_0.val = gdjs.evtTools.input.cursorOnObject(gdjs.Start_32GameCode.mapOfGDgdjs_46Start_9532GameCode_46GDCreditsObjects1Objects, runtimeScene, true, false); +}if ( gdjs.Start_32GameCode.condition0IsTrue_0.val ) { +{ +gdjs.Start_32GameCode.condition1IsTrue_0.val = gdjs.evtTools.input.isMouseButtonPressed(runtimeScene, "Left"); +}} +if (gdjs.Start_32GameCode.condition1IsTrue_0.val) { +{gdjs.evtTools.runtimeScene.replaceScene(runtimeScene, "Credits", false); +}} + +} + + +{ + + +gdjs.Start_32GameCode.condition0IsTrue_0.val = false; +{ +gdjs.Start_32GameCode.condition0IsTrue_0.val = gdjs.evtTools.runtimeScene.sceneJustBegins(runtimeScene); +}if (gdjs.Start_32GameCode.condition0IsTrue_0.val) { +{gdjs.evtTools.sound.playSound(runtimeScene, "Festa-di-Laurea-piena-da-convertire.ogg", false, 100, 1); +}} + +} + + +}; //End of gdjs.Start_32GameCode.eventsList0x5b6e18 + + +gdjs.Start_32GameCode.func = function(runtimeScene) { +runtimeScene.getOnceTriggers().startNewFrame(); + +gdjs.Start_32GameCode.GDSfondoObjects1.length = 0; +gdjs.Start_32GameCode.GDSfondoObjects2.length = 0; +gdjs.Start_32GameCode.GDTitoloGiocoObjects1.length = 0; +gdjs.Start_32GameCode.GDTitoloGiocoObjects2.length = 0; +gdjs.Start_32GameCode.GDNewObjectObjects1.length = 0; +gdjs.Start_32GameCode.GDNewObjectObjects2.length = 0; +gdjs.Start_32GameCode.GDNewObject2Objects1.length = 0; +gdjs.Start_32GameCode.GDNewObject2Objects2.length = 0; +gdjs.Start_32GameCode.GDOptionsObjects1.length = 0; +gdjs.Start_32GameCode.GDOptionsObjects2.length = 0; +gdjs.Start_32GameCode.GDCreditsObjects1.length = 0; +gdjs.Start_32GameCode.GDCreditsObjects2.length = 0; +gdjs.Start_32GameCode.GDPlayObjects1.length = 0; +gdjs.Start_32GameCode.GDPlayObjects2.length = 0; + +gdjs.Start_32GameCode.eventsList0x5b6e18(runtimeScene); +return; + +} + +gdjs['Start_32GameCode'] = gdjs.Start_32GameCode; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/code1.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/code1.js new file mode 100644 index 0000000..63b7e0b --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/code1.js @@ -0,0 +1,1492 @@ +gdjs.Phase1Code = {}; +gdjs.Phase1Code.GDBombObjects1_1final = []; + +gdjs.Phase1Code.GDInvader1Objects1_1final = []; + +gdjs.Phase1Code.GDInvader2Objects1_1final = []; + +gdjs.Phase1Code.GDInvader3Objects1_1final = []; + +gdjs.Phase1Code.GDShipObjects1_1final = []; + +gdjs.Phase1Code.forEachIndex3 = 0; + +gdjs.Phase1Code.forEachIndex4 = 0; + +gdjs.Phase1Code.forEachObjects3 = []; + +gdjs.Phase1Code.forEachObjects4 = []; + +gdjs.Phase1Code.forEachTemporary3 = null; + +gdjs.Phase1Code.forEachTemporary4 = null; + +gdjs.Phase1Code.forEachTotalCount3 = 0; + +gdjs.Phase1Code.forEachTotalCount4 = 0; + +gdjs.Phase1Code.stopDoWhile2 = false; + +gdjs.Phase1Code.GDInvader1Objects1= []; +gdjs.Phase1Code.GDInvader1Objects2= []; +gdjs.Phase1Code.GDInvader1Objects3= []; +gdjs.Phase1Code.GDInvader1Objects4= []; +gdjs.Phase1Code.GDInvader1Objects5= []; +gdjs.Phase1Code.GDInvader1Objects6= []; +gdjs.Phase1Code.GDInvader2Objects1= []; +gdjs.Phase1Code.GDInvader2Objects2= []; +gdjs.Phase1Code.GDInvader2Objects3= []; +gdjs.Phase1Code.GDInvader2Objects4= []; +gdjs.Phase1Code.GDInvader2Objects5= []; +gdjs.Phase1Code.GDInvader2Objects6= []; +gdjs.Phase1Code.GDInvader3Objects1= []; +gdjs.Phase1Code.GDInvader3Objects2= []; +gdjs.Phase1Code.GDInvader3Objects3= []; +gdjs.Phase1Code.GDInvader3Objects4= []; +gdjs.Phase1Code.GDInvader3Objects5= []; +gdjs.Phase1Code.GDInvader3Objects6= []; +gdjs.Phase1Code.GDShipObjects1= []; +gdjs.Phase1Code.GDShipObjects2= []; +gdjs.Phase1Code.GDShipObjects3= []; +gdjs.Phase1Code.GDShipObjects4= []; +gdjs.Phase1Code.GDShipObjects5= []; +gdjs.Phase1Code.GDShipObjects6= []; +gdjs.Phase1Code.GDBackgroundObjects1= []; +gdjs.Phase1Code.GDBackgroundObjects2= []; +gdjs.Phase1Code.GDBackgroundObjects3= []; +gdjs.Phase1Code.GDBackgroundObjects4= []; +gdjs.Phase1Code.GDBackgroundObjects5= []; +gdjs.Phase1Code.GDBackgroundObjects6= []; +gdjs.Phase1Code.GDBulletObjects1= []; +gdjs.Phase1Code.GDBulletObjects2= []; +gdjs.Phase1Code.GDBulletObjects3= []; +gdjs.Phase1Code.GDBulletObjects4= []; +gdjs.Phase1Code.GDBulletObjects5= []; +gdjs.Phase1Code.GDBulletObjects6= []; +gdjs.Phase1Code.GDLeftObjects1= []; +gdjs.Phase1Code.GDLeftObjects2= []; +gdjs.Phase1Code.GDLeftObjects3= []; +gdjs.Phase1Code.GDLeftObjects4= []; +gdjs.Phase1Code.GDLeftObjects5= []; +gdjs.Phase1Code.GDLeftObjects6= []; +gdjs.Phase1Code.GDRightObjects1= []; +gdjs.Phase1Code.GDRightObjects2= []; +gdjs.Phase1Code.GDRightObjects3= []; +gdjs.Phase1Code.GDRightObjects4= []; +gdjs.Phase1Code.GDRightObjects5= []; +gdjs.Phase1Code.GDRightObjects6= []; +gdjs.Phase1Code.GDFireObjects1= []; +gdjs.Phase1Code.GDFireObjects2= []; +gdjs.Phase1Code.GDFireObjects3= []; +gdjs.Phase1Code.GDFireObjects4= []; +gdjs.Phase1Code.GDFireObjects5= []; +gdjs.Phase1Code.GDFireObjects6= []; +gdjs.Phase1Code.GDScoreTEXTObjects1= []; +gdjs.Phase1Code.GDScoreTEXTObjects2= []; +gdjs.Phase1Code.GDScoreTEXTObjects3= []; +gdjs.Phase1Code.GDScoreTEXTObjects4= []; +gdjs.Phase1Code.GDScoreTEXTObjects5= []; +gdjs.Phase1Code.GDScoreTEXTObjects6= []; +gdjs.Phase1Code.GDScoreNUMObjects1= []; +gdjs.Phase1Code.GDScoreNUMObjects2= []; +gdjs.Phase1Code.GDScoreNUMObjects3= []; +gdjs.Phase1Code.GDScoreNUMObjects4= []; +gdjs.Phase1Code.GDScoreNUMObjects5= []; +gdjs.Phase1Code.GDScoreNUMObjects6= []; +gdjs.Phase1Code.GDUFOObjects1= []; +gdjs.Phase1Code.GDUFOObjects2= []; +gdjs.Phase1Code.GDUFOObjects3= []; +gdjs.Phase1Code.GDUFOObjects4= []; +gdjs.Phase1Code.GDUFOObjects5= []; +gdjs.Phase1Code.GDUFOObjects6= []; +gdjs.Phase1Code.GDBombObjects1= []; +gdjs.Phase1Code.GDBombObjects2= []; +gdjs.Phase1Code.GDBombObjects3= []; +gdjs.Phase1Code.GDBombObjects4= []; +gdjs.Phase1Code.GDBombObjects5= []; +gdjs.Phase1Code.GDBombObjects6= []; +gdjs.Phase1Code.GDCountObjects1= []; +gdjs.Phase1Code.GDCountObjects2= []; +gdjs.Phase1Code.GDCountObjects3= []; +gdjs.Phase1Code.GDCountObjects4= []; +gdjs.Phase1Code.GDCountObjects5= []; +gdjs.Phase1Code.GDCountObjects6= []; +gdjs.Phase1Code.GDBombTextNUMObjects1= []; +gdjs.Phase1Code.GDBombTextNUMObjects2= []; +gdjs.Phase1Code.GDBombTextNUMObjects3= []; +gdjs.Phase1Code.GDBombTextNUMObjects4= []; +gdjs.Phase1Code.GDBombTextNUMObjects5= []; +gdjs.Phase1Code.GDBombTextNUMObjects6= []; +gdjs.Phase1Code.GDBaseObjects1= []; +gdjs.Phase1Code.GDBaseObjects2= []; +gdjs.Phase1Code.GDBaseObjects3= []; +gdjs.Phase1Code.GDBaseObjects4= []; +gdjs.Phase1Code.GDBaseObjects5= []; +gdjs.Phase1Code.GDBaseObjects6= []; + +gdjs.Phase1Code.conditionTrue_0 = {val:false}; +gdjs.Phase1Code.condition0IsTrue_0 = {val:false}; +gdjs.Phase1Code.condition1IsTrue_0 = {val:false}; +gdjs.Phase1Code.condition2IsTrue_0 = {val:false}; +gdjs.Phase1Code.conditionTrue_1 = {val:false}; +gdjs.Phase1Code.condition0IsTrue_1 = {val:false}; +gdjs.Phase1Code.condition1IsTrue_1 = {val:false}; +gdjs.Phase1Code.condition2IsTrue_1 = {val:false}; + + +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects2Objects = Hashtable.newFrom({"Invader1": gdjs.Phase1Code.GDInvader1Objects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader2Objects2Objects = Hashtable.newFrom({"Invader2": gdjs.Phase1Code.GDInvader2Objects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader3Objects2Objects = Hashtable.newFrom({"Invader3": gdjs.Phase1Code.GDInvader3Objects2});gdjs.Phase1Code.eventsList0xb9b9c4 = function(runtimeScene) { + +}; //End of gdjs.Phase1Code.eventsList0xb9b9c4 +gdjs.Phase1Code.eventsList0xb99764 = function(runtimeScene) { + +{ + + + +} + + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = !(gdjs.evtTools.systemInfo.isMobile()); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{gdjs.evtTools.camera.hideLayer(runtimeScene, "Controls"); +}} + +} + + +{ + + + +} + + +{ + + +gdjs.Phase1Code.stopDoWhile2 = false; +do {gdjs.Phase1Code.GDInvader1Objects2.length = 0; + +gdjs.Phase1Code.GDInvader2Objects2.length = 0; + +gdjs.Phase1Code.GDInvader3Objects2.length = 0; + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(5)) < 9; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +if (true) { +{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects2Objects, gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(5)) * 60, 0, ""); +}{runtimeScene.getVariables().getFromIndex(5).add(1); +}{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader2Objects2Objects, gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(6)) * 60, 40, ""); +}{runtimeScene.getVariables().getFromIndex(6).add(1); +}{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader3Objects2Objects, gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(7)) * 60, 80, ""); +}{runtimeScene.getVariables().getFromIndex(7).add(1); +} +{ //Subevents: +gdjs.Phase1Code.eventsList0xb9b9c4(runtimeScene);} //Subevents end. +} +} else gdjs.Phase1Code.stopDoWhile2 = true; +} while ( !gdjs.Phase1Code.stopDoWhile2 ); + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb99764 +gdjs.Phase1Code.eventsList0xb9aebc = function(runtimeScene) { + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.runtimeScene.sceneJustBegins(runtimeScene); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{gdjs.evtTools.runtimeScene.resetTimer(runtimeScene, "InvaderTimer"); +}{gdjs.evtTools.runtimeScene.resetTimer(runtimeScene, "UFOTimer"); +}{runtimeScene.getVariables().getFromIndex(0).setNumber(1); +}{runtimeScene.getVariables().getFromIndex(4).setNumber(1); +}{runtimeScene.getVariables().getFromIndex(5).setNumber(1); +}{runtimeScene.getVariables().getFromIndex(6).setNumber(1); +}{runtimeScene.getVariables().getFromIndex(7).setNumber(1); +}{runtimeScene.getVariables().getFromIndex(8).setNumber(0); +}{runtimeScene.getVariables().getFromIndex(3).setNumber(0.5); +}{runtimeScene.getVariables().getFromIndex(2).setNumber(24); +}{runtimeScene.getVariables().getFromIndex(9).setNumber(0); +}{runtimeScene.getVariables().getFromIndex(11).setNumber(4); +}{runtimeScene.getVariables().getFromIndex(12).setNumber(2); +} +{ //Subevents +gdjs.Phase1Code.eventsList0xb99764(runtimeScene);} //End of subevents +} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9aebc +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects5Objects = Hashtable.newFrom({"Bomb": gdjs.Phase1Code.GDBombObjects5});gdjs.Phase1Code.eventsList0xb9c1dc = function(runtimeScene) { + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +{gdjs.Phase1Code.conditionTrue_1 = gdjs.Phase1Code.condition0IsTrue_0; +gdjs.Phase1Code.condition0IsTrue_1.val = false; +gdjs.Phase1Code.condition1IsTrue_1.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_1.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(9)) < gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(11)); +}if ( gdjs.Phase1Code.condition0IsTrue_1.val ) { +{ +gdjs.Phase1Code.condition1IsTrue_1.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(10)) < gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(12)); +}} +gdjs.Phase1Code.conditionTrue_1.val = true && gdjs.Phase1Code.condition0IsTrue_1.val && gdjs.Phase1Code.condition1IsTrue_1.val; +} +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +gdjs.Phase1Code.GDInvader1Objects5.createFrom(gdjs.Phase1Code.GDInvader1Objects4); + +gdjs.Phase1Code.GDBombObjects5.length = 0; + +{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects5Objects, (( gdjs.Phase1Code.GDInvader1Objects5.length === 0 ) ? 0 :gdjs.Phase1Code.GDInvader1Objects5[0].getPointX("")), (( gdjs.Phase1Code.GDInvader1Objects5.length === 0 ) ? 0 :gdjs.Phase1Code.GDInvader1Objects5[0].getPointY("")), ""); +}{runtimeScene.getVariables().getFromIndex(9).add(1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9c1dc +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects5Objects = Hashtable.newFrom({"Bomb": gdjs.Phase1Code.GDBombObjects5});gdjs.Phase1Code.eventsList0xb9c81c = function(runtimeScene) { + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +{gdjs.Phase1Code.conditionTrue_1 = gdjs.Phase1Code.condition0IsTrue_0; +gdjs.Phase1Code.condition0IsTrue_1.val = false; +gdjs.Phase1Code.condition1IsTrue_1.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_1.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(9)) < gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(11)); +}if ( gdjs.Phase1Code.condition0IsTrue_1.val ) { +{ +gdjs.Phase1Code.condition1IsTrue_1.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(10)) < gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(12)); +}} +gdjs.Phase1Code.conditionTrue_1.val = true && gdjs.Phase1Code.condition0IsTrue_1.val && gdjs.Phase1Code.condition1IsTrue_1.val; +} +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +gdjs.Phase1Code.GDInvader1Objects5.createFrom(runtimeScene.getObjects("Invader1")); +gdjs.Phase1Code.GDBombObjects5.length = 0; + +{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects5Objects, (( gdjs.Phase1Code.GDInvader1Objects5.length === 0 ) ? 0 :gdjs.Phase1Code.GDInvader1Objects5[0].getPointX("")), (( gdjs.Phase1Code.GDInvader1Objects5.length === 0 ) ? 0 :gdjs.Phase1Code.GDInvader1Objects5[0].getPointY("")), ""); +}{runtimeScene.getVariables().getFromIndex(9).add(1); +}} + +} + + +{ + + +{ +} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9c81c +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects5Objects = Hashtable.newFrom({"Bomb": gdjs.Phase1Code.GDBombObjects5});gdjs.Phase1Code.eventsList0xb9ceec = function(runtimeScene) { + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +{gdjs.Phase1Code.conditionTrue_1 = gdjs.Phase1Code.condition0IsTrue_0; +gdjs.Phase1Code.condition0IsTrue_1.val = false; +gdjs.Phase1Code.condition1IsTrue_1.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_1.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(9)) < gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(11)); +}if ( gdjs.Phase1Code.condition0IsTrue_1.val ) { +{ +gdjs.Phase1Code.condition1IsTrue_1.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(10)) < gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(12)); +}} +gdjs.Phase1Code.conditionTrue_1.val = true && gdjs.Phase1Code.condition0IsTrue_1.val && gdjs.Phase1Code.condition1IsTrue_1.val; +} +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +gdjs.Phase1Code.GDInvader1Objects5.createFrom(runtimeScene.getObjects("Invader1")); +gdjs.Phase1Code.GDBombObjects5.length = 0; + +{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects5Objects, (( gdjs.Phase1Code.GDInvader1Objects5.length === 0 ) ? 0 :gdjs.Phase1Code.GDInvader1Objects5[0].getPointX("")), (( gdjs.Phase1Code.GDInvader1Objects5.length === 0 ) ? 0 :gdjs.Phase1Code.GDInvader1Objects5[0].getPointY("")), ""); +}{runtimeScene.getVariables().getFromIndex(9).add(1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9ceec +gdjs.Phase1Code.eventsList0xb9d7e4 = function(runtimeScene) { + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(3)) > 0.1; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{runtimeScene.getVariables().getFromIndex(3).sub(0.1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9d7e4 +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader2Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader3Objects2Objects = Hashtable.newFrom({"Invader1": gdjs.Phase1Code.GDInvader1Objects2, "Invader2": gdjs.Phase1Code.GDInvader2Objects2, "Invader3": gdjs.Phase1Code.GDInvader3Objects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBaseObjects2Objects = Hashtable.newFrom({"Base": gdjs.Phase1Code.GDBaseObjects2});gdjs.Phase1Code.eventsList0xb9c0a4 = function(runtimeScene) { + +{ + +gdjs.Phase1Code.GDInvader1Objects3.createFrom(runtimeScene.getObjects("Invader1")); + +for(gdjs.Phase1Code.forEachIndex4 = 0;gdjs.Phase1Code.forEachIndex4 < gdjs.Phase1Code.GDInvader1Objects3.length;++gdjs.Phase1Code.forEachIndex4) { +gdjs.Phase1Code.GDInvader1Objects4.length = 0; + + +gdjs.Phase1Code.forEachTemporary4 = gdjs.Phase1Code.GDInvader1Objects3[gdjs.Phase1Code.forEachIndex4]; +gdjs.Phase1Code.GDInvader1Objects4.push(gdjs.Phase1Code.forEachTemporary4); +if (true) { +{for(var i = 0, len = gdjs.Phase1Code.GDInvader1Objects4.length ;i < len;++i) { + gdjs.Phase1Code.GDInvader1Objects4[i].setX(gdjs.Phase1Code.GDInvader1Objects4[i].getX() + (40 * gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(0)))); +} +}{for(var i = 0, len = gdjs.Phase1Code.GDInvader1Objects4.length ;i < len;++i) { + gdjs.Phase1Code.GDInvader1Objects4[i].setY(20 + (20 * gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(4)))); +} +}{runtimeScene.getVariables().getFromIndex(10).setNumber(gdjs.randomInRange(0, 30)); +} +{ //Subevents: +gdjs.Phase1Code.eventsList0xb9c1dc(runtimeScene);} //Subevents end. +} +} + +} + + +{ + +gdjs.Phase1Code.GDInvader2Objects3.createFrom(runtimeScene.getObjects("Invader2")); + +for(gdjs.Phase1Code.forEachIndex4 = 0;gdjs.Phase1Code.forEachIndex4 < gdjs.Phase1Code.GDInvader2Objects3.length;++gdjs.Phase1Code.forEachIndex4) { +gdjs.Phase1Code.GDInvader2Objects4.length = 0; + + +gdjs.Phase1Code.forEachTemporary4 = gdjs.Phase1Code.GDInvader2Objects3[gdjs.Phase1Code.forEachIndex4]; +gdjs.Phase1Code.GDInvader2Objects4.push(gdjs.Phase1Code.forEachTemporary4); +if (true) { +{for(var i = 0, len = gdjs.Phase1Code.GDInvader2Objects4.length ;i < len;++i) { + gdjs.Phase1Code.GDInvader2Objects4[i].setX(gdjs.Phase1Code.GDInvader2Objects4[i].getX() + (40 * gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(0)))); +} +}{for(var i = 0, len = gdjs.Phase1Code.GDInvader2Objects4.length ;i < len;++i) { + gdjs.Phase1Code.GDInvader2Objects4[i].setY(60 + (20 * gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(4)))); +} +}{runtimeScene.getVariables().getFromIndex(10).setNumber(gdjs.randomInRange(0, 30)); +} +{ //Subevents: +gdjs.Phase1Code.eventsList0xb9c81c(runtimeScene);} //Subevents end. +} +} + +} + + +{ + +gdjs.Phase1Code.GDInvader3Objects3.createFrom(runtimeScene.getObjects("Invader3")); + +for(gdjs.Phase1Code.forEachIndex4 = 0;gdjs.Phase1Code.forEachIndex4 < gdjs.Phase1Code.GDInvader3Objects3.length;++gdjs.Phase1Code.forEachIndex4) { +gdjs.Phase1Code.GDInvader3Objects4.length = 0; + + +gdjs.Phase1Code.forEachTemporary4 = gdjs.Phase1Code.GDInvader3Objects3[gdjs.Phase1Code.forEachIndex4]; +gdjs.Phase1Code.GDInvader3Objects4.push(gdjs.Phase1Code.forEachTemporary4); +if (true) { +{for(var i = 0, len = gdjs.Phase1Code.GDInvader3Objects4.length ;i < len;++i) { + gdjs.Phase1Code.GDInvader3Objects4[i].setX(gdjs.Phase1Code.GDInvader3Objects4[i].getX() + (40 * gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(0)))); +} +}{for(var i = 0, len = gdjs.Phase1Code.GDInvader3Objects4.length ;i < len;++i) { + gdjs.Phase1Code.GDInvader3Objects4[i].setY(100 + (20 * gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(4)))); +} +}{runtimeScene.getVariables().getFromIndex(10).setNumber(gdjs.randomInRange(0, 30)); +} +{ //Subevents: +gdjs.Phase1Code.eventsList0xb9ceec(runtimeScene);} //Subevents end. +} +} + +} + + +{ + + +{ +{gdjs.evtTools.runtimeScene.resetTimer(runtimeScene, "InvaderTimer"); +}{gdjs.evtTools.sound.playSound(runtimeScene, "lowRandom.ogg", false, 30, 1); +}} + +} + + +{ + + + +} + + +{ + +gdjs.Phase1Code.GDInvader1Objects3.createFrom(runtimeScene.getObjects("Invader1")); +gdjs.Phase1Code.GDInvader2Objects3.createFrom(runtimeScene.getObjects("Invader2")); +gdjs.Phase1Code.GDInvader3Objects3.createFrom(runtimeScene.getObjects("Invader3")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +for(var i = 0, k = 0, l = gdjs.Phase1Code.GDInvader1Objects3.length;i 980 ) { + gdjs.Phase1Code.condition0IsTrue_0.val = true; + gdjs.Phase1Code.GDInvader1Objects3[k] = gdjs.Phase1Code.GDInvader1Objects3[i]; + ++k; + } +} +gdjs.Phase1Code.GDInvader1Objects3.length = k;for(var i = 0, k = 0, l = gdjs.Phase1Code.GDInvader2Objects3.length;i 980 ) { + gdjs.Phase1Code.condition0IsTrue_0.val = true; + gdjs.Phase1Code.GDInvader2Objects3[k] = gdjs.Phase1Code.GDInvader2Objects3[i]; + ++k; + } +} +gdjs.Phase1Code.GDInvader2Objects3.length = k;for(var i = 0, k = 0, l = gdjs.Phase1Code.GDInvader3Objects3.length;i 980 ) { + gdjs.Phase1Code.condition0IsTrue_0.val = true; + gdjs.Phase1Code.GDInvader3Objects3[k] = gdjs.Phase1Code.GDInvader3Objects3[i]; + ++k; + } +} +gdjs.Phase1Code.GDInvader3Objects3.length = k;}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{runtimeScene.getVariables().getFromIndex(0).setNumber(-(1)); +}{runtimeScene.getVariables().getFromIndex(4).add(1); +}} + +} + + +{ + + + +} + + +{ + +gdjs.Phase1Code.GDBaseObjects2.createFrom(runtimeScene.getObjects("Base")); +gdjs.Phase1Code.GDInvader1Objects2.createFrom(runtimeScene.getObjects("Invader1")); +gdjs.Phase1Code.GDInvader2Objects2.createFrom(runtimeScene.getObjects("Invader2")); +gdjs.Phase1Code.GDInvader3Objects2.createFrom(runtimeScene.getObjects("Invader3")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.object.hitBoxesCollisionTest(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader2Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader3Objects2Objects, gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBaseObjects2Objects, false, runtimeScene, false); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +/* Reuse gdjs.Phase1Code.GDBaseObjects2 */ +{for(var i = 0, len = gdjs.Phase1Code.GDBaseObjects2.length ;i < len;++i) { + gdjs.Phase1Code.GDBaseObjects2[i].deleteFromScene(runtimeScene); +} +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9c0a4 +gdjs.Phase1Code.eventsList0xb9befc = function(runtimeScene) { + +{ + + + +} + + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.runtimeScene.timerElapsedTime(runtimeScene, gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(3)), "InvaderTimer"); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { + +{ //Subevents +gdjs.Phase1Code.eventsList0xb9c0a4(runtimeScene);} //End of subevents +} + +} + + +{ + + + +} + + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(2)) < 18; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{runtimeScene.getVariables().getFromIndex(3).setNumber(0.4); +}{runtimeScene.getVariables().getFromIndex(11).setNumber(6); +}} + +} + + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(2)) < 12; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{runtimeScene.getVariables().getFromIndex(3).setNumber(0.3); +}{runtimeScene.getVariables().getFromIndex(11).setNumber(7); +}} + +} + + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(2)) < 7; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{runtimeScene.getVariables().getFromIndex(3).setNumber(0.2); +}{runtimeScene.getVariables().getFromIndex(11).setNumber(8); +}} + +} + + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.common.getVariableNumber(runtimeScene.getVariables().getFromIndex(2)) < 3; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{runtimeScene.getVariables().getFromIndex(3).setNumber(0.1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9befc +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDLeftObjects3Objects = Hashtable.newFrom({"Left": gdjs.Phase1Code.GDLeftObjects3});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDRightObjects3Objects = Hashtable.newFrom({"Right": gdjs.Phase1Code.GDRightObjects3});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDFireObjects2Objects = Hashtable.newFrom({"Fire": gdjs.Phase1Code.GDFireObjects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBulletObjects2Objects = Hashtable.newFrom({"Bullet": gdjs.Phase1Code.GDBulletObjects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBulletObjects2Objects = Hashtable.newFrom({"Bullet": gdjs.Phase1Code.GDBulletObjects2});gdjs.Phase1Code.eventsList0xb9f19c = function(runtimeScene) { + +{ + +gdjs.Phase1Code.GDBulletObjects2.createFrom(runtimeScene.getObjects("Bullet")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.object.pickedObjectsCount(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBulletObjects2Objects) < 1; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +gdjs.Phase1Code.GDShipObjects2.createFrom(runtimeScene.getObjects("Ship")); +/* Reuse gdjs.Phase1Code.GDBulletObjects2 */ +{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBulletObjects2Objects, (( gdjs.Phase1Code.GDShipObjects2.length === 0 ) ? 0 :gdjs.Phase1Code.GDShipObjects2[0].getPointX("")), (( gdjs.Phase1Code.GDShipObjects2.length === 0 ) ? 0 :gdjs.Phase1Code.GDShipObjects2[0].getPointY("")) - 20, ""); +}{gdjs.evtTools.sound.playSound(runtimeScene, "laser8.ogg", false, 30, 1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb9f19c +gdjs.Phase1Code.eventsList0xb9ebd4 = function(runtimeScene) { + +{ + +gdjs.Phase1Code.GDLeftObjects3.createFrom(runtimeScene.getObjects("Left")); +gdjs.Phase1Code.GDShipObjects3.createFrom(runtimeScene.getObjects("Ship")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +gdjs.Phase1Code.condition1IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.input.cursorOnObject(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDLeftObjects3Objects, runtimeScene, true, false); +}if ( gdjs.Phase1Code.condition0IsTrue_0.val ) { +{ +for(var i = 0, k = 0, l = gdjs.Phase1Code.GDShipObjects3.length;i 50 ) { + gdjs.Phase1Code.condition1IsTrue_0.val = true; + gdjs.Phase1Code.GDShipObjects3[k] = gdjs.Phase1Code.GDShipObjects3[i]; + ++k; + } +} +gdjs.Phase1Code.GDShipObjects3.length = k;}} +if (gdjs.Phase1Code.condition1IsTrue_0.val) { +/* Reuse gdjs.Phase1Code.GDShipObjects3 */ +{for(var i = 0, len = gdjs.Phase1Code.GDShipObjects3.length ;i < len;++i) { + gdjs.Phase1Code.GDShipObjects3[i].setX(gdjs.Phase1Code.GDShipObjects3[i].getX() - (120 * gdjs.evtTools.runtimeScene.getElapsedTimeInSeconds(runtimeScene))); +} +}} + +} + + +{ + +gdjs.Phase1Code.GDRightObjects3.createFrom(runtimeScene.getObjects("Right")); +gdjs.Phase1Code.GDShipObjects3.createFrom(runtimeScene.getObjects("Ship")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +gdjs.Phase1Code.condition1IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.input.cursorOnObject(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDRightObjects3Objects, runtimeScene, true, false); +}if ( gdjs.Phase1Code.condition0IsTrue_0.val ) { +{ +for(var i = 0, k = 0, l = gdjs.Phase1Code.GDShipObjects3.length;i 50 ) { + gdjs.Phase1Code.condition1IsTrue_0.val = true; + gdjs.Phase1Code.GDShipObjects2[k] = gdjs.Phase1Code.GDShipObjects2[i]; + ++k; + } +} +gdjs.Phase1Code.GDShipObjects2.length = k;}} +if (gdjs.Phase1Code.condition1IsTrue_0.val) { +/* Reuse gdjs.Phase1Code.GDShipObjects2 */ +{for(var i = 0, len = gdjs.Phase1Code.GDShipObjects2.length ;i < len;++i) { + gdjs.Phase1Code.GDShipObjects2[i].setX(gdjs.Phase1Code.GDShipObjects2[i].getX() - (120 * gdjs.evtTools.runtimeScene.getElapsedTimeInSeconds(runtimeScene))); +} +}} + +} + + +{ + +gdjs.Phase1Code.GDShipObjects2.createFrom(runtimeScene.getObjects("Ship")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +gdjs.Phase1Code.condition1IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.input.isKeyPressed(runtimeScene, "Right"); +}if ( gdjs.Phase1Code.condition0IsTrue_0.val ) { +{ +for(var i = 0, k = 0, l = gdjs.Phase1Code.GDShipObjects2.length;i 600 ) { + gdjs.Phase1Code.condition0IsTrue_0.val = true; + gdjs.Phase1Code.GDBombObjects4[k] = gdjs.Phase1Code.GDBombObjects4[i]; + ++k; + } +} +gdjs.Phase1Code.GDBombObjects4.length = k;}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +/* Reuse gdjs.Phase1Code.GDBombObjects4 */ +{for(var i = 0, len = gdjs.Phase1Code.GDBombObjects4.length ;i < len;++i) { + gdjs.Phase1Code.GDBombObjects4[i].deleteFromScene(runtimeScene); +} +}{runtimeScene.getVariables().getFromIndex(9).sub(1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb4661c +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects1Objects = Hashtable.newFrom({"Bomb": gdjs.Phase1Code.GDBombObjects1});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBaseObjects1Objects = Hashtable.newFrom({"Base": gdjs.Phase1Code.GDBaseObjects1});gdjs.Phase1Code.eventsList0xb425c4 = function(runtimeScene) { + +{ + +gdjs.Phase1Code.GDBombObjects2.createFrom(runtimeScene.getObjects("Bomb")); + +for(gdjs.Phase1Code.forEachIndex3 = 0;gdjs.Phase1Code.forEachIndex3 < gdjs.Phase1Code.GDBombObjects2.length;++gdjs.Phase1Code.forEachIndex3) { +gdjs.Phase1Code.GDBombObjects3.length = 0; + + +gdjs.Phase1Code.forEachTemporary3 = gdjs.Phase1Code.GDBombObjects2[gdjs.Phase1Code.forEachIndex3]; +gdjs.Phase1Code.GDBombObjects3.push(gdjs.Phase1Code.forEachTemporary3); +if (true) { +{for(var i = 0, len = gdjs.Phase1Code.GDBombObjects3.length ;i < len;++i) { + gdjs.Phase1Code.GDBombObjects3[i].setY(gdjs.Phase1Code.GDBombObjects3[i].getY() + (180 * gdjs.evtTools.runtimeScene.getElapsedTimeInSeconds(runtimeScene))); +} +} +{ //Subevents: +gdjs.Phase1Code.eventsList0xb4661c(runtimeScene);} //Subevents end. +} +} + +} + + +{ + +gdjs.Phase1Code.GDBaseObjects1.createFrom(runtimeScene.getObjects("Base")); +gdjs.Phase1Code.GDBombObjects1.createFrom(runtimeScene.getObjects("Bomb")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.object.hitBoxesCollisionTest(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects1Objects, gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBaseObjects1Objects, false, runtimeScene, false); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +/* Reuse gdjs.Phase1Code.GDBaseObjects1 */ +/* Reuse gdjs.Phase1Code.GDBombObjects1 */ +{for(var i = 0, len = gdjs.Phase1Code.GDBombObjects1.length ;i < len;++i) { + gdjs.Phase1Code.GDBombObjects1[i].deleteFromScene(runtimeScene); +} +}{for(var i = 0, len = gdjs.Phase1Code.GDBaseObjects1.length ;i < len;++i) { + gdjs.Phase1Code.GDBaseObjects1[i].deleteFromScene(runtimeScene); +} +}{runtimeScene.getVariables().getFromIndex(9).sub(1); +}{gdjs.evtTools.sound.playSound(runtimeScene, "laser1.ogg", false, 30, 1); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb425c4 +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDUFOObjects2Objects = Hashtable.newFrom({"UFO": gdjs.Phase1Code.GDUFOObjects2});gdjs.Phase1Code.eventsList0xb72c24 = function(runtimeScene) { + +}; //End of gdjs.Phase1Code.eventsList0xb72c24 +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDUFOObjects2Objects = Hashtable.newFrom({"UFO": gdjs.Phase1Code.GDUFOObjects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBulletObjects2Objects = Hashtable.newFrom({"Bullet": gdjs.Phase1Code.GDBulletObjects2});gdjs.Phase1Code.eventsList0xb02424 = function(runtimeScene) { + +{ + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.runtimeScene.timerElapsedTime(runtimeScene, 15, "UFOTimer"); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +gdjs.Phase1Code.GDUFOObjects2.length = 0; + +{gdjs.evtTools.object.createObjectOnScene((typeof eventsFunctionContext !== 'undefined' ? eventsFunctionContext : runtimeScene), gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDUFOObjects2Objects, 0, 60, ""); +}{gdjs.evtTools.runtimeScene.resetTimer(runtimeScene, "UFOTimer"); +}} + +} + + +{ + +gdjs.Phase1Code.GDUFOObjects2.createFrom(runtimeScene.getObjects("UFO")); + +for(gdjs.Phase1Code.forEachIndex3 = 0;gdjs.Phase1Code.forEachIndex3 < gdjs.Phase1Code.GDUFOObjects2.length;++gdjs.Phase1Code.forEachIndex3) { +gdjs.Phase1Code.GDUFOObjects3.length = 0; + + +gdjs.Phase1Code.forEachTemporary3 = gdjs.Phase1Code.GDUFOObjects2[gdjs.Phase1Code.forEachIndex3]; +gdjs.Phase1Code.GDUFOObjects3.push(gdjs.Phase1Code.forEachTemporary3); +if (true) { +{for(var i = 0, len = gdjs.Phase1Code.GDUFOObjects3.length ;i < len;++i) { + gdjs.Phase1Code.GDUFOObjects3[i].setX(gdjs.Phase1Code.GDUFOObjects3[i].getX() + (90 * gdjs.evtTools.runtimeScene.getElapsedTimeInSeconds(runtimeScene))); +} +}{gdjs.evtTools.sound.playSound(runtimeScene, "twoTone1.ogg", false, 5, 1); +}} +} + +} + + +{ + +gdjs.Phase1Code.GDBulletObjects2.createFrom(runtimeScene.getObjects("Bullet")); +gdjs.Phase1Code.GDUFOObjects2.createFrom(runtimeScene.getObjects("UFO")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.object.hitBoxesCollisionTest(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDUFOObjects2Objects, gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBulletObjects2Objects, false, runtimeScene, false); +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +/* Reuse gdjs.Phase1Code.GDBulletObjects2 */ +/* Reuse gdjs.Phase1Code.GDUFOObjects2 */ +{for(var i = 0, len = gdjs.Phase1Code.GDBulletObjects2.length ;i < len;++i) { + gdjs.Phase1Code.GDBulletObjects2[i].deleteFromScene(runtimeScene); +} +}{for(var i = 0, len = gdjs.Phase1Code.GDUFOObjects2.length ;i < len;++i) { + gdjs.Phase1Code.GDUFOObjects2[i].deleteFromScene(runtimeScene); +} +}{runtimeScene.getGame().getVariables().getFromIndex(0).add(200); +}{runtimeScene.getVariables().getFromIndex(8).setNumber(0); +}} + +} + + +{ + + +{ +} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb02424 +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects1ObjectsGDgdjs_46Phase1Code_46GDInvader2Objects1ObjectsGDgdjs_46Phase1Code_46GDInvader3Objects1Objects = Hashtable.newFrom({"Invader1": gdjs.Phase1Code.GDInvader1Objects1, "Invader2": gdjs.Phase1Code.GDInvader2Objects1, "Invader3": gdjs.Phase1Code.GDInvader3Objects1});gdjs.Phase1Code.eventsList0xb6d9f4 = function(runtimeScene) { + +{ + +gdjs.Phase1Code.GDInvader1Objects1.createFrom(runtimeScene.getObjects("Invader1")); +gdjs.Phase1Code.GDInvader2Objects1.createFrom(runtimeScene.getObjects("Invader2")); +gdjs.Phase1Code.GDInvader3Objects1.createFrom(runtimeScene.getObjects("Invader3")); + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +gdjs.Phase1Code.condition0IsTrue_0.val = gdjs.evtTools.object.pickedObjectsCount(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects1ObjectsGDgdjs_46Phase1Code_46GDInvader2Objects1ObjectsGDgdjs_46Phase1Code_46GDInvader3Objects1Objects) == 0; +}if (gdjs.Phase1Code.condition0IsTrue_0.val) { +{gdjs.evtTools.runtimeScene.replaceScene(runtimeScene, "WinPage", false); +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb6d9f4 +gdjs.Phase1Code.eventsList0xb45e3c = function(runtimeScene) { + +{ + + +{ +gdjs.Phase1Code.GDScoreNUMObjects1.createFrom(runtimeScene.getObjects("ScoreNUM")); +{runtimeScene.getGame().getVariables().getFromIndex(0).setNumber(gdjs.evtTools.common.trunc(gdjs.evtTools.common.getVariableNumber(runtimeScene.getGame().getVariables().getFromIndex(0)))); +}{for(var i = 0, len = gdjs.Phase1Code.GDScoreNUMObjects1.length ;i < len;++i) { + gdjs.Phase1Code.GDScoreNUMObjects1[i].setString(gdjs.evtTools.common.toString(gdjs.evtTools.common.getVariableNumber(runtimeScene.getGame().getVariables().getFromIndex(0)))); +} +}} + +} + + +}; //End of gdjs.Phase1Code.eventsList0xb45e3c +gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDShipObjects2Objects = Hashtable.newFrom({"Ship": gdjs.Phase1Code.GDShipObjects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader2Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader3Objects2Objects = Hashtable.newFrom({"Invader1": gdjs.Phase1Code.GDInvader1Objects2, "Invader2": gdjs.Phase1Code.GDInvader2Objects2, "Invader3": gdjs.Phase1Code.GDInvader3Objects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDShipObjects2Objects = Hashtable.newFrom({"Ship": gdjs.Phase1Code.GDShipObjects2});gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDBombObjects2Objects = Hashtable.newFrom({"Bomb": gdjs.Phase1Code.GDBombObjects2});gdjs.Phase1Code.eventsList0xb51c74 = function(runtimeScene) { + +{ + + + +} + + +{ + +gdjs.Phase1Code.GDBombObjects1.length = 0; + +gdjs.Phase1Code.GDInvader1Objects1.length = 0; + +gdjs.Phase1Code.GDInvader2Objects1.length = 0; + +gdjs.Phase1Code.GDInvader3Objects1.length = 0; + +gdjs.Phase1Code.GDShipObjects1.length = 0; + + +gdjs.Phase1Code.condition0IsTrue_0.val = false; +{ +{gdjs.Phase1Code.conditionTrue_1 = gdjs.Phase1Code.condition0IsTrue_0; +gdjs.Phase1Code.GDBombObjects1_1final.length = 0;gdjs.Phase1Code.GDInvader1Objects1_1final.length = 0;gdjs.Phase1Code.GDInvader2Objects1_1final.length = 0;gdjs.Phase1Code.GDInvader3Objects1_1final.length = 0;gdjs.Phase1Code.GDShipObjects1_1final.length = 0;gdjs.Phase1Code.condition0IsTrue_1.val = false; +gdjs.Phase1Code.condition1IsTrue_1.val = false; +{ +gdjs.Phase1Code.GDInvader1Objects2.createFrom(runtimeScene.getObjects("Invader1")); +gdjs.Phase1Code.GDInvader2Objects2.createFrom(runtimeScene.getObjects("Invader2")); +gdjs.Phase1Code.GDInvader3Objects2.createFrom(runtimeScene.getObjects("Invader3")); +gdjs.Phase1Code.GDShipObjects2.createFrom(runtimeScene.getObjects("Ship")); +gdjs.Phase1Code.condition0IsTrue_1.val = gdjs.evtTools.object.hitBoxesCollisionTest(gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDShipObjects2Objects, gdjs.Phase1Code.mapOfGDgdjs_46Phase1Code_46GDInvader1Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader2Objects2ObjectsGDgdjs_46Phase1Code_46GDInvader3Objects2Objects, false, runtimeScene, false); +if( gdjs.Phase1Code.condition0IsTrue_1.val ) { + gdjs.Phase1Code.conditionTrue_1.val = true; + for(var j = 0, jLen = gdjs.Phase1Code.GDInvader1Objects2.length;j right-layer.getCameraWidth(cameraId)/2 ) newX = right-layer.getCameraWidth(cameraId)/2; + + var newY = object.getDrawableY()+object.getCenterY()+yOffset; + if ( newY < top +layer.getCameraHeight(cameraId)/2 ) newY = top+layer.getCameraHeight(cameraId)/2; + if ( newY > bottom-layer.getCameraHeight(cameraId)/2 ) newY = bottom-layer.getCameraHeight(cameraId)/2; + + layer.setCameraX(newX, cameraId); + layer.setCameraY(newY, cameraId); +} + +/** + * Update a layer effect parameter (with a number). + * @param {gdjs.RuntimeScene} runtimeScene The scene + * @param {string} layer The name of the layer + * @param {string} effect The name of the effect + * @param {string} parameter The parameter to update + * @param {number} value The new value + */ +gdjs.evtTools.camera.setLayerEffectDoubleParameter = function(runtimeScene, layer, effect, parameter, value) { + if ( !runtimeScene.hasLayer(layer) ) { return; } + + return runtimeScene.getLayer(layer).setEffectDoubleParameter(effect, parameter, value); +} + +/** + * Update a layer effect parameter (with a string). + * @param {gdjs.RuntimeScene} runtimeScene The scene + * @param {string} layer The name of the layer + * @param {string} effect The name of the effect + * @param {string} parameter The parameter to update + * @param {string} value The new value + */ +gdjs.evtTools.camera.setLayerEffectStringParameter = function(runtimeScene, layer, effect, parameter, value) { + if ( !runtimeScene.hasLayer(layer) ) { return; } + + return runtimeScene.getLayer(layer).setEffectStringParameter(effect, parameter, value); +} + +/** + * Enable or disable a layer effect parameter (boolean). + * @param {gdjs.RuntimeScene} runtimeScene The scene + * @param {string} layer The name of the layer + * @param {string} effect The name of the effect + * @param {string} parameter The parameter to update + * @param {boolean} value The new value + */ +gdjs.evtTools.camera.setLayerEffectBooleanParameter = function(runtimeScene, layer, effect, parameter, value) { + if ( !runtimeScene.hasLayer(layer) ) { return; } + + return runtimeScene.getLayer(layer).setEffectBooleanParameter(effect, parameter, value); +} + +/** + * Enable, or disable, an effect of a layer. + * @param {gdjs.RuntimeScene} runtimeScene The scene + * @param {string} layer The name of the layer + * @param {string} effect The name of the effect + * @param {boolean} enabled true to enable, false to disable. + */ +gdjs.evtTools.camera.enableLayerEffect = function(runtimeScene, layer, effect, enabled) { + if ( !runtimeScene.hasLayer(layer) ) { return; } + + runtimeScene.getLayer(layer).enableEffect(effect, enabled); +} + +/** + * Check if an effect is enabled. + * @param {gdjs.RuntimeScene} runtimeScene The scene + * @param {string} layer The name of the layer + * @param {string} effect The name of the effect + * @return {boolean} true if the effect is enabled, false otherwise. + */ +gdjs.evtTools.camera.layerEffectEnabled = function(runtimeScene, layer, effect) { + if ( !runtimeScene.hasLayer(layer) ) { return true; } + + return runtimeScene.getLayer(layer).isEffectEnabled(effect); +} + +gdjs.evtTools.camera.setLayerTimeScale = function(runtimeScene, layer, timeScale) { + if ( !runtimeScene.hasLayer(layer) ) { return; } + return runtimeScene.getLayer(layer).setTimeScale(timeScale); +} + +gdjs.evtTools.camera.getLayerTimeScale = function(runtimeScene, layer) { + if ( !runtimeScene.hasLayer(layer) ) { return 1; } + return runtimeScene.getLayer(layer).getTimeScale(); +} diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/commontools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/commontools.js new file mode 100644 index 0000000..241e11f --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/commontools.js @@ -0,0 +1,196 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * @memberof gdjs.evtTools + * @class common + * @static + * @private + */ +gdjs.evtTools.common = gdjs.evtTools.common || {}; + +/** + * Get the value of a variable. Equivalent of variable.getAsNumber(). + * @private + */ +gdjs.evtTools.common.getVariableNumber = function(variable) { + return variable.getAsNumber(); +}; + +/** + * Get the string of a variable. Equivalent of variable.getAsString(). + * @private + */ +gdjs.evtTools.common.getVariableString = function(variable) { + return variable.getAsString(); +}; + +/** + * @private + */ +gdjs.evtTools.common.sceneVariableExists = function( + runtimeScene, + variableName +) { + return runtimeScene.getVariables().has(variableName); +}; + +/** + * @private + */ +gdjs.evtTools.common.globalVariableExists = function( + runtimeScene, + variableName +) { + return runtimeScene + .getGame() + .getVariables() + .has(variableName); +}; + +/** + * @private + */ +gdjs.evtTools.common.variableChildExists = function(variable, childName) { + return variable.hasChild(childName); +}; + +/** + * @private + */ +gdjs.evtTools.common.variableRemoveChild = function(variable, childName) { + return variable.removeChild(childName); +}; + +/** + * @private + */ +gdjs.evtTools.common.variableClearChildren = function(variable) { + variable.clearChildren(); +}; + +/** + * @private + */ +gdjs.evtTools.common.getVariableChildCount = function(variable) { + if (variable.isStructure() == false) return 0; + return Object.keys(variable.getAllChildren()).length; +}; + +/** + * Convert a string to a float. + * @private + */ +gdjs.evtTools.common.toNumber = function(str) { + return parseFloat(str); +}; + +/** + * Convert a number to a string. + * @private + */ +gdjs.evtTools.common.toString = function(num) { + //Using String literal is fastest than using toString according to + //http://jsperf.com/number-to-string/2 and http://jsben.ch/#/ghQYR + return '' + num; +}; + +/** + * Negate the boolean. + * @private + */ +gdjs.evtTools.common.logicalNegation = function(bool) { + return !bool; +}; + +gdjs.evtTools.common.clamp = function(x, min, max) { + return Math.min(Math.max(x, min), max); +}; + +gdjs.evtTools.common.acosh = function(arg) { + // http://kevin.vanzonneveld.net + // + original by: Onno Marsman + return Math.log(arg + Math.sqrt(arg * arg - 1)); +}; + +gdjs.evtTools.common.asinh = function(arg) { + // http://kevin.vanzonneveld.net + // + original by: Onno Marsman + return Math.log(arg + Math.sqrt(arg * arg + 1)); +}; + +gdjs.evtTools.common.atanh = function(arg) { + // http://kevin.vanzonneveld.net + // + original by: Onno Marsman + return 0.5 * Math.log((1 + arg) / (1 - arg)); +}; + +gdjs.evtTools.common.cosh = function(arg) { + return (Math.exp(arg) + Math.exp(-arg)) / 2; +}; + +gdjs.evtTools.common.sinh = function(arg) { + return (Math.exp(arg) - Math.exp(-arg)) / 2; +}; + +gdjs.evtTools.common.tanh = function(arg) { + return (Math.exp(arg) - Math.exp(-arg)) / (Math.exp(arg) + Math.exp(-arg)); +}; + +gdjs.evtTools.common.cot = function(arg) { + return 1 / Math.tan(arg); +}; + +gdjs.evtTools.common.csc = function(arg) { + return 1 / Math.sin(arg); +}; + +gdjs.evtTools.common.sec = function(arg) { + return 1 / Math.cos(arg); +}; + +gdjs.evtTools.common.log10 = function(arg) { + return Math.log(arg) / Math.LN10; +}; + +gdjs.evtTools.common.log2 = function(arg) { + return Math.log(arg) / Math.LN2; +}; + +gdjs.evtTools.common.sign = function(arg) { + if (arg === 0) return 0; + + return arg > 0 ? +1 : -1; +}; + +gdjs.evtTools.common.cbrt = function(x) { + return Math.pow(x, 1 / 3); +}; + +gdjs.evtTools.common.nthroot = function(x, n) { + return Math.pow(x, 1 / n); +}; + +gdjs.evtTools.common.mod = function(x, y) { + return x - y * Math.floor(x / y); +}; + +gdjs.evtTools.common.angleDifference = function(angle1, angle2) { + return ( + gdjs.evtTools.common.mod( + gdjs.evtTools.common.mod(angle1 - angle2, 360.0) + 180.0, + 360.0 + ) - 180.0 + ); +}; + +gdjs.evtTools.common.lerp = function(a, b, x) { + return a + (b - a) * x; +}; + +gdjs.evtTools.common.trunc = function(x) { + return x | 0; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/inputtools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/inputtools.js new file mode 100644 index 0000000..f658c04 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/inputtools.js @@ -0,0 +1,284 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Tools related to input ( Keyboard, mouse ), for events generated code. + * + * @memberof gdjs.evtTools + * @class input + * @static + * @private + */ +gdjs.evtTools.input = gdjs.evtTools.input || {}; + +/** + * Return true if the specified key is pressed + * + * @private + */ +gdjs.evtTools.input.isKeyPressed = function(runtimeScene, key) { + if (gdjs.evtTools.input.keysNameToCode.hasOwnProperty(key)) { + return runtimeScene.getGame().getInputManager().isKeyPressed(gdjs.evtTools.input.keysNameToCode[key]); + } + + return false; +}; + +/** + * Return true if the specified key was just released + * + * @private + */ +gdjs.evtTools.input.wasKeyReleased = function(runtimeScene, key) { + if (gdjs.evtTools.input.keysNameToCode.hasOwnProperty(key)) { + return runtimeScene.getGame().getInputManager().wasKeyReleased(gdjs.evtTools.input.keysNameToCode[key]); + } + + return false; +}; + +/** + * Return the name of the last key pressed in the game + * @private + */ +gdjs.evtTools.input.lastPressedKey = function(runtimeScene) { + //Ensure _keysCodeToName is constructed + if (gdjs.evtTools.input._keysCodeToName === undefined) { + gdjs.evtTools.input._keysCodeToName = {}; + var keysNameToCode = gdjs.evtTools.input.keysNameToCode; + for(var p in keysNameToCode) { + if (keysNameToCode.hasOwnProperty(p)) { + gdjs.evtTools.input._keysCodeToName[keysNameToCode[p]] = p; + } + } + } + + var keyCode = runtimeScene.getGame().getInputManager().getLastPressedKey(); + if (gdjs.evtTools.input._keysCodeToName.hasOwnProperty(keyCode)) { + return gdjs.evtTools.input._keysCodeToName[keyCode]; + } + + return ""; +}; + +/** + * Hashmap associated each name of a key to its keyCode. + * @memberof gdjs.evtTools + */ +gdjs.evtTools.input.keysNameToCode = { + "a": 65, + "b": 66, + "c": 67, + "d": 68, + "e": 69, + "f": 70, + "g": 71, + "h": 72, + "i": 73, + "j": 74, + "k": 75, + "l": 76, + "m": 77, + "n": 78, + "o": 79, + "p": 80, + "q": 81, + "r": 82, + "s": 83, + "t": 84, + "u": 85, + "v": 86, + "w": 87, + "x": 88, + "y": 89, + "z": 90, + + "Num0": 48, + "Num1": 49, + "Num2": 50, + "Num3": 51, + "Num4": 52, + "Num5": 53, + "Num6": 54, + "Num7": 55, + "Num8": 56, + "Num9": 57, + + "Numpad0": 96, + "Numpad1": 97, + "Numpad2": 98, + "Numpad3": 99, + "Numpad4": 100, + "Numpad5": 101, + "Numpad6": 102, + "Numpad7": 103, + "Numpad8": 104, + "Numpad9": 105, + + "RControl": 17, + "RShift": 16, + "RAlt": 18, + "LControl": 17, + "LShift": 16, + "LAlt": 18, + "LSystem": 91, + "RSystem": 91, + /*"Menu": sf::Keyboard::Menu , + "LBracket": sf::Keyboard::LBracket , + "RBracket": sf::Keyboard::RBracket , + "SemiColon": sf::Keyboard::SemiColon , + "Comma": sf::Keyboard::Comma , + "Period": sf::Keyboard::Period , + "Quote": sf::Keyboard::Quote , + "Slash": sf::Keyboard::Slash , + "BackSlash": sf::Keyboard::BackSlash , + "Tilde": sf::Keyboard::Tilde , + "Equal": sf::Keyboard::Equal , + "Dash": sf::Keyboard::Dash,*/ + "Space": 32, + "Return": 13, + "Back": 8, + "Tab": 9, + "PageUp": 33, + "PageDown": 34, + "End": 35, + "Home": 36, + "Delete": 46, + "Insert": 45, + "Escape": 27, + + "Add": 107, + "Subtract": 109, + "Multiply": 106, + "Divide": 111, + + "Left": 37, + "Up": 38, + "Right": 39, + "Down": 40, + + "F1": 112, + "F2": 113, + "F3": 114, + "F4": 115, + "F5": 116, + "F6": 117, + "F7": 118, + "F8": 119, + "F9": 120, + "F10": 121, + "F11": 122, + "F12": 123, + + "Pause": 19 +}; + +gdjs.evtTools.input.anyKeyPressed = function(runtimeScene) { + return runtimeScene.getGame().getInputManager().anyKeyPressed(); +}; + +gdjs.evtTools.input.isMouseButtonPressed = function(runtimeScene, button) { + if ( button === "Left" ) return runtimeScene.getGame().getInputManager().isMouseButtonPressed(0); + if ( button === "Right" ) return runtimeScene.getGame().getInputManager().isMouseButtonPressed(1); + if ( button === "Middle" ) return runtimeScene.getGame().getInputManager().isMouseButtonPressed(2); + return false; +}; + +gdjs.evtTools.input.isMouseButtonReleased = function(runtimeScene, button) { + if ( button === "Left" ) return runtimeScene.getGame().getInputManager().isMouseButtonReleased(0); + if ( button === "Right" ) return runtimeScene.getGame().getInputManager().isMouseButtonReleased(1); + if ( button === "Middle" ) return runtimeScene.getGame().getInputManager().isMouseButtonReleased(2); + return false; +}; + +gdjs.evtTools.input.hideCursor = function(runtimeScene) { + runtimeScene.getRenderer().hideCursor(); +}; + +gdjs.evtTools.input.showCursor = function(runtimeScene) { + runtimeScene.getRenderer().showCursor(); +}; + +gdjs.evtTools.input.getMouseWheelDelta = function(runtimeScene) { + return runtimeScene.getGame().getInputManager().getMouseWheelDelta(); +}; + +gdjs.evtTools.input.isScrollingUp = function(runtimeScene) { + return runtimeScene.getGame().getInputManager().isScrollingUp(); +}; + +gdjs.evtTools.input.isScrollingDown = function(runtimeScene) { + return runtimeScene.getGame().getInputManager().isScrollingDown(); +}; + +gdjs.evtTools.input.getMouseX = function(runtimeScene, layer, camera) { + return runtimeScene.getLayer(layer).convertCoords( + runtimeScene.getGame().getInputManager().getMouseX(), + runtimeScene.getGame().getInputManager().getMouseY())[0]; +}; + +gdjs.evtTools.input.getMouseY = function(runtimeScene, layer, camera) { + return runtimeScene.getLayer(layer).convertCoords( + runtimeScene.getGame().getInputManager().getMouseX(), + runtimeScene.getGame().getInputManager().getMouseY())[1]; +}; + +gdjs.evtTools.input._cursorIsOnObject = function(obj, runtimeScene) { + return obj.cursorOnObject(runtimeScene); +}; + +gdjs.evtTools.input.cursorOnObject = function(objectsLists, runtimeScene, accurate, inverted) { + return gdjs.evtTools.object.pickObjectsIf(gdjs.evtTools.input._cursorIsOnObject, + objectsLists, inverted, runtimeScene); +}; + +gdjs.evtTools.input.getTouchX = function(runtimeScene, identifier, layer, camera) { + return runtimeScene.getLayer(layer).convertCoords( + runtimeScene.getGame().getInputManager().getTouchX(identifier), + runtimeScene.getGame().getInputManager().getTouchY(identifier))[0]; +}; + +gdjs.evtTools.input.getTouchY = function(runtimeScene, identifier, layer, camera) { + return runtimeScene.getLayer(layer).convertCoords( + runtimeScene.getGame().getInputManager().getTouchX(identifier), + runtimeScene.getGame().getInputManager().getTouchY(identifier))[1]; +}; + +gdjs.evtTools.input.getLastTouchId = function() { + return gdjs.evtTools.input.lastTouchId || 0; +}; + +gdjs.evtTools.input.getLastEndedTouchId = function() { + return gdjs.evtTools.input.lastEndedTouchId || 0; +}; + +gdjs.evtTools.input.popStartedTouch = function(runtimeScene) { + var startedTouchId = runtimeScene.getGame().getInputManager().popStartedTouch(); + + if (startedTouchId !== undefined) { + gdjs.evtTools.input.lastTouchId = startedTouchId; + return true; + } + + return false; +}; + +gdjs.evtTools.input.popEndedTouch = function(runtimeScene) { + var endedTouchId = runtimeScene.getGame().getInputManager().popEndedTouch(); + + if (endedTouchId !== undefined) { + gdjs.evtTools.input.lastEndedTouchId = endedTouchId; + return true; + } + + return false; +}; + + + +gdjs.evtTools.input.touchSimulateMouse = function(runtimeScene, enable) { + runtimeScene.getGame().getInputManager().touchSimulateMouse(enable); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/networktools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/networktools.js new file mode 100644 index 0000000..4c5d3ca --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/networktools.js @@ -0,0 +1,127 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * @memberof gdjs.evtTools + * @namespace network + */ +gdjs.evtTools.network = gdjs.evtTools.network || {}; + +gdjs.evtTools.network.sendHttpRequest = function(host, uri, body, method, contentType, responseVar) +{ + try { + var xhr; + if (typeof XMLHttpRequest !== 'undefined') + xhr = new XMLHttpRequest(); + else { + var versions = ["MSXML2.XmlHttp.5.0", + "MSXML2.XmlHttp.4.0", + "MSXML2.XmlHttp.3.0", + "MSXML2.XmlHttp.2.0", + "Microsoft.XmlHttp"] + + for(var i = 0, len = versions.length; i < len; i++) { + try { + xhr = new ActiveXObject(versions[i]); + break; + } + catch(e){} + } // end for + } + + if ( xhr === undefined ) return; + + xhr.open(method, host+uri, false); + xhr.setRequestHeader( "Content-Type", contentType === "" ? "application/x-www-form-urlencoded" : contentType ); + xhr.send(body); + responseVar.setString(xhr.responseText); + } + catch(e){} +}; + +/** + * Convert a variable to JSON. + * TODO: Move to gdjs.Variable static + * @param {gdjs.Variable} variable The variable to convert to JSON + * @returns {string} The JSON string representing the variable + */ +gdjs.evtTools.network.variableStructureToJSON = function(variable) +{ + if ( !variable.isStructure() ) { + if ( variable.isNumber() ) + return JSON.stringify(variable.getAsNumber()); + else + return JSON.stringify(variable.getAsString()); + } + + var str = "{"; + var firstChild = true; + var children = variable.getAllChildren(); + for(var p in children) { + if (children.hasOwnProperty(p)) { + if ( !firstChild ) str += ","; + str += JSON.stringify(p) + ": " + gdjs.evtTools.network.variableStructureToJSON(children[p]); + + firstChild = false; + } + } + + str += "}"; + return str; +}; + +gdjs.evtTools.network.objectVariableStructureToJSON = function(object, variable) +{ + return gdjs.evtTools.network.variableStructureToJSON(variable); +} + +gdjs.evtTools.network._objectToVariable = function(obj, variable) +{ + if(!isNaN(obj)) { //Number + variable.setNumber(obj); + } + else if (typeof obj == 'string' || obj instanceof String) { + variable.setString(obj); + } + else if ( Array.isArray(obj) ) { + for(var i = 0;i= objectsCount) index = objectsCount-1; //Should never happen. + + // Find the object + var startIndex = 0; + var theChosenOne = null; + for (var listName in objectsLists.items) { + if (objectsLists.items.hasOwnProperty(listName)) { + var list = objectsLists.items[listName]; + + if (index - startIndex < list.length) { + theChosenOne = list[index - startIndex]; + break; + } + + startIndex += list.length; + } + } + + gdjs.evtTools.object.pickOnly(objectsLists, theChosenOne); + return true; +}; + +gdjs.evtTools.object.pickNearestObject = function(objectsLists, x, y, inverted) { + var bestObject = null; + var best = 0; + var first = true; + var lists = gdjs.staticArray(gdjs.evtTools.object.pickNearestObject); + objectsLists.values(lists); + for(var i = 0, len = lists.length;i= testSqDist) ) { + testSqDist = result.farSqDist; + matchObject = object; + resultX = result.farX; + resultY = result.farY; + } + } + } + } + + if ( !matchObject ) + return false; + + gdjs.evtTools.object.pickOnly(objectsLists, matchObject); + varX.setNumber(resultX); + varY.setNumber(resultY); + return true; +}; + +/** + * Do the work of creating a new object + * @private + */ +gdjs.evtTools.object.doCreateObjectOnScene = function(objectsContext, objectName, objectsLists, x, y, layer) { + // objectsContext will either be the gdjs.RuntimeScene or, in an events function, the + // eventsFunctionContext. We can't directly use runtimeScene because the object name could + // be different than the real object name (this is the case in a function. The eventsFunctionContext + // will take care of this in createObject). + var obj = objectsContext.createObject(objectName); + + if ( obj !== null ) { + //Do some extra setup + obj.setPosition(x,y); + obj.setLayer(layer); + + //Let the new object be picked by next actions/conditions. + if ( objectsLists.containsKey(objectName) ) { + objectsLists.get(objectName).push(obj); + } + } +}; + +/** + * Allows events to create a new object on a scene. + * @private + */ +gdjs.evtTools.object.createObjectOnScene = function(objectsContext, objectsLists, x, y, layer) { + gdjs.evtTools.object.doCreateObjectOnScene(objectsContext, objectsLists.firstKey(), objectsLists, x, y, layer); +}; + +/** + * Allows events to create a new object on a scene. + * @private + */ +gdjs.evtTools.object.createObjectFromGroupOnScene = function(objectsContext, objectsLists, objectName, x, y, layer) { + gdjs.evtTools.object.doCreateObjectOnScene(objectsContext, objectName, objectsLists, x, y, layer); +}; + +/** + * Allows events to get the number of objects picked. + * @private + */ +gdjs.evtTools.object.pickedObjectsCount = function(objectsLists) { + var size = 0; + var lists = gdjs.staticArray(gdjs.evtTools.object.pickedObjectsCount); + objectsLists.values(lists); + for(var i = 0, len = lists.length;i= timeInSeconds; +}; + +gdjs.evtTools.runtimeScene.timerPaused = function(runtimeScene, timerName) { + var timeManager = runtimeScene.getTimeManager(); + if ( !timeManager.hasTimer(timerName) ) return false; + + return timeManager.getTimer(timerName).isPaused(); +}; + +gdjs.evtTools.runtimeScene.resetTimer = function(runtimeScene, timerName) { + var timeManager = runtimeScene.getTimeManager(); + if ( !timeManager.hasTimer(timerName) ) + timeManager.addTimer(timerName); + else + timeManager.getTimer(timerName).reset(); +}; + +gdjs.evtTools.runtimeScene.pauseTimer = function(runtimeScene, timerName) { + var timeManager = runtimeScene.getTimeManager(); + if ( !timeManager.hasTimer(timerName) ) timeManager.addTimer(timerName); + + timeManager.getTimer(timerName).setPaused(true); +}; + +gdjs.evtTools.runtimeScene.unpauseTimer = function(runtimeScene, timerName) { + var timeManager = runtimeScene.getTimeManager(); + if ( !timeManager.hasTimer(timerName) ) timeManager.addTimer(timerName); + + return timeManager.getTimer(timerName).setPaused(false); +}; + +gdjs.evtTools.runtimeScene.removeTimer = function(runtimeScene, timerName) { + var timeManager = runtimeScene.getTimeManager(); + timeManager.removeTimer(timerName); +}; + +gdjs.evtTools.runtimeScene.getTimerElapsedTimeInSeconds = function(runtimeScene, timerName) { + var timeManager = runtimeScene.getTimeManager(); + if (!timeManager.hasTimer(timerName)) return 0; + + return timeManager.getTimer(timerName).getTime() / 1000; +}; + +gdjs.evtTools.runtimeScene.getTimeFromStartInSeconds = function(runtimeScene) { + return runtimeScene.getTimeManager().getTimeFromStart() / 1000; +}; + +gdjs.evtTools.runtimeScene.getTime = function(runtimeScene, what) { + if ( what === "timestamp" ) { + return Date.now(); + } + + var now = new Date(); + + if ( what === "hour" ) + return now.getHours(); + else if ( what === "min" ) + return now.getMinutes(); + else if ( what === "sec" ) + return now.getSeconds(); + else if ( what === "mday" ) + return now.getDate(); + else if ( what === "mon" ) + return now.getMonth(); + else if ( what === "year" ) + return now.getFullYear() - 1900; //Conform to the C way of returning years. + else if ( what === "wday" ) + return now.getDay(); + else if ( what === "yday" ) { + var start = new Date(now.getFullYear(), 0, 0); + var diff = now - start; + var oneDay = 1000 * 60 * 60 * 24; + return Math.floor(diff / oneDay); + } + + return 0; +}; + +gdjs.evtTools.runtimeScene.replaceScene = function(runtimeScene, newSceneName, clearOthers) { + if (!runtimeScene.getGame().getSceneData(newSceneName)) return; + + runtimeScene.requestChange(clearOthers ? + gdjs.RuntimeScene.CLEAR_SCENES : + gdjs.RuntimeScene.REPLACE_SCENE, newSceneName); +}; + +gdjs.evtTools.runtimeScene.pushScene = function(runtimeScene, newSceneName) { + if (!runtimeScene.getGame().getSceneData(newSceneName)) return; + + runtimeScene.requestChange(gdjs.RuntimeScene.PUSH_SCENE, newSceneName); +}; + +gdjs.evtTools.runtimeScene.popScene = function(runtimeScene) { + runtimeScene.requestChange(gdjs.RuntimeScene.POP_SCENE); +}; + +gdjs.evtTools.runtimeScene.stopGame = function(runtimeScene) { + runtimeScene.requestChange(gdjs.RuntimeScene.STOP_GAME); +}; + +gdjs.evtTools.runtimeScene.createObjectsFromExternalLayout = function(scene, externalLayout, xPos, yPos) { + var externalLayoutData = scene.getGame().getExternalLayoutData(externalLayout); + if ( externalLayoutData === null ) return; + + scene.createObjectsFrom(externalLayoutData.instances, xPos, yPos); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/soundtools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/soundtools.js new file mode 100644 index 0000000..33ed669 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/soundtools.js @@ -0,0 +1,163 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Class used by events to interact with the soundManager. + * + * @memberof gdjs.evtTools + * @class sound + * @static + * @private + */ +gdjs.evtTools.sound = gdjs.evtTools.sound || {}; + +gdjs.evtTools.sound.getGlobalVolume = function(runtimeScene) { + return runtimeScene.getSoundManager().getGlobalVolume(); +}; + +gdjs.evtTools.sound.setGlobalVolume = function(runtimeScene, globalVolume) { + runtimeScene.getSoundManager().setGlobalVolume(globalVolume); +}; + +//Sounds: + +gdjs.evtTools.sound.playSound = function(runtimeScene, soundFile, loop, volume, pitch) { + runtimeScene.getSoundManager().playSound(soundFile, loop, volume, pitch); +}; + +gdjs.evtTools.sound.playSoundOnChannel = function(runtimeScene, soundFile, channel, loop, volume, pitch) { + runtimeScene.getSoundManager().playSoundOnChannel(soundFile, channel, loop, volume, pitch); +}; + +gdjs.evtTools.sound.stopSoundOnChannel = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + sound && sound.stop(); +}; + +gdjs.evtTools.sound.pauseSoundOnChannel = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + sound && sound.pause(); +}; + +gdjs.evtTools.sound.continueSoundOnChannel = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + if (sound && !sound.playing()) sound.play(); +}; + +gdjs.evtTools.sound.isSoundOnChannelPlaying = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + return sound ? sound.playing() : false; +}; + +gdjs.evtTools.sound.isSoundOnChannelPaused = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + return sound ? sound.paused() : false; +}; + +gdjs.evtTools.sound.isSoundOnChannelStopped = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + return sound ? sound.stopped() : true; +}; + +gdjs.evtTools.sound.getSoundOnChannelVolume = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + return sound ? sound.volume() * 100 : 100; +}; + +gdjs.evtTools.sound.setSoundOnChannelVolume = function(runtimeScene, channel, volume) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + sound && sound.volume(volume / 100); +}; + +gdjs.evtTools.sound.getSoundOnChannelPlayingOffset = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + return sound ? sound.seek() : 0; +}; + +gdjs.evtTools.sound.setSoundOnChannelPlayingOffset = function(runtimeScene, channel, playingOffset) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + sound && sound.seek(playingOffset); +}; + +gdjs.evtTools.sound.getSoundOnChannelPitch = function(runtimeScene, channel) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + return sound ? sound.getRate() : 1; +}; + +gdjs.evtTools.sound.setSoundOnChannelPitch = function(runtimeScene, channel, pitch) { + var sound = runtimeScene.getSoundManager().getSoundOnChannel(channel); + sound && sound.setRate(pitch); +}; + +//Musics: + +gdjs.evtTools.sound.playMusic = function(runtimeScene, soundFile, loop, volume, pitch) { + runtimeScene.getSoundManager().playMusic(soundFile, loop, volume, pitch); +}; + +gdjs.evtTools.sound.playMusicOnChannel = function(runtimeScene, soundFile, channel, loop, volume, pitch) { + runtimeScene.getSoundManager().playMusicOnChannel(soundFile, channel, loop, volume, pitch); +}; + +gdjs.evtTools.sound.stopMusicOnChannel = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + music && music.stop(); +}; + +gdjs.evtTools.sound.pauseMusicOnChannel = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + music && music.pause(); +}; + +gdjs.evtTools.sound.continueMusicOnChannel = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + if (music && !music.playing()) music.play(); +}; + +gdjs.evtTools.sound.isMusicOnChannelPlaying = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + return music ? music.playing() : false; +}; + +gdjs.evtTools.sound.isMusicOnChannelPaused = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + return music ? music.paused() : false; +}; + +gdjs.evtTools.sound.isMusicOnChannelStopped = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + return music ? music.stopped() : true; +}; + +gdjs.evtTools.sound.getMusicOnChannelVolume = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + return music ? music.volume() * 100 : 100; +}; + +gdjs.evtTools.sound.setMusicOnChannelVolume = function(runtimeScene, channel, volume) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + music && music.volume(volume / 100); +}; + +gdjs.evtTools.sound.getMusicOnChannelPlayingOffset = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + return music ? music.seek() : 0; +}; + +gdjs.evtTools.sound.setMusicOnChannelPlayingOffset = function(runtimeScene, channel, playingOffset) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + music && music.seek(playingOffset); +}; + +gdjs.evtTools.sound.getMusicOnChannelPitch = function(runtimeScene, channel) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + return music ? music.getRate() : 1; +}; + +gdjs.evtTools.sound.setMusicOnChannelPitch = function(runtimeScene, channel, pitch) { + var music = runtimeScene.getSoundManager().getMusicOnChannel(channel); + music && music.setRate(pitch); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/storagetools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/storagetools.js new file mode 100644 index 0000000..bdedd10 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/storagetools.js @@ -0,0 +1,254 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Tools related to storage, for events generated code. + * + * @memberof gdjs.evtTools + * @namespace storage + * @private + */ +gdjs.evtTools.storage = gdjs.evtTools.storage || { + loadedFiles: new Hashtable(), + localStorage: typeof cc !== 'undefined' ? cc.sys.localStorage : localStorage, + fileUtils: null //Disabled for now +}; + +/** + * Load into memory a JSON object stored in the local storage object + * provided by the browser. + * The JSON object is named GDJS_filename in the localStorage object. + * + * @param filename {String} The name of the JSON object + */ +gdjs.evtTools.storage.loadJSONFileFromStorage = function(filename) { + if ( gdjs.evtTools.storage.loadedFiles.containsKey(filename) ) + return; //Already loaded. + + var rawStr = null; + if (gdjs.evtTools.storage.fileUtils) { + var fileUtils = gdjs.evtTools.storage.fileUtils; + + var fullPath = jsb.fileUtils.getWritablePath() + filename; + if (jsb.fileUtils.isFileExist(fullPath)) { + rawStr = jsb.fileUtils.getStringFromFile(fullPath); + } else { + console.log('File "' + filename + '" does not exist.'); + } + } else { + var localStorage = gdjs.evtTools.storage.localStorage; + rawStr = localStorage.getItem("GDJS_"+filename); + } + + try { + if ( rawStr !== null ) + gdjs.evtTools.storage.loadedFiles.put(filename, JSON.parse(rawStr)); + else + gdjs.evtTools.storage.loadedFiles.put(filename, {}); + } + catch(e) { + console.log('Unable to load data from "' + filename + '"!'); + gdjs.evtTools.storage.loadedFiles.put(filename, {}); + } +}; + +/** + * Unload from memory a JSON object, which is then stored in the local storage + * object provided by the browser. + * The JSON object is named GDJS_filename in the localStorage object. + * + * @param filename {String} The name of the JSON object + */ +gdjs.evtTools.storage.unloadJSONFile = function(filename) { + if ( !gdjs.evtTools.storage.loadedFiles.containsKey(filename) ) + return; //Not loaded. + + var jsonObject = gdjs.evtTools.storage.loadedFiles.get(filename); + var rawStr = JSON.stringify(jsonObject); + if (gdjs.evtTools.storage.fileUtils) { + var fileUtils = gdjs.evtTools.storage.fileUtils; + + var fullPath = jsb.fileUtils.getWritablePath() + filename; + if (!jsb.fileUtils.writeToFile(rawStr, fullPath)) { + console.log('Unable to save data to file "' + filename + '"!'); + } + + } else { + var localStorage = gdjs.evtTools.storage.localStorage; + try { + localStorage.setItem("GDJS_"+filename, rawStr); + } catch(e) { + //TODO: Handle storage error. + console.log('Unable to save data to localStorage for "' + filename + '"!'); + } + } + + gdjs.evtTools.storage.loadedFiles.remove(filename); +}; + +gdjs.evtTools.storage.clearJSONFile = function(filename) { + var notPermanentlyLoaded = false; + if ( !gdjs.evtTools.storage.loadedFiles.containsKey(filename) ) { + notPermanentlyLoaded = true; + gdjs.evtTools.storage.loadJSONFileFromStorage(filename); + } + + var JSONobject = gdjs.evtTools.storage.loadedFiles.get(filename); + for ( var p in JSONobject ) { + if ( JSONobject.hasOwnProperty(p) ) + delete JSONobject[p]; + } + + if ( notPermanentlyLoaded ) gdjs.evtTools.storage.unloadJSONFile(filename); + return true; +}; + +gdjs.evtTools.storage.elementExistsInJSONFile = function(filename, element) { + var notPermanentlyLoaded = false; + if ( !gdjs.evtTools.storage.loadedFiles.containsKey(filename) ) { + notPermanentlyLoaded = true; + gdjs.evtTools.storage.loadJSONFileFromStorage(filename); + } + + var elemArray = element.split("/"); + var currentElem = gdjs.evtTools.storage.loadedFiles.get(filename); + for (var i =0;i= 0 ) + return str.substr(start, len); + + return ""; +}; + +/** + * Return a new string containing the character at the specified position. + * @private + */ +gdjs.evtTools.string.strAt = function(str, start) { + if ( start < str.length && start >= 0 ) + return str.substr(start, 1); + + return ""; +}; + +/** + * Return the string repeated. + * @private + */ +gdjs.evtTools.string.strRepeat = function(str, count) { + var result = ""; + for ( var i = 0; i < count; i++ ) + result += str; + + return result; +} + +/** + * Return the length of the string + * @private + */ +gdjs.evtTools.string.strLen = function(str) { + return str.length; +}; + +/** + * Search in a string + * @private + */ +gdjs.evtTools.string.strFind = function(str, what) { + return str.indexOf(what); +}; + +/** + * Reverse search in a string + * @private + */ +gdjs.evtTools.string.strRFind = function(str, what) { + return str.lastIndexOf(what); +}; + +/** + * Search in a string, starting from a specified position. + * @private + */ +gdjs.evtTools.string.strFindFrom = function(str, what, pos) { + return str.indexOf(what, pos); +}; + +/** + * Reverse search in a string, starting from a specified position. + * @private + */ +gdjs.evtTools.string.strRFindFrom = function(str, what, pos) { + return str.lastIndexOf(what, pos); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/windowtools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/windowtools.js new file mode 100644 index 0000000..7997dbc --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/events-tools/windowtools.js @@ -0,0 +1,80 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Tools related to window, for events generated code. + * @memberof gdjs.evtTools + * @class window + * @static + * @private + */ +gdjs.evtTools.window = gdjs.evtTools.window || {}; + +gdjs.evtTools.window.setMargins = function(runtimeScene, top, right, bottom, left) { + runtimeScene.getGame().getRenderer().setMargins(top, right, bottom, left); +}; + +gdjs.evtTools.window.setFullScreen = function(runtimeScene, enable, keepAspectRatio) { + runtimeScene.getGame().getRenderer().keepAspectRatio(keepAspectRatio); + runtimeScene.getGame().getRenderer().setFullScreen(enable); +}; + +gdjs.evtTools.window.setWindowSize = function(runtimeScene, width, height, updateGameResolution) { + runtimeScene.getGame().getRenderer().setWindowSize(width, height); + if (updateGameResolution) { + runtimeScene.getGame().setGameResolutionSize(width, height); + } +}; + +gdjs.evtTools.window.centerWindow = function(runtimeScene) { + runtimeScene.getGame().getRenderer().centerWindow(); +}; + +gdjs.evtTools.window.setGameResolutionSize = function(runtimeScene, width, height) { + runtimeScene.getGame().setGameResolutionSize(width, height); +}; + +gdjs.evtTools.window.setGameResolutionResizeMode = function(runtimeScene, resizeMode) { + runtimeScene.getGame().setGameResolutionResizeMode(resizeMode); +}; + +gdjs.evtTools.window.setAdaptGameResolutionAtRuntime = function(runtimeScene, enable) { + runtimeScene.getGame().setAdaptGameResolutionAtRuntime(enable); +}; + +gdjs.evtTools.window.setWindowTitle = function(runtimeScene, title) { + runtimeScene.getGame().getRenderer().setWindowTitle(title); +}; + +gdjs.evtTools.window.getWindowTitle = function(runtimeScene) { + runtimeScene.getGame().getRenderer().getWindowTitle(); +}; + +gdjs.evtTools.window.getWindowInnerWidth = function() { + if (gdjs.RuntimeGameRenderer && gdjs.RuntimeGameRenderer.getWindowInnerWidth) + return gdjs.RuntimeGameRenderer.getWindowInnerWidth(); + + return (typeof window !== "undefined") ? window.innerWidth : 800; +}; + +gdjs.evtTools.window.getWindowInnerHeight = function() { + if (gdjs.RuntimeGameRenderer && gdjs.RuntimeGameRenderer.getWindowInnerHeight) + return gdjs.RuntimeGameRenderer.getWindowInnerHeight(); + + return (typeof window !== "undefined") ? window.innerHeight : 800; +}; + +gdjs.evtTools.window.getGameResolutionWidth = function(runtimeScene) { + return runtimeScene.getGame().getGameResolutionWidth(); +}; + +gdjs.evtTools.window.getGameResolutionHeight = function(runtimeScene) { + return runtimeScene.getGame().getGameResolutionHeight(); +}; + +gdjs.evtTools.window.openURL = function(url, runtimeScene) { + return runtimeScene.getGame().getRenderer().openURL(url); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/fontfaceobserver-font-manager/fontfaceobserver-font-manager.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/fontfaceobserver-font-manager/fontfaceobserver-font-manager.js new file mode 100644 index 0000000..94e850c --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/fontfaceobserver-font-manager/fontfaceobserver-font-manager.js @@ -0,0 +1,128 @@ +/* + * GDevelop JS Platform + * Copyright 2013-present Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * FontFaceObserverFontManager loads fonts (using fontfaceobserver library) + * from the game resources (see `loadFonts`), and allow to access to + * the font families of the loaded fonts during the game (see `getFontFamily`). + * + * "@font-face" declarations must be have been added separately in the index.html + * (or any CSS file). + * + * @class FontFaceObserverFontManager + * @memberof gdjs + * @param {Object} resources The resources data of the game. + */ +gdjs.FontFaceObserverFontManager = function(resources) +{ + this._resources = resources; + this._loadedFontFamily = {}; // Associate font resource names to the loaded font family + this._loadedFonts = {}; // Associate font resource names to the resources, for faster access +}; + +gdjs.FontManager = gdjs.FontFaceObserverFontManager; //Register the class to let the engine use it. + +/** + * Return the font family associated to the specified font resource name. + * The font resource must have been loaded before. If that's not the case, + * a font family will be returned but without guarantee of it being loaded (to + * keep compatibility with GDevelop 5.0-beta56 and previous). + * + * @param {string} resourceName The name of the resource to get. + * @returns {string} The font family to be used for this font resource, + * or "Arial" if `resourceName` is empty. + */ +gdjs.FontFaceObserverFontManager.prototype.getFontFamily = function(resourceName) { + if (this._loadedFontFamily[resourceName]) { + return this._loadedFontFamily[resourceName]; + } + + return resourceName ? + gdjs.FontFaceObserverFontManager._getFontFamilyFromFilename(resourceName) : + 'Arial'; +} + +/** + * Return the font file associated to the specified font resource name. + * The font resource must have been loaded before. If that's not the case, + * the resource name will be returned (to + * keep compatibility with GDevelop 5.0-beta56 and previous). + * + * Should only be useful for renderers running on a non HTML5/non browser environment. + * + * @param {string} resourceName The name of the resource to get. + * @returns {string} The file of the font resource. + */ +gdjs.FontFaceObserverFontManager.prototype.getFontFile = function(resourceName) { + if (this._loadedFonts[resourceName]) { + return this._loadedFonts[resourceName].file || ''; + } + + return resourceName; +} + +/** + * Return the font family for a given filename. + * Should be kept in sync with the declaration of "@font-face" during exports. + * + * @private + * @param {string} filename The filename of the font + * @returns {string} The font family to be used for this font resource. + */ +gdjs.FontFaceObserverFontManager._getFontFamilyFromFilename = function(filename) { + return "gdjs_font_" + filename; +} + +/** + * Load the specified resources, so that fonts are loaded and can then be + * used by using the font family returned by getFontFamily. + * @param onProgress Callback called each time a new file is loaded. + * @param onComplete Callback called when loading is done. + * @param resources The resources to be loaded. If not specified, will load the resources + * specified in the FontFaceObserverFontManager constructor. + */ +gdjs.FontFaceObserverFontManager.prototype.loadFonts = function(onProgress, onComplete, resources) { + resources = resources || this._resources; + + //Construct the list of files to be loaded. + //For one loaded file, it can have one or more resources + //that use it. + var filesResources = {}; + for(var i = 0, len = resources.length;iparseInt(a[1],10)}else C=!1;return C}function J(){null===F&&(F=!!document.fonts);return F} +function K(){if(null===E){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}E=""!==a.style.font}return E}function L(a,b){return[a.style,a.weight,K()?a.stretch:"","100px",b].join(" ")} +A.prototype.load=function(a,b){var c=this,k=a||"BESbswy",q=0,D=b||3E3,H=(new Date).getTime();return new Promise(function(a,b){if(J()&&!G()){var M=new Promise(function(a,b){function e(){(new Date).getTime()-H>=D?b():document.fonts.load(L(c,'"'+c.family+'"'),k).then(function(c){1<=c.length?a():setTimeout(e,25)},function(){b()})}e()}),N=new Promise(function(a,c){q=setTimeout(c,D)});Promise.race([N,M]).then(function(){clearTimeout(q);a(c)},function(){b(c)})}else m(function(){function u(){var b;if(b=-1!= +f&&-1!=g||-1!=f&&-1!=h||-1!=g&&-1!=h)(b=f!=g&&f!=h&&g!=h)||(null===B&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),B=!!b&&(536>parseInt(b[1],10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=B&&(f==v&&g==v&&h==v||f==w&&g==w&&h==w||f==x&&g==x&&h==x)),b=!b;b&&(d.parentNode&&d.parentNode.removeChild(d),clearTimeout(q),a(c))}function I(){if((new Date).getTime()-H>=D)d.parentNode&&d.parentNode.removeChild(d),b(c);else{var a=document.hidden;if(!0===a||void 0===a)f=e.a.offsetWidth, +g=n.a.offsetWidth,h=p.a.offsetWidth,u();q=setTimeout(I,50)}}var e=new r(k),n=new r(k),p=new r(k),f=-1,g=-1,h=-1,v=-1,w=-1,x=-1,d=document.createElement("div");d.dir="ltr";t(e,L(c,"sans-serif"));t(n,L(c,"serif"));t(p,L(c,"monospace"));d.appendChild(e.a);d.appendChild(n.a);d.appendChild(p.a);document.body.appendChild(d);v=e.a.offsetWidth;w=n.a.offsetWidth;x=p.a.offsetWidth;I();z(e,function(a){f=a;u()});t(e,L(c,'"'+c.family+'",sans-serif'));z(n,function(a){g=a;u()});t(n,L(c,'"'+c.family+'",serif')); +z(p,function(a){h=a;u()});t(p,L(c,'"'+c.family+'",monospace'))})})};"object"===typeof module?module.exports=A:(window.FontFaceObserver=A,window.FontFaceObserver.prototype.load=A.prototype.load);}()); +})() \ No newline at end of file diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/force.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/force.js new file mode 100644 index 0000000..1df3450 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/force.js @@ -0,0 +1,135 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * A vector used to move objects. + * + * @memberof gdjs + * @class Force + * @param {number} x The initial x component + * @param {number} y The initial y component + * @param {number} multiplier The multiplier (0 for a force that disappear on next frame, 1 for a permanent force) + */ +gdjs.Force = function(x,y, multiplier) +{ + this._x = x || 0; + this._y = y || 0; + this._angle = Math.atan2(y,x)*180/Math.PI; + this._length = Math.sqrt(x*x+y*y); + this._dirty = false; + this._multiplier = multiplier; +} + +/** + * Returns the X component of the force. + */ +gdjs.Force.prototype.getX = function() { + return this._x; +} + +/** + * Returns the Y component of the force. + */ +gdjs.Force.prototype.getY = function() { + return this._y; +} + +/** + * Set the x component of the force. + * @param {number} x The new X component + */ +gdjs.Force.prototype.setX = function(x) { + this._x = x; + this._dirty = true; +} + +/** + * Set the y component of the force. + * @param {number} y The new Y component + */ +gdjs.Force.prototype.setY = function(y) { + this._y = y; + this._dirty = true; +} + +/** + * Set the angle of the force. + * @param {number} angle The new angle + */ +gdjs.Force.prototype.setAngle = function(angle) { + + if ( this._dirty ) { + this._length = Math.sqrt(this._x*this._x+this._y*this._y); + this._dirty = false; + } + + this._angle = angle; + var angleInRadians = angle/180*Math.PI; + this._x = Math.cos(angleInRadians)*this._length; + this._y = Math.sin(angleInRadians)*this._length; +} + +/** + * Set the length of the force. + * @param {number} len The length + */ +gdjs.Force.prototype.setLength = function(len) { + + if ( this._dirty ) { + this._angle = Math.atan2(this._y, this._x)*180/Math.PI; + this._dirty = false; + } + + this._length = len; + var angleInRadians = this._angle/180*Math.PI; + this._x = Math.cos(angleInRadians)*this._length; + this._y = Math.sin(angleInRadians)*this._length; +} + +/** + * Get the angle of the force + */ +gdjs.Force.prototype.getAngle = function() { + if ( this._dirty ) { + this._angle = Math.atan2(this._y, this._x)*180/Math.PI; + this._length = Math.sqrt(this._x*this._x+this._y*this._y); + + this._dirty = false; + } + + return this._angle; +} + + +/** + * Get the length of the force + */ +gdjs.Force.prototype.getLength = function() { + if ( this._dirty ) { + this._angle = Math.atan2(this._y, this._x)*180/Math.PI; + this._length = Math.sqrt(this._x*this._x+this._y*this._y); + + this._dirty = false; + } + + return this._length; +}; + +/** + * Return 1 (true) if the force is permanent, 0 (false) if it is instant. + * @returns {number} + */ +gdjs.Force.prototype.getMultiplier = function() { + return this._multiplier; +}; + +/** + * Set if the force multiplier. + * @param {number} multiplier The new value + */ +gdjs.Force.prototype.setMultiplier = function(multiplier) { + this._multiplier = multiplier; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/gd-splash-image.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/gd-splash-image.js new file mode 100644 index 0000000..4eff0dc --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/gd-splash-image.js @@ -0,0 +1 @@ +gdjs.splashImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhwAAADBCAMAAACzH5mWAAACYVBMVEUAAAD///////////////////////////9kqOP///9nrOP///////////////////////////////////////////////84gMpZntv///87gspGi/X///89hM1Zntz///////85gcr///9QlNdOkNr///////9Ahs7///////8/hc3///////9Fhs3///86gss7g8w/hs3///////////87gsv///88g8z///9Bhs5NktT///9KkM7///////89g8z///////8+hc7///////9Bh87///85gsv///////8+hc3///87g8z///////////8/hc3///////8+hc3///9Bh9BOktY9hM3///8/hc7///9Ahs7///9coN3///8/hs7///9Ah8////9Bhs3///9mq+M+hc1UmdlAh83///9UmNn///////////9ChslHiNT///89hM3///////////9Sl9j///9Vmdk/hc7///9FjNH///9Umdn///9YndxlquP///9WmtplquJkqeJhpuE+htD///9RlddYnNs9hMw9hM1mrOT///9lquI+hc5Tl9llq+RjpuH///9nrONVmdlmq+NPlNZmq+P///////9Tl9hjqeJPk9ZZnttQldZiqOFmrONQlddfpN5jp+H///9Qk9dXnNthpuBnrORZn9xlq+NmquJjqeFdot5WmtlnreNmreNOk9ZYnds3f8n///9nrONVmdlTmNhYndtQlNZmq+NkqeJWm9pSltdNktVRlddhpuBcod1bn9xOk9VjqOFfpN9eot49hMxgpd9Znts7g8th3d+dAAAAs3RSTlMAONj2SASTLZmM3d17p1Py6ohNRDL9mf7MR+0CF9a7DCD8xKoM+rB6VxysdV4gE/frpHAoBvPv4ctAEQkHAvjk4ce2hIBPJPrl0L8m8NSso5ARuLF4SRjFtIhpZD0v15xmWUI19Ly6fW9sY1BANCon7NvNwLu2nIKBYzo5+unVq5eUgVtDMC/7+dnNzKCdl2soIg/37+zqx49b39XFoZ+KdnRyUEtAw8Czr6M3687KbmdZzQSiAnEAABAaSURBVHja7NoxioNQFIXhWwa3YOsqwqwjneVbh6DpHoJBxMIiMhYjMZA0t4ntLGyygpmBjE8v83+rOBx+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFiXpsbjl5eic895HL3MC++KqyC9to3+tEpi2H3LX6DJ6gV1V7nVBrcCo5OZ1YQeBReml1sXdBfZUo4YwCqw5ZRpGvReYEve1hlIILDm1Gk4mMGRoNKD6TWBGr2EdBVacNbCdwIa41NCaWGBCruFNAgvuuoKzwIC01hV0gu1LoscqiDoMKB/rIOrYvmleCVHH5sV+/q0m6lr3lD2Vu9dxkm5dMf/o+rF7H6YDx8S/031+61oWDMcv9s38N6YoCsCHodIwhqothqmltDqdMh1Ux5RqVS1tU6pGUWuC1hbUvseaoCEidrGHhIQ3oRK7WP8q3Kuuvjnv3ffOvGtI5/tFq2feq3c/95x77n2dlSOmajw8kpouOjEH3hpz+iyk6MScNVbjfkqNTs5hQzcOpxJKZ+fKFwNSx/g6PWc/GpByI8WtjzipHdMUcP8TyqNU7zLFqE84qfOdDtC9R+9eF2uqt6cHu2XBf8iRdygPQBHlPXVUFW2bdzDYLQAm5HWVUQPr2dXyQMIlFnYJGLOk1+0Gv5jDvh1sx4ze7okxQc+LG8CASM84thSVRreXN+dCUrmFy7EUFJEWw+lfWl4BRqTHZIyAkOfnn1UgYR67mRcYrpiMHPhFD/Ztb7BKOG9a/C+ZYaBRzJCuaV0geVxD3XgEAtVyCD+25iQgB7jZF3PAlNpsHq1ajoyeMYx5FRI5EKp2dYcksf89xi0QqJdDULqHLkdv9oUkr/hZ0DrFcoTShPHTfiSJPrF2PDkSOTBmZUJSGPUepR4ECuRwDRCcqt7WWCKeZXrISI5stwnlAOHV3BJTqtuzipCj0W1CF4octVvb64yyPT72N96MU+31R18jOYoG/IE7OmKWUNd1CZLBUtSN/SBQIUcffUVW2FDdLsiWXAM5PAA2Bh7H5+ogkIuPlhkEOQJFMcbWbh1u3fCrCEkzkKNX/FrHPzo7xujfAM7SNAxDv1j5inENcIYsbT304N4gCwwbdu3G7WK5HILaYGWMMa2QKMcl9vHlYEJvnlWUyhHmbmzOiftB3/5i7sDkQPCWZXM77oCj7GhDOKE3qA2jCTCmtO5vs8WJQ8VyOQThXnz26FNBk+Mc+3gUTHCzB52rVA43LyOx0rN5NfuZXy6HYEMjfyiBvy/HmjaMpWgGQtSQ8XSKgRw4x3iN31hLkgOiP8NKfGBI2MOziko51nE38Oy2kt2xpNCGHFC7Bc9G6uU41IZRjLlxvo1Aky05ILeKPYgoTY5dYoGBc4cFBFXKkcX825drlNf6Mz0jNuSAXHZJl9dROV4i6OVowYLOYzll/0sKD+zJAYGu7EE1kOQIsPxcA4Zs51lFpRxRdov1YERfpDCSyAHl6CJdvRz3sCBssdL6ksQ9m3JAoYeJ4KXIAdt+xk0MGTa0N/OsolCOlTHJJbtvYQ/AZ0cO30T+ezvImmcIe3VBj7GgFhCIQBItuBzSBcUAkhwN7LP9zEcuqFKOEWy9FQZjlrAL1SFySGrc7PDflmM/FjQS4ih+RmMHLod09yM7iyKHt79p6ZbGs4pCOfbwpCFPPJUhRA6J9Jl/W47LWNA1pBwlynHXvhzH2AhfpMjB/+NWAk6kknXoQaEcp1g1GgYz1vOyGZFD4lyzk3I8R4iTAws6BHHsfk5i7yhcDnmn03OOIkeQPcUNZo84qFAOn6ULNrItODtyVGATkno5zluUI58mRwsQ5OjHO0UUOXLZrFMGKOk8qyiUI4cFVYA5eSxv1tqQo5Zr/a/KMQULlNNEkQPYJsRoihxQZHKooyfPKgrlcKN3x+cBvw05vM7L8QrhuC7oAhaEyAHXXxE4XkyS4yJr+vgoctQZH+o4xp+wQjkim8X1pHmlxoYchSxgFzjHzVcYQ3Q1BxZzHWuQHifI0QIkOXjJ1o8iR4Vxv6icZxVFcgj9Blvbma5E5DBf/t5xUo43GFN0cmAxI9GJ6I19mmhyhNiglVHkgFmG/aIqnlUUytHA9AsAQ3riKNe6HHksoBCco/UFhm75cBWLuYrLdvyFTY7X0+SA0p9B20hy8PnBazQ1B1XKMYCd+gSBaZbI0Msh6/yCgzS9wNBVAS1YzAVA2TTSph4tQJTjIGsXkOToYbTq68Wziko5RvBCWkr3bCaDZTlyXezC6uWo19WZBtMLTv2THddHxnH1wgucVoocYts7QJGDV3tRg3VMKaiUg22BpIOcrqwitSzHQbG8cYonHzA26Xbn0KC7YItRFz6g1FPlGMx7WSQ5yvBDHVm8UlUph08cM7PyfsRWq3J0yWbPLAwOsuA1xird9IIG3QR7XECvchUocoiRaCbJkYkf6gjyrKJSjgoRYqXL3tWiHIWVwmvHuPsaQzcp7EaDWsAW+a9RWslyeEXhIORYnYmQZdDrqkHrgVJA5DiVieAjyMEXnEtATrooMKVy7PLw03EhcJIZ3zDG6Mb1M0o+2GGZwUXIcoTEtrbkvZXRRk8+hO3X5iFy4KwkyMHPmR0DBLQ4tiBHKGNejOHpAY4yWcMYr4uaiUaNBTuM0zDmAlkOYENZTpNjD2+hYS2ILKVy9NZ1I2R9i7CpHJHAkmBNnxhn9XpwlnwNY7YuahIaVTCEfCMhGFEOUQzQ5OA782lIp6AIlMpxiYUIAWWrsdqOcmzu+ScTY38wLRMcZoiGMVQXNVZDWQTWOaOhHE1ADpZn0wlyiO40cro0T60cfstyNPClupDDlP4HA+A4AzWEqbqgFRrK8GKwzFRJViHIwcayrKMcrgyEDYZbMx1+4udZBZWjOgMhQJAjh2/6WT524rMkh2v7HFBAgYYwQb8XP1BDWWi9y4FfYX4CckR4EkaXsnIi++IOdYwWWUXdUraZhfSwvHcckcuxz+0/BwSIdeJAfTVxUsPZCRYZo6GsosohDrcQ5BBvIFTFvQuXp1iOfnzGstyow16kFqT18i/xgjKG4oOGjC1q0YyEbjMBEpBjDm9kUeXopp/fc3hWUSiHCMkAOQNYlSlZyqpluoYxBskKuB2LrdW9kqxCkYO3k9ZT5QhN1E0Ubp5VFMsRkBzJ0WW50qTKscjaqA3VjOywtGRZrKHsJssh6n6qHFAjDnWIV2TzVMsRKbE6xkVsoZVUOWZoGJPQMJyT+SBloSSrUOToyxo/EbIczR0PdWTwrKJaDqjijXs5HnbfpMpRrFmqSGGuZsjAscWAIG+xTqfKIabdWUCWI+zpMMGf4llFuRzVIltY2Dryq5WDNm5xheZOzYSBs1eBGQs0lMkJycG6xgNocohhinYoQerUy1HOJrzuAJZOJGQmV45J1traQwo0U8aNn2y36i0AqhziGJ0/ATly/jzU0Y9nFfVy9BODLpfI0z25cozFxxr0rNVkzBy6aPIUwJiAZxWyHGLroSIBOXwuPpTiINUWUC+HjzV2G6yd9dkGyZVjhdX21CTNCgWTZo9ftHbGxvx6VtHkb1qweMwZSVYhybGVlxxEOUTVUgOiYVqnWA5xMDpqzdxeSZCD1NhehQbSKYBE5PBmiw17qhx+cahjicgqquWoE29jydvsyZBDvg4pwBKQo0xPSI4yNpqFCclRW/L7UMdFkVVUy5El2mCyWa0Rki3HfA1lBegZMlVzksmJyOHrw1MyWQ6R19N+v3lbp1wO0d0aAVYmxqTLsUpDmQpxbBquIKvQ5CjXbVHQ5FjefqgjU3Rb1cvhlx8j5f+Yku/t3F1v0lAYwPFnvsQLp0bn0gg0Ww0bijJaN0R0uslElKFWGUODkbEZglGZaGLmjIk3mIyLXfhVHj6g2hKbjb5A25UDPL/LLVtg+e88tJzDXN/jgFi3SweUOXRNxW4c2sfx3QIHcWjbez62h9Rn8CaOO8qq9wJMzCnP7wz0P44k6orrvhPjmryDOBZuaf98duPQLnlW2geI1ryIQ9vG895qP8HMKgNx5FFfCjqVPJgq5nFoOwKfguM43qmbOubVqeJVHHeUDaynp8DI90n1IpuBOEBEXVk/dJLRHRkHcay1lO8HbMSh+yE/q+PqPROv4oDrWtx6AsvKU5lmIo4d1CeDjhCHbsjbjuOuum5MXgAbcejekbr2WPm7excHzLZMfunv++3P4GUiDn8adXHroGMr5spUsRvH/P2W4hvYiEP/cMiysn7MexhHQD29uKLbxuX2lnk24oAK6muCntsFdCxjM465829binFwJY5ppQt1qngYB3w8rk6Wqc74j6kPZ4qVOCJo4BXoSvjQoZSdOO6OfW2nMbkB7sQBn1tt457GAe9n1JNIh4bjwvhx9etXgZU4YA/1cTXQ5Q9z6EQarOO4OXHA9ZXZm622Rx/AII63Y6bm9E6kqlZN43g2ZubigTjWxgwtwH9nZ9or1kZAi2vlR0uxPA3sxLGLBkQ/6FtPOskjYxWHqacB0I3D2hU4bFWbKoZxWPqkxWHuIWg+PGqpJh8/G3+3cWNldrnV9uUqMBQHNNEAD0YaPNpWdhDHl+8A7sUBT7Sp4m0cEJht6br34CQwFcc2Z+M2dyQs2J0qduO4+fMXgKtxPNCmikdxaC4c0zn0+vIhAFtxQAGNlMBYUM6iDQU7cdx7M7s2dhLA5Th+aVPF8zjg7oUXMwfj/3oKgLk4lKXDzmH6RrjXPtJ7CTC3OnHY61NXT1r90AlrAei0OfHXPBiaOGFpE1RTlyzcgQ7Pr/y8fE59mf3i/OaCyeP4Zxr6QkJDJTDX2K8L2JXYXrgaAdKZyPMpYJjfh4ZyYCkhF0TDQrioWM+UqolFIIMphcYyfujGeiokFXg+vvRXnOf5ZkWSQ8XEbSCDroLGRBoGoy0YRWPRPJBRVkYTnOQHMsJkNJNNABlhdTTDSXS5McKCMTSVfgVkZCU4NLdEs2V0VdFKvAyu8Zd8JiQgbHmFlnwhP7gin0UTAt1bYU4JraUzu+DYLo+mQkCYk8Nu+Erb4ESqjuaaQBiUwe5kk3mwZzsctfzlQSAsCmO3hHqp5wGTyoloSWgAYZOMPRDiyZ0uC4lUw11u/SgCYVXPhx65WLwghVIR0HV7q7pf2RMF7BbdbGNZWUB7uHRMVHdz8MrODjEW5bBXYSAsq/mwbzJA2OYPY5/kgDAvxGE/VIAMgC0RvVcCMhh2BPQWR9ewg6MWRy/FaEfAQPFy8SjQPfMBEwxz6AmB3ocdQEHJizwydPhpMEUKR51HNgVkUAXlGB4dkS5SBps/JOLRyNKLjSGQLwjounoZyFDwF3kOXRSt1IAMj8UQn3apjAwdzx5CNZkX0BGBl2nNGFqLxVxcsBlGPFekY7dDr7aTEdM97SasV3ZoxRghi4mQ1FyKpTk0JMSWmsn96jaQURVspKqyvC9JueQ/YUmS5FAx31gHQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCbPkDAEs0Kmq+QIwAAAAASUVORK5CYII=' diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/gd.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/gd.js new file mode 100644 index 0000000..6c389de --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/gd.js @@ -0,0 +1,379 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * The `gdjs` namespace contains all classes and objects of the game engine. + * @namespace + */ +window.gdjs = { + objectsTypes: new Hashtable(), + behaviorsTypes: new Hashtable(), + /** + * Contains functions used by events (this is a convention only, functions can actually + * by anywhere). + * @namespace + * @memberOf gdjs + */ + evtTools: {}, + callbacksFirstRuntimeSceneLoaded: [], + callbacksRuntimeSceneLoaded: [], + callbacksRuntimeScenePreEvents: [], + callbacksRuntimeScenePostEvents: [], + callbacksRuntimeScenePaused: [], + callbacksRuntimeSceneResumed: [], + callbacksRuntimeSceneUnloading: [], + callbacksRuntimeSceneUnloaded: [], + callbacksObjectDeletedFromScene: [], +}; + +/** + * Convert a rgb color value to a hex string. + * + * No "#" or "0x" are added. + * @param {number} r Red + * @param {number} g Green + * @param {number} b Blue + * @returns {string} + */ +gdjs.rgbToHex = function(r, g, b) { + return '' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); +}; + +/** + * Convert a rgb color value to a hex value. + * @param {number} r Red + * @param {number} g Green + * @param {number} b Blue + * @returns {number} + */ +gdjs.rgbToHexNumber = function(r, g, b) { + return (r << 16) + (g << 8) + b; +}; + +/** + * Get a random integer between 0 and max. + * @param {number} max The maximum value (inclusive). + * @returns {number} + */ +gdjs.random = function(max) { + if (max <= 0) return 0; + return Math.floor(Math.random() * (max + 1)); +}; + +/** + * Get a random integer between min and max. + * @param {number} min The minimum value (inclusive). + * @param {number} max The maximum value (inclusive). + * @returns {number} + */ +gdjs.randomInRange = function(min, max) { + return min + gdjs.random(max - min); // return min if min >= max +}; + +/** + * Get a random float in the range 0 to less than max (inclusive of 0, but not max). + * @param {number} max The maximum value (exclusive). + * @returns {number} + */ +gdjs.randomFloat = function(max) { + if (max <= 0) return 0; + return Math.random() * max; +}; + +/** + * Get a random float between min and max + * @param {number} min The minimum value (inclusive). + * @param {number} max The maximum value (exclusive). + * @returns {number} + */ +gdjs.randomFloatInRange = function(min, max) { + return min + gdjs.randomFloat(max - min); // return min if min >= max +}; + +/** + * Get a random number between min and max in steps + * @param {number} min The minimum value (inclusive). + * @param {number} max The maximum value (inclusive). + * @param {number} step The interval between each value. + * @returns {number} + */ +gdjs.randomWithStep = function(min, max, step) { + if (step <= 0) return min + gdjs.random(max - min); + return min + gdjs.random(Math.floor((max - min) / step)) * step; // return min if min >= max +}; + +/** + * Convert an angle in degrees to radians. + * @param {number} angleInDegrees The angle in degrees. + * @returns {number} + */ +gdjs.toRad = function(angleInDegrees) { + return (angleInDegrees / 180) * 3.14159; +}; + +/** + * Convert an angle in radians to degrees. + * @param {number} angleInRadians The angle in radians. + * @returns {number} + */ +gdjs.toDegrees = function(angleInRadians) { + return (angleInRadians * 180) / 3.14159; +}; + +/** + * A Constructor for a {@link gdjs.RuntimeObject}. + * @name RuntimeObjectConstructor + * @function + * @param {gdjs.RuntimeScene} runtimeScene The {@link gdjs.RuntimeScene} the object belongs to. + * @param {ObjectData} objectData The initial properties of the object. + */ + +/** + * Register a runtime object (class extending {@link gdjs.RuntimeObject}) that can be used in a scene. + * + * The name of the type of the object must be complete, with the namespace if any. For + * example, if you are providing a Text object in the TextObject extension, the full name + * of the type of the object is "TextObject::Text". + * + * @param {string} objectTypeName The name of the type of the Object. + * @param {RuntimeObjectConstructor} Ctor The constructor of the Object. + */ +gdjs.registerObject = function(objectTypeName, Ctor) { + gdjs.objectsTypes.put(objectTypeName, Ctor); +}; + +/** + * A Constructor for a {@link gdjs.RuntimeBehavior}. + * @name RuntimeBehaviorConstructor + * @function + * @param {gdjs.RuntimeScene} runtimeScene The scene owning the object of the behavior + * @param {BehaviorData} behaviorData The properties used to setup the behavior + * @param {gdjs.RuntimeObject} owner The object owning the behavior + */ + +/** + * Register a runtime behavior (class extending {@link gdjs.RuntimeBehavior}) that can be used by a + * {@link gdjs.RuntimeObject}. + * + * The type of the behavior must be complete, with the namespace of the extension. For + * example, if you are providing a Draggable behavior in the DraggableBehavior extension, + * the full name of the type of the behavior is "DraggableBehavior::Draggable". + * + * @param {string} behaviorTypeName The name of the type of the behavior. + * @param {RuntimeBehaviorConstructor} Ctor The constructor of the Object. + */ +gdjs.registerBehavior = function(behaviorTypeName, Ctor) { + gdjs.behaviorsTypes.put(behaviorTypeName, Ctor); +}; + +/** + * Register a function to be called when the first {@link gdjs.RuntimeScene} is loaded, after + * resources loading is done. This can be considered as the "start of the game". + * + * @param {Function} callback The function to be called. + */ +gdjs.registerFirstRuntimeSceneLoadedCallback = function(callback) { + gdjs.callbacksFirstRuntimeSceneLoaded.push(callback); +}; + +/** + * Register a function to be called when a scene is loaded. + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeSceneLoadedCallback = function(callback) { + gdjs.callbacksRuntimeSceneLoaded.push(callback); +}; + +/** + * Register a function to be called each time a scene is stepped (i.e: at every frame), + * before events are run. + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeScenePreEventsCallback = function(callback) { + gdjs.callbacksRuntimeScenePreEvents.push(callback); +}; + +/** + * Register a function to be called each time a scene is stepped (i.e: at every frame), + * after events are run and before rendering. + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeScenePostEventsCallback = function(callback) { + gdjs.callbacksRuntimeScenePostEvents.push(callback); +}; + +/** + * Register a function to be called when a scene is paused. + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeScenePausedCallback = function(callback) { + gdjs.callbacksRuntimeScenePaused.push(callback); +}; + +/** + * Register a function to be called when a scene is resumed. + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeSceneResumedCallback = function(callback) { + gdjs.callbacksRuntimeSceneResumed.push(callback); +}; + +/** + * Register a function to be called when a scene unload started. This is + * before the object deletion and renderer destruction. It is safe to + * manipulate these. It is **not** be safe to release resources as other + * callbacks might do operations on objects or the scene. + * + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeSceneUnloadingCallback = function(callback) { + gdjs.callbacksRuntimeSceneUnloading.push(callback); +}; + +/** + * Register a function to be called when a scene is unloaded. The objects + * and renderer are now destroyed - it is **not** safe to do anything apart + * from releasing resources. + * + * @param {Function} callback The function to be called. + */ +gdjs.registerRuntimeSceneUnloadedCallback = function(callback) { + gdjs.callbacksRuntimeSceneUnloaded.push(callback); +}; + +/** + * Register a function to be called when an object is deleted from a scene. + * @param {Function} callback The function to be called. + */ +gdjs.registerObjectDeletedFromSceneCallback = function(callback) { + gdjs.callbacksObjectDeletedFromScene.push(callback); +}; + +/** + * Keep this function until we're sure now client is using it anymore. + * @deprecated + * @private + */ +gdjs.registerGlobalCallbacks = function() { + console.warning( + "You're calling gdjs.registerGlobalCallbacks. This method is now useless and you must not call it anymore." + ); +}; + +/** + * Remove all the global callbacks that were registered previously. + * + * Should only be used for testing - this should never be used at runtime. + */ +gdjs.clearGlobalCallbacks = function() { + gdjs.callbacksFirstRuntimeSceneLoaded = []; + gdjs.callbacksRuntimeSceneLoaded = []; + gdjs.callbacksRuntimeScenePreEvents = []; + gdjs.callbacksRuntimeScenePostEvents = []; + gdjs.callbacksRuntimeScenePaused = []; + gdjs.callbacksRuntimeSceneResumed = []; + gdjs.callbacksRuntimeSceneUnloading = []; + gdjs.callbacksRuntimeSceneUnloaded = []; + gdjs.callbacksObjectDeletedFromScene = []; +}; + +/** + * Get the constructor of an object. + * + * @param {string} name The name of the type of the object. + * @returns {ObjectCtor} + */ +gdjs.getObjectConstructor = function(name) { + if (name !== undefined && gdjs.objectsTypes.containsKey(name)) + return gdjs.objectsTypes.get(name); + + console.warn('Object type "' + name + '" was not found.'); + return gdjs.objectsTypes.get(''); //Create a base empty runtime object. +}; + +/** + * Get the constructor of a behavior. + * + * @param {string} name The name of the type of the behavior. + * @returns {BehaviorCtor} + */ +gdjs.getBehaviorConstructor = function(name) { + if (name !== undefined && gdjs.behaviorsTypes.containsKey(name)) + return gdjs.behaviorsTypes.get(name); + + console.warn('Behavior type "' + name + '" was not found.'); + return gdjs.behaviorsTypes.get(''); //Create a base empty runtime behavior. +}; + +/** + * Create a static array that won't need a new allocation each time it's used. + * @param {any} owner The owner of the Array. + * @returns {Array} + */ +gdjs.staticArray = function(owner) { + owner._staticArray = owner._staticArray || []; + return owner._staticArray; +}; + +/** + * Create a second static array that won't need a new allocation each time it's used. + * @param {any} owner The owner of the Array. + * @returns {Array} + */ +gdjs.staticArray2 = function(owner) { + owner._staticArray2 = owner._staticArray2 || []; + return owner._staticArray2; +}; + +/** + * Create a static object that won't need a new allocation each time it's used. + * @param {any} owner The owner of the Array. + * @returns {Object} + */ +gdjs.staticObject = function(owner) { + owner._staticObject = owner._staticObject || {}; + return owner._staticObject; +}; + +/** + * Return a new array of objects that is the concatenation of all the objects passed + * as parameters. + * @param objectsLists + * @returns {Array} + */ +gdjs.objectsListsToArray = function(objectsLists) { + var lists = gdjs.staticArray(gdjs.objectsListsToArray); + objectsLists.values(lists); + + var result = []; + for (var i = 0; i < lists.length; ++i) { + var arr = lists[i]; + for (var k = 0; k < arr.length; ++k) { + result.push(arr[k]); + } + } + return result; +}; + +Array.prototype.remove = function(from) { + //Adapted from the nice article available at + //https://www.scirra.com/blog/76/how-to-write-low-garbage-real-time-javascript + for (var i = from, len = this.length - 1; i < len; i++) this[i] = this[i + 1]; + + this.length = len; +}; + +Array.prototype.createFrom = function(arr) { + var len = arr.length; + for (var i = 0; i < len; ++i) { + this[i] = arr[i]; + } + this.length = len; +}; + +//Make sure console.warn and console.error are available. +console.warn = console.warn || console.log; +console.error = console.error || console.log; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/howler-sound-manager/howler-sound-manager.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/howler-sound-manager/howler-sound-manager.js new file mode 100644 index 0000000..e9e2641 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/howler-sound-manager/howler-sound-manager.js @@ -0,0 +1,419 @@ +/* + * GDevelop JS Platform + * Copyright 2013-present Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * A thin wrapper around a Howl object with: + * * Extra methods `paused`, `stopped`, `getRate`/`setRate` and `canBeDestroyed` methods. + * * Automatic clamping when calling `setRate` to ensure a valid value is passed to Howler.js. + * + * See https://github.com/goldfire/howler.js#methods for the full documentation. + * + * @memberof gdjs + * @class HowlerSound + */ +gdjs.HowlerSound = function(o) { + Howl.call(this, o); + this._paused = false; + this._stopped = true; + this._canBeDestroyed = false; + this._rate = o.rate || 1; + + //Add custom events listener to keep + //track of the sound status. + var that = this; + this.on('end', function() { + if (!that.loop()) { + that._canBeDestroyed = true; + that._paused = false; + that._stopped = true; + } + }); + this.on('playerror', function(id, error) { + console.error( + "Can't play a sound, considering it as stopped. Error is:", + error + ); + that._paused = false; + that._stopped = true; + }); + + // Track play/pause event to be sure the status is + // sync'ed with the sound - though this should be redundant + // with `play`/`pause` methods already doing that. Keeping + // that to be sure that the status is always correct. + this.on('play', function() { + that._paused = false; + that._stopped = false; + }); + this.on('pause', function() { + that._paused = true; + that._stopped = false; + }); +}; +gdjs.HowlerSound.prototype = Object.create(Howl.prototype); + +// Redefine `stop`/`play`/`pause` to ensure the status of the sound +// is immediately updated (so that calling `stopped` just after +// `play` will return false). + +gdjs.HowlerSound.prototype.stop = function() { + this._paused = false; + this._stopped = true; + return Howl.prototype.stop.call(this); +}; +gdjs.HowlerSound.prototype.play = function() { + this._paused = false; + this._stopped = false; + return Howl.prototype.play.call(this); +}; +gdjs.HowlerSound.prototype.pause = function() { + this._paused = true; + this._stopped = false; + return Howl.prototype.pause.call(this); +}; + +// Add methods to query the status of the sound: + +gdjs.HowlerSound.prototype.paused = function() { + return this._paused; +}; +gdjs.HowlerSound.prototype.stopped = function() { + return this._stopped; +}; +gdjs.HowlerSound.prototype.canBeDestroyed = function() { + return this._canBeDestroyed; +}; + +// Methods to safely update the rate of the sound: + +gdjs.HowlerSound.prototype.getRate = function() { + return this._rate; +}; +gdjs.HowlerSound.prototype.setRate = function(rate) { + this._rate = gdjs.HowlerSoundManager.clampRate(rate); + this.rate(this._rate); +}; + +/** + * HowlerSoundManager is used to manage the sounds and musics of a RuntimeScene. + * + * It is basically a container to associate channels to sounds and keep a list + * of all sounds being played. + * + * @memberof gdjs + * @class HowlerSoundManager + */ +gdjs.HowlerSoundManager = function(resources) { + this._resources = resources; + this._availableResources = {}; //Map storing "audio" resources for faster access. + + this._globalVolume = 100; + + this._sounds = {}; + this._musics = {}; + this._freeSounds = []; //Sounds without an assigned channel. + this._freeMusics = []; //Musics without an assigned channel. + + this._pausedSounds = []; + this._paused = false; + + var that = this; + this._checkForPause = function() { + if (that._paused) { + this.pause(); + that._pausedSounds.push(this); + } + }; + + document.addEventListener('deviceready', function() { + // pause/resume sounds in Cordova when the app is being paused/resumed + document.addEventListener( + 'pause', + function() { + var soundList = that._freeSounds.concat(that._freeMusics); + for (var key in that._sounds) { + if (that._sounds.hasOwnProperty(key)) { + soundList.push(that._sounds[key]); + } + } + for (var key in that._musics) { + if (that._musics.hasOwnProperty(key)) { + soundList.push(that._musics[key]); + } + } + for (var i = 0; i < soundList.length; i++) { + var sound = soundList[i]; + if (!sound.paused() && !sound.stopped()) { + sound.pause(); + that._pausedSounds.push(sound); + } + } + that._paused = true; + }, + false + ); + document.addEventListener( + 'resume', + function() { + for (var i = 0; i < that._pausedSounds.length; i++) { + var sound = that._pausedSounds[i]; + if (!sound.stopped()) { + sound.play(); + } + } + that._pausedSounds.length = 0; + that._paused = false; + }, + false + ); + }); +}; + +gdjs.SoundManager = gdjs.HowlerSoundManager; //Register the class to let the engine use it. + +/** + * Ensure rate is in a range valid for Howler.js + * @return The clamped rate + * @private + */ +gdjs.HowlerSoundManager.clampRate = function(rate) { + if (rate > 4.0) return 4.0; + if (rate < 0.5) return 0.5; + + return rate; +}; + +/** + * Return the file associated to the given sound name. + * + * Names and files are loaded from resources when preloadAudio is called. If no + * file is associated to the given name, then the name will be considered as a + * filename and will be returned. + * + * @private + * @return The associated filename + */ +gdjs.HowlerSoundManager.prototype._getFileFromSoundName = function(soundName) { + if ( + this._availableResources.hasOwnProperty(soundName) && + this._availableResources[soundName].file + ) { + return this._availableResources[soundName].file; + } + + return soundName; +}; + +/** + * Store the sound in the specified array, put it at the first index that + * is free, or add it at the end if no element is free + * ("free" means that the gdjs.HowlerSound can be destroyed). + * + * @param {Array} arr The array containing the sounds. + * @param {gdjs.HowlerSound} arr The gdjs.HowlerSound to add. + * @return The gdjs.HowlerSound that have been added (i.e: the second parameter). + * @private + */ +gdjs.HowlerSoundManager.prototype._storeSoundInArray = function(arr, sound) { + //Try to recycle an old sound. + var index = null; + for (var i = 0, len = arr.length; i < len; ++i) { + if (arr[i] !== null && arr[i].canBeDestroyed()) { + arr[index] = sound; + return sound; + } + } + + arr.push(sound); + return sound; +}; + +gdjs.HowlerSoundManager.prototype.playSound = function( + soundName, + loop, + volume, + pitch +) { + var soundFile = this._getFileFromSoundName(soundName); + + var sound = new gdjs.HowlerSound({ + src: [soundFile], //TODO: ogg, mp3... + loop: loop, + volume: volume / 100, + rate: gdjs.HowlerSoundManager.clampRate(pitch), + }); + + this._storeSoundInArray(this._freeSounds, sound).play(); + + sound.on('play', this._checkForPause); +}; + +gdjs.HowlerSoundManager.prototype.playSoundOnChannel = function( + soundName, + channel, + loop, + volume, + pitch +) { + var oldSound = this._sounds[channel]; + if (oldSound) { + oldSound.unload(); + } + + var soundFile = this._getFileFromSoundName(soundName); + + var sound = new gdjs.HowlerSound({ + src: [soundFile], //TODO: ogg, mp3... + loop: loop, + volume: volume / 100, + rate: gdjs.HowlerSoundManager.clampRate(pitch), + }); + + sound.play(); + this._sounds[channel] = sound; + + sound.on('play', this._checkForPause); +}; + +gdjs.HowlerSoundManager.prototype.getSoundOnChannel = function(channel) { + return this._sounds[channel]; +}; + +gdjs.HowlerSoundManager.prototype.playMusic = function( + soundName, + loop, + volume, + pitch +) { + var soundFile = this._getFileFromSoundName(soundName); + + var sound = new gdjs.HowlerSound({ + src: [soundFile], //TODO: ogg, mp3... + loop: loop, + html5: true, //Force HTML5 audio so we don't wait for the full file to be loaded on Android. + volume: volume / 100, + rate: gdjs.HowlerSoundManager.clampRate(pitch), + }); + + this._storeSoundInArray(this._freeMusics, sound).play(); + + sound.on('play', this._checkForPause); +}; + +gdjs.HowlerSoundManager.prototype.playMusicOnChannel = function( + soundName, + channel, + loop, + volume, + pitch +) { + var oldMusic = this._musics[channel]; + if (oldMusic) { + oldMusic.unload(); + } + + var soundFile = this._getFileFromSoundName(soundName); + + var music = new gdjs.HowlerSound({ + src: [soundFile], //TODO: ogg, mp3... + loop: loop, + html5: true, //Force HTML5 audio so we don't wait for the full file to be loaded on Android. + volume: volume / 100, + rate: gdjs.HowlerSoundManager.clampRate(pitch), + }); + + music.play(); + this._musics[channel] = music; + + music.on('play', this._checkForPause); +}; + +gdjs.HowlerSoundManager.prototype.getMusicOnChannel = function(channel) { + return this._musics[channel]; +}; + +gdjs.HowlerSoundManager.prototype.setGlobalVolume = function(volume) { + this._globalVolume = volume; + if (this._globalVolume > 100) this._globalVolume = 100; + if (this._globalVolume < 0) this._globalVolume = 0; + Howler.volume(this._globalVolume / 100); +}; + +gdjs.HowlerSoundManager.prototype.getGlobalVolume = function() { + return this._globalVolume; +}; + +gdjs.HowlerSoundManager.prototype.clearAll = function() { + for (var i = 0; i < this._freeSounds.length; ++i) { + if (this._freeSounds[i]) this._freeSounds[i].unload(); + } + for (var i = 0; i < this._freeMusics.length; ++i) { + if (this._freeMusics[i]) this._freeMusics[i].unload(); + } + this._freeSounds.length = 0; + this._freeMusics.length = 0; + + for (var p in this._sounds) { + if (this._sounds.hasOwnProperty(p) && this._sounds[p]) { + this._sounds[p].unload(); + delete this._sounds[p]; + } + } + for (var p in this._musics) { + if (this._musics.hasOwnProperty(p) && this._musics[p]) { + this._musics[p].unload(); + delete this._musics[p]; + } + } + this._pausedSounds.length = 0; +}; + +gdjs.HowlerSoundManager.prototype.preloadAudio = function( + onProgress, + onComplete, + resources +) { + resources = resources || this._resources; + + //Construct the list of files to be loaded. + //For one loaded file, it can have one or more resources + //that use it. + var files = []; + for (var i = 0, len = resources.length; i < len; ++i) { + var res = resources[i]; + if (res.file && res.kind === 'audio') { + this._availableResources[res.name] = res; + + if (files.indexOf(res.file) === -1) { + files.push(res.file); + } + } + } + + if (files.length === 0) return onComplete(files.length); + + var loaded = 0; + function onLoad(audioFile) { + loaded++; + if (loaded === files.length) { + return onComplete(files.length); + } + + onProgress(loaded, files.length); + } + + var that = this; + for (var i = 0; i < files.length; ++i) { + (function(audioFile) { + var sound = new XMLHttpRequest(); + sound.addEventListener('load', onLoad.bind(that, audioFile)); + sound.addEventListener('error', onLoad.bind(that, audioFile)); + sound.addEventListener('abort', onLoad.bind(that, audioFile)); + sound.open('GET', audioFile); + sound.send(); + })(files[i]); + } +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/howler-sound-manager/howler.min.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/howler-sound-manager/howler.min.js new file mode 100644 index 0000000..fb1d970 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/howler-sound-manager/howler.min.js @@ -0,0 +1,4 @@ +/*! howler.js v2.1.2 | (c) 2013-2019, James Simpson of GoldFire Studios | MIT License | howlerjs.com */ +!function(){"use strict";var e=function(){this.init()};e.prototype={init:function(){var e=this||n;return e._counter=1e3,e._html5AudioPool=[],e.html5PoolSize=10,e._codecs={},e._howls=[],e._muted=!1,e._volume=1,e._canPlayEvent="canplaythrough",e._navigator="undefined"!=typeof window&&window.navigator?window.navigator:null,e.masterGain=null,e.noAudio=!1,e.usingWebAudio=!0,e.autoSuspend=!0,e.ctx=null,e.autoUnlock=!0,e._setup(),e},volume:function(e){var o=this||n;if(e=parseFloat(e),o.ctx||_(),void 0!==e&&e>=0&&e<=1){if(o._volume=e,o._muted)return o;o.usingWebAudio&&o.masterGain.gain.setValueAtTime(e,n.ctx.currentTime);for(var t=0;t=0;o--)e._howls[o].unload();return e.usingWebAudio&&e.ctx&&void 0!==e.ctx.close&&(e.ctx.close(),e.ctx=null,_()),e},codecs:function(e){return(this||n)._codecs[e.replace(/^x-/,"")]},_setup:function(){var e=this||n;if(e.state=e.ctx?e.ctx.state||"suspended":"suspended",e._autoSuspend(),!e.usingWebAudio)if("undefined"!=typeof Audio)try{var o=new Audio;void 0===o.oncanplaythrough&&(e._canPlayEvent="canplay")}catch(n){e.noAudio=!0}else e.noAudio=!0;try{var o=new Audio;o.muted&&(e.noAudio=!0)}catch(e){}return e.noAudio||e._setupCodecs(),e},_setupCodecs:function(){var e=this||n,o=null;try{o="undefined"!=typeof Audio?new Audio:null}catch(n){return e}if(!o||"function"!=typeof o.canPlayType)return e;var t=o.canPlayType("audio/mpeg;").replace(/^no$/,""),r=e._navigator&&e._navigator.userAgent.match(/OPR\/([0-6].)/g),a=r&&parseInt(r[0].split("/")[1],10)<33;return e._codecs={mp3:!(a||!t&&!o.canPlayType("audio/mp3;").replace(/^no$/,"")),mpeg:!!t,opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),aac:!!o.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!o.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(o.canPlayType("audio/x-m4a;")||o.canPlayType("audio/m4a;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(o.canPlayType("audio/x-mp4;")||o.canPlayType("audio/mp4;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,""),webm:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,""),dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,""),flac:!!(o.canPlayType("audio/x-flac;")||o.canPlayType("audio/flac;")).replace(/^no$/,"")},e},_unlockAudio:function(){var e=this||n;if(!e._audioUnlocked&&e.ctx){e._audioUnlocked=!1,e.autoUnlock=!1,e._mobileUnloaded||44100===e.ctx.sampleRate||(e._mobileUnloaded=!0,e.unload()),e._scratchBuffer=e.ctx.createBuffer(1,1,22050);var o=function(n){for(var t=0;t0?i._seek:t._sprite[e][0]/1e3),s=Math.max(0,(t._sprite[e][0]+t._sprite[e][1])/1e3-_),l=1e3*s/Math.abs(i._rate),c=t._sprite[e][0]/1e3,f=(t._sprite[e][0]+t._sprite[e][1])/1e3,p=!(!i._loop&&!t._sprite[e][2]);i._sprite=e,i._ended=!1;var m=function(){i._paused=!1,i._seek=_,i._start=c,i._stop=f,i._loop=p};if(_>=f)return void t._ended(i);var v=i._node;if(t._webAudio){var h=function(){t._playLock=!1,m(),t._refreshBuffer(i);var e=i._muted||t._muted?0:i._volume;v.gain.setValueAtTime(e,n.ctx.currentTime),i._playStart=n.ctx.currentTime,void 0===v.bufferSource.start?i._loop?v.bufferSource.noteGrainOn(0,_,86400):v.bufferSource.noteGrainOn(0,_,s):i._loop?v.bufferSource.start(0,_,86400):v.bufferSource.start(0,_,s),l!==1/0&&(t._endTimers[i._id]=setTimeout(t._ended.bind(t,i),l)),o||setTimeout(function(){t._emit("play",i._id),t._loadQueue()},0)};"running"===n.state?h():(t._playLock=!0,t.once("resume",h),t._clearTimer(i._id))}else{var y=function(){v.currentTime=_,v.muted=i._muted||t._muted||n._muted||v.muted,v.volume=i._volume*n.volume(),v.playbackRate=i._rate;try{var r=v.play();if(r&&"undefined"!=typeof Promise&&(r instanceof Promise||"function"==typeof r.then)?(t._playLock=!0,m(),r.then(function(){t._playLock=!1,v._unlocked=!0,o||(t._emit("play",i._id),t._loadQueue())}).catch(function(){t._playLock=!1,t._emit("playerror",i._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction."),i._ended=!0,i._paused=!0})):o||(t._playLock=!1,m(),t._emit("play",i._id),t._loadQueue()),v.playbackRate=i._rate,v.paused)return void t._emit("playerror",i._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");"__default"!==e||i._loop?t._endTimers[i._id]=setTimeout(t._ended.bind(t,i),l):(t._endTimers[i._id]=function(){t._ended(i),v.removeEventListener("ended",t._endTimers[i._id],!1)},v.addEventListener("ended",t._endTimers[i._id],!1))}catch(e){t._emit("playerror",i._id,e)}};"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"===v.src&&(v.src=t._src,v.load());var g=window&&window.ejecta||!v.readyState&&n._navigator.isCocoonJS;if(v.readyState>=3||g)y();else{t._playLock=!0;var A=function(){y(),v.removeEventListener(n._canPlayEvent,A,!1)};v.addEventListener(n._canPlayEvent,A,!1),t._clearTimer(i._id)}}return i._id},pause:function(e){var n=this;if("loaded"!==n._state||n._playLock)return n._queue.push({event:"pause",action:function(){n.pause(e)}}),n;for(var o=n._getSoundIds(e),t=0;t=0?o=parseInt(r[0],10):e=parseFloat(r[0])}else r.length>=2&&(e=parseFloat(r[0]),o=parseInt(r[1],10));var a;if(!(void 0!==e&&e>=0&&e<=1))return a=o?t._soundById(o):t._sounds[0],a?a._volume:0;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"volume",action:function(){t.volume.apply(t,r)}}),t;void 0===o&&(t._volume=e),o=t._getSoundIds(o);for(var u=0;u0?t/_:t),l=Date.now();e._fadeTo=o,e._interval=setInterval(function(){var r=(Date.now()-l)/t;l=Date.now(),i+=d*r,i=Math.max(0,i),i=Math.min(1,i),i=Math.round(100*i)/100,u._webAudio?e._volume=i:u.volume(i,e._id,!0),a&&(u._volume=i),(on&&i>=o)&&(clearInterval(e._interval),e._interval=null,e._fadeTo=null,u.volume(o,e._id),u._emit("fade",e._id))},s)},_stopFade:function(e){var o=this,t=o._soundById(e);return t&&t._interval&&(o._webAudio&&t._node.gain.cancelScheduledValues(n.ctx.currentTime),clearInterval(t._interval),t._interval=null,o.volume(t._fadeTo,e),t._fadeTo=null,o._emit("fade",e)),o},loop:function(){var e,n,o,t=this,r=arguments;if(0===r.length)return t._loop;if(1===r.length){if("boolean"!=typeof r[0])return!!(o=t._soundById(parseInt(r[0],10)))&&o._loop;e=r[0],t._loop=e}else 2===r.length&&(e=r[0],n=parseInt(r[1],10));for(var a=t._getSoundIds(n),u=0;u=0?o=parseInt(r[0],10):e=parseFloat(r[0])}else 2===r.length&&(e=parseFloat(r[0]),o=parseInt(r[1],10));var i;if("number"!=typeof e)return i=t._soundById(o),i?i._rate:t._rate;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"rate",action:function(){t.rate.apply(t,r)}}),t;void 0===o&&(t._rate=e),o=t._getSoundIds(o);for(var d=0;d=0?o=parseInt(r[0],10):t._sounds.length&&(o=t._sounds[0]._id,e=parseFloat(r[0]))}else 2===r.length&&(e=parseFloat(r[0]),o=parseInt(r[1],10));if(void 0===o)return t;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"seek",action:function(){t.seek.apply(t,r)}}),t;var i=t._soundById(o);if(i){if(!("number"==typeof e&&e>=0)){if(t._webAudio){var d=t.playing(o)?n.ctx.currentTime-i._playStart:0,_=i._rateSeek?i._rateSeek-i._seek:0;return i._seek+(_+d*Math.abs(i._rate))}return i._node.currentTime}var s=t.playing(o);s&&t.pause(o,!0),i._seek=e,i._ended=!1,t._clearTimer(o),t._webAudio||!i._node||isNaN(i._node.duration)||(i._node.currentTime=e);var l=function(){t._emit("seek",o),s&&t.play(o,!0)};if(s&&!t._webAudio){var c=function(){t._playLock?setTimeout(c,0):l()};setTimeout(c,0)}else l()}return t},playing:function(e){var n=this;if("number"==typeof e){var o=n._soundById(e);return!!o&&!o._paused}for(var t=0;t=0&&n._howls.splice(a,1);var u=!0;for(t=0;t=0){u=!1;break}return r&&u&&delete r[e._src],n.noAudio=!1,e._state="unloaded",e._sounds=[],e=null,null},on:function(e,n,o,t){var r=this,a=r["_on"+e];return"function"==typeof n&&a.push(t?{id:o,fn:n,once:t}:{id:o,fn:n}),r},off:function(e,n,o){var t=this,r=t["_on"+e],a=0;if("number"==typeof n&&(o=n,n=null),n||o)for(a=0;a=0;a--)r[a].id&&r[a].id!==n&&"load"!==e||(setTimeout(function(e){e.call(this,n,o)}.bind(t,r[a].fn),0),r[a].once&&t.off(e,r[a].fn,r[a].id));return t._loadQueue(e),t},_loadQueue:function(e){var n=this;if(n._queue.length>0){var o=n._queue[0];o.event===e&&(n._queue.shift(),n._loadQueue()),e||o.action()}return n},_ended:function(e){var o=this,t=e._sprite;if(!o._webAudio&&e._node&&!e._node.paused&&!e._node.ended&&e._node.currentTime=0;t--){if(o<=n)return;e._sounds[t]._ended&&(e._webAudio&&e._sounds[t]._node&&e._sounds[t]._node.disconnect(0),e._sounds.splice(t,1),o--)}}},_getSoundIds:function(e){var n=this;if(void 0===e){for(var o=[],t=0;t=0;if(n._scratchBuffer&&e.bufferSource&&(e.bufferSource.onended=null,e.bufferSource.disconnect(0),t))try{e.bufferSource.buffer=n._scratchBuffer}catch(e){}return e.bufferSource=null,o},_clearSound:function(e){/MSIE |Trident\//.test(n._navigator&&n._navigator.userAgent)||(e.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA")}};var t=function(e){this._parent=e,this.init()};t.prototype={init:function(){var e=this,o=e._parent;return e._muted=o._muted,e._loop=o._loop,e._volume=o._volume,e._rate=o._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++n._counter,o._sounds.push(e),e.create(),e},create:function(){var e=this,o=e._parent,t=n._muted||e._muted||e._parent._muted?0:e._volume;return o._webAudio?(e._node=void 0===n.ctx.createGain?n.ctx.createGainNode():n.ctx.createGain(),e._node.gain.setValueAtTime(t,n.ctx.currentTime),e._node.paused=!0,e._node.connect(n.masterGain)):(e._node=n._obtainHtml5Audio(),e._errorFn=e._errorListener.bind(e),e._node.addEventListener("error",e._errorFn,!1),e._loadFn=e._loadListener.bind(e),e._node.addEventListener(n._canPlayEvent,e._loadFn,!1),e._node.src=o._src,e._node.preload="auto",e._node.volume=t*n.volume(),e._node.load()),e},reset:function(){var e=this,o=e._parent;return e._muted=o._muted,e._loop=o._loop,e._volume=o._volume,e._rate=o._rate,e._seek=0,e._rateSeek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++n._counter,e},_errorListener:function(){var e=this;e._parent._emit("loaderror",e._id,e._node.error?e._node.error.code:0),e._node.removeEventListener("error",e._errorFn,!1)},_loadListener:function(){var e=this,o=e._parent;o._duration=Math.ceil(10*e._node.duration)/10,0===Object.keys(o._sprite).length&&(o._sprite={__default:[0,1e3*o._duration]}),"loaded"!==o._state&&(o._state="loaded",o._emit("load"),o._loadQueue()),e._node.removeEventListener(n._canPlayEvent,e._loadFn,!1)}};var r={},a=function(e){var n=e._src;if(r[n])return e._duration=r[n].duration,void d(e);if(/^data:[^;]+;base64,/.test(n)){for(var o=atob(n.split(",")[1]),t=new Uint8Array(o.length),a=0;a0?(r[o._src]=e,d(o,e)):t()};"undefined"!=typeof Promise&&1===n.ctx.decodeAudioData.length?n.ctx.decodeAudioData(e).then(a).catch(t):n.ctx.decodeAudioData(e,a,t)},d=function(e,n){n&&!e._duration&&(e._duration=n.duration),0===Object.keys(e._sprite).length&&(e._sprite={__default:[0,1e3*e._duration]}),"loaded"!==e._state&&(e._state="loaded",e._emit("load"),e._loadQueue())},_=function(){if(n.usingWebAudio){try{"undefined"!=typeof AudioContext?n.ctx=new AudioContext:"undefined"!=typeof webkitAudioContext?n.ctx=new webkitAudioContext:n.usingWebAudio=!1}catch(e){n.usingWebAudio=!1}n.ctx||(n.usingWebAudio=!1);var e=/iP(hone|od|ad)/.test(n._navigator&&n._navigator.platform),o=n._navigator&&n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),t=o?parseInt(o[1],10):null;if(e&&t&&t<9){var r=/safari/.test(n._navigator&&n._navigator.userAgent.toLowerCase());(n._navigator&&n._navigator.standalone&&!r||n._navigator&&!n._navigator.standalone&&!r)&&(n.usingWebAudio=!1)}n.usingWebAudio&&(n.masterGain=void 0===n.ctx.createGain?n.ctx.createGainNode():n.ctx.createGain(),n.masterGain.gain.setValueAtTime(n._muted?0:1,n.ctx.currentTime),n.masterGain.connect(n.ctx.destination)),n._setup()}};"function"==typeof define&&define.amd&&define([],function(){return{Howler:n,Howl:o}}),"undefined"!=typeof exports&&(exports.Howler=n,exports.Howl=o),"undefined"!=typeof window?(window.HowlerGlobal=e,window.Howler=n,window.Howl=o,window.Sound=t):"undefined"!=typeof global&&(global.HowlerGlobal=e,global.Howler=n,global.Howl=o,global.Sound=t)}(); +/*! Spatial Plugin */ +!function(){"use strict";HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(e){var n=this;if(!n.ctx||!n.ctx.listener)return n;for(var t=n._howls.length-1;t>=0;t--)n._howls[t].stereo(e);return n},HowlerGlobal.prototype.pos=function(e,n,t){var r=this;return r.ctx&&r.ctx.listener?(n="number"!=typeof n?r._pos[1]:n,t="number"!=typeof t?r._pos[2]:t,"number"!=typeof e?r._pos:(r._pos=[e,n,t],void 0!==r.ctx.listener.positionX?(r.ctx.listener.positionX.setTargetAtTime(r._pos[0],Howler.ctx.currentTime,.1),r.ctx.listener.positionY.setTargetAtTime(r._pos[1],Howler.ctx.currentTime,.1),r.ctx.listener.positionZ.setTargetAtTime(r._pos[2],Howler.ctx.currentTime,.1)):r.ctx.listener.setPosition(r._pos[0],r._pos[1],r._pos[2]),r)):r},HowlerGlobal.prototype.orientation=function(e,n,t,r,o,i){var a=this;if(!a.ctx||!a.ctx.listener)return a;var s=a._orientation;return n="number"!=typeof n?s[1]:n,t="number"!=typeof t?s[2]:t,r="number"!=typeof r?s[3]:r,o="number"!=typeof o?s[4]:o,i="number"!=typeof i?s[5]:i,"number"!=typeof e?s:(a._orientation=[e,n,t,r,o,i],void 0!==a.ctx.listener.forwardX?(a.ctx.listener.forwardX.setTargetAtTime(e,Howler.ctx.currentTime,.1),a.ctx.listener.forwardY.setTargetAtTime(n,Howler.ctx.currentTime,.1),a.ctx.listener.forwardZ.setTargetAtTime(t,Howler.ctx.currentTime,.1),a.ctx.listener.upX.setTargetAtTime(e,Howler.ctx.currentTime,.1),a.ctx.listener.upY.setTargetAtTime(n,Howler.ctx.currentTime,.1),a.ctx.listener.upZ.setTargetAtTime(t,Howler.ctx.currentTime,.1)):a.ctx.listener.setOrientation(e,n,t,r,o,i),a)},Howl.prototype.init=function(e){return function(n){var t=this;return t._orientation=n.orientation||[1,0,0],t._stereo=n.stereo||null,t._pos=n.pos||null,t._pannerAttr={coneInnerAngle:void 0!==n.coneInnerAngle?n.coneInnerAngle:360,coneOuterAngle:void 0!==n.coneOuterAngle?n.coneOuterAngle:360,coneOuterGain:void 0!==n.coneOuterGain?n.coneOuterGain:0,distanceModel:void 0!==n.distanceModel?n.distanceModel:"inverse",maxDistance:void 0!==n.maxDistance?n.maxDistance:1e4,panningModel:void 0!==n.panningModel?n.panningModel:"HRTF",refDistance:void 0!==n.refDistance?n.refDistance:1,rolloffFactor:void 0!==n.rolloffFactor?n.rolloffFactor:1},t._onstereo=n.onstereo?[{fn:n.onstereo}]:[],t._onpos=n.onpos?[{fn:n.onpos}]:[],t._onorientation=n.onorientation?[{fn:n.onorientation}]:[],e.call(this,n)}}(Howl.prototype.init),Howl.prototype.stereo=function(n,t){var r=this;if(!r._webAudio)return r;if("loaded"!==r._state)return r._queue.push({event:"stereo",action:function(){r.stereo(n,t)}}),r;var o=void 0===Howler.ctx.createStereoPanner?"spatial":"stereo";if(void 0===t){if("number"!=typeof n)return r._stereo;r._stereo=n,r._pos=[n,0,0]}for(var i=r._getSoundIds(t),a=0;a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/inputmanager.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/inputmanager.js new file mode 100644 index 0000000..e84fbd9 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/inputmanager.js @@ -0,0 +1,317 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Store input made on a canvas: mouse position, key pressed + * and touches states. + * + * See **bindStandardEvents** method for connecting the input + * manager to a canvas and **onFrameEnded** for signaling the + * end of a frame (necessary for proper touches events handling). + * + * @constructor + * @memberof gdjs + * @class InputManager + */ +gdjs.InputManager = function() +{ + this._pressedKeys = new Hashtable(); + this._releasedKeys = new Hashtable(); + this._lastPressedKey = 0; + this._pressedMouseButtons = new Array(5); + this._releasedMouseButtons = new Array(5); + this._mouseX = 0; + this._mouseY = 0; + this._mouseWheelDelta = 0; + this._touches = new Hashtable(); + this._startedTouches = []; //Identifiers of the touches that started during/before the frame. + this._endedTouches = []; //Identifiers of the touches that ended during/before the frame. + + this._touchSimulateMouse = true; +}; + +/** @constant {number} */ +gdjs.InputManager.MOUSE_LEFT_BUTTON = 0; + +/** @constant {number} */ +gdjs.InputManager.MOUSE_RIGHT_BUTTON = 1; + +/** @constant {number} */ +gdjs.InputManager.MOUSE_MIDDLE_BUTTON = 2; + +/** + * Should be called whenever a key is pressed + * @param {number} keyCode The key code associated to the key press. + */ +gdjs.InputManager.prototype.onKeyPressed = function(keyCode) { + this._pressedKeys.put(keyCode, true); + this._lastPressedKey = keyCode; +}; + +/** + * Should be called whenever a key is released + * @param {number} keyCode The key code associated to the key release. + */ +gdjs.InputManager.prototype.onKeyReleased = function(keyCode) { + this._pressedKeys.put(keyCode, false); + this._releasedKeys.put(keyCode, true); +}; + +/** + * Return the code of the last key that was pressed. + * @return {number} The code of the last key pressed. + */ +gdjs.InputManager.prototype.getLastPressedKey = function() { + return this._lastPressedKey; +}; + +/** + * Return true if the key corresponding to keyCode is pressed. + * @param {number} keyCode The key code to be tested. + */ +gdjs.InputManager.prototype.isKeyPressed = function(keyCode) { + return this._pressedKeys.containsKey(keyCode) && this._pressedKeys.get(keyCode); +}; + +/** + * Return true if the key corresponding to keyCode was released during the last frame. + * @param {number} keyCode The key code to be tested. + */ +gdjs.InputManager.prototype.wasKeyReleased = function(keyCode) { + return this._releasedKeys.containsKey(keyCode) && this._releasedKeys.get(keyCode); +}; + +/** + * Return true if any key is pressed + */ +gdjs.InputManager.prototype.anyKeyPressed = function() { + for(var keyCode in this._pressedKeys.items) { + if (this._pressedKeys.items.hasOwnProperty(keyCode)) { + if (this._pressedKeys.items[keyCode]) { + return true; + } + } + } + + return false; +}; + +/** + * Should be called when the mouse is moved.
+ * Please note that the coordinates must be expressed relative to the view position. + * + * @param {number} x The mouse new X position + * @param {number} y The mouse new Y position + */ +gdjs.InputManager.prototype.onMouseMove = function(x,y) { + this._mouseX = x; + this._mouseY = y; +}; + +/** + * Get the mouse X position + * + * @return the mouse X position, relative to the game view. + */ +gdjs.InputManager.prototype.getMouseX = function() { + return this._mouseX; +}; + +/** + * Get the mouse Y position + * + * @return the mouse Y position, relative to the game view. + */ +gdjs.InputManager.prototype.getMouseY = function() { + return this._mouseY; +}; + +/** + * Should be called whenever a mouse button is pressed + * @param {number} buttonCode The mouse button code associated to the event. + * See gdjs.InputManager.MOUSE_LEFT_BUTTON, gdjs.InputManager.MOUSE_RIGHT_BUTTON, gdjs.InputManager.MOUSE_MIDDLE_BUTTON + */ +gdjs.InputManager.prototype.onMouseButtonPressed = function(buttonCode) { + this._pressedMouseButtons[buttonCode] = true; + this._releasedMouseButtons[buttonCode] = false; +}; + +/** + * Should be called whenever a mouse button is released + * @param {number} buttonCode The mouse button code associated to the event. (see onMouseButtonPressed) + */ +gdjs.InputManager.prototype.onMouseButtonReleased = function(buttonCode) { + this._pressedMouseButtons[buttonCode] = false; + this._releasedMouseButtons[buttonCode] = true; +}; + +/** + * Return true if the mouse button corresponding to buttonCode is pressed. + * @param {number} buttonCode The mouse button code (0: Left button, 1: Right button). + */ +gdjs.InputManager.prototype.isMouseButtonPressed = function(buttonCode) { + return this._pressedMouseButtons[buttonCode] !== undefined && this._pressedMouseButtons[buttonCode]; +}; + +/** + * Return true if the mouse button corresponding to buttonCode was just released. + * @param {number} buttonCode The mouse button code (0: Left button, 1: Right button). + */ +gdjs.InputManager.prototype.isMouseButtonReleased = function(buttonCode) { + return this._releasedMouseButtons[buttonCode] !== undefined && this._releasedMouseButtons[buttonCode]; +}; + +/** + * Should be called whenever the mouse wheel is used + * @param {number} wheelDelta The mouse wheel delta + */ +gdjs.InputManager.prototype.onMouseWheel = function(wheelDelta) { + this._mouseWheelDelta = wheelDelta; +}; + +/** + * Return the mouse wheel delta + */ +gdjs.InputManager.prototype.getMouseWheelDelta = function() { + return this._mouseWheelDelta; +}; + +/** + * Get a touch X position + * + * @return the touch X position, relative to the game view. + */ +gdjs.InputManager.prototype.getTouchX = function(identifier) { + if (!this._touches.containsKey(identifier)) + return 0; + + return this._touches.get(identifier).x; +}; + +/** + * Get a touch Y position + * + * @return the touch Y position, relative to the game view. + */ +gdjs.InputManager.prototype.getTouchY = function(identifier) { + if (!this._touches.containsKey(identifier)) + return 0; + + return this._touches.get(identifier).y; +}; + +/** + * Update and return the array containing the identifiers of all touches. + * + */ +gdjs.InputManager.prototype.getAllTouchIdentifiers = function() { + gdjs.InputManager._allTouchIds = gdjs.InputManager._allTouchIds || []; + gdjs.InputManager._allTouchIds.length = 0; + + for(var id in this._touches.items) { + if (this._touches.items.hasOwnProperty(id)) { + gdjs.InputManager._allTouchIds.push(parseInt(id, 10)); + } + } + + return gdjs.InputManager._allTouchIds; +}; + +gdjs.InputManager.prototype.onTouchStart = function(identifier, x, y) { + this._startedTouches.push(identifier); + this._touches.put(identifier, {x: x, y: y}); + + if (this._touchSimulateMouse) { + this.onMouseMove(x, y); + this.onMouseButtonPressed(gdjs.InputManager.MOUSE_LEFT_BUTTON); + } +}; + +gdjs.InputManager.prototype.onTouchMove = function(identifier, x, y) { + var touch = this._touches.get(identifier); + if (!touch) return; + + touch.x = x; + touch.y = y; + + if (this._touchSimulateMouse) { + this.onMouseMove(x, y); + } +}; + +gdjs.InputManager.prototype.onTouchEnd = function(identifier) { + this._endedTouches.push(identifier); + if (this._touches.containsKey(identifier)) { //Postpone deletion at the end of the frame + this._touches.get(identifier).justEnded = true; + } + + if (this._touchSimulateMouse) { + this.onMouseButtonReleased(gdjs.InputManager.MOUSE_LEFT_BUTTON); + } +}; + +gdjs.InputManager.prototype.getStartedTouchIdentifiers = function() { + return this._startedTouches; +}; + +gdjs.InputManager.prototype.popStartedTouch = function() { + return this._startedTouches.shift(); +}; + +gdjs.InputManager.prototype.popEndedTouch = function() { + return this._endedTouches.shift(); +}; + +/** + * Set if touch events should simulate mouse events. + * + * If true, any touch will move the mouse position and set mouse buttons + * as pressed/released. + * @param enable {Boolean} true to simulate mouse events, false to disable it. + */ +gdjs.InputManager.prototype.touchSimulateMouse = function(enable) { + if (enable === undefined) enable = true; + + this._touchSimulateMouse = enable; +}; + +/** + * Notify the input manager that the frame ended, so anything that last + * only for one frame (started/ended touches) should be reset. + * + * This method should be called in the game loop (see gdjs.RuntimeGame.startGameLoop). + */ +gdjs.InputManager.prototype.onFrameEnded = function() { + //Only clear the ended touches at the end of the frame. + for(var id in this._touches.items) { + if (this._touches.items.hasOwnProperty(id)) { + var touch = this._touches.items[id]; + if(touch.justEnded) { + this._touches.remove(id); + } + } + } + + this._startedTouches.length = 0; + this._endedTouches.length = 0; + this._releasedKeys.clear(); + this._releasedMouseButtons.length = 0; + this._mouseWheelDelta = 0; +}; + +/** + * Return true if the mouse wheel scroll to up + */ +gdjs.InputManager.prototype.isScrollingUp = function() { + return this.getMouseWheelDelta() > 0; +}; + +/** + * Return true if the mouse wheel scroll to down + */ +gdjs.InputManager.prototype.isScrollingDown = function() { + return this.getMouseWheelDelta() < 0; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/jsonmanager.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/jsonmanager.js new file mode 100644 index 0000000..f5f51b0 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/jsonmanager.js @@ -0,0 +1,158 @@ +/* + * GDevelop JS Platform + * Copyright 2013-present Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * JsonManager loads json files (using XMLHttpRequest), using the "json" resources + * registered in the game resources. + * + * Contrary to audio/fonts, json files are loaded asynchronously, when requested. + * You should properly handle errors, and give the developer/player a way to know + * that loading failed. + * + * @class JsonManager + * @memberof gdjs + * @param {Object[]} resources The resources data of the game. + */ +gdjs.JsonManager = function(resources) { + this._resources = resources; + + /** @type Object. */ + this._loadedJsons = {}; +}; + +/** + * The callback called when a json is preloaded + * @callback JsonManagerOnProgressCallback + * @param {number} loaded The number of json files loaded so far + * @param {number} total The total number to be loaded + * @returns {undefined} Nothing + */ + +/** + * The callback called when all jsons are preloaded + * @callback JsonManagerOnCompleteCallback + * @param {number} total The total number to be loaded + * @returns {undefined} Nothing + */ + +/** + * Request all the json resources to be preloaded (unless they are marked as not preloaded). + * + * @param {JsonManagerOnProgressCallback} onProgress The function called after each json is loaded. + * @param {JsonManagerOnCompleteCallback} onComplete The function called when all jsons are loaded. + */ +gdjs.JsonManager.prototype.preloadJsons = function(onProgress, onComplete) { + var resources = this._resources; + + var jsonResources = resources.filter(function(resource) { + return resource.kind === 'json' && !resource.disablePreload; + }); + if (jsonResources.length === 0) return onComplete(jsonResources.length); + + var loaded = 0; + /** @type JsonManagerRequestCallback */ + var onLoad = function(error, jsonContent) { + if (error) { + console.error('Error while preloading a json resource:' + error); + } + + loaded++; + if (loaded === jsonResources.length) { + return onComplete(jsonResources.length); + } + + onProgress(loaded, jsonResources.length); + }; + + for (var i = 0; i < jsonResources.length; ++i) { + this.loadJson(jsonResources[i].name, onLoad); + } +}; + +/** + * The callback called when a json that was requested is loaded (or an error occured). + * @callback JsonManagerRequestCallback + * @param {?Error} error The error, if any. `null` otherwise. + * @param {?Object} jsonContent The content of the json file (or null if an error occured). + * @returns {undefined} Nothing + */ + +/** + * Request the json file from the given resource name. + * This method is asynchronous. When loaded, the `callback` is called with the error + * (null if none) and the loaded json (a JS Object). + * + * @param {string} resourceName The resource pointing to the json file to load. + * @param {JsonManagerRequestCallback} callback The callback function called when json is loaded (or an error occured). + */ +gdjs.JsonManager.prototype.loadJson = function(resourceName, callback) { + var resource = this._resources.find(function(resource) { + return resource.kind === 'json' && resource.name === resourceName; + }); + if (!resource) { + callback( + new Error( + 'Can\'t find resource with name: "' + + resourceName + + '" (or is not a json resource).' + ), + null + ); + return; + } + + // Don't fetch again an object that is already in memory + if (this._loadedJsons[resourceName]) { + callback(null, this._loadedJsons[resourceName]); + return; + } + + var that = this; + var xhr = new XMLHttpRequest(); + xhr.responseType = 'json'; + xhr.open('GET', resource.file); + xhr.onload = function() { + if (xhr.status !== 200) { + callback( + new Error('HTTP error: ' + xhr.status + '(' + xhr.statusText + ')'), + null + ); + return; + } + + // Cache the result + that._loadedJsons[resourceName] = xhr.response; + + callback(null, xhr.response); + }; + xhr.onerror = function() { + callback(new Error('Network error'), null); + }; + xhr.onabort = function() { + callback(new Error('Request aborted'), null); + }; + xhr.send(); +}; + +/** + * Check if the given json resource was loaded (preloaded or loaded with `loadJson`). + * @param {string} resourceName The name of the json resource. + * @returns {boolean} true if the content of the json resource is loaded. false otherwise. + */ +gdjs.JsonManager.prototype.isJsonLoaded = function(resourceName) { + return !!this._loadedJsons[resourceName]; +}; + +/** + * Get the object for the given resource that is already loaded (preloaded or loaded with `loadJson`). + * If the resource is not loaded, `null` will be returned. + * + * @param {string} resourceName The name of the json resource. + * @returns {?Object} the content of the json resource, if loaded. `null` otherwise. + */ +gdjs.JsonManager.prototype.getLoadedJson = function(resourceName) { + return this._loadedJsons[resourceName] || null; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laser1.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laser1.ogg new file mode 100644 index 0000000..56ad23d Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laser1.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laser8.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laser8.ogg new file mode 100644 index 0000000..9f8c8af Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laser8.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laserGreen04.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laserGreen04.png new file mode 100644 index 0000000..81f7e2b Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laserGreen04.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laserRed06.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laserRed06.png new file mode 100644 index 0000000..33b59cb Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/laserRed06.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/layer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/layer.js new file mode 100644 index 0000000..261fe9a --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/layer.js @@ -0,0 +1,391 @@ +// @ts-check +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Represents a layer of a scene, used to display objects. + * + * Viewports and multiple cameras are not supported. + * + * @class Layer + * @param {Object} layerData The data used to initialize the layer + * @param {gdjs.RuntimeScene} runtimeScene The scene in which the layer is used + * @memberof gdjs + */ +gdjs.Layer = function(layerData, runtimeScene) { + this._name = layerData.name; + this._cameraRotation = 0; + this._zoomFactor = 1; + this._timeScale = 1; + this._hidden = !layerData.visibility; + this._effects = layerData.effects || []; + this._cameraX = runtimeScene.getGame().getGameResolutionWidth() / 2; + this._cameraY = runtimeScene.getGame().getGameResolutionHeight() / 2; + this._cachedGameResolutionWidth = runtimeScene + .getGame() + .getGameResolutionWidth(); + this._cachedGameResolutionHeight = runtimeScene + .getGame() + .getGameResolutionHeight(); + this._runtimeScene = runtimeScene; + + // @ts-ignore - assume the proper renderer is passed + this._renderer = new gdjs.LayerRenderer(this, runtimeScene.getRenderer()); + this.show(!this._hidden); + this._setEffectsDefaultParameters(); +}; + +gdjs.Layer.prototype.getRenderer = function() { + return this._renderer; +}; + +/** + * Called by the RuntimeScene whenever the game resolution size is changed. + * Updates the layer width/height and position. + */ +gdjs.Layer.prototype.onGameResolutionResized = function() { + var oldGameResolutionWidth = this._cachedGameResolutionWidth; + var oldGameResolutionHeight = this._cachedGameResolutionHeight; + this._cachedGameResolutionWidth = this._runtimeScene + .getGame() + .getGameResolutionWidth(); + this._cachedGameResolutionHeight = this._runtimeScene + .getGame() + .getGameResolutionHeight(); + + // Adapt position of the camera center as: + // * Most cameras following a player/object on the scene will be updating this + // in events anyway. + // * Cameras not following a player/object are usually UIs which are intuitively + // expected not to "move". Not adapting the center position would make the camera + // move from its initial position (which is centered in the screen) - and anchor + // behavior would behave counterintuitively. + this._cameraX += + (this._cachedGameResolutionWidth - oldGameResolutionWidth) / 2; + this._cameraY += + (this._cachedGameResolutionHeight - oldGameResolutionHeight) / 2; + this._renderer.updatePosition(); +}; + +/** + * Returns the scene the layer belongs to + * @returns {gdjs.RuntimeScene} the scene the layer belongs to + */ +gdjs.Layer.prototype.getRuntimeScene = function() { + return this._runtimeScene; +}; + +/** + * Called at each frame, after events are run and before rendering. + * @param {gdjs.RuntimeScene} runtimeScene The scene the layer belongs to. + */ +gdjs.Layer.prototype.update = function(runtimeScene) { + return this._renderer.updateTime(); +}; + +/** + * Get the name of the layer + * @return {String} The name of the layer + */ +gdjs.Layer.prototype.getName = function() { + return this._name; +}; + +/** + * Change the camera center X position. + * + * @param {number=} cameraId The camera number. Currently ignored. + * @return The x position of the camera + */ +gdjs.Layer.prototype.getCameraX = function(cameraId) { + return this._cameraX; +}; + +/** + * Change the camera center Y position. + * + * @param {number=} cameraId The camera number. Currently ignored. + * @return The y position of the camera + */ +gdjs.Layer.prototype.getCameraY = function(cameraId) { + return this._cameraY; +}; + +/** + * Set the camera center X position. + * + * @param {number} x The new x position + * @param {number=} cameraId The camera number. Currently ignored. + */ +gdjs.Layer.prototype.setCameraX = function(x, cameraId) { + this._cameraX = x; + this._renderer.updatePosition(); +}; + +/** + * Set the camera center Y position. + * + * @param {number} y The new y position + * @param {number=} cameraId The camera number. Currently ignored. + */ +gdjs.Layer.prototype.setCameraY = function(y, cameraId) { + this._cameraY = y; + this._renderer.updatePosition(); +}; + +/** + * Get the camera width (which can be different than the game resolution width + * if the camera is zoomed). + * + * @param {number=} cameraId The camera number. Currently ignored. + * @return {number} The width of the camera + */ +gdjs.Layer.prototype.getCameraWidth = function(cameraId) { + return (+this._cachedGameResolutionWidth * 1) / this._zoomFactor; +}; + +/** + * Get the camera height (which can be different than the game resolution height + * if the camera is zoomed). + * + * @param {number=} cameraId The camera number. Currently ignored. + * @return {number} The height of the camera + */ +gdjs.Layer.prototype.getCameraHeight = function(cameraId) { + return (+this._cachedGameResolutionHeight * 1) / this._zoomFactor; +}; + +/** + * Show (or hide) the layer. + * @param {boolean} enable true to show the layer, false to hide it. + */ +gdjs.Layer.prototype.show = function(enable) { + this._hidden = !enable; + this._renderer.updateVisibility(enable); +}; + +/** + * Check if the layer is visible. + * + * @return true if the layer is visible. + */ +gdjs.Layer.prototype.isVisible = function() { + return !this._hidden; +}; + +/** + * Set the zoom of a camera. + * + * @param {number} newZoom The new zoom. Must be superior to 0. 1 is the default zoom. + * @param {number=} cameraId The camera number. Currently ignored. + */ +gdjs.Layer.prototype.setCameraZoom = function(newZoom, cameraId) { + this._zoomFactor = newZoom; + this._renderer.updatePosition(); +}; + +/** + * Get the zoom of a camera. + * + * @param {number=} cameraId The camera number. Currently ignored. + * @return {number} The zoom. + */ +gdjs.Layer.prototype.getCameraZoom = function(cameraId) { + return this._zoomFactor; +}; + +/** + * Get the rotation of the camera, expressed in degrees. + * + * @param {number=} cameraId The camera number. Currently ignored. + * @return {number} The rotation, in degrees. + */ +gdjs.Layer.prototype.getCameraRotation = function(cameraId) { + return this._cameraRotation; +}; + +/** + * Set the rotation of the camera, expressed in degrees. + * The rotation is made around the camera center. + * + * @param {number} rotation The new rotation, in degrees. + * @param {number=} cameraId The camera number. Currently ignored. + */ +gdjs.Layer.prototype.setCameraRotation = function(rotation, cameraId) { + this._cameraRotation = rotation; + this._renderer.updatePosition(); +}; + +/** + * Convert a point from the canvas coordinates (For example, the mouse position) to the + * "world" coordinates. + * + * TODO: Update this method to store the result in a static array + * + * @param {number} x The x position, in canvas coordinates. + * @param {number} y The y position, in canvas coordinates. + * @param {number=} cameraId The camera number. Currently ignored. + */ +gdjs.Layer.prototype.convertCoords = function(x, y, cameraId) { + x -= this._cachedGameResolutionWidth / 2; + y -= this._cachedGameResolutionHeight / 2; + x /= Math.abs(this._zoomFactor); + y /= Math.abs(this._zoomFactor); + + // Only compute angle and cos/sin once (allow heavy optimization from JS engines). + var angleInRadians = (this._cameraRotation / 180) * Math.PI; + var tmp = x; + var cosValue = Math.cos(angleInRadians); + var sinValue = Math.sin(angleInRadians); + x = cosValue * x - sinValue * y; + y = sinValue * tmp + cosValue * y; + + return [x + this.getCameraX(cameraId), y + this.getCameraY(cameraId)]; +}; + +gdjs.Layer.prototype.convertInverseCoords = function(x, y, cameraId) { + x -= this.getCameraX(cameraId); + y -= this.getCameraY(cameraId); + + // Only compute angle and cos/sin once (allow heavy optimization from JS engines). + var angleInRadians = (this._cameraRotation / 180) * Math.PI; + var tmp = x; + var cosValue = Math.cos(-angleInRadians); + var sinValue = Math.sin(-angleInRadians); + x = cosValue * x - sinValue * y; + y = sinValue * tmp + cosValue * y; + + x *= Math.abs(this._zoomFactor); + y *= Math.abs(this._zoomFactor); + + return [ + x + this._cachedGameResolutionWidth / 2, + y + this._cachedGameResolutionHeight / 2, + ]; +}; + +gdjs.Layer.prototype.getWidth = function() { + return this._cachedGameResolutionWidth; +}; + +gdjs.Layer.prototype.getHeight = function() { + return this._cachedGameResolutionHeight; +}; + +gdjs.Layer.prototype.getEffects = function() { + return this._effects; +}; + +/** + * Change an effect parameter value (for parameters that are numbers). + * @param {string} name The name of the effect to update. + * @param {string} parameterName The name of the parameter to update. + * @param {number} value The new value (number). + */ +gdjs.Layer.prototype.setEffectDoubleParameter = function( + name, + parameterName, + value +) { + return this._renderer.setEffectDoubleParameter(name, parameterName, value); +}; + +/** + * Change an effect parameter value (for parameters that are strings). + * @param {string} name The name of the effect to update. + * @param {string} parameterName The name of the parameter to update. + * @param {string} value The new value (string). + */ +gdjs.Layer.prototype.setEffectStringParameter = function( + name, + parameterName, + value +) { + return this._renderer.setEffectStringParameter(name, parameterName, value); +}; + +/** + * Change an effect parameter value (for parameters that are booleans). + * @param {string} name The name of the effect to update. + * @param {string} parameterName The name of the parameter to update. + * @param {boolean} value The new value (boolean). + */ +gdjs.Layer.prototype.setEffectBooleanParameter = function( + name, + parameterName, + value +) { + return this._renderer.setEffectBooleanParameter(name, parameterName, value); +}; + +/** + * Enable or disable an effect. + * @param {string} name The name of the effect to enable or disable. + * @param {boolean} enable true to enable, false to disable + */ +gdjs.Layer.prototype.enableEffect = function(name, enable) { + this._renderer.enableEffect(name, enable); +}; + +/** + * Check if an effect is enabled + * @param {string} name The name of the effect + * @return {boolean} true if the effect is enabled, false otherwise. + */ +gdjs.Layer.prototype.isEffectEnabled = function(name) { + return this._renderer.isEffectEnabled(name); +}; + +gdjs.Layer.prototype._setEffectsDefaultParameters = function() { + for (var i = 0; i < this._effects.length; ++i) { + var effect = this._effects[i]; + for (var name in effect.doubleParameters) { + this.setEffectDoubleParameter( + effect.name, + name, + effect.doubleParameters[name] + ); + } + for (var name in effect.stringParameters) { + this.setEffectStringParameter( + effect.name, + name, + effect.stringParameters[name] + ); + } + for (var name in effect.booleanParameters) { + this.setEffectBooleanParameter( + effect.name, + name, + effect.booleanParameters[name] + ); + } + } +}; + +/** + * Set the time scale for the objects on the layer: + * time will be slower if time scale is < 1, faster if > 1. + * @param {number} timeScale The new time scale (must be positive). + */ +gdjs.Layer.prototype.setTimeScale = function(timeScale) { + if (timeScale >= 0) this._timeScale = timeScale; +}; + +/** + * Get the time scale for the objects on the layer. + */ +gdjs.Layer.prototype.getTimeScale = function() { + return this._timeScale; +}; + +/** + * Return the time elapsed since the last frame, + * in milliseconds, for objects on the layer. + */ +gdjs.Layer.prototype.getElapsedTime = function() { + return this._runtimeScene.getTimeManager().getElapsedTime() * this._timeScale; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/hshg.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/hshg.js new file mode 100644 index 0000000..fee15de --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/hshg.js @@ -0,0 +1,617 @@ +// Hierarchical Spatial Hash Grid: HSHG +//Note that this file has been customized so that HSHG is put into the gdjs object. +//Thus, it must be included after gd.js + +/** + * @namespace + * @memberof gdjs + */ +gdjs.HSHG = gdjs.HSHG || {}; + +(function(root, undefined){ + +//--------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//--------------------------------------------------------------------- + +/** + * Updates every object's position in the grid, but only if + * the hash value for that object has changed. + * This method DOES NOT take into account object expansion or + * contraction, just position, and does not attempt to change + * the grid the object is currently in; it only (possibly) changes + * the cell. + * + * If the object has significantly changed in size, the best bet is to + * call removeObject() and addObject() sequentially, outside of the + * normal update cycle of HSHG. + * + * @return void + */ +function update_RECOMPUTE(){ + + var i + ,obj + ,grid + ,meta + ,objAABB + ,newObjHash; + + // for each object + for(i = 0; i < this._globalObjects.length; i++){ + obj = this._globalObjects[i]; + meta = obj.HSHG; + grid = meta.grid; + + // recompute hash + objAABB = obj.getAABB(); + newObjHash = grid.toHash(objAABB.min[0], objAABB.min[1]); + + if(newObjHash !== meta.hash){ + // grid position has changed, update! + grid.removeObject(obj); + grid.addObject(obj, newObjHash); + } + } +} + +function update_REMOVEALL(){ +// not implemented yet :) +} + +function testAABBOverlap(objA, objB){ + var a = objA.getAABB() + ,b = objB.getAABB(); + + if(a.min[0] > b.max[0] || a.min[1] > b.max[1] + || a.max[0] < b.min[0] || a.max[1] < b.min[1]){ + return false; + } else { + return true; + } +} + +function getLongestAABBEdge(min, max){ + return Math.max( + Math.abs(max[0] - min[0]) + ,Math.abs(max[1] - min[1]) + ); +} + +//--------------------------------------------------------------------- +// ENTITIES +//--------------------------------------------------------------------- + +/** + * A hierarchical spatial grid containing objects and allowing fast test collisions between them. + * + * @class HSHG + * @memberof gdjs.HSHG + * @constructor + */ +function HSHG(){ + + this.MAX_OBJECT_CELL_DENSITY = 1/8 // objects / cells + this.INITIAL_GRID_LENGTH = 256 // 16x16 + this.HIERARCHY_FACTOR = 2 + this.HIERARCHY_FACTOR_SQRT = Math.SQRT2 + this.UPDATE_METHOD = update_RECOMPUTE // or update_REMOVEALL + + this._grids = []; + this._globalObjects = []; +} + +/** + * Add an object to the grid. The object can be anything as long as it provides a getAABB method. + * An 'HSHG' property is added to the object, and is then deleted when the object is removed from the HSHG. + */ +HSHG.prototype.addObject = function(obj){ + var x ,i + ,cellSize + ,objAABB = obj.getAABB() + ,objSize = getLongestAABBEdge(objAABB.min, objAABB.max) + ,oneGrid, newGrid; + + // for HSHG metadata + obj.HSHG = { + globalObjectsIndex: this._globalObjects.length + }; //TODO: recycle existing object if necessary. + + // add to global object array + this._globalObjects.push(obj); + + if(this._grids.length === 0) { + // no grids exist yet + cellSize = objSize * this.HIERARCHY_FACTOR_SQRT; + newGrid = new Grid(cellSize, this.INITIAL_GRID_LENGTH, this); + newGrid.initCells(); + newGrid.addObject(obj); + + this._grids.push(newGrid); + } else { + x = 0; + + // grids are sorted by cellSize, smallest to largest + for(i = 0; i < this._grids.length; i++){ + oneGrid = this._grids[i]; + x = oneGrid.cellSize; + if(objSize < x){ + x = x / this.HIERARCHY_FACTOR; + if(objSize < x) { + // find appropriate size + while( objSize < x ) { + x = x / this.HIERARCHY_FACTOR; + } + newGrid = new Grid(x * this.HIERARCHY_FACTOR, this.INITIAL_GRID_LENGTH, this); + newGrid.initCells(); + // assign obj to grid + newGrid.addObject(obj) + // insert grid into list of grids directly before oneGrid + this._grids.splice(i, 0, newGrid); + } else { + // insert obj into grid oneGrid + oneGrid.addObject(obj); + } + return; + } + } + + while( objSize >= x ){ + x = x * this.HIERARCHY_FACTOR; + } + + newGrid = new Grid(x, this.INITIAL_GRID_LENGTH, this); + newGrid.initCells(); + // insert obj into grid + newGrid.addObject(obj) + // add newGrid as last element in grid list + this._grids.push(newGrid); + } +}; + +/** + * Remove an object from the HSHG. The object must be in the HSHG before being removed. + */ +HSHG.prototype.removeObject = function(obj){ + var meta = obj.HSHG + ,globalObjectsIndex + ,replacementObj; + + if(meta === undefined){ + throw Error( obj + ' was not in the HSHG.' ); + return; + } + + // remove object from global object list + globalObjectsIndex = meta.globalObjectsIndex + if(globalObjectsIndex === this._globalObjects.length - 1){ + this._globalObjects.pop(); + } else { + replacementObj = this._globalObjects.pop(); + replacementObj.HSHG.globalObjectsIndex = globalObjectsIndex; + this._globalObjects[ globalObjectsIndex ] = replacementObj; + } + + meta.grid.removeObject(obj); + + // remove meta data + delete obj.HSHG; +}; + + +/** + * Must be called when objects have been moved ( typically at each "tick" of the game/simulation ). + */ +HSHG.prototype.update = function(){ + this.UPDATE_METHOD.call(this); +}; + +/** + * Return a list of objects colliding with theObject. + * @param {gdjs.RuntimeObject} theObject The object to be tested against. + */ +HSHG.prototype.queryForCollisionWith = function(theObject, result){ + + var i, j, k, l, c + ,grid + ,cell + ,objA + ,objB + ,offset + ,adjacentCell + ,biggerGrid + ,objAAABB + ,objAHashInBiggerGrid; + + result.length = 0; + + theObject.HSHG.excludeMe = true; + var theObjectAABB = theObject.getAABB(); + var theObjectHashInItsGrid = theObject.HSHG.grid.toHash(theObjectAABB.min[0], theObjectAABB.min[1]); + var theObjectCellInItsGrid = theObject.HSHG.grid.allCells[theObjectHashInItsGrid]; + + // default broad test to internal aabb overlap test + broadOverlapTest = testAABBOverlap; + + // for all grids ordered by cell size ASC + for(i = 0; i < this._grids.length; i++){ + grid = this._grids[i]; + + if ( grid.cellSize === theObject.HSHG.grid.cellSize ) { //We're in the grid of theObject: + + // 1)Test against neighbors: + + // For each cell of the grid that is occupied + for(j = 0; j < grid.occupiedCells.length; j++){ + cell = grid.occupiedCells[j]; + + // Collide all objects within the occupied cell + for(l = 0; l < cell.objectContainer.length; l++){ + objB = cell.objectContainer[l]; //Note that objB could be theObject. + if(!objB.HSHG.excludeMe && broadOverlapTest(theObject, objB) === true){ + result.push( objB ); + } + } + + // For the first half of all adjacent cells (offset 4 is the current cell) + for(c = 0; c < 4; c++){ + offset = cell.neighborOffsetArray[c]; + adjacentCell = grid.allCells[ cell.allCellsIndex + offset ]; + + // Collide all objects in cell with adjacent cell + for(l = 0; l < adjacentCell.objectContainer.length; l++){ + objB = adjacentCell.objectContainer[l]; //Note that objB could be theObject. + if(!objB.HSHG.excludeMe && broadOverlapTest(theObject, objB) === true){ + result.push( objB ); + } + } + } + } + + // 2)Test against objects of bigger grids: + + // For all grids with cellsize larger than the grid of theObject: + for(k = i + 1; k < this._grids.length; k++){ + biggerGrid = this._grids[k]; + var objectHashInBiggerGrid = biggerGrid.toHash(theObjectAABB.min[0], theObjectAABB.min[1]); + cell = biggerGrid.allCells[objectHashInBiggerGrid]; + + // Check theObject against every object in all cells in offset array of cell + // for all adjacent cells... + for(c = 0; c < cell.neighborOffsetArray.length; c++){ + offset = cell.neighborOffsetArray[c]; + adjacentCell = biggerGrid.allCells[ cell.allCellsIndex + offset ]; + + // for all objects in the adjacent cell... + for(l = 0; l < adjacentCell.objectContainer.length; l++){ + objB = adjacentCell.objectContainer[l]; + + // Test against theObject: Note that objB is necessarily different from theObject. + if(broadOverlapTest(theObject, objB) === true){ + result.push( objB ); + } + } + } + } + + break; //All collisions with object have now been registered + } + else if ( grid.cellSize < theObject.HSHG.grid.cellSize ) { //We're in a grid with smaller objects + + // For all objects that are stored in this smaller grid + for(j = 0; j < grid.allObjects.length; j++){ + + //Get the object of the smaller grid. + objA = grid.allObjects[j]; + objAAABB = objA.getAABB(); + + //Get its position in the (bigger) grid containing theObject. + objAHashInBiggerGrid = theObject.HSHG.grid.toHash(objAAABB.min[0], objAAABB.min[1]); + + //Check if it is near theObject (i.e: Check if the cell of objA is a neighbor of the cell + //of theObject ). + var objAIsInAdjacentCellToObject = false; + for(c = 0; c < theObjectCellInItsGrid.neighborOffsetArray.length; c++){ + offset = theObjectCellInItsGrid.neighborOffsetArray[c]; + if ( objAHashInBiggerGrid === theObjectCellInItsGrid.allCellsIndex + offset ) { + objAIsInAdjacentCellToObject = true; + break; + } + } + + //If objA is near theObject, trigger a collision test. + if ( objAIsInAdjacentCellToObject ) { + //Note that objA is necessarily different from theObject + if(broadOverlapTest(theObject, objA) === true){ + result.push( objA ); + } + } + } + } + } + + delete theObject.HSHG.excludeMe; +}; + +HSHG.update_RECOMPUTE = update_RECOMPUTE; +HSHG.update_REMOVEALL = update_REMOVEALL; + +/** + * Grid + * + * @class Grid + * @memberof gdjs.HSHG + * @constructor + * @param cellSize {int} the pixel size of each cell of the grid + * @param cellCount {int} the total number of cells for the grid (width x height) + * @param parentHierarchy {HSHG} the HSHG to which this grid belongs + * @return void + */ +function Grid(cellSize, cellCount, parentHierarchy){ + this.cellSize = cellSize; + this.inverseCellSize = 1/cellSize; + this.rowColumnCount = ~~Math.sqrt(cellCount); + this.xyHashMask = this.rowColumnCount - 1; + this.occupiedCells = []; + this.allCells = Array(this.rowColumnCount*this.rowColumnCount); + this.allObjects = []; + this.sharedInnerOffsets = []; + + this._parentHierarchy = parentHierarchy || null; +} + +Grid.prototype.initCells = function(){ + + // TODO: inner/unique offset rows 0 and 2 may need to be + // swapped due to +y being "down" vs "up" + + var i, gridLength = this.allCells.length + ,x, y + ,wh = this.rowColumnCount + ,isOnRightEdge, isOnLeftEdge, isOnTopEdge, isOnBottomEdge + ,innerOffsets = [ + // y+ down offsets + //-1 + -wh, -wh, -wh + 1, + //-1, 0, 1, + //wh - 1, wh, wh + 1 + + // y+ up offsets + wh - 1, wh, wh + 1, + -1, 0, 1, + -1 + -wh, -wh, -wh + 1 + ] + ,leftOffset, rightOffset, topOffset, bottomOffset + ,uniqueOffsets = [] + ,cell; + + this.sharedInnerOffsets = innerOffsets; + + // init all cells, creating offset arrays as needed + + for(i = 0; i < gridLength; i++){ + + cell = new Cell(); + // compute row (y) and column (x) for an index + y = ~~(i / this.rowColumnCount); + x = ~~(i - (y*this.rowColumnCount)); + + // reset / init + isOnRightEdge = false; + isOnLeftEdge = false; + isOnTopEdge = false; + isOnBottomEdge = false; + + // right or left edge cell + if((x+1) % this.rowColumnCount == 0){ isOnRightEdge = true; } + else if(x % this.rowColumnCount == 0){ isOnLeftEdge = true; } + + // top or bottom edge cell + if((y+1) % this.rowColumnCount == 0){ isOnTopEdge = true; } + else if(y % this.rowColumnCount == 0){ isOnBottomEdge = true; } + + // if cell is edge cell, use unique offsets, otherwise use inner offsets + if(isOnRightEdge || isOnLeftEdge || isOnTopEdge || isOnBottomEdge){ + + // figure out cardinal offsets first + rightOffset = isOnRightEdge === true ? -wh + 1 : 1; + leftOffset = isOnLeftEdge === true ? wh - 1 : -1; + topOffset = isOnTopEdge === true ? -gridLength + wh : wh; + bottomOffset = isOnBottomEdge === true ? gridLength - wh : -wh; + + // diagonals are composites of the cardinals + uniqueOffsets = [ + // y+ down offset + //leftOffset + bottomOffset, bottomOffset, rightOffset + bottomOffset, + //leftOffset, 0, rightOffset, + //leftOffset + topOffset, topOffset, rightOffset + topOffset + + // y+ up offset + leftOffset + topOffset, topOffset, rightOffset + topOffset, + leftOffset, 0, rightOffset, + leftOffset + bottomOffset, bottomOffset, rightOffset + bottomOffset + ]; + + cell.neighborOffsetArray = uniqueOffsets; + } else { + cell.neighborOffsetArray = this.sharedInnerOffsets; + } + + cell.allCellsIndex = i; + this.allCells[i] = cell; + } +} + +Grid.prototype.toHash = function(x, y, z){ + var i, xHash, yHash, zHash; + + if(x < 0){ + i = (-x) * this.inverseCellSize; + xHash = this.rowColumnCount - 1 - ( ~~i & this.xyHashMask ); + } else { + i = x * this.inverseCellSize; + xHash = ~~i & this.xyHashMask; + } + + if(y < 0){ + i = (-y) * this.inverseCellSize; + yHash = this.rowColumnCount - 1 - ( ~~i & this.xyHashMask ); + } else { + i = y * this.inverseCellSize; + yHash = ~~i & this.xyHashMask; + } + + return xHash + yHash * this.rowColumnCount; +} + +Grid.prototype.addObject = function(obj, hash){ + var objAABB + ,objHash + ,targetCell; + + // technically, passing this in this should save some computational effort when updating objects + if(hash !== undefined){ + objHash = hash; + } else { + objAABB = obj.getAABB() + objHash = this.toHash(objAABB.min[0], objAABB.min[1]) + } + targetCell = this.allCells[objHash]; + + if(targetCell.objectContainer.length === 0){ + // insert this cell into occupied cells list + targetCell.occupiedCellsIndex = this.occupiedCells.length; + this.occupiedCells.push(targetCell); + } + + // add meta data to obj, for fast update/removal + obj.HSHG.objectContainerIndex = targetCell.objectContainer.length; + obj.HSHG.hash = objHash; + obj.HSHG.grid = this; + obj.HSHG.allGridObjectsIndex = this.allObjects.length; + // add obj to cell + targetCell.objectContainer.push(obj); + + // we can assume that the targetCell is already a member of the occupied list + + // add to grid-global object list + this.allObjects.push(obj); + + // do test for grid density + if(this.allObjects.length / this.allCells.length > this._parentHierarchy.MAX_OBJECT_CELL_DENSITY){ + // grid must be increased in size + this.expandGrid(); + } +} + +Grid.prototype.removeObject = function(obj){ + var meta = obj.HSHG + ,hash + ,containerIndex + ,allGridObjectsIndex + ,cell + ,replacementCell + ,replacementObj; + + hash = meta.hash; + containerIndex = meta.objectContainerIndex; + allGridObjectsIndex = meta.allGridObjectsIndex; + cell = this.allCells[hash]; + + // remove object from cell object container + if(cell.objectContainer.length === 1){ + // this is the last object in the cell, so reset it + cell.objectContainer.length = 0; + + // remove cell from occupied list + if(cell.occupiedCellsIndex === this.occupiedCells.length - 1){ + // special case if the cell is the newest in the list + this.occupiedCells.pop(); + } else { + replacementCell = this.occupiedCells.pop(); + replacementCell.occupiedCellsIndex = cell.occupiedCellsIndex; + this.occupiedCells[ cell.occupiedCellsIndex ] = replacementCell; + } + + cell.occupiedCellsIndex = null; + } else { + // there is more than one object in the container + if(containerIndex === cell.objectContainer.length - 1){ + // special case if the obj is the newest in the container + cell.objectContainer.pop(); + } else { + replacementObj = cell.objectContainer.pop(); + replacementObj.HSHG.objectContainerIndex = containerIndex; + cell.objectContainer[ containerIndex ] = replacementObj; + } + } + + // remove object from grid object list + if(allGridObjectsIndex === this.allObjects.length - 1){ + this.allObjects.pop(); + } else { + replacementObj = this.allObjects.pop(); + replacementObj.HSHG.allGridObjectsIndex = allGridObjectsIndex; + this.allObjects[ allGridObjectsIndex ] = replacementObj; + } +} + +Grid.prototype.expandGrid = function(){ + var i, j + ,currentCellCount = this.allCells.length + ,currentRowColumnCount = this.rowColumnCount + ,currentXYHashMask = this.xyHashMask + + ,newCellCount = currentCellCount * 4 // double each dimension + ,newRowColumnCount = ~~Math.sqrt(newCellCount) + ,newXYHashMask = newRowColumnCount - 1 + ,allObjects = this.allObjects.slice(0) // duplicate array, not objects contained + ,aCell + ,push = Array.prototype.push; + + // remove all objects + for(i = 0; i < allObjects.length; i++){ + this.removeObject(allObjects[i]); + } + + // reset grid values, set new grid to be 4x larger than last + this.rowColumnCount = newRowColumnCount; + this.allCells = Array(this.rowColumnCount*this.rowColumnCount); + this.xyHashMask = newXYHashMask; + + // initialize new cells + this.initCells(); + + // re-add all objects to grid + for(i = 0; i < allObjects.length; i++){ + this.addObject(allObjects[i]); + } +} + +/** + * A cell of a grid + * + * @class Cell + * @memberof gdjs.HSHG + * @constructor + * @private + */ +function Cell(){ + this.objectContainer = []; + this.neighborOffsetArray; + this.occupiedCellsIndex = null; + this.allCellsIndex = null; +} + +//--------------------------------------------------------------------- +// EXPORTS +//--------------------------------------------------------------------- + +root['HSHG'] = HSHG; +HSHG._private = { + Grid: Grid, + Cell: Cell, + testAABBOverlap: testAABBOverlap, + getLongestAABBEdge: getLongestAABBEdge +}; + +})(gdjs.HSHG); diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/jshashtable.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/jshashtable.js new file mode 100644 index 0000000..33759c8 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/jshashtable.js @@ -0,0 +1,134 @@ +// @ts-check +/** + * A generic map (key-value) container. + * + * Mostly used for storing lists of objects for + * GDevelop generated events. + * + * @constructor + */ +function Hashtable() +{ + /** + * The content of the Hashtable. Prefer using methods rather + * than accessing this internal object, unless you need to iterate + * on the values. + * @type {Object.} + */ + this.items = {}; +} + +/** + * Construct a Hashtable from a JS object. + * + * @param {Object.} items The content of the Hashtable. + * @returns {Hashtable} The new hashtable. + * @static + */ +Hashtable.newFrom = function(items) { + var hashtable = new Hashtable(); + hashtable.items = items; + return hashtable; +} + +/** + * Add a key-value pair to the Hashtable. + * If a value already exists for this key, it is overwritten. + * + * @memberof Hashtable + * @param {string} key The key. + * @param {any} value The value to associate to the key. + */ +Hashtable.prototype.put = function(key, value) { + this.items[key] = value; +} + +/** + * Get a value corresponding to a key, or undefined if not found. + * + * @memberof Hashtable + * @param {string} key The key associated to the value. + */ +Hashtable.prototype.get = function(key) { + return this.items[key]; +} + +/** + * Verify if a key exists in the Hashtable. + * + * @memberof Hashtable + * @param {string} key The key to search in the Hashtable. + * @returns {boolean} true if the key exists. + */ +Hashtable.prototype.containsKey = function(key) { + return this.items.hasOwnProperty(key); +} + +/** + * Remove the value associated to the specified key. + * + * @memberof Hashtable + * @param {string} key The key to remove. + */ +Hashtable.prototype.remove = function(key) { + delete this.items[key]; +} + +/** + * Get the first key of the Hashtable. + * + * @memberof Hashtable + * @returns {?string} The first key of the Hashtable, or undefined if empty. + */ +Hashtable.prototype.firstKey = function() { + for (var k in this.items) { + if (this.items.hasOwnProperty(k)) { + return k; + } + } + + return null; +} + +/** + * Dump all the keys of the Hashtable to an array (which is cleared first). + * + * @memberof Hashtable + * @param {Array} result The Array where the result gets pushed. + */ +Hashtable.prototype.keys = function(result) { + result.length = 0; + for (var k in this.items) { + if (this.items.hasOwnProperty(k)) { + result.push(k); + } + } +} + +/** + * Dump all the values of the Hashtable to an array (which is cleared first). + * + * @memberof Hashtable + * @param {Array} result The Array where the results get pushed. + */ +Hashtable.prototype.values = function(result) { + result.length = 0; + for (var k in this.items) { + if (this.items.hasOwnProperty(k)) { + result.push(this.items[k]); + } + } +} + +/** + * Clear the Hashtable. + * + * @memberof Hashtable + */ +Hashtable.prototype.clear = function() { + for (var k in this.items) { + if (this.items.hasOwnProperty(k)) { + delete this.items[k]; + } + } +} diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/rbush.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/rbush.js new file mode 100644 index 0000000..151de67 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/libs/rbush.js @@ -0,0 +1,624 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.rbush = f()}})(function(){var define,module,exports;return (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= 0) { + if (insertPath[level].children.length > this._maxEntries) { + this._split(insertPath, level); + level--; + } else break; + } + + // adjust bboxes along the insertion path + this._adjustParentBBoxes(bbox, insertPath, level); + }, + + // split overflowed node into two + _split: function (insertPath, level) { + + var node = insertPath[level], + M = node.children.length, + m = this._minEntries; + + this._chooseSplitAxis(node, m, M); + + var splitIndex = this._chooseSplitIndex(node, m, M); + + var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); + newNode.height = node.height; + newNode.leaf = node.leaf; + + calcBBox(node, this.toBBox); + calcBBox(newNode, this.toBBox); + + if (level) insertPath[level - 1].children.push(newNode); + else this._splitRoot(node, newNode); + }, + + _splitRoot: function (node, newNode) { + // split root node + this.data = createNode([node, newNode]); + this.data.height = node.height + 1; + this.data.leaf = false; + calcBBox(this.data, this.toBBox); + }, + + _chooseSplitIndex: function (node, m, M) { + + var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + + minOverlap = minArea = Infinity; + + for (i = m; i <= M - m; i++) { + bbox1 = distBBox(node, 0, i, this.toBBox); + bbox2 = distBBox(node, i, M, this.toBBox); + + overlap = intersectionArea(bbox1, bbox2); + area = bboxArea(bbox1) + bboxArea(bbox2); + + // choose distribution with minimum overlap + if (overlap < minOverlap) { + minOverlap = overlap; + index = i; + + minArea = area < minArea ? area : minArea; + + } else if (overlap === minOverlap) { + // otherwise choose distribution with minimum area + if (area < minArea) { + minArea = area; + index = i; + } + } + } + + return index; + }, + + // sorts node children by the best axis for split + _chooseSplitAxis: function (node, m, M) { + + var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, + compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, + xMargin = this._allDistMargin(node, m, M, compareMinX), + yMargin = this._allDistMargin(node, m, M, compareMinY); + + // if total distributions margin value is minimal for x, sort by minX, + // otherwise it's already sorted by minY + if (xMargin < yMargin) node.children.sort(compareMinX); + }, + + // total margin of all possible split distributions where each node is at least m full + _allDistMargin: function (node, m, M, compare) { + + node.children.sort(compare); + + var toBBox = this.toBBox, + leftBBox = distBBox(node, 0, m, toBBox), + rightBBox = distBBox(node, M - m, M, toBBox), + margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), + i, child; + + for (i = m; i < M - m; i++) { + child = node.children[i]; + extend(leftBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin(leftBBox); + } + + for (i = M - m - 1; i >= m; i--) { + child = node.children[i]; + extend(rightBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin(rightBBox); + } + + return margin; + }, + + _adjustParentBBoxes: function (bbox, path, level) { + // adjust bboxes along the given tree path + for (var i = level; i >= 0; i--) { + extend(path[i], bbox); + } + }, + + _condense: function (path) { + // go through the path, removing empty nodes and updating bboxes + for (var i = path.length - 1, siblings; i >= 0; i--) { + if (path[i].children.length === 0) { + if (i > 0) { + siblings = path[i - 1].children; + siblings.splice(siblings.indexOf(path[i]), 1); + + } else this.clear(); + + } else calcBBox(path[i], this.toBBox); + } + }, + + _initFormat: function (format) { + // data format (minX, minY, maxX, maxY accessors) + + // uses eval-type function compilation instead of just accepting a toBBox function + // because the algorithms are very sensitive to sorting functions performance, + // so they should be dead simple and without inner calls + + var compareArr = ['return a', ' - b', ';']; + + this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); + this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); + + this.toBBox = new Function('a', + 'return {minX: a' + format[0] + + ', minY: a' + format[1] + + ', maxX: a' + format[2] + + ', maxY: a' + format[3] + '};'); + } +}; + +function findItem(item, items, equalsFn) { + if (!equalsFn) return items.indexOf(item); + + for (var i = 0; i < items.length; i++) { + if (equalsFn(item, items[i])) return i; + } + return -1; +} + +// calculate node's bbox from bboxes of its children +function calcBBox(node, toBBox) { + distBBox(node, 0, node.children.length, toBBox, node); +} + +// min bounding rectangle of node children from k to p-1 +function distBBox(node, k, p, toBBox, destNode) { + if (!destNode) destNode = createNode(null); + destNode.minX = Infinity; + destNode.minY = Infinity; + destNode.maxX = -Infinity; + destNode.maxY = -Infinity; + + for (var i = k, child; i < p; i++) { + child = node.children[i]; + extend(destNode, node.leaf ? toBBox(child) : child); + } + + return destNode; +} + +function extend(a, b) { + a.minX = Math.min(a.minX, b.minX); + a.minY = Math.min(a.minY, b.minY); + a.maxX = Math.max(a.maxX, b.maxX); + a.maxY = Math.max(a.maxY, b.maxY); + return a; +} + +function compareNodeMinX(a, b) { return a.minX - b.minX; } +function compareNodeMinY(a, b) { return a.minY - b.minY; } + +function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); } +function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); } + +function enlargedArea(a, b) { + return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * + (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY)); +} + +function intersectionArea(a, b) { + var minX = Math.max(a.minX, b.minX), + minY = Math.max(a.minY, b.minY), + maxX = Math.min(a.maxX, b.maxX), + maxY = Math.min(a.maxY, b.maxY); + + return Math.max(0, maxX - minX) * + Math.max(0, maxY - minY); +} + +function contains(a, b) { + return a.minX <= b.minX && + a.minY <= b.minY && + b.maxX <= a.maxX && + b.maxY <= a.maxY; +} + +function intersects(a, b) { + return b.minX <= a.maxX && + b.minY <= a.maxY && + b.maxX >= a.minX && + b.maxY >= a.minY; +} + +function createNode(children) { + return { + children: children, + height: 1, + leaf: true, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }; +} + +// sort an array so that items come in groups of n unsorted items, with groups sorted between each other; +// combines selection algorithm with binary divide & conquer approach + +function multiSelect(arr, left, right, n, compare) { + var stack = [left, right], + mid; + + while (stack.length) { + right = stack.pop(); + left = stack.pop(); + + if (right - left <= n) continue; + + mid = left + Math.ceil((right - left) / n / 2) * n; + quickselect(arr, mid, left, right, compare); + + stack.push(left, mid, mid, right); + } +} + +},{"quickselect":2}],2:[function(require,module,exports){ +'use strict'; + +module.exports = partialSort; + +// Floyd-Rivest selection algorithm: +// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right]; +// The k-th element will have the (k - left + 1)th smallest value in [left, right] + +function partialSort(arr, k, left, right, compare) { + + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp(2 * z / 3); + var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + partialSort(arr, k, newLeft, newRight, compare); + } + + var t = arr[k]; + var i = left; + var j = right; + + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); + + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) i++; + while (compare(arr[j], t) > 0) j--; + } + + if (compare(arr[left], t) === 0) swap(arr, left, j); + else { + j++; + swap(arr, j, right); + } + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } +} + +function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +},{}]},{},[1])(1) +}); diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/lose1.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/lose1.png new file mode 100644 index 0000000..bde1f37 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/lose1.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/lowRandom.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/lowRandom.ogg new file mode 100644 index 0000000..ea39f82 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/lowRandom.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/oncetriggers.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/oncetriggers.js new file mode 100644 index 0000000..5ddc88f --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/oncetriggers.js @@ -0,0 +1,52 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * OnceTriggers is used to store the status of the conditions "Trigger once", + * that are used in events to have conditions that are only valid for one frame in a row. + * + * @memberof gdjs + * @class OnceTriggers + * @constructor + */ +gdjs.OnceTriggers = function() +{ + this._onceTriggers = {}; + this._lastFrameOnceTrigger = {}; +}; + +/** + * To be called when events begin so that "Trigger once" conditions + * are properly handled. + */ +gdjs.OnceTriggers.prototype.startNewFrame = function() { + this._clearObject(this._lastFrameOnceTrigger); + for (var k in this._onceTriggers) { + if (this._onceTriggers.hasOwnProperty(k)) { + this._lastFrameOnceTrigger[k] = this._onceTriggers[k]; + delete this._onceTriggers[k]; + } + } +}; + +/** + * Used by "Trigger once" conditions: return true only if + * this method was not called with the same identifier during the last frame. + * @param triggerId The identifier of the "Trigger once" condition. + */ +gdjs.OnceTriggers.prototype.triggerOnce = function(triggerId) { + this._onceTriggers[triggerId] = true; + + return !this._lastFrameOnceTrigger.hasOwnProperty(triggerId); +}; + +gdjs.OnceTriggers.prototype._clearObject = function(obj) { + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + delete obj[k]; + } + } +}; \ No newline at end of file diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/layer-pixi-renderer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/layer-pixi-renderer.js new file mode 100644 index 0000000..e46bee2 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/layer-pixi-renderer.js @@ -0,0 +1,228 @@ +// @ts-check +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * The renderer for a gdjs.Layer using Pixi.js. + * + * @class LayerPixiRenderer + * @memberof gdjs + * @param {gdjs.Layer} layer The layer + * @param {gdjs.RuntimeScenePixiRenderer} runtimeSceneRenderer The scene renderer + */ +gdjs.LayerPixiRenderer = function(layer, runtimeSceneRenderer) { + // @ts-ignore + this._pixiContainer = new PIXI.Container(); + /** @type Object. */ + this._filters = {}; + this._layer = layer; + runtimeSceneRenderer.getPIXIContainer().addChild(this._pixiContainer); + + this._setupFilters(); +}; + +gdjs.LayerRenderer = gdjs.LayerPixiRenderer; //Register the class to let the engine use it. + +/** + * Update the position of the PIXI container. To be called after each change + * made to position, zoom or rotation of the camera. + * @private + */ +gdjs.LayerPixiRenderer.prototype.updatePosition = function() { + var angle = -gdjs.toRad(this._layer.getCameraRotation()); + var zoomFactor = this._layer.getCameraZoom(); + + this._pixiContainer.rotation = angle; + this._pixiContainer.scale.x = zoomFactor; + this._pixiContainer.scale.y = zoomFactor; + + var cosValue = Math.cos(angle); + var sinValue = Math.sin(angle); + var centerX = + this._layer.getCameraX() * zoomFactor * cosValue - + this._layer.getCameraY() * zoomFactor * sinValue; + var centerY = + this._layer.getCameraX() * zoomFactor * sinValue + + this._layer.getCameraY() * zoomFactor * cosValue; + + this._pixiContainer.position.x = -centerX; + this._pixiContainer.position.y = -centerY; + this._pixiContainer.position.x += this._layer.getWidth() / 2; + this._pixiContainer.position.y += this._layer.getHeight() / 2; +}; + +gdjs.LayerPixiRenderer.prototype.updateVisibility = function(visible) { + this._pixiContainer.visible = !!visible; +}; + +gdjs.LayerPixiRenderer.prototype.updateTime = function() { + for(var filterName in this._filters) { + var filter = this._filters[filterName]; + filter.update(filter.pixiFilter, this._layer); + } +}; + +gdjs.LayerPixiRenderer.prototype._setupFilters = function() { + var effects = this._layer.getEffects(); + if (effects.length === 0) { + return; + } + + this._filters = {}; + + // @ts-ignore + /** @type PIXI.Filter[] */ + var pixiFilters = []; + for (var i = 0; i < effects.length; ++i) { + var effect = effects[i]; + var filterCreator = gdjs.PixiFiltersTools.getFilterCreator( + effect.effectType + ); + if (!filterCreator) { + console.log( + 'Filter "' + + effect.name + + '" has an unknown effect type: "' + + effect.effectType + + '". Was it registered properly? Is the effect type correct?' + ); + continue; + } + + /** @type gdjsPixiFiltersToolsFilter */ + var filter = { + pixiFilter: filterCreator.makePIXIFilter(this._layer, effect), + updateDoubleParameter: filterCreator.updateDoubleParameter, + updateStringParameter: filterCreator.updateStringParameter, + updateBooleanParameter: filterCreator.updateBooleanParameter, + update: filterCreator.update, + }; + + pixiFilters.push(filter.pixiFilter); + this._filters[effect.name] = filter; + } + + this._pixiContainer.filters = pixiFilters; +}; + +/** + * Add a child to the pixi container associated to the layer. + * All objects which are on this layer must be children of this container. + * + * @param child The child (PIXI object) to be added. + * @param zOrder The z order of the associated object. + */ +gdjs.LayerPixiRenderer.prototype.addRendererObject = function(child, zOrder) { + child.zOrder = zOrder; //Extend the pixi object with a z order. + + for (var i = 0, len = this._pixiContainer.children.length; i < len; ++i) { + if (this._pixiContainer.children[i].zOrder >= zOrder) { + //TODO : Dichotomic search + this._pixiContainer.addChildAt(child, i); + return; + } + } + this._pixiContainer.addChild(child); +}; + +/** + * Change the z order of a child associated to an object. + * + * @param child The child (PIXI object) to be modified. + * @param newZOrder The z order of the associated object. + */ +gdjs.LayerPixiRenderer.prototype.changeRendererObjectZOrder = function( + child, + newZOrder +) { + this._pixiContainer.removeChild(child); + this.addRendererObject(child, newZOrder); +}; + +/** + * Remove a child from the internal pixi container. + * Should be called when an object is deleted or removed from the layer. + * + * @param child The child (PIXI object) to be removed. + */ +gdjs.LayerPixiRenderer.prototype.removeRendererObject = function(child) { + this._pixiContainer.removeChild(child); +}; + +/** + * Update the parameter of an effect (with a number). + * @param {string} name The effect name + * @param {string} parameterName The parameter name + * @param {number} value The new value for the parameter + */ +gdjs.LayerPixiRenderer.prototype.setEffectDoubleParameter = function( + name, + parameterName, + value +) { + var filter = this._filters[name]; + if (!filter) return; + + filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); +}; + +/** + * Update the parameter of an effect (with a string). + * @param {string} name The effect name + * @param {string} parameterName The parameter name + * @param {string} value The new value for the parameter + */ +gdjs.LayerPixiRenderer.prototype.setEffectStringParameter = function( + name, + parameterName, + value +) { + var filter = this._filters[name]; + if (!filter) return; + + filter.updateStringParameter(filter.pixiFilter, parameterName, value); +}; + +/** + * Enable or disable the parameter of an effect (boolean). + * @param {string} name The effect name + * @param {string} parameterName The parameter name + * @param {boolean} value The new value for the parameter + */ +gdjs.LayerPixiRenderer.prototype.setEffectBooleanParameter = function( + name, + parameterName, + value +) { + var filter = this._filters[name]; + if (!filter) return; + + filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); +}; + +/** + * Enable an effect. + * @param {string} name The effect name + * @param {boolean} value Set to true to enable, false to disable + */ +gdjs.LayerPixiRenderer.prototype.enableEffect = function(name, value) { + var filter = this._filters[name]; + if (!filter) return; + + gdjs.PixiFiltersTools.enableEffect(filter, value); +}; + +/** + * Check if an effect is enabled. + * @param {string} name The effect name + * @return {boolean} true if the filter is enabled + */ +gdjs.LayerPixiRenderer.prototype.isEffectEnabled = function(name) { + var filter = this._filters[name]; + if (!filter) return false; + + return gdjs.PixiFiltersTools.isEffectEnabled(filter); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/loadingscreen-pixi-renderer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/loadingscreen-pixi-renderer.js new file mode 100644 index 0000000..ed3d98b --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/loadingscreen-pixi-renderer.js @@ -0,0 +1,83 @@ +gdjs.LoadingScreenPixiRenderer = function(runtimeGamePixiRenderer, loadingScreenSetup) { + this._pixiRenderer = runtimeGamePixiRenderer.getPIXIRenderer(); + if (!this._pixiRenderer) { + // A PIXI Renderer can be missing during tests, when creating a runtime game + // without a canvas. + return; + } + + this._loadingScreen = new PIXI.Container(); + + this._progressText = new PIXI.Text(' ', { + fontSize: '30px', + fontFamily: 'Arial', + fill: '#FFFFFF', + align: 'center', + }); + this._loadingScreen.addChild(this._progressText); + + if (loadingScreenSetup && loadingScreenSetup.showGDevelopSplash) { + this._madeWithText = new PIXI.Text('Made with', { + fontSize: '30px', + fontFamily: 'Arial', + fill: '#FFFFFF', + align: 'center', + }); + this._madeWithText.position.y = this._pixiRenderer.height / 2 - 130; + this._websiteText = new PIXI.Text('gdevelop-app.com', { + fontSize: '30px', + fontFamily: 'Arial', + fill: '#FFFFFF', + align: 'center', + }); + this._websiteText.position.y = this._pixiRenderer.height / 2 + 100; + + this._splashImage = new PIXI.Sprite.fromImage(gdjs.splashImage); + this._splashImage.position.x = this._pixiRenderer.width / 2; + this._splashImage.position.y = this._pixiRenderer.height / 2; + this._splashImage.anchor.x = 0.5; + this._splashImage.anchor.y = 0.5; + this._splashImage.scale.x = this._pixiRenderer.width / 800; + this._splashImage.scale.y = this._pixiRenderer.width / 800; + this._loadingScreen.addChild(this._splashImage); + this._loadingScreen.addChild(this._madeWithText); + this._loadingScreen.addChild(this._websiteText); + } +}; + +gdjs.LoadingScreenRenderer = gdjs.LoadingScreenPixiRenderer; //Register the class to let the engine use it. + +gdjs.LoadingScreenPixiRenderer.prototype.render = function(percent) { + if (!this._pixiRenderer) { + return; + } + + var screenBorder = 10; + + if (this._madeWithText) { + this._madeWithText.position.x = + this._pixiRenderer.width / 2 - this._madeWithText.width / 2; + this._madeWithText.position.y = + this._pixiRenderer.height / 2 - + this._splashImage.height / 2 - + this._madeWithText.height - + 20; + } + if (this._websiteText) { + this._websiteText.position.x = + this._pixiRenderer.width - this._websiteText.width - screenBorder; + this._websiteText.position.y = + this._pixiRenderer.height - this._websiteText.height - screenBorder; + } + + this._progressText.text = percent + '%'; + this._progressText.position.x = screenBorder; + this._progressText.position.y = + this._pixiRenderer.height - this._progressText.height - screenBorder; + + this._pixiRenderer.render(this._loadingScreen); +}; + +gdjs.LoadingScreenPixiRenderer.prototype.unload = function() { + // Nothing to do +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/pixi-filters-tools.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/pixi-filters-tools.js new file mode 100644 index 0000000..e021384 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/pixi-filters-tools.js @@ -0,0 +1,120 @@ +// @ts-check +/** + * Contains tools related to PIXI filters handling. + */ +gdjs.PixiFiltersTools = {}; + +gdjs.PixiFiltersTools.clampValue = function(value, min, max) { return Math.max(min, Math.min(max, value)); }; +gdjs.PixiFiltersTools.clampKernelSize = function(value) { return (([5, 7, 9, 11, 13, 15].indexOf(value) !== -1) ? value : 5); }; + +/** Object. */ +gdjs.PixiFiltersTools._filterCreators = {}; + +/** + * Enable an effect. + * @param {gdjsPixiFiltersToolsFilter} filter The filter to enable or disable + * @param {boolean} value Set to true to enable, false to disable + */ +gdjs.PixiFiltersTools.enableEffect = function(filter, value) { + filter.pixiFilter.enabled = value; +} + +/** + * Check if an effect is enabled. + * @param {gdjsPixiFiltersToolsFilter} filter The filter to be checked + * @return {boolean} true if the filter is enabled + */ +gdjs.PixiFiltersTools.isEffectEnabled = function(filter) { + return filter.pixiFilter.enabled; +} + +/** + * Return the creator for the filter with the given name, if any. + * @param {string} filterName The name of the filter to get + * @return {?gdjsPixiFiltersToolsFilterCreator} The filter creator, if any (null otherwise). + */ +gdjs.PixiFiltersTools.getFilterCreator = function(filterName) { + if (gdjs.PixiFiltersTools._filterCreators.hasOwnProperty(filterName)) + return gdjs.PixiFiltersTools._filterCreators[filterName]; + + return null; +} + +/** + * Register a new PIXI filter creator, to be used by GDJS. + * @param {string} filterName The name of the filter to get + * @param {gdjsPixiFiltersToolsFilterCreator} filterCreator The object used to create the filter. + */ +gdjs.PixiFiltersTools.registerFilterCreator = function(filterName, filterCreator) { + if (gdjs.PixiFiltersTools._filterCreators.hasOwnProperty(filterName)) + console.warn("Filter \"" + filterName + "\" was already registered in gdjs.PixiFiltersTools. Replacing it with the new one."); + + gdjs.PixiFiltersTools._filterCreators[filterName] = filterCreator; +} + +// Type definitions: + +/** + * Function to call to create the PIXI filter used at runtime + * @callback gdjsPixiFiltersToolsFilterCreatorMakePIXIFilter + * @param {gdjs.Layer} layer + * @param {Object} effectData + * @returns {Object} + */ + +/** + * The function to be called to update the filter at every frame + * @callback gdjsPixiFiltersToolsUpdate + * @param {Object} filter + * @param {gdjs.Layer} layer + * @returns {Object} + */ + +/** + * The function to be called to update a parameter (with a number) + * @callback gdjsPixiFiltersToolsUpdateDoubleParameter + * @param {Object} filter + * @param {string} parameterName + * @param {number} value + * @returns {void} + */ + +/** + * The function to be called to update a parameter (with a string) + * @callback gdjsPixiFiltersToolsUpdateStringParameter + * @param {Object} filter + * @param {string} parameterName + * @param {string} value + * @returns {void} + */ + +/** + * The function to be called to update a parameter (with a boolean) + * @callback gdjsPixiFiltersToolsUpdateBooleanParameter + * @param {Object} filter + * @param {string} parameterName + * @param {boolean} value + * @returns {void} + */ + +/** + * A wrapper allowing to create a PIXI filter and update it using a common interface + * @typedef gdjsPixiFiltersToolsFilterCreator + * @type {Object} + * @property {gdjsPixiFiltersToolsFilterCreatorMakePIXIFilter} makePIXIFilter Function to call to create the filter + * @property {gdjsPixiFiltersToolsUpdate} update The function to be called to update the filter at every frame + * @property {gdjsPixiFiltersToolsUpdateDoubleParameter} updateDoubleParameter The function to be called to update a parameter (with a number) + * @property {gdjsPixiFiltersToolsUpdateStringParameter} updateStringParameter The function to be called to update a parameter (with a string) + * @property {gdjsPixiFiltersToolsUpdateBooleanParameter} updateBooleanParameter The function to be called to update a parameter (with a boolean) + */ + +/** + * The type of a filter used to manipulate a Pixi filter. + * @typedef gdjsPixiFiltersToolsFilter + * @type {Object} + * @property {any} pixiFilter The PIXI filter + * @property {gdjsPixiFiltersToolsUpdate} update The function to be called to update the filter at every frame + * @property {gdjsPixiFiltersToolsUpdateDoubleParameter} updateDoubleParameter The function to be called to update a parameter (with a number) + * @property {gdjsPixiFiltersToolsUpdateStringParameter} updateStringParameter The function to be called to update a parameter (with a string) + * @property {gdjsPixiFiltersToolsUpdateBooleanParameter} updateBooleanParameter The function to be called to update a parameter (with a boolean) + */ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/pixi-image-manager.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/pixi-image-manager.js new file mode 100644 index 0000000..5dd35c6 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/pixi-image-manager.js @@ -0,0 +1,174 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * PixiImageManager loads and stores textures that can be used by the Pixi.js renderers. + * + * @class PixiImageManager + * @memberof gdjs + * @param {Object} resources The resources data of the game. + */ +gdjs.PixiImageManager = function(resources) +{ + this._resources = resources; + + // The invalid texture is a 8x8 PNG file filled with magenta (#ff00ff), to be + // easily spotted if rendered on screen. + this._invalidTexture = PIXI.Texture.from("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAFElEQVQoU2P8z/D/PwMewDgyFAAApMMX8Zi0uXAAAAAASUVORK5CYIIA"); + this._loadedTextures = new Hashtable(); +}; + +gdjs.ImageManager = gdjs.PixiImageManager; //Register the class to let the engine use it. + +/** + * Return the PIXI texture associated to the specified resource name. + * Returns a placeholder texture if not found. + * @param {string} resourceName The name of the resource + * @returns {PIXI.Texture} The requested texture, or a placeholder if not found. + */ +gdjs.PixiImageManager.prototype.getPIXITexture = function(resourceName) { + if ( this._loadedTextures.containsKey(resourceName) ) { + return this._loadedTextures.get(resourceName); + } + if ( resourceName === "" ) { + return this._invalidTexture; + } + + //Texture is not loaded, load it now from the resources list. + if ( this._resources ) { + var texture = null; + + for(var i = 0, len = this._resources.length;i0)-(t<0)},r.abs=function(t){var e=t>>31;return(t^e)-e},r.min=function(t,e){return e^(t^e)&-(t65535)<<4,t>>>=e,r=(t>255)<<3,t>>>=r,e|=r,r=(t>15)<<2,t>>>=r,e|=r,r=(t>3)<<1,t>>>=r,(e|=r)|t>>1},r.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},r.popCount=function(t){return t-=t>>>1&1431655765,16843009*((t=(858993459&t)+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},r.countTrailingZeros=n,r.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)+1},r.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},r.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var i=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|i[t>>>16&255]<<8|i[t>>>24&255]},r.interleave2=function(t,e){return t&=65535,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e&=65535,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1},r.deinterleave2=function(t,e){return t=t>>>e&1431655765,t=858993459&(t|t>>>1),t=252645135&(t|t>>>2),t=16711935&(t|t>>>4),(t=65535&(t|t>>>16))<<16>>16},r.interleave3=function(t,e,r){return t&=1023,t=4278190335&(t|t<<16),t=251719695&(t|t<<8),t=3272356035&(t|t<<4),t=1227133513&(t|t<<2),e&=1023,e=4278190335&(e|e<<16),e=251719695&(e|e<<8),e=3272356035&(e|e<<4),e=1227133513&(e|e<<2),t|=e<<1,r&=1023,r=4278190335&(r|r<<16),r=251719695&(r|r<<8),r=3272356035&(r|r<<4),r=1227133513&(r|r<<2),t|r<<2},r.deinterleave3=function(t,e){return t=t>>>e&1227133513,t=3272356035&(t|t>>>2),t=251719695&(t|t>>>4),t=4278190335&(t|t>>>8),(t=1023&(t|t>>>16))<<22>>22},r.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>n(t)+1}},{}],2:[function(t,e,r){"use strict";function n(t,e,r){r=r||2;var n=e&&e.length,o=n?e[0]*r:t.length,a=i(t,0,o,r,!0),u=[];if(!a||a.next===a.prev)return u;var h,l,d,f,p,v,g;if(n&&(a=c(t,e,a,r)),t.length>80*r){h=d=t[0],l=f=t[1];for(var y=r;yd&&(d=p),v>f&&(f=v);g=Math.max(d-h,f-l),g=0!==g?1/g:0}return s(a,u,r,h,l,g),u}function i(t,e,r,n,i){var o,s;if(i===A(t,e,r,n)>0)for(o=e;o=e;o-=n)s=P(o,t[o],t[o+1],s);return s&&T(s,s.next)&&(C(s),s=s.next),s}function o(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!T(n,n.next)&&0!==x(n.prev,n,n.next))n=n.next;else{if(C(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function s(t,e,r,n,i,c,d){if(t){!d&&c&&v(t,n,i,c);for(var f,p,g=t;t.prev!==t.next;)if(f=t.prev,p=t.next,c?u(t,n,i,c):a(t))e.push(f.i/r),e.push(t.i/r),e.push(p.i/r),C(t),t=p.next,g=p.next;else if((t=p)===g){d?1===d?(t=h(t,e,r),s(t,e,r,n,i,c,2)):2===d&&l(t,e,r,n,i,c):s(o(t),e,r,n,i,c,1);break}}}function a(t){var e=t.prev,r=t,n=t.next;if(x(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(_(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&x(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function u(t,e,r,n){var i=t.prev,o=t,s=t.next;if(x(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,l=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,c=y(a,u,e,r,n),d=y(h,l,e,r,n),f=t.prevZ,p=t.nextZ;f&&f.z>=c&&p&&p.z<=d;){if(f!==t.prev&&f!==t.next&&_(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&x(f.prev,f,f.next)>=0)return!1;if(f=f.prevZ,p!==t.prev&&p!==t.next&&_(i.x,i.y,o.x,o.y,s.x,s.y,p.x,p.y)&&x(p.prev,p,p.next)>=0)return!1;p=p.nextZ}for(;f&&f.z>=c;){if(f!==t.prev&&f!==t.next&&_(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&x(f.prev,f,f.next)>=0)return!1;f=f.prevZ}for(;p&&p.z<=d;){if(p!==t.prev&&p!==t.next&&_(i.x,i.y,o.x,o.y,s.x,s.y,p.x,p.y)&&x(p.prev,p,p.next)>=0)return!1;p=p.nextZ}return!0}function h(t,e,r){var n=t;do{var i=n.prev,o=n.next.next;!T(i,o)&&w(i,n,n.next,o)&&S(i,o)&&S(o,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(o.i/r),C(n),C(n.next),n=t=o),n=n.next}while(n!==t);return n}function l(t,e,r,n,i,a){var u=t;do{for(var h=u.next.next;h!==u.prev;){if(u.i!==h.i&&b(u,h)){var l=M(u,h);return u=o(u,u.next),l=o(l,l.next),s(u,e,r,n,i,a),void s(l,e,r,n,i,a)}h=h.next}u=u.next}while(u!==t)}function c(t,e,r,n){var s,a,u,h,l,c=[];for(s=0,a=e.length;s=n.next.y&&n.next.y!==n.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=i&&a>s){if(s=a,a===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=l&&i!==n.x&&_(or.x)&&S(n,t)&&(r=n,d=u),n=n.next;return r}function v(t,e,r,n){var i=t;do{null===i.z&&(i.z=y(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,g(i)}function g(t){var e,r,n,i,o,s,a,u,h=1;do{for(r=t,t=null,o=null,s=0;r;){for(s++,n=r,a=0,e=0;e0||u>0&&n;)0!==a&&(0===u||!n||r.z<=n.z)?(i=r,r=r.nextZ,a--):(i=n,n=n.nextZ,u--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;r=n}o.nextZ=null,h*=2}while(s>1);return t}function y(t,e,r,n,i){return t=32767*(t-r)*i,e=32767*(e-n)*i,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1}function m(t){var e=t,r=t;do{e.x=0&&(t-s)*(n-a)-(r-s)*(e-a)>=0&&(r-s)*(o-a)-(i-s)*(n-a)>=0}function b(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!E(t,e)&&S(t,e)&&S(e,t)&&O(t,e)}function x(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function T(t,e){return t.x===e.x&&t.y===e.y}function w(t,e,r,n){return!!(T(t,e)&&T(r,n)||T(t,n)&&T(r,e))||x(t,e,r)>0!=x(t,e,n)>0&&x(r,n,t)>0!=x(r,n,e)>0}function E(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&w(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}function S(t,e){return x(t.prev,t,t.next)<0?x(t,e,t.next)>=0&&x(t,t.prev,e)>=0:x(t,e,t.prev)<0||x(t,t.next,e)<0}function O(t,e){var r=t,n=!1,i=(t.x+e.x)/2,o=(t.y+e.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}function M(t,e){var r=new R(t.i,t.x,t.y),n=new R(e.i,e.x,e.y),i=t.next,o=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function P(t,e,r,n){var i=new R(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function C(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function R(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function A(t,e,r,n){for(var i=0,o=e,s=r-n;o0&&(n+=t[i-1].length,r.holes.push(n))}return r}},{}],3:[function(t,e,r){"use strict";function n(){}function i(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function o(){this._events=new n,this._eventsCount=0}var s=Object.prototype.hasOwnProperty,a="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(a=!1)),o.prototype.eventNames=function(){var t,e,r=[];if(0===this._eventsCount)return r;for(e in t=this._events)s.call(t,e)&&r.push(a?e.slice(1):e);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(t)):r},o.prototype.listeners=function(t,e){var r=a?a+t:t,n=this._events[r];if(e)return!!n;if(!n)return[];if(n.fn)return[n.fn];for(var i=0,o=n.length,s=new Array(o);i=0;n--){var i=t[n];"."===i?t.splice(n,1):".."===i?(t.splice(n,1),r++):r&&(t.splice(n,1),r--)}if(e)for(;r--;r)t.unshift("..");return t}function n(t,e){if(t.filter)return t.filter(e);for(var r=[],n=0;n=-1&&!i;o--){var s=o>=0?arguments[o]:t.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(r=s+"/"+r,i="/"===s.charAt(0))}return r=e(n(r.split("/"),function(t){return!!t}),!i).join("/"),(i?"/":"")+r||"."},r.normalize=function(t){var i=r.isAbsolute(t),o="/"===s(t,-1);return t=e(n(t.split("/"),function(t){return!!t}),!i).join("/"),t||i||(t="."),t&&o&&(t+="/"),(i?"/":"")+t},r.isAbsolute=function(t){return"/"===t.charAt(0)},r.join=function(){var t=Array.prototype.slice.call(arguments,0);return r.normalize(n(t,function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))},r.relative=function(t,e){function n(t){for(var e=0;e=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=r.resolve(t).substr(1),e=r.resolve(e).substr(1);for(var i=n(t.split("/")),o=n(e.split("/")),s=Math.min(i.length,o.length),a=s,u=0;u=t.byteLength?n.bufferSubData(this.type,e,t):n.bufferData(this.type,t,this.drawType),this.data=t},i.prototype.bind=function(){this.gl.bindBuffer(this.type,this.buffer)},i.createVertexBuffer=function(t,e,r){return new i(t,t.ARRAY_BUFFER,e,r)},i.createIndexBuffer=function(t,e,r){return new i(t,t.ELEMENT_ARRAY_BUFFER,e,r)},i.create=function(t,e,r,n){return new i(t,e,r,n)},i.prototype.destroy=function(){this.gl.deleteBuffer(this.buffer)},e.exports=i},{}],10:[function(t,e,r){var n=t("./GLTexture"),i=function(t,e,r){this.gl=t,this.framebuffer=t.createFramebuffer(),this.stencil=null,this.texture=null,this.width=e||100,this.height=r||100};i.prototype.enableTexture=function(t){var e=this.gl;this.texture=t||new n(e),this.texture.bind(),this.bind(),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.texture.texture,0)},i.prototype.enableStencil=function(){if(!this.stencil){var t=this.gl;this.stencil=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,this.stencil),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,this.stencil),t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_STENCIL,this.width,this.height)}},i.prototype.clear=function(t,e,r,n){this.bind();var i=this.gl;i.clearColor(t,e,r,n),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT)},i.prototype.bind=function(){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,this.framebuffer)},i.prototype.unbind=function(){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,null)},i.prototype.resize=function(t,e){var r=this.gl;this.width=t,this.height=e,this.texture&&this.texture.uploadData(null,t,e),this.stencil&&(r.bindRenderbuffer(r.RENDERBUFFER,this.stencil),r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,t,e))},i.prototype.destroy=function(){var t=this.gl;this.texture&&this.texture.destroy(),t.deleteFramebuffer(this.framebuffer),this.gl=null,this.stencil=null,this.texture=null},i.createRGBA=function(t,e,r,o){var s=n.fromData(t,null,e,r);s.enableNearestScaling(),s.enableWrapClamp();var a=new i(t,e,r);return a.enableTexture(s),a.unbind(),a},i.createFloat32=function(t,e,r,o){var s=new n.fromData(t,o,e,r);s.enableNearestScaling(),s.enableWrapClamp();var a=new i(t,e,r);return a.enableTexture(s),a.unbind(),a},e.exports=i},{"./GLTexture":12}],11:[function(t,e,r){var n=t("./shader/compileProgram"),i=t("./shader/extractAttributes"),o=t("./shader/extractUniforms"),s=t("./shader/setPrecision"),a=t("./shader/generateUniformAccessObject"),u=function(t,e,r,u,h){this.gl=t,u&&(e=s(e,u),r=s(r,u)),this.program=n(t,e,r,h),this.attributes=i(t,this.program),this.uniformData=o(t,this.program),this.uniforms=a(t,this.uniformData)};u.prototype.bind=function(){return this.gl.useProgram(this.program),this},u.prototype.destroy=function(){this.attributes=null,this.uniformData=null,this.uniforms=null,this.gl.deleteProgram(this.program)},e.exports=u},{"./shader/compileProgram":17,"./shader/extractAttributes":19,"./shader/extractUniforms":20,"./shader/generateUniformAccessObject":21,"./shader/setPrecision":25}],12:[function(t,e,r){var n=function(t,e,r,n,i){this.gl=t,this.texture=t.createTexture(),this.mipmap=!1,this.premultiplyAlpha=!1,this.width=e||-1,this.height=r||-1,this.format=n||t.RGBA,this.type=i||t.UNSIGNED_BYTE};n.prototype.upload=function(t){this.bind();var e=this.gl;e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,this.premultiplyAlpha);var r=t.videoWidth||t.width,n=t.videoHeight||t.height;n!==this.height||r!==this.width?e.texImage2D(e.TEXTURE_2D,0,this.format,this.format,this.type,t):e.texSubImage2D(e.TEXTURE_2D,0,0,0,this.format,this.type,t),this.width=r,this.height=n};var i=!1;n.prototype.uploadData=function(t,e,r){this.bind();var n=this.gl;if(t instanceof Float32Array){if(!i){if(!n.getExtension("OES_texture_float"))throw new Error("floating point textures not available");i=!0}this.type=n.FLOAT}else this.type=this.type||n.UNSIGNED_BYTE;n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,this.premultiplyAlpha),e!==this.width||r!==this.height?n.texImage2D(n.TEXTURE_2D,0,this.format,e,r,0,this.format,this.type,t||null):n.texSubImage2D(n.TEXTURE_2D,0,0,0,e,r,this.format,this.type,t||null),this.width=e,this.height=r},n.prototype.bind=function(t){var e=this.gl;void 0!==t&&e.activeTexture(e.TEXTURE0+t),e.bindTexture(e.TEXTURE_2D,this.texture)},n.prototype.unbind=function(){var t=this.gl;t.bindTexture(t.TEXTURE_2D,null)},n.prototype.minFilter=function(t){var e=this.gl;this.bind(),this.mipmap?e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t?e.LINEAR_MIPMAP_LINEAR:e.NEAREST_MIPMAP_NEAREST):e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t?e.LINEAR:e.NEAREST)},n.prototype.magFilter=function(t){var e=this.gl;this.bind(),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,t?e.LINEAR:e.NEAREST)},n.prototype.enableMipmap=function(){var t=this.gl;this.bind(),this.mipmap=!0,t.generateMipmap(t.TEXTURE_2D)},n.prototype.enableLinearScaling=function(){this.minFilter(!0),this.magFilter(!0)},n.prototype.enableNearestScaling=function(){this.minFilter(!1),this.magFilter(!1)},n.prototype.enableWrapClamp=function(){var t=this.gl;this.bind(),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)},n.prototype.enableWrapRepeat=function(){var t=this.gl;this.bind(),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT)},n.prototype.enableWrapMirrorRepeat=function(){var t=this.gl;this.bind(),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.MIRRORED_REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.MIRRORED_REPEAT)},n.prototype.destroy=function(){this.gl.deleteTexture(this.texture)},n.fromSource=function(t,e,r){var i=new n(t);return i.premultiplyAlpha=r||!1,i.upload(e),i},n.fromData=function(t,e,r,i){var o=new n(t);return o.uploadData(e,r,i),o},e.exports=n},{}],13:[function(t,e,r){function n(t,e){if(this.nativeVaoExtension=null,n.FORCE_NATIVE||(this.nativeVaoExtension=t.getExtension("OES_vertex_array_object")||t.getExtension("MOZ_OES_vertex_array_object")||t.getExtension("WEBKIT_OES_vertex_array_object")),this.nativeState=e,this.nativeVaoExtension){this.nativeVao=this.nativeVaoExtension.createVertexArrayOES();var r=t.getParameter(t.MAX_VERTEX_ATTRIBS);this.nativeState={tempAttribState:new Array(r),attribState:new Array(r)}}this.gl=t,this.attributes=[],this.indexBuffer=null,this.dirty=!1}var i=t("./setVertexAttribArrays");n.prototype.constructor=n,e.exports=n,n.FORCE_NATIVE=!1,n.prototype.bind=function(){if(this.nativeVao){if(this.nativeVaoExtension.bindVertexArrayOES(this.nativeVao),this.dirty)return this.dirty=!1,this.activate(),this;this.indexBuffer&&this.indexBuffer.bind()}else this.activate();return this},n.prototype.unbind=function(){return this.nativeVao&&this.nativeVaoExtension.bindVertexArrayOES(null),this},n.prototype.activate=function(){for(var t=this.gl,e=null,r=0;r1)for(var r=1;r1&&(n=r[0]+"@",t=r[1]),t=t.replace(D,"."),n+s(t.split("."),e).join(".")}function u(t){for(var e,r,n=[],i=0,o=t.length;i=55296&&e<=56319&&i65535&&(t-=65536,e+=k(t>>>10&1023|55296),t=56320|1023&t),e+=k(t)}).join("")}function l(t){return t-48<10?t-22:t-65<26?t-65:t-97<26?t-97:w}function c(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function d(t,e,r){var n=0;for(t=r?B(t/M):t>>1,t+=B(t/e);t>N*S>>1;n+=w)t=B(t/N);return B(n+(N+1)*t/(t+O))}function f(t){var e,r,n,i,s,a,u,c,f,p,v=[],g=t.length,y=0,m=C,_=P;for(r=t.lastIndexOf(R),r<0&&(r=0),n=0;n=128&&o("not-basic"),v.push(t.charCodeAt(n));for(i=r>0?r+1:0;i=g&&o("invalid-input"),c=l(t.charCodeAt(i++)),(c>=w||c>B((T-y)/a))&&o("overflow"),y+=c*a,f=u<=_?E:u>=_+S?S:u-_,!(cB(T/p)&&o("overflow"),a*=p;e=v.length+1,_=d(y-s,e,0==s),B(y/e)>T-m&&o("overflow"),m+=B(y/e),y%=e,v.splice(y++,0,m)}return h(v)}function p(t){var e,r,n,i,s,a,h,l,f,p,v,g,y,m,_,b=[];for(t=u(t),g=t.length,e=C,r=0,s=P,a=0;a=e&&vB((T-r)/y)&&o("overflow"),r+=(h-e)*y,e=h,a=0;aT&&o("overflow"),v==e){for(l=r,f=w;p=f<=s?E:f>=s+S?S:f-s,!(l= 0x80 (not a basic code point)","invalid-input":"Invalid input"},N=w-E,B=Math.floor,k=String.fromCharCode;if(b={version:"1.4.1",ucs2:{decode:u,encode:h},decode:f,encode:p,toASCII:g,toUnicode:v},"function"==typeof t&&"object"==typeof t.amd&&t.amd)t("punycode",function(){return b});else if(y&&m)if(r.exports==y)m.exports=b;else for(x in b)b.hasOwnProperty(x)&&(y[x]=b[x]);else i.punycode=b}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],28:[function(t,e,r){"use strict";function n(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.exports=function(t,e,r,o){e=e||"&",r=r||"=";var s={};if("string"!=typeof t||0===t.length)return s;var a=/\+/g;t=t.split(e);var u=1e3;o&&"number"==typeof o.maxKeys&&(u=o.maxKeys);var h=t.length;u>0&&h>u&&(h=u);for(var l=0;l=0?(c=v.substr(0,g),d=v.substr(g+1)):(c=v,d=""),f=decodeURIComponent(c),p=decodeURIComponent(d),n(s,f)?i(s[f])?s[f].push(p):s[f]=[s[f],p]:s[f]=p}return s};var i=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)}},{}],29:[function(t,e,r){"use strict";function n(t,e){if(t.map)return t.map(e);for(var r=[],n=0;n=i||0===r)){r=e+r>i?i-e:r;var o=i-r;for(n=e;n0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;i(this,t),this.baseUrl=r,this.progress=0,this.loading=!1,this.defaultQueryString="",this._beforeMiddleware=[],this._afterMiddleware=[],this._resourcesParsing=[],this._boundLoadResource=function(t,r){return e._loadResource(t,r)},this._queue=d.queue(this._boundLoadResource,n),this._queue.pause(),this.resources={},this.onProgress=new u.default,this.onError=new u.default,this.onLoad=new u.default,this.onStart=new u.default,this.onComplete=new u.default;for(var o=0;o0||e.responseType===t.XHR_RESPONSE_TYPE.BUFFER)?n=200:1223===n&&(n=204),2!=(n/100|0))return void this.abort("["+e.status+"] "+e.statusText+": "+e.responseURL);if(this.xhrType===t.XHR_RESPONSE_TYPE.TEXT)this.data=r,this.type=t.TYPE.TEXT;else if(this.xhrType===t.XHR_RESPONSE_TYPE.JSON)try{this.data=JSON.parse(r),this.type=t.TYPE.JSON}catch(t){return void this.abort("Error trying to parse loaded json: "+t)}else if(this.xhrType===t.XHR_RESPONSE_TYPE.DOCUMENT)try{if(window.DOMParser){var i=new DOMParser;this.data=i.parseFromString(r,"text/xml")}else{var o=document.createElement("div");o.innerHTML=r,this.data=o}this.type=t.TYPE.XML}catch(t){return void this.abort("Error trying to parse loaded xml: "+t)}else this.data=e.response||r;this.complete()},t.prototype._determineCrossOrigin=function(t,e){if(0===t.indexOf("data:"))return"";if(window.origin!==window.location.origin)return"anonymous";e=e||window.location,p||(p=document.createElement("a")),p.href=t,t=(0,l.default)(p.href,{strictMode:!0});var r=!t.port&&""===e.port||t.port===e.port,n=t.protocol?t.protocol+":":"";return t.host===e.hostname&&r&&n===e.protocol?"":"anonymous"},t.prototype._determineXhrType=function(){return t._xhrTypeMap[this.extension]||t.XHR_RESPONSE_TYPE.TEXT},t.prototype._determineLoadType=function(){return t._loadTypeMap[this.extension]||t.LOAD_TYPE.XHR},t.prototype._getExtension=function(){var t=this.url,e="";if(this.isDataUrl){var r=t.indexOf("/");e=t.substring(r+1,t.indexOf(";",r))}else{var n=t.indexOf("?"),i=t.indexOf("#"),o=Math.min(n>-1?n:t.length,i>-1?i:t.length);t=t.substring(0,o),e=t.substring(t.lastIndexOf(".")+1)}return e.toLowerCase()},t.prototype._getMimeFromXhrType=function(e){switch(e){case t.XHR_RESPONSE_TYPE.BUFFER:return"application/octet-binary";case t.XHR_RESPONSE_TYPE.BLOB:return"application/blob";case t.XHR_RESPONSE_TYPE.DOCUMENT:return"application/xml";case t.XHR_RESPONSE_TYPE.JSON:return"application/json";case t.XHR_RESPONSE_TYPE.DEFAULT:case t.XHR_RESPONSE_TYPE.TEXT:default:return"text/plain"}},u(t,[{key:"isDataUrl",get:function(){return this._hasFlag(t.STATUS_FLAGS.DATA_URL)}},{key:"isComplete",get:function(){return this._hasFlag(t.STATUS_FLAGS.COMPLETE)}},{key:"isLoading",get:function(){return this._hasFlag(t.STATUS_FLAGS.LOADING)}}]),t}();v.STATUS_FLAGS={NONE:0,DATA_URL:1,COMPLETE:2,LOADING:4},v.TYPE={UNKNOWN:0,JSON:1,XML:2,IMAGE:3,AUDIO:4,VIDEO:5,TEXT:6},v.LOAD_TYPE={XHR:1,IMAGE:2,AUDIO:3,VIDEO:4},v.XHR_RESPONSE_TYPE={DEFAULT:"text",BUFFER:"arraybuffer",BLOB:"blob",DOCUMENT:"document",JSON:"json",TEXT:"text"},v._loadTypeMap={gif:v.LOAD_TYPE.IMAGE,png:v.LOAD_TYPE.IMAGE,bmp:v.LOAD_TYPE.IMAGE,jpg:v.LOAD_TYPE.IMAGE,jpeg:v.LOAD_TYPE.IMAGE,tif:v.LOAD_TYPE.IMAGE,tiff:v.LOAD_TYPE.IMAGE,webp:v.LOAD_TYPE.IMAGE,tga:v.LOAD_TYPE.IMAGE,svg:v.LOAD_TYPE.IMAGE,"svg+xml":v.LOAD_TYPE.IMAGE,mp3:v.LOAD_TYPE.AUDIO,ogg:v.LOAD_TYPE.AUDIO,wav:v.LOAD_TYPE.AUDIO,mp4:v.LOAD_TYPE.VIDEO,webm:v.LOAD_TYPE.VIDEO},v._xhrTypeMap={xhtml:v.XHR_RESPONSE_TYPE.DOCUMENT,html:v.XHR_RESPONSE_TYPE.DOCUMENT,htm:v.XHR_RESPONSE_TYPE.DOCUMENT,xml:v.XHR_RESPONSE_TYPE.DOCUMENT,tmx:v.XHR_RESPONSE_TYPE.DOCUMENT,svg:v.XHR_RESPONSE_TYPE.DOCUMENT,tsx:v.XHR_RESPONSE_TYPE.DOCUMENT,gif:v.XHR_RESPONSE_TYPE.BLOB,png:v.XHR_RESPONSE_TYPE.BLOB,bmp:v.XHR_RESPONSE_TYPE.BLOB,jpg:v.XHR_RESPONSE_TYPE.BLOB,jpeg:v.XHR_RESPONSE_TYPE.BLOB,tif:v.XHR_RESPONSE_TYPE.BLOB,tiff:v.XHR_RESPONSE_TYPE.BLOB,webp:v.XHR_RESPONSE_TYPE.BLOB,tga:v.XHR_RESPONSE_TYPE.BLOB,json:v.XHR_RESPONSE_TYPE.JSON,text:v.XHR_RESPONSE_TYPE.TEXT,txt:v.XHR_RESPONSE_TYPE.TEXT,ttf:v.XHR_RESPONSE_TYPE.BUFFER,otf:v.XHR_RESPONSE_TYPE.BUFFER},v.EMPTY_GIF="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",void 0!==e&&(e.exports.default=v)},{"mini-signals":5,"parse-uri":7}],34:[function(t,e,r){"use strict";function n(){}function i(t,e,r,n){var i=0,o=t.length;!function s(a){if(a||i===o)return void(r&&r(a));n?setTimeout(function(){e(t[i++],s)},1):e(t[i++],s)}()}function o(t){return function(){if(null===t)throw new Error("Callback was already called.");var e=t;t=null,e.apply(this,arguments)}}function s(t,e){function r(t,e,r){if(null!=r&&"function"!=typeof r)throw new Error("task callback must be a function");if(a.started=!0,null==t&&a.idle())return void setTimeout(function(){return a.drain()},1);var i={data:t,callback:"function"==typeof r?r:n};e?a._tasks.unshift(i):a._tasks.push(i),setTimeout(function(){return a.process()},1)}function i(t){return function(){s-=1,t.callback.apply(t,arguments),null!=arguments[0]&&a.error(arguments[0],t.data),s<=a.concurrency-a.buffer&&a.unsaturated(),a.idle()&&a.drain(),a.process()}}if(null==e)e=1;else if(0===e)throw new Error("Concurrency must not be zero");var s=0,a={_tasks:[],concurrency:e,saturated:n,unsaturated:n,buffer:e/4,empty:n,drain:n,error:n,started:!1,paused:!1,push:function(t,e){r(t,!1,e)},kill:function(){s=0,a.drain=n,a.started=!1,a._tasks=[]},unshift:function(t,e){r(t,!0,e)},process:function(){for(;!a.paused&&s>2,o[1]=(3&n[0])<<4|n[1]>>4,o[2]=(15&n[1])<<2|n[2]>>6,o[3]=63&n[2];switch(r-(t.length-1)){case 2:o[3]=64,o[2]=64;break;case 1:o[3]=64}for(var a=0;a",'"',"`"," ","\r","\n","\t"],p=["{","}","|","\\","^","`"].concat(f),v=["'"].concat(p),g=["%","/","?",";","#"].concat(v),y=["/","?","#"],m=/^[+a-z0-9A-Z_-]{0,63}$/,_=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,b={javascript:!0,"javascript:":!0},x={javascript:!0,"javascript:":!0},T={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},w=t("querystring");n.prototype.parse=function(t,e,r){if(!h.isString(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var n=t.indexOf("?"),i=-1!==n&&n127?L+="x":L+=D[N];if(!L.match(m)){var k=A.slice(0,O),F=A.slice(O+1),j=D.match(_);j&&(k.push(j[1]),F.unshift(j[2])),F.length&&(a="/"+F.join(".")+a),this.hostname=k.join(".");break}}} +this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),R||(this.hostname=u.toASCII(this.hostname));var U=this.port?":"+this.port:"",X=this.hostname||"";this.host=X+U,this.href+=this.host,R&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==a[0]&&(a="/"+a))}if(!b[p])for(var O=0,I=v.length;O0)&&r.host.split("@");S&&(r.auth=S.shift(),r.host=r.hostname=S.shift())}return r.search=t.search,r.query=t.query,h.isNull(r.pathname)&&h.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r}if(!w.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var O=w.slice(-1)[0],M=(r.host||t.host||w.length>1)&&("."===O||".."===O)||""===O,P=0,C=w.length;C>=0;C--)O=w[C],"."===O?w.splice(C,1):".."===O?(w.splice(C,1),P++):P&&(w.splice(C,1),P--);if(!_&&!b)for(;P--;P)w.unshift("..");!_||""===w[0]||w[0]&&"/"===w[0].charAt(0)||w.unshift(""),M&&"/"!==w.join("/").substr(-1)&&w.push("");var R=""===w[0]||w[0]&&"/"===w[0].charAt(0);if(E){r.hostname=r.host=R?"":w.length?w.shift():"";var S=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@");S&&(r.auth=S.shift(),r.host=r.hostname=S.shift())}return _=_||r.host&&w.length,_&&!R&&w.unshift(""),w.length?r.pathname=w.join("/"):(r.pathname=null,r.path=null),h.isNull(r.pathname)&&h.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},n.prototype.parseHost=function(){var t=this.host,e=c.exec(t);e&&(e=e[0],":"!==e&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)}},{"./util":39,punycode:27,querystring:30}],39:[function(t,e,r){"use strict";e.exports={isString:function(t){return"string"==typeof t},isObject:function(t){return"object"==typeof t&&null!==t},isNull:function(t){return null===t},isNullOrUndefined:function(t){return null==t}}},{}],40:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var o=t("../core"),s=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(o),a=t("ismobilejs"),u=n(a),h=t("./accessibleTarget"),l=n(h);s.utils.mixins.delayMixin(s.DisplayObject.prototype,l.default);var c=100,d=0,f=0,p=2,v=function(){function t(e){i(this,t),!u.default.tablet&&!u.default.phone||navigator.isCocoonJS||this.createTouchHook();var r=document.createElement("div");r.style.width=c+"px",r.style.height=c+"px",r.style.position="absolute",r.style.top=d+"px",r.style.left=f+"px",r.style.zIndex=p,this.div=r,this.pool=[],this.renderId=0,this.debug=!1,this.renderer=e,this.children=[],this._onKeyDown=this._onKeyDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this.isActive=!1,this.isMobileAccessabillity=!1,window.addEventListener("keydown",this._onKeyDown,!1)}return t.prototype.createTouchHook=function(){var t=this,e=document.createElement("button");e.style.width="1px",e.style.height="1px",e.style.position="absolute",e.style.top="-1000px",e.style.left="-1000px",e.style.zIndex=2,e.style.backgroundColor="#FF0000",e.title="HOOK DIV",e.addEventListener("focus",function(){t.isMobileAccessabillity=!0,t.activate(),document.body.removeChild(e)}),document.body.appendChild(e)},t.prototype.activate=function(){this.isActive||(this.isActive=!0,window.document.addEventListener("mousemove",this._onMouseMove,!0),window.removeEventListener("keydown",this._onKeyDown,!1),this.renderer.on("postrender",this.update,this),this.renderer.view.parentNode&&this.renderer.view.parentNode.appendChild(this.div))},t.prototype.deactivate=function(){this.isActive&&!this.isMobileAccessabillity&&(this.isActive=!1,window.document.removeEventListener("mousemove",this._onMouseMove,!0),window.addEventListener("keydown",this._onKeyDown,!1),this.renderer.off("postrender",this.update),this.div.parentNode&&this.div.parentNode.removeChild(this.div))},t.prototype.updateAccessibleObjects=function(t){if(t.visible){t.accessible&&t.interactive&&(t._accessibleActive||this.addChild(t),t.renderId=this.renderId);for(var e=t.children,r=0;rthis.renderer.width&&(t.width=this.renderer.width-t.x),t.y+t.height>this.renderer.height&&(t.height=this.renderer.height-t.y)},t.prototype.addChild=function(t){var e=this.pool.pop();e||(e=document.createElement("button"),e.style.width=c+"px",e.style.height=c+"px",e.style.backgroundColor=this.debug?"rgba(255,0,0,0.5)":"transparent",e.style.position="absolute",e.style.zIndex=p,e.style.borderStyle="none",navigator.userAgent.toLowerCase().indexOf("chrome")>-1?e.setAttribute("aria-live","off"):e.setAttribute("aria-live","polite"),navigator.userAgent.match(/rv:.*Gecko\//)?e.setAttribute("aria-relevant","additions"):e.setAttribute("aria-relevant","text"),e.addEventListener("click",this._onClick.bind(this)),e.addEventListener("focus",this._onFocus.bind(this)),e.addEventListener("focusout",this._onFocusOut.bind(this))),t.accessibleTitle&&null!==t.accessibleTitle?e.title=t.accessibleTitle:t.accessibleHint&&null!==t.accessibleHint||(e.title="displayObject "+t.tabIndex),t.accessibleHint&&null!==t.accessibleHint&&e.setAttribute("aria-label",t.accessibleHint),t._accessibleActive=!0,t._accessibleDiv=e,e.displayObject=t,this.children.push(t),this.div.appendChild(t._accessibleDiv),t._accessibleDiv.tabIndex=t.tabIndex},t.prototype._onClick=function(t){var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"click",e.eventData)},t.prototype._onFocus=function(t){t.target.getAttribute("aria-live","off")||t.target.setAttribute("aria-live","assertive");var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"mouseover",e.eventData)},t.prototype._onFocusOut=function(t){t.target.getAttribute("aria-live","off")||t.target.setAttribute("aria-live","polite");var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"mouseout",e.eventData)},t.prototype._onKeyDown=function(t){9===t.keyCode&&this.activate()},t.prototype._onMouseMove=function(t){0===t.movementX&&0===t.movementY||this.deactivate()},t.prototype.destroy=function(){this.div=null;for(var t=0;t]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i,r.SHAPES={POLY:0,RECT:1,CIRC:2,ELIP:3,RREC:4},r.PRECISION={LOW:"lowp",MEDIUM:"mediump",HIGH:"highp"},r.TRANSFORM_MODE={STATIC:0,DYNAMIC:1},r.TEXT_GRADIENT={LINEAR_VERTICAL:0,LINEAR_HORIZONTAL:1},r.UPDATE_PRIORITY={INTERACTION:50,HIGH:25,NORMAL:0,LOW:-25,UTILITY:-50}},{}],47:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../math"),o=function(){function t(){n(this,t),this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.rect=null}return t.prototype.isEmpty=function(){return this.minX>this.maxX||this.minY>this.maxY},t.prototype.clear=function(){this.updateID++,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0},t.prototype.getRectangle=function(t){return this.minX>this.maxX||this.minY>this.maxY?i.Rectangle.EMPTY:(t=t||new i.Rectangle(0,0,1,1),t.x=this.minX,t.y=this.minY,t.width=this.maxX-this.minX,t.height=this.maxY-this.minY,t)},t.prototype.addPoint=function(t){this.minX=Math.min(this.minX,t.x),this.maxX=Math.max(this.maxX,t.x),this.minY=Math.min(this.minY,t.y),this.maxY=Math.max(this.maxY,t.y)},t.prototype.addQuad=function(t){var e=this.minX,r=this.minY,n=this.maxX,i=this.maxY,o=t[0],s=t[1];e=on?o:n,i=s>i?s:i,o=t[2],s=t[3],e=on?o:n,i=s>i?s:i,o=t[4],s=t[5],e=on?o:n,i=s>i?s:i,o=t[6],s=t[7],e=on?o:n,i=s>i?s:i,this.minX=e,this.minY=r,this.maxX=n,this.maxY=i},t.prototype.addFrame=function(t,e,r,n,i){var o=t.worldTransform,s=o.a,a=o.b,u=o.c,h=o.d,l=o.tx,c=o.ty,d=this.minX,f=this.minY,p=this.maxX,v=this.maxY,g=s*e+u*r+l,y=a*e+h*r+c;d=gp?g:p,v=y>v?y:v,g=s*n+u*r+l,y=a*n+h*r+c,d=gp?g:p,v=y>v?y:v,g=s*e+u*i+l,y=a*e+h*i+c,d=gp?g:p,v=y>v?y:v,g=s*n+u*i+l,y=a*n+h*i+c,d=gp?g:p,v=y>v?y:v,this.minX=d,this.minY=f,this.maxX=p,this.maxY=v},t.prototype.addVertices=function(t,e,r,n){for(var i=t.worldTransform,o=i.a,s=i.b,a=i.c,u=i.d,h=i.tx,l=i.ty,c=this.minX,d=this.minY,f=this.maxX,p=this.maxY,v=r;vf?m:f,p=_>p?_:p}this.minX=c,this.minY=d,this.maxX=f,this.maxY=p},t.prototype.addBounds=function(t){var e=this.minX,r=this.minY,n=this.maxX,i=this.maxY;this.minX=t.minXn?t.maxX:n,this.maxY=t.maxY>i?t.maxY:i},t.prototype.addBoundsMask=function(t,e){var r=t.minX>e.minX?t.minX:e.minX,n=t.minY>e.minY?t.minY:e.minY,i=t.maxXu?i:u,this.maxY=o>h?o:h}},t.prototype.addBoundsArea=function(t,e){var r=t.minX>e.x?t.minX:e.x,n=t.minY>e.y?t.minY:e.y,i=t.maxXu?i:u,this.maxY=o>h?o:h}},t}();r.default=o},{"../math":70}],48:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r1)for(var r=0;rthis.children.length)throw new Error(t+"addChildAt: The index "+e+" supplied is out of bounds "+this.children.length);return t.parent&&t.parent.removeChild(t),t.parent=this,t.transform._parentID=-1,this.children.splice(e,0,t),this._boundsID++,this.onChildrenChange(e),t.emit("added",this),t},e.prototype.swapChildren=function(t,e){if(t!==e){var r=this.getChildIndex(t),n=this.getChildIndex(e);this.children[r]=e,this.children[n]=t,this.onChildrenChange(r=this.children.length)throw new Error("The index "+e+" supplied is out of bounds "+this.children.length);var r=this.getChildIndex(t);(0,a.removeItems)(this.children,r,1),this.children.splice(e,0,t),this.onChildrenChange(e)},e.prototype.getChildAt=function(t){if(t<0||t>=this.children.length)throw new Error("getChildAt: Index ("+t+") does not exist.");return this.children[t]},e.prototype.removeChild=function(t){var e=arguments.length;if(e>1)for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:0,e=arguments[1],r=t,n="number"==typeof e?e:this.children.length,i=n-r,o=void 0;if(i>0&&i<=n){o=this.children.splice(r,i);for(var s=0;s2&&void 0!==arguments[2]&&arguments[2]||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.worldTransform.apply(t,e)},e.prototype.toLocal=function(t,e,r,n){return e&&(t=e.toGlobal(t,r,n)),n||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.worldTransform.applyInverse(t,r)},e.prototype.renderWebGL=function(t){},e.prototype.renderCanvas=function(t){},e.prototype.setParent=function(t){if(!t||!t.addChild)throw new Error("setParent: Argument must be a Container");return t.addChild(this),t},e.prototype.setTransform=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,s=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,a=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,u=arguments.length>8&&void 0!==arguments[8]?arguments[8]:0;return this.position.x=t,this.position.y=e,this.scale.x=r||1,this.scale.y=n||1,this.rotation=i,this.skew.x=o,this.skew.y=s,this.pivot.x=a,this.pivot.y=u,this},e.prototype.destroy=function(){this.removeAllListeners(),this.parent&&this.parent.removeChild(this),this.transform=null,this.parent=null,this._bounds=null,this._currentBounds=null,this._mask=null,this.filterArea=null,this.interactive=!1,this.interactiveChildren=!1,this._destroyed=!0},a(e,[{key:"_tempDisplayObjectParent",get:function(){return null===this.tempDisplayObjectParent&&(this.tempDisplayObjectParent=new e),this.tempDisplayObjectParent}},{key:"x",get:function(){return this.position.x},set:function(t){this.transform.position.x=t}},{key:"y",get:function(){return this.position.y},set:function(t){this.transform.position.y=t}},{key:"worldTransform",get:function(){return this.transform.worldTransform}},{key:"localTransform",get:function(){return this.transform.localTransform}},{key:"position",get:function(){return this.transform.position},set:function(t){this.transform.position.copy(t)}},{key:"scale",get:function(){return this.transform.scale},set:function(t){this.transform.scale.copy(t)}},{key:"pivot",get:function(){return this.transform.pivot},set:function(t){this.transform.pivot.copy(t)}},{key:"skew",get:function(){return this.transform.skew},set:function(t){this.transform.skew.copy(t)}},{key:"rotation",get:function(){return this.transform.rotation},set:function(t){this.transform.rotation=t}},{key:"worldVisible",get:function(){var t=this;do{if(!t.visible)return!1;t=t.parent}while(t);return!0}},{key:"mask",get:function(){return this._mask},set:function(t){this._mask&&(this._mask.renderable=!0,this._mask.isMask=!1),this._mask=t,this._mask&&(this._mask.renderable=!1,this._mask.isMask=!0)}},{key:"filters",get:function(){return this._filters&&this._filters.slice()},set:function(t){this._filters=t&&t.slice()}}]),e}(h.default);r.default=b,b.prototype.displayObjectUpdateTransform=b.prototype.updateTransform},{"../const":46,"../math":70,"../settings":101,"./Bounds":47,"./Transform":50,"./TransformStatic":52,eventemitter3:3}],50:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")} +function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]&&arguments[0];i(this,e);var n=o(this,t.call(this));return n.fillAlpha=1,n.lineWidth=0,n.nativeLines=r,n.lineColor=0,n.lineAlignment=.5,n.graphicsData=[],n.tint=16777215,n._prevTint=16777215,n.blendMode=_.BLEND_MODES.NORMAL,n.currentPath=null,n._webGL={},n.isMask=!1,n.boundsPadding=0,n._localBounds=new x.default,n.dirty=0,n.fastRectDirty=-1,n.clearDirty=0,n.boundsDirty=-1,n.cachedSpriteDirty=!1,n._spriteRect=null,n._fastRect=!1,n._prevRectTint=null,n._prevRectFillColor=null,n}return s(e,t),e.prototype.clone=function(){var t=new e;t.renderable=this.renderable,t.fillAlpha=this.fillAlpha,t.lineWidth=this.lineWidth,t.lineColor=this.lineColor,t.lineAlignment=this.lineAlignment,t.tint=this.tint,t.blendMode=this.blendMode,t.isMask=this.isMask,t.boundsPadding=this.boundsPadding,t.dirty=0,t.cachedSpriteDirty=this.cachedSpriteDirty;for(var r=0;re.CURVES.maxSegments&&(r=e.CURVES.maxSegments),r},e.prototype.lineStyle=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.5;if(this.lineWidth=t,this.lineColor=e,this.lineAlpha=r,this.lineAlignment=n,this.currentPath)if(this.currentPath.shape.points.length){var i=new y.Polygon(this.currentPath.shape.points.slice(-2));i.closed=!1,this.drawShape(i)}else this.currentPath.lineWidth=this.lineWidth,this.currentPath.lineColor=this.lineColor,this.currentPath.lineAlpha=this.lineAlpha,this.currentPath.lineAlignment=this.lineAlignment;return this},e.prototype.moveTo=function(t,e){var r=new y.Polygon([t,e]);return r.closed=!1,this.drawShape(r),this},e.prototype.lineTo=function(t,e){var r=this.currentPath.shape.points,n=r[r.length-2],i=r[r.length-1];return n===t&&i===e||(r.push(t,e),this.dirty++),this},e.prototype.quadraticCurveTo=function(t,r,n,i){this.currentPath?0===this.currentPath.shape.points.length&&(this.currentPath.shape.points=[0,0]):this.moveTo(0,0);var o=this.currentPath.shape.points,s=0,a=0;0===o.length&&this.moveTo(0,0);for(var u=o[o.length-2],h=o[o.length-1],l=e.CURVES.adaptive?this._segmentsCount(this._quadraticCurveLength(u,h,t,r,n,i)):20,c=1;c<=l;++c){var d=c/l;s=u+(t-u)*d,a=h+(r-h)*d,o.push(s+(t+(n-t)*d-s)*d,a+(r+(i-r)*d-a)*d)}return this.dirty++,this},e.prototype.bezierCurveTo=function(t,r,n,i,o,s){this.currentPath?0===this.currentPath.shape.points.length&&(this.currentPath.shape.points=[0,0]):this.moveTo(0,0);var a=this.currentPath.shape.points,u=a[a.length-2],h=a[a.length-1];a.length-=2;var l=e.CURVES.adaptive?this._segmentsCount(this._bezierCurveLength(u,h,t,r,n,i,o,s)):20;return(0,w.default)(u,h,t,r,n,i,o,s,l,a),this.dirty++,this},e.prototype.arcTo=function(t,e,r,n,i){this.currentPath?0===this.currentPath.shape.points.length&&this.currentPath.shape.points.push(t,e):this.moveTo(t,e);var o=this.currentPath.shape.points,s=o[o.length-2],a=o[o.length-1],u=a-e,h=s-t,l=n-e,c=r-t,d=Math.abs(u*c-h*l);if(d<1e-8||0===i)o[o.length-2]===t&&o[o.length-1]===e||o.push(t,e);else{var f=u*u+h*h,p=l*l+c*c,v=u*l+h*c,g=i*Math.sqrt(f)/d,y=i*Math.sqrt(p)/d,m=g*v/f,_=y*v/p,b=g*c+y*h,x=g*l+y*u,T=h*(y+m),w=u*(y+m),E=c*(g+_),S=l*(g+_),O=Math.atan2(w-x,T-b),M=Math.atan2(S-x,E-b);this.arc(b+t,x+e,i,O,M,h*l>c*u)}return this.dirty++,this},e.prototype.arc=function(t,r,n,i,o){var s=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(i===o)return this;!s&&o<=i?o+=_.PI_2:s&&i<=o&&(i+=_.PI_2);var a=o-i,u=e.CURVES.adaptive?this._segmentsCount(Math.abs(a)*n):40*Math.ceil(Math.abs(a)/_.PI_2);if(0===a)return this;var h=t+Math.cos(i)*n,l=r+Math.sin(i)*n,c=this.currentPath?this.currentPath.shape.points:null;if(c){var d=Math.abs(c[c.length-2]-h),f=Math.abs(c[c.length-1]-l);d<.001&&f<.001||c.push(h,l)}else this.moveTo(h,l),c=this.currentPath.shape.points;for(var p=a/(2*u),v=2*p,g=Math.cos(p),y=Math.sin(p),m=u-1,b=m%1/m,x=0;x<=m;++x){var T=x+b*x,w=p+i+v*T,E=Math.cos(w),S=-Math.sin(w);c.push((g*E+y*S)*n+t,(g*-S+y*E)*n+r)}return this.dirty++,this},e.prototype.beginFill=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return this.filling=!0,this.fillColor=t,this.fillAlpha=e,this.currentPath&&this.currentPath.shape.points.length<=2&&(this.currentPath.fill=this.filling,this.currentPath.fillColor=this.fillColor,this.currentPath.fillAlpha=this.fillAlpha),this},e.prototype.endFill=function(){return this.filling=!1,this.fillColor=null,this.fillAlpha=1,this},e.prototype.drawRect=function(t,e,r,n){return this.drawShape(new y.Rectangle(t,e,r,n)),this},e.prototype.drawRoundedRect=function(t,e,r,n,i){return this.drawShape(new y.RoundedRectangle(t,e,r,n,i)),this},e.prototype.drawCircle=function(t,e,r){return this.drawShape(new y.Circle(t,e,r)),this},e.prototype.drawEllipse=function(t,e,r,n){return this.drawShape(new y.Ellipse(t,e,r,n)),this},e.prototype.drawPolygon=function(t){var e=t,r=!0;if(e instanceof y.Polygon&&(r=e.closed,e=e.points),!Array.isArray(e)){e=new Array(arguments.length);for(var n=0;n5&&void 0!==arguments[5]?arguments[5]:0;i=i||n/2;for(var s=-1*Math.PI/2+o,a=2*r,u=_.PI_2/a,h=[],l=0;l0)&&(this.lineWidth=0,this.lineAlignment=.5,this.filling=!1,this.boundsDirty=-1,this.canvasTintDirty=-1,this.dirty++,this.clearDirty++,this.graphicsData.length=0),this.currentPath=null,this._spriteRect=null,this},e.prototype.isFastRect=function(){return 1===this.graphicsData.length&&this.graphicsData[0].shape.type===_.SHAPES.RECT&&!this.graphicsData[0].lineWidth},e.prototype._renderWebGL=function(t){this.dirty!==this.fastRectDirty&&(this.fastRectDirty=this.dirty,this._fastRect=this.isFastRect()),this._fastRect?this._renderSpriteRect(t):(t.setObjectRenderer(t.plugins.graphics),t.plugins.graphics.render(this))},e.prototype._renderSpriteRect=function(t){var e=this.graphicsData[0].shape;this._spriteRect||(this._spriteRect=new g.default(new d.default(d.default.WHITE)));var r=this._spriteRect,n=this.graphicsData[0].fillColor;if(16777215===this.tint)r.tint=n;else if(this.tint!==this._prevRectTint||n!==this._prevRectFillColor){var i=C,o=R;(0,m.hex2rgb)(n,i),(0,m.hex2rgb)(this.tint,o),i[0]*=o[0],i[1]*=o[1],i[2]*=o[2],r.tint=(0,m.rgb2hex)(i),this._prevRectTint=this.tint,this._prevRectFillColor=n}r.alpha=this.graphicsData[0].fillAlpha,r.worldAlpha=this.worldAlpha*r.alpha,r.blendMode=this.blendMode,r._texture._frame.width=e.width,r._texture._frame.height=e.height,r.transform.worldTransform=this.transform.worldTransform,r.anchor.set(-e.x/e.width,-e.y/e.height),r._onAnchorUpdate(),r._renderWebGL(t)},e.prototype._renderCanvas=function(t){!0!==this.isMask&&t.plugins.graphics.render(this)},e.prototype._calculateBounds=function(){this.boundsDirty!==this.dirty&&(this.boundsDirty=this.dirty,this.updateLocalBounds(),this.cachedSpriteDirty=!0);var t=this._localBounds;this._bounds.addFrame(this.transform,t.minX,t.minY,t.maxX,t.maxY)},e.prototype.containsPoint=function(t){this.worldTransform.applyInverse(t,P);for(var e=this.graphicsData,r=0;re?o+a:e,r=sn?s+u:n;else if(c===_.SHAPES.CIRC)o=i.x,s=i.y,a=i.radius+p,u=i.radius+p,t=o-ae?o+a:e,r=s-un?s+u:n;else if(c===_.SHAPES.ELIP)o=i.x,s=i.y,a=i.width+p,u=i.height+p,t=o-ae?o+a:e,r=s-un?s+u:n;else for(var v=i.points,g=0,y=0,m=0,b=0,x=0,T=0,w=0,E=0,S=0;S+2e?w+x:e,r=E-Tn?E+T:n)}else t=0,e=0,r=0,n=0;var O=this.boundsPadding;this._localBounds.minX=t-O,this._localBounds.maxX=e+O,this._localBounds.minY=r-O,this._localBounds.maxY=n+O},e.prototype.drawShape=function(t){this.currentPath&&this.currentPath.shape.points.length<=2&&this.graphicsData.pop(),this.currentPath=null;var e=new p.default(this.lineWidth,this.lineColor,this.lineAlpha,this.fillColor,this.fillAlpha,this.filling,this.nativeLines,t,this.lineAlignment);return this.graphicsData.push(e),e.type===_.SHAPES.POLY&&(e.shape.closed=e.shape.closed,this.currentPath=e),this.dirty++,e},e.prototype.generateCanvasTexture=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=this.getLocalBounds(),n=l.default.create(r.width,r.height,t,e);O||(O=new S.default),this.transform.updateLocalTransform(),this.transform.localTransform.copy(M),M.invert(),M.tx-=r.x,M.ty-=r.y,O.render(this,n,!0,M);var i=d.default.fromCanvas(n.baseTexture._canvasRenderTarget.canvas,t,"graphics");return i.baseTexture.resolution=e,i.baseTexture.update(),i},e.prototype.closePath=function(){var t=this.currentPath;return t&&t.shape&&t.shape.close(),this},e.prototype.addHole=function(){var t=this.graphicsData.pop();return this.currentPath=this.graphicsData[this.graphicsData.length-1],this.currentPath.addHole(t.shape),this.currentPath=null,this},e.prototype.destroy=function(e){t.prototype.destroy.call(this,e);for(var r=0;r0){p=0;for(var y=0;y=2;x-=2)r.lineTo(d[x],d[x+1]);f[m].closed&&r.closePath()}}u.fill&&(r.globalAlpha=u.fillAlpha*n,r.fillStyle="#"+("00000"+(0|l).toString(16)).substr(-6),r.fill()),u.lineWidth&&(r.globalAlpha=u.lineAlpha*n,r.strokeStyle="#"+("00000"+(0|c).toString(16)).substr(-6),r.stroke())}else if(u.type===s.SHAPES.RECT)(u.fillColor||0===u.fillColor)&&(r.globalAlpha=u.fillAlpha*n,r.fillStyle="#"+("00000"+(0|l).toString(16)).substr(-6),r.fillRect(h.x,h.y,h.width,h.height)),u.lineWidth&&(r.globalAlpha=u.lineAlpha*n,r.strokeStyle="#"+("00000"+(0|c).toString(16)).substr(-6),r.strokeRect(h.x,h.y,h.width,h.height));else if(u.type===s.SHAPES.CIRC)r.beginPath(),r.arc(h.x,h.y,h.radius,0,2*Math.PI),r.closePath(),u.fill&&(r.globalAlpha=u.fillAlpha*n,r.fillStyle="#"+("00000"+(0|l).toString(16)).substr(-6),r.fill()),u.lineWidth&&(r.globalAlpha=u.lineAlpha*n,r.strokeStyle="#"+("00000"+(0|c).toString(16)).substr(-6),r.stroke());else if(u.type===s.SHAPES.ELIP){var T=2*h.width,w=2*h.height,E=h.x-T/2,S=h.y-w/2;r.beginPath();var O=T/2*.5522848,M=w/2*.5522848,P=E+T,C=S+w,R=E+T/2,A=S+w/2;r.moveTo(E,A),r.bezierCurveTo(E,A-M,R-O,S,R,S),r.bezierCurveTo(R+O,S,P,A-M,P,A),r.bezierCurveTo(P,A+M,R+O,C,R,C),r.bezierCurveTo(R-O,C,E,A+M,E,A),r.closePath(),u.fill&&(r.globalAlpha=u.fillAlpha*n,r.fillStyle="#"+("00000"+(0|l).toString(16)).substr(-6),r.fill()),u.lineWidth&&(r.globalAlpha=u.lineAlpha*n,r.strokeStyle="#"+("00000"+(0|c).toString(16)).substr(-6),r.stroke())}else if(u.type===s.SHAPES.RREC){var I=h.x,D=h.y,L=h.width,N=h.height,B=h.radius,k=Math.min(L,N)/2|0;B=B>k?k:B,r.beginPath(),r.moveTo(I,D+B),r.lineTo(I,D+N-B),r.quadraticCurveTo(I,D+N,I+B,D+N),r.lineTo(I+L-B,D+N),r.quadraticCurveTo(I+L,D+N,I+L,D+N-B),r.lineTo(I+L,D+B),r.quadraticCurveTo(I+L,D,I+L-B,D),r.lineTo(I+B,D),r.quadraticCurveTo(I,D,I,D+B),r.closePath(),(u.fillColor||0===u.fillColor)&&(r.globalAlpha=u.fillAlpha*n,r.fillStyle="#"+("00000"+(0|l).toString(16)).substr(-6),r.fill()),u.lineWidth&&(r.globalAlpha=u.lineAlpha*n,r.strokeStyle="#"+("00000"+(0|c).toString(16)).substr(-6),r.stroke())}}},t.prototype.updateGraphicsTint=function(t){t._prevTint=t.tint,t.canvasTintDirty=t.dirty;for(var e=(t.tint>>16&255)/255,r=(t.tint>>8&255)/255,n=(255&t.tint)/255,i=0;i>16&255)/255*e*255<<16)+((s>>8&255)/255*r*255<<8)+(255&s)/255*n*255,o._lineTint=((a>>16&255)/255*e*255<<16)+((a>>8&255)/255*r*255<<8)+(255&a)/255*n*255}},t.prototype.renderPolygon=function(t,e,r){r.moveTo(t[0],t[1]);for(var n=1;n9&&void 0!==arguments[9]?arguments[9]:[],l=0,c=0,d=0,f=0,p=0;h.push(t,e);for(var v=1,g=0;v<=u;++v)g=v/u,l=1-g,c=l*l,d=c*l,f=g*g,p=f*g,h.push(d*t+3*c*g*r+3*l*f*i+p*s,d*e+3*c*g*n+3*l*f*o+p*a);return h}r.__esModule=!0,r.default=n},{}],57:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("../../utils"),u=t("../../const"),h=t("../../renderers/webgl/utils/ObjectRenderer"),l=n(h),c=t("../../renderers/webgl/WebGLRenderer"),d=n(c),f=t("./WebGLGraphicsData"),p=n(f),v=t("./shaders/PrimitiveShader"),g=n(v),y=t("./utils/buildPoly"),m=n(y),_=t("./utils/buildRectangle"),b=n(_),x=t("./utils/buildRoundedRectangle"),T=n(x),w=t("./utils/buildCircle"),E=n(w),S=function(t){function e(r){i(this,e);var n=o(this,t.call(this,r));return n.graphicsDataPool=[],n.primitiveShader=null,n.gl=r.gl,n.CONTEXT_UID=0,n}return s(e,t),e.prototype.onContextChange=function(){this.gl=this.renderer.gl,this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.primitiveShader=new g.default(this.gl)},e.prototype.destroy=function(){l.default.prototype.destroy.call(this);for(var t=0;t32e4)&&(n=this.graphicsDataPool.pop()||new p.default(this.renderer.gl,this.primitiveShader,this.renderer.state.attribsState),n.nativeLines=r,n.reset(e),t.data.push(n)),n.dirty=!0,n},e}(l.default);r.default=S,d.default.registerPlugin("graphics",S)},{"../../const":46,"../../renderers/webgl/WebGLRenderer":84,"../../renderers/webgl/utils/ObjectRenderer":94,"../../utils":125,"./WebGLGraphicsData":58,"./shaders/PrimitiveShader":59,"./utils/buildCircle":60,"./utils/buildPoly":62,"./utils/buildRectangle":63,"./utils/buildRoundedRectangle":64}],58:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("pixi-gl-core"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=function(){function t(e,r,i){n(this,t),this.gl=e,this.color=[0,0,0],this.points=[],this.indices=[],this.buffer=o.default.GLBuffer.createVertexBuffer(e),this.indexBuffer=o.default.GLBuffer.createIndexBuffer(e),this.dirty=!0,this.nativeLines=!1,this.glPoints=null,this.glIndices=null,this.shader=r,this.vao=new o.default.VertexArrayObject(e,i).addIndex(this.indexBuffer).addAttribute(this.buffer,r.attributes.aVertexPosition,e.FLOAT,!1,24,0).addAttribute(this.buffer,r.attributes.aColor,e.FLOAT,!1,24,8)}return t.prototype.reset=function(){this.points.length=0,this.indices.length=0},t.prototype.upload=function(){this.glPoints=new Float32Array(this.points),this.buffer.upload(this.glPoints),this.glIndices=new Uint16Array(this.indices),this.indexBuffer.upload(this.glIndices),this.dirty=!1},t.prototype.destroy=function(){this.color=null,this.points=null,this.indices=null,this.vao.destroy(),this.buffer.destroy(),this.indexBuffer.destroy(),this.gl=null,this.buffer=null,this.indexBuffer=null,this.glPoints=null,this.glIndices=null},t}();r.default=s},{"pixi-gl-core":15}],59:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=t("../../../Shader"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=function(t){function e(r){return n(this,e),i(this,t.call(this,r,["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform mat3 projectionMatrix;","uniform float alpha;","uniform vec3 tint;","varying vec4 vColor;","void main(void){"," gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);"," vColor = aColor * vec4(tint * alpha, alpha);","}"].join("\n"),["varying vec4 vColor;","void main(void){"," gl_FragColor = vColor;","}"].join("\n")))}return o(e,t),e}(a.default);r.default=u},{"../../../Shader":44}],60:[function(t,e,r){"use strict";function n(t,e,r){var n=t.shape,i=n.x,u=n.y,h=void 0,l=void 0;if(t.type===s.SHAPES.CIRC?(h=n.radius,l=n.radius):(h=n.width,l=n.height),0!==h&&0!==l){var c=Math.floor(30*Math.sqrt(n.radius))||Math.floor(15*Math.sqrt(n.width+n.height)),d=2*Math.PI/c;if(t.fill){var f=(0,a.hex2rgb)(t.fillColor),p=t.fillAlpha,v=f[0]*p,g=f[1]*p,y=f[2]*p,m=e.points,_=e.indices,b=m.length/6;_.push(b);for(var x=0;x196*p*p?(R=O-P,A=M-C,I=Math.sqrt(R*R+A*A),R/=I,A/=I,R*=p,A*=p,h.push(T-R*L,w-A*L),h.push(y,m,_,g),h.push(T+R*N,w+A*N),h.push(y,m,_,g), +h.push(T-R*N*L,w-A*L),h.push(y,m,_,g),d++):(h.push(T+(H-T)*L,w+(Y-w)*L),h.push(y,m,_,g),h.push(T-(H-T)*N,w-(Y-w)*N),h.push(y,m,_,g))}}b=r[2*(c-2)],x=r[2*(c-2)+1],T=r[2*(c-1)],w=r[2*(c-1)+1],O=-(x-w),M=b-T,I=Math.sqrt(O*O+M*M),O/=I,M/=I,O*=p,M*=p,h.push(T-O*L,w-M*L),h.push(y,m,_,g),h.push(T+O*N,w+M*N),h.push(y,m,_,g),l.push(f);for(var V=0;V=6){for(var i=[],o=t.holes,u=0;u0&&(0,s.default)(t,e,r)}r.__esModule=!0,r.default=i;var o=t("./buildLine"),s=n(o),a=t("../../../utils"),u=t("earcut"),h=n(u)},{"../../../utils":125,"./buildLine":61,earcut:2}],63:[function(t,e,r){"use strict";function n(t,e,r){var n=t.shape,i=n.x,a=n.y,u=n.width,h=n.height;if(t.fill){var l=(0,s.hex2rgb)(t.fillColor),c=t.fillAlpha,d=l[0]*c,f=l[1]*c,p=l[2]*c,v=e.points,g=e.indices,y=v.length/6;v.push(i,a),v.push(d,f,p,c),v.push(i+u,a),v.push(d,f,p,c),v.push(i,a+h),v.push(d,f,p,c),v.push(i+u,a+h),v.push(d,f,p,c),g.push(y,y,y+1,y+2,y+3,y+3)}if(t.lineWidth){var m=t.points;t.points=[i,a,i+u,a,i+u,a+h,i,a+h,i,a],(0,o.default)(t,e,r),t.points=m}}r.__esModule=!0,r.default=n;var i=t("./buildLine"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../../utils")},{"../../../utils":125,"./buildLine":61}],64:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e,r){var n=t.shape,i=n.x,o=n.y,a=n.width,h=n.height,d=n.radius,f=[];if(f.push(i+d,o),s(i+a-d,o,i+a,o,i+a,o+d,f),s(i+a,o+h-d,i+a,o+h,i+a-d,o+h,f),s(i+d,o+h,i,o+h,i,o+h-d,f),s(i,o+d,i,o,i+d+1e-10,o,f),t.fill){for(var p=(0,c.hex2rgb)(t.fillColor),v=t.fillAlpha,g=p[0]*v,y=p[1]*v,m=p[2]*v,_=e.points,b=e.indices,x=_.length/6,T=(0,u.default)(f,null,2),w=0,E=T.length;w6&&void 0!==arguments[6]?arguments[6]:[],u=a,h=0,l=0,c=0,d=0,f=0,p=0,v=0,g=0;v<=20;++v)g=v/20,h=o(t,r,g),l=o(e,n,g),c=o(r,i,g),d=o(n,s,g),f=o(h,c,g),p=o(l,d,g),u.push(f,p);return u}r.__esModule=!0,r.default=i;var a=t("earcut"),u=n(a),h=t("./buildLine"),l=n(h),c=t("../../../utils")},{"../../../utils":125,"./buildLine":61,earcut:2}],65:[function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0,r.autoDetectRenderer=r.Application=r.Filter=r.SpriteMaskFilter=r.Quad=r.RenderTarget=r.ObjectRenderer=r.WebGLManager=r.Shader=r.CanvasRenderTarget=r.TextureUvs=r.VideoBaseTexture=r.BaseRenderTexture=r.RenderTexture=r.BaseTexture=r.TextureMatrix=r.Texture=r.Spritesheet=r.CanvasGraphicsRenderer=r.GraphicsRenderer=r.GraphicsData=r.Graphics=r.TextMetrics=r.TextStyle=r.Text=r.SpriteRenderer=r.CanvasTinter=r.CanvasSpriteRenderer=r.Sprite=r.TransformBase=r.TransformStatic=r.Transform=r.Container=r.DisplayObject=r.Bounds=r.glCore=r.WebGLRenderer=r.CanvasRenderer=r.ticker=r.utils=r.settings=void 0;var o=t("./const");Object.keys(o).forEach(function(t){"default"!==t&&"__esModule"!==t&&Object.defineProperty(r,t,{enumerable:!0,get:function(){return o[t]}})});var s=t("./math");Object.keys(s).forEach(function(t){"default"!==t&&"__esModule"!==t&&Object.defineProperty(r,t,{enumerable:!0,get:function(){return s[t]}})});var a=t("pixi-gl-core");Object.defineProperty(r,"glCore",{enumerable:!0,get:function(){return i(a).default}});var u=t("./display/Bounds");Object.defineProperty(r,"Bounds",{enumerable:!0,get:function(){return i(u).default}});var h=t("./display/DisplayObject");Object.defineProperty(r,"DisplayObject",{enumerable:!0,get:function(){return i(h).default}});var l=t("./display/Container");Object.defineProperty(r,"Container",{enumerable:!0,get:function(){return i(l).default}});var c=t("./display/Transform");Object.defineProperty(r,"Transform",{enumerable:!0,get:function(){return i(c).default}});var d=t("./display/TransformStatic");Object.defineProperty(r,"TransformStatic",{enumerable:!0,get:function(){return i(d).default}});var f=t("./display/TransformBase");Object.defineProperty(r,"TransformBase",{enumerable:!0,get:function(){return i(f).default}});var p=t("./sprites/Sprite");Object.defineProperty(r,"Sprite",{enumerable:!0,get:function(){return i(p).default}});var v=t("./sprites/canvas/CanvasSpriteRenderer");Object.defineProperty(r,"CanvasSpriteRenderer",{enumerable:!0,get:function(){return i(v).default}});var g=t("./sprites/canvas/CanvasTinter");Object.defineProperty(r,"CanvasTinter",{enumerable:!0,get:function(){return i(g).default}});var y=t("./sprites/webgl/SpriteRenderer");Object.defineProperty(r,"SpriteRenderer",{enumerable:!0,get:function(){return i(y).default}});var m=t("./text/Text");Object.defineProperty(r,"Text",{enumerable:!0,get:function(){return i(m).default}});var _=t("./text/TextStyle");Object.defineProperty(r,"TextStyle",{enumerable:!0,get:function(){return i(_).default}});var b=t("./text/TextMetrics");Object.defineProperty(r,"TextMetrics",{enumerable:!0,get:function(){return i(b).default}});var x=t("./graphics/Graphics");Object.defineProperty(r,"Graphics",{enumerable:!0,get:function(){return i(x).default}});var T=t("./graphics/GraphicsData");Object.defineProperty(r,"GraphicsData",{enumerable:!0,get:function(){return i(T).default}});var w=t("./graphics/webgl/GraphicsRenderer");Object.defineProperty(r,"GraphicsRenderer",{enumerable:!0,get:function(){return i(w).default}});var E=t("./graphics/canvas/CanvasGraphicsRenderer");Object.defineProperty(r,"CanvasGraphicsRenderer",{enumerable:!0,get:function(){return i(E).default}});var S=t("./textures/Spritesheet");Object.defineProperty(r,"Spritesheet",{enumerable:!0,get:function(){return i(S).default}});var O=t("./textures/Texture");Object.defineProperty(r,"Texture",{enumerable:!0,get:function(){return i(O).default}});var M=t("./textures/TextureMatrix");Object.defineProperty(r,"TextureMatrix",{enumerable:!0,get:function(){return i(M).default}});var P=t("./textures/BaseTexture");Object.defineProperty(r,"BaseTexture",{enumerable:!0,get:function(){return i(P).default}});var C=t("./textures/RenderTexture");Object.defineProperty(r,"RenderTexture",{enumerable:!0,get:function(){return i(C).default}});var R=t("./textures/BaseRenderTexture");Object.defineProperty(r,"BaseRenderTexture",{enumerable:!0,get:function(){return i(R).default}});var A=t("./textures/VideoBaseTexture");Object.defineProperty(r,"VideoBaseTexture",{enumerable:!0,get:function(){return i(A).default}});var I=t("./textures/TextureUvs");Object.defineProperty(r,"TextureUvs",{enumerable:!0,get:function(){return i(I).default}});var D=t("./renderers/canvas/utils/CanvasRenderTarget");Object.defineProperty(r,"CanvasRenderTarget",{enumerable:!0,get:function(){return i(D).default}});var L=t("./Shader");Object.defineProperty(r,"Shader",{enumerable:!0,get:function(){return i(L).default}});var N=t("./renderers/webgl/managers/WebGLManager");Object.defineProperty(r,"WebGLManager",{enumerable:!0,get:function(){return i(N).default}});var B=t("./renderers/webgl/utils/ObjectRenderer");Object.defineProperty(r,"ObjectRenderer",{enumerable:!0,get:function(){return i(B).default}});var k=t("./renderers/webgl/utils/RenderTarget");Object.defineProperty(r,"RenderTarget",{enumerable:!0,get:function(){return i(k).default}});var F=t("./renderers/webgl/utils/Quad");Object.defineProperty(r,"Quad",{enumerable:!0,get:function(){return i(F).default}});var j=t("./renderers/webgl/filters/spriteMask/SpriteMaskFilter");Object.defineProperty(r,"SpriteMaskFilter",{enumerable:!0,get:function(){return i(j).default}});var U=t("./renderers/webgl/filters/Filter");Object.defineProperty(r,"Filter",{enumerable:!0,get:function(){return i(U).default}});var X=t("./Application");Object.defineProperty(r,"Application",{enumerable:!0,get:function(){return i(X).default}});var G=t("./autoDetectRenderer");Object.defineProperty(r,"autoDetectRenderer",{enumerable:!0,get:function(){return G.autoDetectRenderer}});var W=t("./utils"),H=n(W),Y=t("./ticker"),V=n(Y),z=t("./settings"),q=i(z),K=t("./renderers/canvas/CanvasRenderer"),Z=i(K),J=t("./renderers/webgl/WebGLRenderer"),Q=i(J);r.settings=q.default,r.utils=H,r.ticker=V,r.CanvasRenderer=Z.default,r.WebGLRenderer=Q.default},{"./Application":43,"./Shader":44,"./autoDetectRenderer":45,"./const":46,"./display/Bounds":47,"./display/Container":48,"./display/DisplayObject":49,"./display/Transform":50,"./display/TransformBase":51,"./display/TransformStatic":52,"./graphics/Graphics":53,"./graphics/GraphicsData":54,"./graphics/canvas/CanvasGraphicsRenderer":55,"./graphics/webgl/GraphicsRenderer":57,"./math":70,"./renderers/canvas/CanvasRenderer":77,"./renderers/canvas/utils/CanvasRenderTarget":79,"./renderers/webgl/WebGLRenderer":84,"./renderers/webgl/filters/Filter":86,"./renderers/webgl/filters/spriteMask/SpriteMaskFilter":89,"./renderers/webgl/managers/WebGLManager":93,"./renderers/webgl/utils/ObjectRenderer":94,"./renderers/webgl/utils/Quad":95,"./renderers/webgl/utils/RenderTarget":96,"./settings":101,"./sprites/Sprite":102,"./sprites/canvas/CanvasSpriteRenderer":103,"./sprites/canvas/CanvasTinter":104,"./sprites/webgl/SpriteRenderer":106,"./text/Text":108,"./text/TextMetrics":109,"./text/TextStyle":110,"./textures/BaseRenderTexture":111,"./textures/BaseTexture":112,"./textures/RenderTexture":113,"./textures/Spritesheet":114,"./textures/Texture":115,"./textures/TextureMatrix":116,"./textures/TextureUvs":117,"./textures/VideoBaseTexture":118,"./ticker":121,"./utils":125,"pixi-gl-core":15}],66:[function(t,e,r){"use strict";function n(t){return t<0?-1:t>0?1:0}r.__esModule=!0;var i=t("./Matrix"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=[1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1],a=[0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1],u=[0,-1,-1,-1,0,1,1,1,0,1,1,1,0,-1,-1,-1],h=[1,1,0,-1,-1,-1,0,1,-1,-1,0,1,1,1,0,-1],l=[],c=[];!function(){for(var t=0;t<16;t++){var e=[];c.push(e);for(var r=0;r<16;r++)for(var i=n(s[t]*s[r]+u[t]*a[r]),d=n(a[t]*s[r]+h[t]*a[r]),f=n(s[t]*u[r]+u[t]*h[r]),p=n(a[t]*u[r]+h[t]*h[r]),v=0;v<16;v++)if(s[v]===i&&a[v]===d&&u[v]===f&&h[v]===p){e.push(v);break}}for(var g=0;g<16;g++){var y=new o.default;y.set(s[g],a[g],u[g],h[g],0,0),l.push(y)}}();var d={E:0,SE:1,S:2,SW:3,W:4,NW:5,N:6,NE:7,MIRROR_VERTICAL:8,MIRROR_HORIZONTAL:12,uX:function(t){return s[t]},uY:function(t){return a[t]},vX:function(t){return u[t]},vY:function(t){return h[t]},inv:function(t){return 8&t?15&t:7&-t},add:function(t,e){return c[t][e]},sub:function(t,e){return c[t][d.inv(e)]},rotate180:function(t){return 4^t},isVertical:function(t){return 2==(3&t)},byDirection:function(t,e){return 2*Math.abs(t)<=Math.abs(e)?e>=0?d.S:d.N:2*Math.abs(e)<=Math.abs(t)?t>0?d.E:d.W:e>0?t>0?d.SE:d.SW:t>0?d.NE:d.NW},matrixAppendRotationInv:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=l[d.inv(e)];i.tx=r,i.ty=n,t.append(i)}};r.default=d},{"./Matrix":67}],67:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:1,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;n(this,t),this.a=e,this.b=r,this.c=i,this.d=o,this.tx=s,this.ty=a,this.array=null}return t.prototype.fromArray=function(t){this.a=t[0],this.b=t[1],this.c=t[3],this.d=t[4],this.tx=t[2],this.ty=t[5]},t.prototype.set=function(t,e,r,n,i,o){return this.a=t,this.b=e,this.c=r,this.d=n,this.tx=i,this.ty=o,this},t.prototype.toArray=function(t,e){this.array||(this.array=new Float32Array(9));var r=e||this.array;return t?(r[0]=this.a,r[1]=this.b,r[2]=0,r[3]=this.c,r[4]=this.d,r[5]=0,r[6]=this.tx,r[7]=this.ty,r[8]=1):(r[0]=this.a,r[1]=this.c,r[2]=this.tx,r[3]=this.b,r[4]=this.d,r[5]=this.ty,r[6]=0,r[7]=0,r[8]=1),r},t.prototype.apply=function(t,e){e=e||new s.default;var r=t.x,n=t.y;return e.x=this.a*r+this.c*n+this.tx,e.y=this.b*r+this.d*n+this.ty,e},t.prototype.applyInverse=function(t,e){e=e||new s.default;var r=1/(this.a*this.d+this.c*-this.b),n=t.x,i=t.y;return e.x=this.d*r*n+-this.c*r*i+(this.ty*this.c-this.tx*this.d)*r,e.y=this.a*r*i+-this.b*r*n+(-this.ty*this.a+this.tx*this.b)*r,e},t.prototype.translate=function(t,e){return this.tx+=t,this.ty+=e,this},t.prototype.scale=function(t,e){return this.a*=t,this.d*=e,this.c*=t,this.b*=e,this.tx*=t,this.ty*=e,this},t.prototype.rotate=function(t){var e=Math.cos(t),r=Math.sin(t),n=this.a,i=this.c,o=this.tx;return this.a=n*e-this.b*r,this.b=n*r+this.b*e,this.c=i*e-this.d*r,this.d=i*r+this.d*e,this.tx=o*e-this.ty*r,this.ty=o*r+this.ty*e,this},t.prototype.append=function(t){var e=this.a,r=this.b,n=this.c,i=this.d;return this.a=t.a*e+t.b*n,this.b=t.a*r+t.b*i,this.c=t.c*e+t.d*n,this.d=t.c*r+t.d*i,this.tx=t.tx*e+t.ty*n+this.tx,this.ty=t.tx*r+t.ty*i+this.ty,this},t.prototype.setTransform=function(t,e,r,n,i,o,s,a,u){return this.a=Math.cos(s+u)*i,this.b=Math.sin(s+u)*i,this.c=-Math.sin(s-a)*o,this.d=Math.cos(s-a)*o,this.tx=t-(r*this.a+n*this.c),this.ty=e-(r*this.b+n*this.d),this},t.prototype.prepend=function(t){var e=this.tx;if(1!==t.a||0!==t.b||0!==t.c||1!==t.d){var r=this.a,n=this.c;this.a=r*t.a+this.b*t.c,this.b=r*t.b+this.b*t.d,this.c=n*t.a+this.d*t.c,this.d=n*t.b+this.d*t.d}return this.tx=e*t.a+this.ty*t.c+t.tx,this.ty=e*t.b+this.ty*t.d+t.ty,this},t.prototype.decompose=function(t){var e=this.a,r=this.b,n=this.c,i=this.d,o=-Math.atan2(-n,i),s=Math.atan2(r,e),u=Math.abs(o+s);return u<1e-5||Math.abs(a.PI_2-u)<1e-5?(t.rotation=s,e<0&&i>=0&&(t.rotation+=t.rotation<=0?Math.PI:-Math.PI),t.skew.x=t.skew.y=0):(t.rotation=0,t.skew.x=o,t.skew.y=s),t.scale.x=Math.sqrt(e*e+r*r),t.scale.y=Math.sqrt(n*n+i*i),t.position.x=this.tx,t.position.y=this.ty,t},t.prototype.invert=function(){var t=this.a,e=this.b,r=this.c,n=this.d,i=this.tx,o=t*n-e*r;return this.a=n/o,this.b=-e/o,this.c=-r/o,this.d=t/o,this.tx=(r*this.ty-n*i)/o,this.ty=-(t*this.ty-e*i)/o,this},t.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},t.prototype.clone=function(){var e=new t;return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e},t.prototype.copy=function(t){return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t},i(t,null,[{key:"IDENTITY",get:function(){return new t}},{key:"TEMP_MATRIX",get:function(){return new t}}]),t}();r.default=u},{"../const":46,"./Point":69}],68:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;n(this,t),this._x=i,this._y=o,this.cb=e,this.scope=r}return t.prototype.clone=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return new t(e||this.cb,r||this.scope,this._x,this._y)},t.prototype.set=function(t,e){var r=t||0,n=e||(0!==e?r:0);this._x===r&&this._y===n||(this._x=r,this._y=n,this.cb.call(this.scope))},t.prototype.copy=function(t){this._x===t.x&&this._y===t.y||(this._x=t.x,this._y=t.y,this.cb.call(this.scope))},t.prototype.equals=function(t){return t.x===this._x&&t.y===this._y},i(t,[{key:"x",get:function(){return this._x},set:function(t){this._x!==t&&(this._x=t,this.cb.call(this.scope))}},{key:"y",get:function(){return this._y},set:function(t){this._y!==t&&(this._y=t,this.cb.call(this.scope))}}]),t}();r.default=o},{}],69:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;n(this,t),this.x=e,this.y=r}return t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.copy=function(t){this.set(t.x,t.y)},t.prototype.equals=function(t){return t.x===this.x&&t.y===this.y},t.prototype.set=function(t,e){this.x=t||0,this.y=e||(0!==e?this.x:0)},t}();r.default=i},{}],70:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./Point");Object.defineProperty(r,"Point",{enumerable:!0,get:function(){return n(i).default}});var o=t("./ObservablePoint");Object.defineProperty(r,"ObservablePoint",{enumerable:!0,get:function(){return n(o).default}});var s=t("./Matrix");Object.defineProperty(r,"Matrix",{enumerable:!0,get:function(){return n(s).default}});var a=t("./GroupD8");Object.defineProperty(r,"GroupD8",{enumerable:!0,get:function(){return n(a).default}});var u=t("./shapes/Circle");Object.defineProperty(r,"Circle",{enumerable:!0,get:function(){return n(u).default}});var h=t("./shapes/Ellipse");Object.defineProperty(r,"Ellipse",{enumerable:!0,get:function(){return n(h).default}});var l=t("./shapes/Polygon");Object.defineProperty(r,"Polygon",{enumerable:!0,get:function(){return n(l).default}});var c=t("./shapes/Rectangle");Object.defineProperty(r,"Rectangle",{enumerable:!0,get:function(){return n(c).default}});var d=t("./shapes/RoundedRectangle");Object.defineProperty(r,"RoundedRectangle",{enumerable:!0,get:function(){return n(d).default}})},{"./GroupD8":66,"./Matrix":67,"./ObservablePoint":68,"./Point":69,"./shapes/Circle":71,"./shapes/Ellipse":72,"./shapes/Polygon":73,"./shapes/Rectangle":74,"./shapes/RoundedRectangle":75}],71:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("./Rectangle"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../const"),a=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;n(this,t),this.x=e,this.y=r,this.radius=i,this.type=s.SHAPES.CIRC}return t.prototype.clone=function(){return new t(this.x,this.y,this.radius)},t.prototype.contains=function(t,e){if(this.radius<=0)return!1;var r=this.radius*this.radius,n=this.x-t,i=this.y-e;return n*=n,i*=i,n+i<=r},t.prototype.getBounds=function(){return new o.default(this.x-this.radius,this.y-this.radius,2*this.radius,2*this.radius)},t}();r.default=a},{"../../const":46,"./Rectangle":74}],72:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("./Rectangle"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../const"),a=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;n(this,t),this.x=e,this.y=r,this.width=i,this.height=o,this.type=s.SHAPES.ELIP}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;var r=(t-this.x)/this.width,n=(e-this.y)/this.height;return r*=r,n*=n,r+n<=1},t.prototype.getBounds=function(){return new o.default(this.x-this.width,this.y-this.height,this.width,this.height)},t}();r.default=a},{"../../const":46,"./Rectangle":74}],73:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../Point"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../const"),a=function(){function t(){for(var e=arguments.length,r=Array(e),i=0;ie!=h>e&&t<(e-a)/(h-a)*(u-s)+s&&(r=!r)}return r},t}();r.default=a},{"../../const":46,"../Point":69}],74:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;n(this,t),this.x=Number(e),this.y=Number(r),this.width=Number(i),this.height=Number(s),this.type=o.SHAPES.RECT}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this},t.prototype.contains=function(t,e){return!(this.width<=0||this.height<=0)&&(t>=this.x&&t=this.y&&e0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.001,r=Math.ceil((this.x+this.width-e)*t)/t,n=Math.ceil((this.y+this.height-e)*t)/t;this.x=Math.floor((this.x+e)*t)/t,this.y=Math.floor((this.y+e)*t)/t,this.width=r-this.x,this.height=n-this.y},i(t,[{key:"left",get:function(){return this.x}},{key:"right",get:function(){return this.x+this.width}},{key:"top",get:function(){return this.y}},{key:"bottom",get:function(){return this.y+this.height}}],[{key:"EMPTY",get:function(){return new t(0,0,0,0)}}]),t}();r.default=s},{"../../const":46}],75:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../../const"),o=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:20;n(this,t),this.x=e,this.y=r,this.width=o,this.height=s,this.radius=a,this.type=i.SHAPES.RREC}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height,this.radius)},t.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;if(t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height){if(e>=this.y+this.radius&&e<=this.y+this.height-this.radius||t>=this.x+this.radius&&t<=this.x+this.width-this.radius)return!0;var r=t-(this.x+this.radius),n=e-(this.y+this.radius),i=this.radius*this.radius;if(r*r+n*n<=i)return!0;if((r=t-(this.x+this.width-this.radius))*r+n*n<=i)return!0;if(n=e-(this.y+this.height-this.radius),r*r+n*n<=i)return!0;if((r=t-(this.x+this.radius))*r+n*n<=i)return!0}return!1},t}();r.default=o},{"../../const":46}],76:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=function(){function t(t,e){for(var r=0;r0){h=0;for(var d=0;d=2;g-=2)e.lineTo(a[g],a[g+1])}}}else if(o.type===i.SHAPES.RECT)e.rect(s.x,s.y,s.width,s.height),e.closePath();else if(o.type===i.SHAPES.CIRC)e.arc(s.x,s.y,s.radius,0,2*Math.PI),e.closePath();else if(o.type===i.SHAPES.ELIP){var y=2*s.width,m=2*s.height,_=s.x-y/2,b=s.y-m/2,x=y/2*.5522848,T=m/2*.5522848,w=_+y,E=b+m,S=_+y/2,O=b+m/2;e.moveTo(_,O),e.bezierCurveTo(_,O-T,S-x,b,S,b),e.bezierCurveTo(S+x,b,w,O-T,w,O),e.bezierCurveTo(w,O+T,S+x,E,S,E),e.bezierCurveTo(S-x,E,_,O+T,_,O),e.closePath()}else if(o.type===i.SHAPES.RREC){var M=s.x,P=s.y,C=s.width,R=s.height,A=s.radius,I=Math.min(C,R)/2|0;A=A>I?I:A,e.moveTo(M,P+A),e.lineTo(M,P+R-A),e.quadraticCurveTo(M,P+R,M+A,P+R),e.lineTo(M+C-A,P+R),e.quadraticCurveTo(M+C,P+R,M+C,P+R-A),e.lineTo(M+C,P+A),e.quadraticCurveTo(M+C,P,M+C-A,P),e.lineTo(M+A,P),e.quadraticCurveTo(M,P,M,P+A),e.closePath()}}}},t.prototype.popMask=function(t){t.context.restore(),t.invalidateBlendMode()},t.prototype.destroy=function(){},t}();r.default=o},{"../../../const":46}],79:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:[];return(0,s.default)()?(t[i.BLEND_MODES.NORMAL]="source-over",t[i.BLEND_MODES.ADD]="lighter",t[i.BLEND_MODES.MULTIPLY]="multiply",t[i.BLEND_MODES.SCREEN]="screen",t[i.BLEND_MODES.OVERLAY]="overlay",t[i.BLEND_MODES.DARKEN]="darken",t[i.BLEND_MODES.LIGHTEN]="lighten",t[i.BLEND_MODES.COLOR_DODGE]="color-dodge",t[i.BLEND_MODES.COLOR_BURN]="color-burn",t[i.BLEND_MODES.HARD_LIGHT]="hard-light",t[i.BLEND_MODES.SOFT_LIGHT]="soft-light",t[i.BLEND_MODES.DIFFERENCE]="difference",t[i.BLEND_MODES.EXCLUSION]="exclusion",t[i.BLEND_MODES.HUE]="hue",t[i.BLEND_MODES.SATURATION]="saturate",t[i.BLEND_MODES.COLOR]="color",t[i.BLEND_MODES.LUMINOSITY]="luminosity"):(t[i.BLEND_MODES.NORMAL]="source-over",t[i.BLEND_MODES.ADD]="lighter",t[i.BLEND_MODES.MULTIPLY]="source-over",t[i.BLEND_MODES.SCREEN]="source-over",t[i.BLEND_MODES.OVERLAY]="source-over",t[i.BLEND_MODES.DARKEN]="source-over",t[i.BLEND_MODES.LIGHTEN]="source-over",t[i.BLEND_MODES.COLOR_DODGE]="source-over",t[i.BLEND_MODES.COLOR_BURN]="source-over",t[i.BLEND_MODES.HARD_LIGHT]="source-over",t[i.BLEND_MODES.SOFT_LIGHT]="source-over",t[i.BLEND_MODES.DIFFERENCE]="source-over",t[i.BLEND_MODES.EXCLUSION]="source-over",t[i.BLEND_MODES.HUE]="source-over",t[i.BLEND_MODES.SATURATION]="source-over",t[i.BLEND_MODES.COLOR]="source-over",t[i.BLEND_MODES.LUMINOSITY]="source-over"),t[i.BLEND_MODES.NORMAL_NPM]=t[i.BLEND_MODES.NORMAL],t[i.BLEND_MODES.ADD_NPM]=t[i.BLEND_MODES.ADD],t[i.BLEND_MODES.SCREEN_NPM]=t[i.BLEND_MODES.SCREEN],t}r.__esModule=!0,r.default=n;var i=t("../../../const"),o=t("./canUseNewCanvasBlendModes"),s=function(t){return t&&t.__esModule?t:{default:t}}(o)},{"../../../const":46,"./canUseNewCanvasBlendModes":80}],82:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../../const"),o=t("../../settings"),s=function(t){return t&&t.__esModule?t:{default:t}}(o),a=function(){function t(e){n(this,t),this.renderer=e,this.count=0,this.checkCount=0,this.maxIdle=s.default.GC_MAX_IDLE,this.checkCountMax=s.default.GC_MAX_CHECK_COUNT,this.mode=s.default.GC_MODE}return t.prototype.update=function(){this.count++,this.mode!==i.GC_MODES.MANUAL&&++this.checkCount>this.checkCountMax&&(this.checkCount=0,this.run())},t.prototype.run=function(){for(var t=this.renderer.textureManager,e=t._managedTextures,r=!1,n=0;nthis.maxIdle&&(t.destroyTexture(i,!0),e[n]=null,r=!0)}if(r){for(var o=0,s=0;s=0;r--)this.unload(t.children[r])},t}();r.default=a},{"../../const":46,"../../settings":101}],83:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("pixi-gl-core"),o=t("../../const"),s=t("./utils/RenderTarget"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=t("../../utils"),h=function(){function t(e){n(this,t),this.renderer=e,this.gl=e.gl,this._managedTextures=[]}return t.prototype.bindTexture=function(){},t.prototype.getTexture=function(){},t.prototype.updateTexture=function(t,e){var r=this.gl,n=!!t._glRenderTargets;if(!t.hasLoaded)return null;var s=this.renderer.boundTextures;if(void 0===e){e=0;for(var u=0;u 0.5)"," {"," color = vec4(1.0, 0.0, 0.0, 1.0);"," }"," else"," {"," color = vec4(0.0, 1.0, 0.0, 1.0);"," }"," gl_FragColor = mix(sample, masky, 0.5);"," gl_FragColor *= sample.a;","}"].join("\n")}}]),t}();r.default=f},{"../../../const":46,"../../../settings":101,"../../../utils":125,"./extractUniformsFromSrc":87}],87:[function(t,e,r){"use strict";function n(t,e,r){var n=i(t),o=i(e);return Object.assign(n,o)}function i(t){for(var e=new RegExp("^(projectionMatrix|uSampler|filterArea|filterClamp)$"),r={},n=void 0,i=t.replace(/\s+/g," ").split(/\s*;\s*/),o=0;o-1){var u=s.split(" "),h=u[1],l=u[2],c=1;l.indexOf("[")>-1&&(n=l.split(/\[|]/),l=n[0],c*=Number(n[1])),l.match(e)||(r[l]={value:a(h,c),name:l,type:h})}}return r}r.__esModule=!0,r.default=n;var o=t("pixi-gl-core"),s=function(t){return t&&t.__esModule?t:{default:t}}(o),a=s.default.shader.defaultValue},{"pixi-gl-core":15}],88:[function(t,e,r){"use strict";function n(t,e,r){var n=t.identity();return n.translate(e.x/r.width,e.y/r.height),n.scale(r.width,r.height),n}function i(t,e,r){var n=t.identity();n.translate(e.x/r.width,e.y/r.height);var i=r.width/e.width,o=r.height/e.height;return n.scale(i,o),n}function o(t,e,r,n){var i=n._texture.orig,o=t.set(r.width,0,0,r.height,e.x,e.y),a=n.worldTransform.copy(s.Matrix.TEMP_MATRIX);return a.invert(),o.prepend(a),o.scale(1/i.width,1/i.height),o.translate(n.anchor.x,n.anchor.y),o}r.__esModule=!0,r.calculateScreenSpaceMatrix=n,r.calculateNormalizedScreenSpaceMatrix=i,r.calculateSpriteMatrix=o;var s=t("../../../math")},{"../../../math":70}],89:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("../Filter"),u=n(a),h=t("../../../../math"),l=(t("path"),t("../../../../textures/TextureMatrix")),c=n(l),d=function(t){function e(r){i(this,e);var n=new h.Matrix,s=o(this,t.call(this,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vMaskCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n}\n","varying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D mask;\nuniform float alpha;\nuniform vec4 maskClamp;\n\nvoid main(void)\n{\n float clip = step(3.5,\n step(maskClamp.x, vMaskCoord.x) +\n step(maskClamp.y, vMaskCoord.y) +\n step(vMaskCoord.x, maskClamp.z) +\n step(vMaskCoord.y, maskClamp.w));\n\n vec4 original = texture2D(uSampler, vTextureCoord);\n vec4 masky = texture2D(mask, vMaskCoord);\n\n original *= (masky.r * masky.a * alpha * clip);\n\n gl_FragColor = original;\n}\n"));return r.renderable=!1,s.maskSprite=r,s.maskMatrix=n,s}return s(e,t),e.prototype.apply=function(t,e,r,n){var i=this.maskSprite,o=this.maskSprite.texture;o.valid&&(o.transform||(o.transform=new c.default(o,0)),o.transform.update(),this.uniforms.mask=o,this.uniforms.otherMatrix=t.calculateSpriteMatrix(this.maskMatrix,i).prepend(o.transform.mapCoord),this.uniforms.alpha=i.worldAlpha,this.uniforms.maskClamp=o.transform.uClampFrame,t.applyFilter(this,e,r,n))},e}(u.default);r.default=d},{"../../../../math":70,"../../../../textures/TextureMatrix":116,"../Filter":86,path:8}],90:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var a=t("./WebGLManager"),u=n(a),h=t("../utils/RenderTarget"),l=n(h),c=t("../utils/Quad"),d=n(c),f=t("../../../math"),p=t("../../../Shader"),v=n(p),g=t("../filters/filterTransforms"),y=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(g),m=t("bit-twiddle"),_=n(m),b=function(){function t(){s(this,t),this.renderTarget=null,this.target=null,this.resolution=1,this.sourceFrame=new f.Rectangle,this.destinationFrame=new f.Rectangle,this.filters=[]}return t.prototype.clear=function(){this.filters=null,this.target=null,this.renderTarget=null},t}(),x=function(t){function e(r){s(this,e);var n=i(this,t.call(this,r));return n.gl=n.renderer.gl,n.quad=new d.default(n.gl,r.state.attribState),n.shaderCache={},n.pool={},n.filterData=null,n.managedFilters=[],n.renderer.on("prerender",n.onPrerender,n),n._screenWidth=r.view.width,n._screenHeight=r.view.height,n}return o(e,t),e.prototype.pushFilter=function(t,e){var r=this.renderer,n=this.filterData;if(!n){n=this.renderer._activeRenderTarget.filterStack;var i=new b;i.sourceFrame=i.destinationFrame=this.renderer._activeRenderTarget.size,i.renderTarget=r._activeRenderTarget,this.renderer._activeRenderTarget.filterData=n={index:0,stack:[i]},this.filterData=n}var o=n.stack[++n.index],s=n.stack[0].destinationFrame;o||(o=n.stack[n.index]=new b);var a=t.filterArea&&0===t.filterArea.x&&0===t.filterArea.y&&t.filterArea.width===r.screen.width&&t.filterArea.height===r.screen.height,u=e[0].resolution,h=0|e[0].padding,l=a?r.screen:t.filterArea||t.getBounds(!0),c=o.sourceFrame,d=o.destinationFrame;c.x=(l.x*u|0)/u,c.y=(l.y*u|0)/u,c.width=(l.width*u|0)/u,c.height=(l.height*u|0)/u,a||(n.stack[0].renderTarget.transform||e[0].autoFit&&c.fit(s),c.pad(h)),d.width=c.width,d.height=c.height;var f=this.getPotRenderTarget(r.gl,c.width,c.height,u);o.target=t,o.filters=e,o.resolution=u,o.renderTarget=f,f.setFrame(d,c),r.bindRenderTarget(f),f.clear()},e.prototype.popFilter=function(){var t=this.filterData,e=t.stack[t.index-1],r=t.stack[t.index];this.quad.map(r.renderTarget.size,r.sourceFrame).upload();var n=r.filters;if(1===n.length)n[0].apply(this,r.renderTarget,e.renderTarget,!1,r),this.freePotRenderTarget(r.renderTarget);else{var i=r.renderTarget,o=this.getPotRenderTarget(this.renderer.gl,r.sourceFrame.width,r.sourceFrame.height,r.resolution);o.setFrame(r.destinationFrame,r.sourceFrame),o.clear();var s=0;for(s=0;s0&&void 0!==arguments[0]&&arguments[0],e=this.renderer,r=this.managedFilters;e.off("prerender",this.onPrerender,this);for(var n=0;n0&&(e+="\nelse "),r1&&void 0!==arguments[1]?arguments[1]:[];return e[i.BLEND_MODES.NORMAL]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.ADD]=[t.ONE,t.DST_ALPHA],e[i.BLEND_MODES.MULTIPLY]=[t.DST_COLOR,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.SCREEN]=[t.ONE,t.ONE_MINUS_SRC_COLOR],e[i.BLEND_MODES.OVERLAY]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.DARKEN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.LIGHTEN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.COLOR_DODGE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.COLOR_BURN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.HARD_LIGHT]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.SOFT_LIGHT]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.DIFFERENCE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.EXCLUSION]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.HUE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.SATURATION]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.COLOR]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.LUMINOSITY]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.NORMAL_NPM]=[t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.ADD_NPM]=[t.SRC_ALPHA,t.DST_ALPHA,t.ONE,t.DST_ALPHA],e[i.BLEND_MODES.SCREEN_NPM]=[t.SRC_ALPHA,t.ONE_MINUS_SRC_COLOR,t.ONE,t.ONE_MINUS_SRC_COLOR],e}r.__esModule=!0,r.default=n;var i=t("../../../const")},{"../../../const":46}],99:[function(t,e,r){"use strict";function n(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e[i.DRAW_MODES.POINTS]=t.POINTS,e[i.DRAW_MODES.LINES]=t.LINES,e[i.DRAW_MODES.LINE_LOOP]=t.LINE_LOOP,e[i.DRAW_MODES.LINE_STRIP]=t.LINE_STRIP,e[i.DRAW_MODES.TRIANGLES]=t.TRIANGLES,e[i.DRAW_MODES.TRIANGLE_STRIP]=t.TRIANGLE_STRIP,e[i.DRAW_MODES.TRIANGLE_FAN]=t.TRIANGLE_FAN,e}r.__esModule=!0,r.default=n;var i=t("../../../const")},{"../../../const":46}],100:[function(t,e,r){"use strict";function n(t){t.getContextAttributes().stencil||console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly")}r.__esModule=!0,r.default=n},{}],101:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./utils/maxRecommendedTextures"),o=n(i),s=t("./utils/canUploadSameBuffer"),a=n(s);r.default={TARGET_FPMS:.06,MIPMAP_TEXTURES:!0,RESOLUTION:1,FILTER_RESOLUTION:1,SPRITE_MAX_TEXTURES:(0,o.default)(32),SPRITE_BATCH_SIZE:4096,RETINA_PREFIX:/@([0-9\.]+)x/,RENDER_OPTIONS:{view:null,antialias:!1,forceFXAA:!1,autoResize:!1,transparent:!1,backgroundColor:0,clearBeforeRender:!0,preserveDrawingBuffer:!1,roundPixels:!1,width:800,height:600,legacy:!1},TRANSFORM_MODE:0,GC_MODE:0,GC_MAX_IDLE:3600,GC_MAX_CHECK_COUNT:600,WRAP_MODE:0,SCALE_MODE:0,PRECISION_VERTEX:"highp",PRECISION_FRAGMENT:"mediump",CAN_UPLOAD_SAME_BUFFER:(0,a.default)(),MESH_CANVAS_PADDING:0}},{"./utils/canUploadSameBuffer":122,"./utils/maxRecommendedTextures":127}],102:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=function(){function t(t,e){for(var r=0;r=n&&v.x=i&&v.y>16)+(65280&t)+((255&t)<<16)}},{key:"texture",get:function(){return this._texture},set:function(t){this._texture!==t&&(this._texture=t||d.default.EMPTY,this.cachedTint=16777215,this._textureID=-1,this._textureTrimmedID=-1,t&&(t.baseTexture.hasLoaded?this._onTextureUpdate():t.once("update",this._onTextureUpdate,this)))}}]),e}(p.default);r.default=g},{"../const":46,"../display/Container":48,"../math":70,"../textures/Texture":115,"../utils":125}],103:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var o=t("../../renderers/canvas/CanvasRenderer"),s=n(o),a=t("../../const"),u=t("../../math"),h=t("./CanvasTinter"),l=n(h),c=new u.Matrix,d=function(){function t(e){i(this,t),this.renderer=e}return t.prototype.render=function(t){var e=t._texture,r=this.renderer,n=e._frame.width,i=e._frame.height,o=t.transform.worldTransform,s=0,h=0;if(!(e.orig.width<=0||e.orig.height<=0)&&e.baseTexture.source&&(r.setBlendMode(t.blendMode),e.valid)){r.context.globalAlpha=t.worldAlpha;var d=e.baseTexture.scaleMode===a.SCALE_MODES.LINEAR;r.smoothProperty&&r.context[r.smoothProperty]!==d&&(r.context[r.smoothProperty]=d),e.trim?(s=e.trim.width/2+e.trim.x-t.anchor.x*e.orig.width,h=e.trim.height/2+e.trim.y-t.anchor.y*e.orig.height):(s=(.5-t.anchor.x)*e.orig.width,h=(.5-t.anchor.y)*e.orig.height),e.rotate&&(o.copy(c),o=c,u.GroupD8.matrixAppendRotationInv(o,e.rotate,s,h),s=0,h=0),s-=n/2,h-=i/2,r.roundPixels?(r.context.setTransform(o.a,o.b,o.c,o.d,o.tx*r.resolution|0,o.ty*r.resolution|0),s|=0,h|=0):r.context.setTransform(o.a,o.b,o.c,o.d,o.tx*r.resolution,o.ty*r.resolution);var f=e.baseTexture.resolution;16777215!==t.tint?(t.cachedTint===t.tint&&t.tintedTexture.tintId===t._texture._updateID||(t.cachedTint=t.tint,t.tintedTexture=l.default.getTintedTexture(t,t.tint)),r.context.drawImage(t.tintedTexture,0,0,n*f,i*f,s*r.resolution,h*r.resolution,n*r.resolution,i*r.resolution)):r.context.drawImage(e.baseTexture.source,e._frame.x*f,e._frame.y*f,n*f,i*f,s*r.resolution,h*r.resolution,n*r.resolution,i*r.resolution)}},t.prototype.destroy=function(){this.renderer=null},t}();r.default=d,s.default.registerPlugin("sprite",d)},{"../../const":46,"../../math":70,"../../renderers/canvas/CanvasRenderer":77,"./CanvasTinter":104}],104:[function(t,e,r){"use strict";r.__esModule=!0;var n=t("../../utils"),i=t("../../renderers/canvas/utils/canUseNewCanvasBlendModes"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s={getTintedTexture:function(t,e){var r=t._texture;e=s.roundColor(e);var n="#"+("00000"+(0|e).toString(16)).substr(-6);r.tintCache=r.tintCache||{};var i=r.tintCache[n],o=void 0;if(i){if(i.tintId===r._updateID)return r.tintCache[n];o=r.tintCache[n]}else o=s.canvas||document.createElement("canvas");if(s.tintMethod(r,e,o),o.tintId=r._updateID,s.convertTintToImage){var a=new Image;a.src=o.toDataURL(),r.tintCache[n]=a}else r.tintCache[n]=o,s.canvas=null;return o},tintWithMultiply:function(t,e,r){var n=r.getContext("2d"),i=t._frame.clone(),o=t.baseTexture.resolution;i.x*=o,i.y*=o,i.width*=o,i.height*=o,r.width=Math.ceil(i.width),r.height=Math.ceil(i.height),n.save(),n.fillStyle="#"+("00000"+(0|e).toString(16)).substr(-6),n.fillRect(0,0,i.width,i.height),n.globalCompositeOperation="multiply",n.drawImage(t.baseTexture.source,i.x,i.y,i.width,i.height,0,0,i.width,i.height),n.globalCompositeOperation="destination-atop",n.drawImage(t.baseTexture.source,i.x,i.y,i.width,i.height,0,0,i.width,i.height),n.restore()},tintWithOverlay:function(t,e,r){var n=r.getContext("2d"),i=t._frame.clone(),o=t.baseTexture.resolution;i.x*=o,i.y*=o,i.width*=o,i.height*=o,r.width=Math.ceil(i.width),r.height=Math.ceil(i.height),n.save(),n.globalCompositeOperation="copy",n.fillStyle="#"+("00000"+(0|e).toString(16)).substr(-6),n.fillRect(0,0,i.width,i.height),n.globalCompositeOperation="destination-atop",n.drawImage(t.baseTexture.source,i.x,i.y,i.width,i.height,0,0,i.width,i.height),n.restore()},tintWithPerPixel:function(t,e,r){var i=r.getContext("2d"),o=t._frame.clone(),s=t.baseTexture.resolution;o.x*=s,o.y*=s,o.width*=s,o.height*=s,r.width=Math.ceil(o.width),r.height=Math.ceil(o.height),i.save(),i.globalCompositeOperation="copy",i.drawImage(t.baseTexture.source,o.x,o.y,o.width,o.height,0,0,o.width,o.height),i.restore();for(var a=(0,n.hex2rgb)(e),u=a[0],h=a[1],l=a[2],c=i.getImageData(0,0,o.width,o.height),d=c.data,f=0;f=this.size&&this.flush(),t._texture._uvs&&(this.sprites[this.currentIndex++]=t)},e.prototype.flush=function(){if(0!==this.currentIndex){var t=this.renderer.gl,e=this.MAX_TEXTURES,r=S.default.nextPow2(this.currentIndex),n=S.default.log2(r),i=this.buffers[n],o=this.sprites,s=this.groups,a=i.float32View,u=i.uint32View,h=this.boundTextures,l=this.renderer.boundTextures,c=this.renderer.textureGC.count,d=0,f=void 0,p=void 0,v=1,g=0,y=s[0],m=void 0,_=void 0,T=x.premultiplyBlendMode[o[0]._texture.baseTexture.premultipliedAlpha?1:0][o[0].blendMode];y.textureCount=0,y.start=0,y.blend=T,O++;var E=void 0;for(E=0;E0&&(e+="\nelse "),r0&&(r.shadowColor=e.dropShadowColor);for(var f=Math.cos(e.dropShadowAngle)*e.dropShadowDistance,p=Math.sin(e.dropShadowAngle)*e.dropShadowDistance,v=0;v3&&void 0!==arguments[3]&&arguments[3],i=this._style,o=i.letterSpacing;if(0===o)return void(n?this.context.strokeText(t,e,r):this.context.fillText(t,e,r));for(var s=String.prototype.split.call(t,""),a=e,u=0,h="";u3&&void 0!==arguments[3]?arguments[3]:t._canvas;n=void 0===n||null===n?r.wordWrap:n;var o=r.toFontString(),s=t.measureFont(o),a=i.getContext("2d");a.font=o;for(var u=n?t.wordWrap(e,r,i):e,h=u.split(/(?:\r\n|\r|\n)/),l=new Array(h.length),c=0,d=0;d2&&void 0!==arguments[2]?arguments[2]:t._canvas,i=n.getContext("2d"),o=0,s="",a="",u={},h=r.letterSpacing,l=r.whiteSpace,c=t.collapseSpaces(l),d=t.collapseNewlines(l),f=!c,p=r.wordWrapWidth+h,v=t.tokenize(e),g=0;gp)if(""!==s&&(a+=t.addLine(s),s="",o=0),t.canBreakWords(y,r.breakWords))for(var x=y.split(""),T=0;Tp&&(a+=t.addLine(s),f=!1,s="",o=0),s+=w,o+=M}else{s.length>0&&(a+=t.addLine(s),s="",o=0);var P=g===v.length-1;a+=t.addLine(y,!P),f=!1,s="",o=0}else b+o>p&&(f=!1,a+=t.addLine(s),s="",o=0),(s.length>0||!t.isBreakingSpace(y)||f)&&(s+=y,o+=b)}return a+=t.addLine(s,!1)},t.addLine=function(e){var r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=t.trimRight(e),e=r?e+"\n":e},t.getFromCache=function(t,e,r,n){var i=r[t];if(void 0===i){var o=t.length*e;i=n.measureText(t).width+o,r[t]=i}return i},t.collapseSpaces=function(t){return"normal"===t||"pre-line"===t},t.collapseNewlines=function(t){return"normal"===t},t.trimRight=function(e){if("string"!=typeof e)return"";for(var r=e.length-1;r>=0;r--){var n=e[r];if(!t.isBreakingSpace(n))break;e=e.slice(0,-1)}return e},t.isNewline=function(e){return"string"==typeof e&&t._newlines.indexOf(e.charCodeAt(0))>=0},t.isBreakingSpace=function(e){return"string"==typeof e&&t._breakingSpaces.indexOf(e.charCodeAt(0))>=0},t.tokenize=function(e){var r=[],n="";if("string"!=typeof e)return r;for(var i=0;ia;--d){for(var g=0;g0&&void 0!==arguments[0]?arguments[0]:"";e?delete t._fonts[e]:t._fonts={}},t}();r.default=i;var o=document.createElement("canvas");o.width=o.height=10,i._canvas=o,i._context=o.getContext("2d"),i._fonts={},i.METRICS_STRING="|Éq",i.BASELINE_SYMBOL="M",i.BASELINE_MULTIPLIER=1.4,i._newlines=[10,13],i._breakingSpaces=[9,32,8192,8193,8194,8195,8196,8197,8198,8200,8201,8202,8287,12288]},{}],110:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){return"number"==typeof t?(0,l.hex2string)(t):("string"==typeof t&&0===t.indexOf("0x")&&(t=t.replace("0x","#")),t)}function o(t){if(Array.isArray(t)){for(var e=0;e=0;r--){var n=e[r].trim();!/([\"\'])[^\'\"]+\1/.test(n)&&d.indexOf(n)<0&&(n='"'+n+'"'),e[r]=n}return this.fontStyle+" "+this.fontVariant+" "+this.fontWeight+" "+t+" "+e.join(",")},u(t,[{key:"align",get:function(){return this._align},set:function(t){this._align!==t&&(this._align=t,this.styleID++)}},{key:"breakWords",get:function(){return this._breakWords},set:function(t){this._breakWords!==t&&(this._breakWords=t,this.styleID++)}},{key:"dropShadow",get:function(){return this._dropShadow},set:function(t){this._dropShadow!==t&&(this._dropShadow=t,this.styleID++)}},{key:"dropShadowAlpha",get:function(){return this._dropShadowAlpha},set:function(t){this._dropShadowAlpha!==t&&(this._dropShadowAlpha=t,this.styleID++)}},{key:"dropShadowAngle",get:function(){return this._dropShadowAngle},set:function(t){this._dropShadowAngle!==t&&(this._dropShadowAngle=t,this.styleID++)}},{key:"dropShadowBlur",get:function(){return this._dropShadowBlur},set:function(t){this._dropShadowBlur!==t&&(this._dropShadowBlur=t,this.styleID++)}},{key:"dropShadowColor",get:function(){return this._dropShadowColor},set:function(t){var e=o(t);this._dropShadowColor!==e&&(this._dropShadowColor=e,this.styleID++)}},{key:"dropShadowDistance",get:function(){return this._dropShadowDistance},set:function(t){this._dropShadowDistance!==t&&(this._dropShadowDistance=t,this.styleID++)}},{key:"fill",get:function(){return this._fill},set:function(t){var e=o(t);this._fill!==e&&(this._fill=e,this.styleID++)}},{key:"fillGradientType",get:function(){return this._fillGradientType},set:function(t){this._fillGradientType!==t&&(this._fillGradientType=t,this.styleID++)}},{key:"fillGradientStops",get:function(){return this._fillGradientStops},set:function(t){s(this._fillGradientStops,t)||(this._fillGradientStops=t,this.styleID++)}},{key:"fontFamily",get:function(){return this._fontFamily},set:function(t){this.fontFamily!==t&&(this._fontFamily=t,this.styleID++)}},{key:"fontSize",get:function(){return this._fontSize},set:function(t){this._fontSize!==t&&(this._fontSize=t,this.styleID++)}},{key:"fontStyle",get:function(){return this._fontStyle},set:function(t){this._fontStyle!==t&&(this._fontStyle=t,this.styleID++)}},{key:"fontVariant",get:function(){return this._fontVariant},set:function(t){this._fontVariant!==t&&(this._fontVariant=t,this.styleID++)}},{key:"fontWeight",get:function(){return this._fontWeight},set:function(t){this._fontWeight!==t&&(this._fontWeight=t,this.styleID++)}},{key:"letterSpacing",get:function(){return this._letterSpacing},set:function(t){this._letterSpacing!==t&&(this._letterSpacing=t,this.styleID++)}},{key:"lineHeight",get:function(){return this._lineHeight},set:function(t){this._lineHeight!==t&&(this._lineHeight=t,this.styleID++)}},{key:"leading",get:function(){return this._leading},set:function(t){this._leading!==t&&(this._leading=t,this.styleID++)}},{key:"lineJoin",get:function(){return this._lineJoin},set:function(t){this._lineJoin!==t&&(this._lineJoin=t,this.styleID++)}},{key:"miterLimit",get:function(){return this._miterLimit},set:function(t){this._miterLimit!==t&&(this._miterLimit=t,this.styleID++)}},{key:"padding",get:function(){return this._padding},set:function(t){this._padding!==t&&(this._padding=t,this.styleID++)}},{key:"stroke",get:function(){return this._stroke},set:function(t){var e=o(t);this._stroke!==e&&(this._stroke=e,this.styleID++)}},{key:"strokeThickness",get:function(){return this._strokeThickness},set:function(t){this._strokeThickness!==t&&(this._strokeThickness=t,this.styleID++)}},{key:"textBaseline",get:function(){return this._textBaseline},set:function(t){this._textBaseline!==t&&(this._textBaseline=t,this.styleID++)}},{key:"trim",get:function(){return this._trim},set:function(t){this._trim!==t&&(this._trim=t,this.styleID++)}},{key:"whiteSpace",get:function(){return this._whiteSpace},set:function(t){this._whiteSpace!==t&&(this._whiteSpace=t,this.styleID++)}},{key:"wordWrap",get:function(){return this._wordWrap},set:function(t){this._wordWrap!==t&&(this._wordWrap=t,this.styleID++)}},{key:"wordWrapWidth",get:function(){return this._wordWrapWidth},set:function(t){this._wordWrapWidth!==t&&(this._wordWrapWidth=t,this.styleID++)}}]),t}();r.default=f},{"../const":46,"../utils":125}],111:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("./BaseTexture"),u=n(a),h=t("../settings"),l=n(h),c=function(t){function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:100,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,s=arguments[2],a=arguments[3];i(this,e);var u=o(this,t.call(this,null,s));return u.resolution=a||l.default.RESOLUTION,u.width=Math.ceil(r),u.height=Math.ceil(n),u.realWidth=u.width*u.resolution,u.realHeight=u.height*u.resolution,u.scaleMode=void 0!==s?s:l.default.SCALE_MODE,u.hasLoaded=!0,u._glRenderTargets={},u._canvasRenderTarget=null,u.valid=!1,u}return s(e,t),e.prototype.resize=function(t,e){t=Math.ceil(t),e=Math.ceil(e),t===this.width&&e===this.height||(this.valid=t>0&&e>0,this.width=t,this.height=e,this.realWidth=this.width*this.resolution,this.realHeight=this.height*this.resolution,this.valid&&this.emit("update",this))},e.prototype.destroy=function(){t.prototype.destroy.call(this,!0),this.renderer=null},e}(u.default);r.default=c},{"../settings":101,"./BaseTexture":112}],112:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("../utils"),u=t("../settings"),h=n(u),l=t("eventemitter3"),c=n(l),d=t("../utils/determineCrossOrigin"),f=n(d),p=t("bit-twiddle"),v=n(p),g=function(t){function e(r,n,s){i(this,e);var u=o(this,t.call(this));return u.uid=(0,a.uid)(),u.touched=0,u.resolution=s||h.default.RESOLUTION,u.width=100,u.height=100,u.realWidth=100,u.realHeight=100,u.scaleMode=void 0!==n?n:h.default.SCALE_MODE,u.hasLoaded=!1,u.isLoading=!1,u.source=null,u.origSource=null,u.imageType=null,u.sourceScale=1,u.premultipliedAlpha=!0,u.imageUrl=null,u.isPowerOfTwo=!1,u.mipmap=h.default.MIPMAP_TEXTURES,u.wrapMode=h.default.WRAP_MODE,u._glTextures={},u._enabled=0,u._virtalBoundId=-1,u._destroyed=!1,u.textureCacheIds=[],r&&u.loadSource(r),u}return s(e,t),e.prototype.update=function(){"svg"!==this.imageType&&(this.realWidth=this.source.naturalWidth||this.source.videoWidth||this.source.width,this.realHeight=this.source.naturalHeight||this.source.videoHeight||this.source.height,this._updateDimensions()),this.emit("update",this)},e.prototype._updateDimensions=function(){this.width=this.realWidth/this.resolution,this.height=this.realHeight/this.resolution,this.isPowerOfTwo=v.default.isPow2(this.realWidth)&&v.default.isPow2(this.realHeight)},e.prototype.loadSource=function(t){var e=this.isLoading;this.hasLoaded=!1,this.isLoading=!1,e&&this.source&&(this.source.onload=null,this.source.onerror=null);var r=!this.source;if(this.source=t,(t.src&&t.complete||t.getContext)&&t.width&&t.height)this._updateImageType(),"svg"===this.imageType?this._loadSvgSource():this._sourceLoaded(),r&&this.emit("loaded",this);else if(!t.getContext){this.isLoading=!0;var n=this;if(t.onload=function(){if(n._updateImageType(),t.onload=null,t.onerror=null,n.isLoading){if(n.isLoading=!1,n._sourceLoaded(),"svg"===n.imageType)return void n._loadSvgSource();n.emit("loaded",n)}},t.onerror=function(){t.onload=null,t.onerror=null,n.isLoading&&(n.isLoading=!1,n.emit("error",n))},t.complete&&t.src){if(t.onload=null,t.onerror=null,"svg"===n.imageType)return void n._loadSvgSource();this.isLoading=!1,t.width&&t.height?(this._sourceLoaded(),e&&this.emit("loaded",this)):e&&this.emit("error",this)}}},e.prototype._updateImageType=function(){if(this.imageUrl){var t=(0,a.decomposeDataUri)(this.imageUrl),e=void 0;if(t&&"image"===t.mediaType){var r=t.subType.split("+")[0];if(!(e=(0,a.getUrlFileExtension)("."+r)))throw new Error("Invalid image type in data URI.")}else(e=(0,a.getUrlFileExtension)(this.imageUrl))||(e="png");this.imageType=e}},e.prototype._loadSvgSource=function(){if("svg"===this.imageType){var t=(0,a.decomposeDataUri)(this.imageUrl);t?this._loadSvgSourceUsingDataUri(t):this._loadSvgSourceUsingXhr()}},e.prototype._loadSvgSourceUsingDataUri=function(t){var e=void 0;if("base64"===t.encoding){if(!atob)throw new Error("Your browser doesn't support base64 conversions.");e=atob(t.data)}else e=t.data;this._loadSvgSourceUsingString(e)},e.prototype._loadSvgSourceUsingXhr=function(){var t=this,e=new XMLHttpRequest;e.onload=function(){if(e.readyState!==e.DONE||200!==e.status)throw new Error("Failed to load SVG using XHR.");t._loadSvgSourceUsingString(e.response)},e.onerror=function(){return t.emit("error",t)},e.open("GET",this.imageUrl,!0),e.send()},e.prototype._loadSvgSourceUsingString=function(t){var r=(0,a.getSvgSize)(t),n=r.width,i=r.height;if(!n||!i)throw new Error("The SVG image must have width and height defined (in pixels), canvas API needs them.");this.realWidth=Math.round(n*this.sourceScale),this.realHeight=Math.round(i*this.sourceScale),this._updateDimensions();var o=document.createElement("canvas");o.width=this.realWidth,o.height=this.realHeight,o._pixiId="canvas_"+(0,a.uid)(),o.getContext("2d").drawImage(this.source,0,0,n,i,0,0,this.realWidth,this.realHeight),this.origSource=this.source,this.source=o,e.addToCache(this,o._pixiId),this.isLoading=!1,this._sourceLoaded(),this.emit("loaded",this)},e.prototype._sourceLoaded=function(){this.hasLoaded=!0,this.update()},e.prototype.destroy=function(){this.imageUrl&&(delete a.TextureCache[this.imageUrl],this.imageUrl=null,navigator.isCocoonJS||(this.source.src="")),this.source=null,this.dispose(),e.removeFromCache(this),this.textureCacheIds=null,this._destroyed=!0},e.prototype.dispose=function(){this.emit("dispose",this)},e.prototype.updateSourceImage=function(t){this.source.src=t,this.loadSource(this.source)},e.fromImage=function(t,r,n,i){var o=a.BaseTextureCache[t];if(!o){var s=new Image;void 0===r&&0!==t.indexOf("data:")?s.crossOrigin=(0,f.default)(t):r&&(s.crossOrigin="string"==typeof r?r:"anonymous"),o=new e(s,n),o.imageUrl=t,i&&(o.sourceScale=i),o.resolution=(0,a.getResolutionOfUrl)(t),s.src=t,e.addToCache(o,t)}return o},e.fromCanvas=function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"canvas";t._pixiId||(t._pixiId=n+"_"+(0,a.uid)());var i=a.BaseTextureCache[t._pixiId];return i||(i=new e(t,r),e.addToCache(i,t._pixiId)),i},e.from=function(t,r,n){if("string"==typeof t)return e.fromImage(t,void 0,r,n);if(t instanceof HTMLImageElement){var i=t.src,o=a.BaseTextureCache[i] +;return o||(o=new e(t,r),o.imageUrl=i,n&&(o.sourceScale=n),o.resolution=(0,a.getResolutionOfUrl)(i),e.addToCache(o,i)),o}return t instanceof HTMLCanvasElement?e.fromCanvas(t,r):t},e.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),a.BaseTextureCache[e]=t)},e.removeFromCache=function(t){if("string"==typeof t){var e=a.BaseTextureCache[t];if(e){var r=e.textureCacheIds.indexOf(t);return r>-1&&e.textureCacheIds.splice(r,1),delete a.BaseTextureCache[t],e}}else if(t&&t.textureCacheIds){for(var n=0;n0&&e>0,this._frame.width=this.orig.width=t,this._frame.height=this.orig.height=e,r||this.baseTexture.resize(t,e),this._updateUvs()},e.create=function(t,r,n,i){return new e(new u.default(t,r,n,i))},e}(l.default);r.default=c},{"./BaseRenderTexture":111,"./Texture":115}],114:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:null;n(this,t),this.baseTexture=e,this.textures={},this.animations={},this.data=r,this.resolution=this._updateResolution(i||this.baseTexture.imageUrl),this._frames=this.data.frames,this._frameKeys=Object.keys(this._frames),this._batchIndex=0,this._callback=null}return i(t,null,[{key:"BATCH_SIZE",get:function(){return 1e3}}]),t.prototype._updateResolution=function(t){var e=this.data.meta.scale,r=(0,s.getResolutionOfUrl)(t,null);return null===r&&(r=void 0!==e?parseFloat(e):1),1!==r&&(this.baseTexture.resolution=r,this.baseTexture.update()),r},t.prototype.parse=function(e){this._batchIndex=0,this._callback=e,this._frameKeys.length<=t.BATCH_SIZE?(this._processFrames(0),this._processAnimations(),this._parseComplete()):this._nextBatch()},t.prototype._processFrames=function(e){for(var r=e,n=t.BATCH_SIZE,i=this.baseTexture.sourceScale;r-e=r.length)break;o=r[i++]}else{if(i=r.next(),i.done)break;o=i.value}var s=o;this.animations[e].push(this.textures[s])}}},t.prototype._parseComplete=function(){var t=this._callback;this._callback=null,this._batchIndex=0,t.call(this,this.textures)},t.prototype._nextBatch=function(){var e=this;this._processFrames(this._batchIndex*t.BATCH_SIZE),this._batchIndex++,setTimeout(function(){e._batchIndex*t.BATCH_SIZE0&&void 0!==arguments[0]&&arguments[0];for(var e in this.textures)this.textures[e].destroy();this._frames=null,this._frameKeys=null,this.data=null,this.textures=null,t&&this.baseTexture.destroy(),this.baseTexture=null},t}();r.default=a},{"../":65,"../utils":125}],115:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){t.destroy=function(){},t.on=function(){},t.once=function(){},t.emit=function(){}}r.__esModule=!0;var u=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:"canvas";return new e(l.default.fromCanvas(t,r,n))},e.fromVideo=function(t,r,n,i){return"string"==typeof t?e.fromVideoUrl(t,r,n,i):new e(d.default.fromVideo(t,r,i))},e.fromVideoUrl=function(t,r,n,i){return new e(d.default.fromUrl(t,r,n,i))},e.from=function(t){if("string"==typeof t){var r=m.TextureCache[t];if(!r){return null!==t.match(/\.(mp4|webm|ogg|h264|avi|mov)$/)?e.fromVideoUrl(t):e.fromImage(t)}return r}return t instanceof HTMLImageElement?new e(l.default.from(t)):t instanceof HTMLCanvasElement?e.fromCanvas(t,b.default.SCALE_MODE,"HTMLCanvasElement"):t instanceof HTMLVideoElement?e.fromVideo(t):t instanceof l.default?new e(t):t},e.fromLoader=function(t,r,n){var i=new l.default(t,void 0,(0,m.getResolutionOfUrl)(r)),o=new e(i);return i.imageUrl=r,n||(n=r),l.default.addToCache(o.baseTexture,n),e.addToCache(o,n),n!==r&&(l.default.addToCache(o.baseTexture,r),e.addToCache(o,r)),o},e.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),m.TextureCache[e]=t)},e.removeFromCache=function(t){if("string"==typeof t){var e=m.TextureCache[t];if(e){var r=e.textureCacheIds.indexOf(t);return r>-1&&e.textureCacheIds.splice(r,1),delete m.TextureCache[t],e}}else if(t&&t.textureCacheIds){for(var n=0;nthis.baseTexture.width,s=r+i>this.baseTexture.height;if(o||s){var a=o&&s?"and":"or",u="X: "+e+" + "+n+" = "+(e+n)+" > "+this.baseTexture.width,h="Y: "+r+" + "+i+" = "+(r+i)+" > "+this.baseTexture.height;throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: "+u+" "+a+" "+h)}this.valid=n&&i&&this.baseTexture.hasLoaded,this.trim||this.rotate||(this.orig=t),this.valid&&this._updateUvs()}},{key:"rotate",get:function(){return this._rotate},set:function(t){this._rotate=t,this.valid&&this._updateUvs()}},{key:"width",get:function(){return this.orig.width}},{key:"height",get:function(){return this.orig.height}}]),e}(g.default);r.default=x,x.EMPTY=new x(new l.default),a(x.EMPTY),a(x.EMPTY.baseTexture),x.WHITE=function(){var t=document.createElement("canvas");t.width=10,t.height=10;var e=t.getContext("2d");return e.fillStyle="white",e.fillRect(0,0,10,10),new x(new l.default(t))}(),a(x.WHITE),a(x.WHITE.baseTexture)},{"../math":70,"../settings":101,"../utils":125,"./BaseTexture":112,"./TextureUvs":117,"./VideoBaseTexture":118,eventemitter3:3}],116:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2])||arguments[2];if(i(this,e),!r)throw new Error("No video source element specified.");(r.readyState===r.HAVE_ENOUGH_DATA||r.readyState===r.HAVE_FUTURE_DATA)&&r.width&&r.height&&(r.complete=!0);var a=o(this,t.call(this,r,n));return a.width=r.videoWidth,a.height=r.videoHeight,a._autoUpdate=!0,a._isAutoUpdating=!1,a.autoPlay=s,a.update=a.update.bind(a),a._onCanPlay=a._onCanPlay.bind(a),r.addEventListener("play",a._onPlayStart.bind(a)),r.addEventListener("pause",a._onPlayStop.bind(a)),a.hasLoaded=!1,a.__loaded=!1,a._isSourceReady()?a._onCanPlay():(r.addEventListener("canplay",a._onCanPlay),r.addEventListener("canplaythrough",a._onCanPlay)),a}return s(e,t),e.prototype._isSourcePlaying=function(){var t=this.source;return t.currentTime>0&&!1===t.paused&&!1===t.ended&&t.readyState>2},e.prototype._isSourceReady=function(){return 3===this.source.readyState||4===this.source.readyState},e.prototype._onPlayStart=function(){this.hasLoaded||this._onCanPlay(),!this._isAutoUpdating&&this.autoUpdate&&(d.shared.add(this.update,this,f.UPDATE_PRIORITY.HIGH),this._isAutoUpdating=!0)},e.prototype._onPlayStop=function(){this._isAutoUpdating&&(d.shared.remove(this.update,this),this._isAutoUpdating=!1)},e.prototype._onCanPlay=function(){this.hasLoaded=!0,this.source&&(this.source.removeEventListener("canplay",this._onCanPlay),this.source.removeEventListener("canplaythrough",this._onCanPlay),this.width=this.source.videoWidth,this.height=this.source.videoHeight,this.__loaded||(this.__loaded=!0,this.emit("loaded",this)),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&this.source.play())},e.prototype.destroy=function(){this._isAutoUpdating&&d.shared.remove(this.update,this),this.source&&this.source._pixiId&&(l.default.removeFromCache(this.source._pixiId),delete this.source._pixiId,this.source.pause(),this.source.src="",this.source.load()),t.prototype.destroy.call(this)},e.fromVideo=function(t,r,n){t._pixiId||(t._pixiId="video_"+(0,c.uid)());var i=c.BaseTextureCache[t._pixiId];return i||(i=new e(t,r,n),l.default.addToCache(i,t._pixiId)),i},e.fromUrl=function(t,r,n,i){var o=document.createElement("video");o.setAttribute("webkit-playsinline",""),o.setAttribute("playsinline","");var s=Array.isArray(t)?t[0].src||t[0]:t.src||t;if(void 0===n&&0!==s.indexOf("data:")?o.crossOrigin=(0,v.default)(s):n&&(o.crossOrigin="string"==typeof n?n:"anonymous"),Array.isArray(t))for(var u=0;u2&&void 0!==arguments[2]?arguments[2]:u.UPDATE_PRIORITY.NORMAL;return this._addListener(new l.default(t,e,r))},t.prototype.addOnce=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.UPDATE_PRIORITY.NORMAL;return this._addListener(new l.default(t,e,r,!0))},t.prototype._addListener=function(t){var e=this._head.next,r=this._head;if(e){for(;e;){if(t.priority>e.priority){t.connect(r);break}r=e,e=e.next}t.previous||t.connect(r)}else t.connect(r);return this._startIfPossible(),this},t.prototype.remove=function(t,e){for(var r=this._head.next;r;)r=r.match(t,e)?r.destroy():r.next;return this._head.next||this._cancelIfNeeded(),this},t.prototype.start=function(){this.started||(this.started=!0,this._requestIfNeeded())},t.prototype.stop=function(){this.started&&(this.started=!1,this._cancelIfNeeded())},t.prototype.destroy=function(){this.stop();for(var t=this._head.next;t;)t=t.destroy(!0);this._head.destroy(),this._head=null},t.prototype.update=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:performance.now(),e=void 0;if(t>this.lastTime){e=this.elapsedMS=t-this.lastTime,e>this._maxElapsedMS&&(e=this._maxElapsedMS),this.deltaTime=e*a.default.TARGET_FPMS*this.speed;for(var r=this._head,n=r.next;n;)n=n.emit(this.deltaTime);r.next||this._cancelIfNeeded()}else this.deltaTime=this.elapsedMS=0;this.lastTime=t},o(t,[{key:"FPS",get:function(){return 1e3/this.elapsedMS}},{key:"minFPS",get:function(){return 1e3/this._maxElapsedMS},set:function(t){var e=Math.min(Math.max(0,t)/1e3,a.default.TARGET_FPMS);this._maxElapsedMS=1/e}}]),t}();r.default=c},{"../const":46,"../settings":101,"./TickerListener":120}],120:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n(this,t),this.fn=e,this.context=r,this.priority=i,this.once=o,this.next=null,this.previous=null,this._destroyed=!1}return t.prototype.match=function(t,e){return e=e||null,this.fn===t&&this.context===e},t.prototype.emit=function(t){this.fn&&(this.context?this.fn.call(this.context,t):this.fn(t));var e=this.next;return this.once&&this.destroy(!0),this._destroyed&&(this.next=null),e},t.prototype.connect=function(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this},t.prototype.destroy=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._destroyed=!0,this.fn=null,this.context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);var e=this.next;return this.next=t?null:e,this.previous=null,e},t}();r.default=i},{}],121:[function(t,e,r){"use strict";r.__esModule=!0,r.Ticker=r.shared=void 0;var n=t("./Ticker"),i=function(t){return t&&t.__esModule?t:{default:t}}(n),o=new i.default;o.autoStart=!0,o.destroy=function(){},r.shared=o,r.Ticker=i.default},{"./Ticker":119}],122:[function(t,e,r){"use strict";function n(){return!(!!navigator.platform&&/iPad|iPhone|iPod/.test(navigator.platform))}r.__esModule=!0,r.default=n},{}],123:[function(t,e,r){"use strict";function n(t){for(var e=6*t,r=new Uint16Array(e),n=0,i=0;n1&&void 0!==arguments[1]?arguments[1]:window.location;if(0===t.indexOf("data:"))return"";e=e||window.location,s||(s=document.createElement("a")),s.href=t,t=o.default.parse(s.href);var r=!t.port&&""===e.port||t.port===e.port;return t.hostname===e.hostname&&r&&t.protocol===e.protocol?"":"anonymous"}r.__esModule=!0,r.default=n;var i=t("url"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=void 0},{url:38}],125:[function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t){return t&&t.__esModule?t:{default:t}}function o(){return++U}function s(t,e){return e=e||[],e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255,e}function a(t){return t=t.toString(16),"#"+(t="000000".substr(0,6-t.length)+t)}function u(t){return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)}function h(t,e){var r=S.default.RETINA_PREFIX.exec(t);return r?parseFloat(r[1]):void 0!==e?e:1}function l(t){var e=w.DATA_URI.exec(t);if(e)return{mediaType:e[1]?e[1].toLowerCase():void 0,subType:e[2]?e[2].toLowerCase():void 0,charset:e[3]?e[3].toLowerCase():void 0,encoding:e[4]?e[4].toLowerCase():void 0,data:e[5]}}function c(t){var e=w.URL_FILE_EXTENSION.exec(t);if(e)return e[1].toLowerCase()}function d(t){var e=w.SVG_SIZE.exec(t),r={};return e&&(r[e[1]]=Math.round(parseFloat(e[3])),r[e[5]]=Math.round(parseFloat(e[7]))),r}function f(){X=!0}function p(t){if(!X){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var e=["\n %c %c %c PixiJS "+w.VERSION+" - ✰ "+t+" ✰ %c %c http://www.pixijs.com/ %c %c ♥%c♥%c♥ \n\n","background: #ff66a5; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff66a5; background: #030307; padding:5px 0;","background: #ff66a5; padding:5px 0;","background: #ffc3dc; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;"];window.console.log.apply(console,e)}else window.console&&window.console.log("PixiJS "+w.VERSION+" - "+t+" - http://www.pixijs.com/");X=!0}}function v(){var t={stencil:!0,failIfMajorPerformanceCaveat:!0};try{if(!window.WebGLRenderingContext)return!1;var e=document.createElement("canvas"),r=e.getContext("webgl",t)||e.getContext("experimental-webgl",t),n=!(!r||!r.getContextAttributes().stencil);if(r){var i=r.getExtension("WEBGL_lose_context");i&&i.loseContext()}return r=null,n}catch(t){return!1}}function g(t){return 0===t?0:t<0?-1:1}function y(){var t=void 0;for(t in G)G[t].destroy();for(t in W)W[t].destroy()}function m(){var t=void 0;for(t in G)delete G[t];for(t in W)delete W[t]}function _(t,e){return H[e?1:0][t]}function b(t,e){if(1===e)return(255*e<<24)+t;if(0===e)return 0;var r=t>>16&255,n=t>>8&255,i=255&t;return r=r*e+.5|0,n=n*e+.5|0,i=i*e+.5|0,(255*e<<24)+(r<<16)+(n<<8)+i}function x(t,e,r,n){return r=r||new Float32Array(4),n||void 0===n?(r[0]=t[0]*e,r[1]=t[1]*e,r[2]=t[2]*e):(r[0]=t[0],r[1]=t[1],r[2]=t[2]),r[3]=e,r}function T(t,e,r,n){return r=r||new Float32Array(4),r[0]=(t>>16&255)/255,r[1]=(t>>8&255)/255,r[2]=(255&t)/255,(n||void 0===n)&&(r[0]*=e,r[1]*=e,r[2]*=e),r[3]=e,r}r.__esModule=!0,r.premultiplyBlendMode=r.BaseTextureCache=r.TextureCache=r.earcut=r.mixins=r.pluginTarget=r.EventEmitter=r.removeItems=r.isMobile=void 0,r.uid=o,r.hex2rgb=s,r.hex2string=a,r.rgb2hex=u,r.getResolutionOfUrl=h,r.decomposeDataUri=l,r.getUrlFileExtension=c,r.getSvgSize=d,r.skipHello=f,r.sayHello=p,r.isWebGLSupported=v,r.sign=g,r.destroyTextureCache=y,r.clearTextureCache=m,r.correctBlendMode=_,r.premultiplyTint=b,r.premultiplyRgba=x,r.premultiplyTintToRgba=T;var w=t("../const"),E=t("../settings"),S=i(E),O=t("eventemitter3"),M=i(O),P=t("./pluginTarget"),C=i(P),R=t("./mixin"),A=n(R),I=t("ismobilejs"),D=n(I),L=t("remove-array-items"),N=i(L),B=t("./mapPremultipliedBlendModes"),k=i(B),F=t("earcut"),j=i(F),U=0,X=!1;r.isMobile=D,r.removeItems=N.default,r.EventEmitter=M.default,r.pluginTarget=C.default,r.mixins=A,r.earcut=j.default;var G=r.TextureCache=Object.create(null),W=r.BaseTextureCache=Object.create(null),H=r.premultiplyBlendMode=(0,k.default)()},{"../const":46,"../settings":101,"./mapPremultipliedBlendModes":126,"./mixin":128,"./pluginTarget":129,earcut:2,eventemitter3:3,ismobilejs:4,"remove-array-items":31}],126:[function(t,e,r){"use strict";function n(){for(var t=[],e=[],r=0;r<32;r++)t[r]=r,e[r]=r;t[i.BLEND_MODES.NORMAL_NPM]=i.BLEND_MODES.NORMAL,t[i.BLEND_MODES.ADD_NPM]=i.BLEND_MODES.ADD,t[i.BLEND_MODES.SCREEN_NPM]=i.BLEND_MODES.SCREEN,e[i.BLEND_MODES.NORMAL]=i.BLEND_MODES.NORMAL_NPM,e[i.BLEND_MODES.ADD]=i.BLEND_MODES.ADD_NPM,e[i.BLEND_MODES.SCREEN]=i.BLEND_MODES.SCREEN_NPM;var n=[];return n.push(e),n.push(t),n}r.__esModule=!0,r.default=n;var i=t("../const")},{"../const":46}],127:[function(t,e,r){"use strict";function n(t){return o.default.tablet||o.default.phone?4:t}r.__esModule=!0,r.default=n;var i=t("ismobilejs"),o=function(t){return t&&t.__esModule?t:{default:t}}(i)},{ismobilejs:4}],128:[function(t,e,r){"use strict";function n(t,e){if(t&&e)for(var r=Object.keys(e),n=0;n1?this._fontStyle="italic":t.indexOf("oblique")>-1?this._fontStyle="oblique":this._fontStyle="normal",t.indexOf("small-caps")>-1?this._fontVariant="small-caps":this._fontVariant="normal";var e=t.split(" "),r=-1;this._fontSize=26;for(var i=0;i-1&&r=this._durations[this.currentFrame];)n-=this._durations[this.currentFrame]*i,this._currentTime+=i;this._currentTime+=n/this._durations[this.currentFrame]}else this._currentTime+=e;this._currentTime<0&&!this.loop?(this.gotoAndStop(0),this.onComplete&&this.onComplete()):this._currentTime>=this._textures.length&&!this.loop?(this.gotoAndStop(this._textures.length-1),this.onComplete&&this.onComplete()):r!==this.currentFrame&&(this.loop&&this.onLoop&&(this.animationSpeed>0&&this.currentFramer&&this.onLoop()),this.updateTexture())},e.prototype.updateTexture=function(){this._texture=this._textures[this.currentFrame],this._textureID=-1,this.cachedTint=16777215,this.updateAnchor&&this._anchor.copy(this._texture.defaultAnchor),this.onFrameChange&&this.onFrameChange(this.currentFrame)},e.prototype.destroy=function(e){this.stop(),t.prototype.destroy.call(this,e)},e.fromFrames=function(t){for(var r=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:{};i(this,e);var s=o(this,t.call(this));return s._textWidth=0,s._textHeight=0,s._glyphs=[],s._font={tint:void 0!==n.tint?n.tint:16777215,align:n.align||"left",name:null,size:0},s.font=n.font,s._text=r,s._maxWidth=0,s._maxLineHeight=0,s._letterSpacing=0,s._anchor=new c.default(function(){s.dirty=!0},s,0,0),s.dirty=!1,s.updateText(),s}return s(e,t),e.prototype.updateText=function(){for(var t=e.fonts[this._font.name],r=this._font.size/t.size,n=new h.Point,i=[],o=[],s=this.text.replace(/(?:\r\n|\r)/g,"\n"),a=s.length,u=this._maxWidth*t.size/this._font.size,l=null,c=0,d=0,f=0,p=-1,v=0,g=0,y=0,m=0;m0&&n.x>u&&(++g,h.utils.removeItems(i,1+p-g,1+m-p),m=p,p=-1,o.push(v),d=Math.max(d,v),f++,n.x=0,n.y+=t.lineHeight,l=null))}else o.push(c),d=Math.max(d,c),++f,++g,n.x=0,n.y+=t.lineHeight,l=null}var T=s.charAt(s.length-1);"\r"!==T&&"\n"!==T&&(/(?:\s)/.test(T)&&(c=v),o.push(c),d=Math.max(d,c));for(var w=[],E=0;E<=f;E++){var S=0;"right"===this._font.align?S=d-o[E]:"center"===this._font.align&&(S=(d-o[E])/2),w.push(S)}for(var O=i.length,M=this.tint,P=0;P=0?t:16777215,this.dirty=!0}},{key:"align",get:function(){return this._font.align},set:function(t){this._font.align=t||"left",this.dirty=!0}},{key:"anchor",get:function(){return this._anchor},set:function(t){"number"==typeof t?this._anchor.set(t):this._anchor.copy(t)}},{key:"font",get:function(){return this._font},set:function(t){t&&("string"==typeof t?(t=t.split(" "),this._font.name=1===t.length?t[0]:t.slice(1).join(" "),this._font.size=t.length>=2?parseInt(t[0],10):e.fonts[this._font.name].size):(this._font.name=t.name,this._font.size="number"==typeof t.size?t.size:parseInt(t.size,10)),this.dirty=!0)}},{key:"text",get:function(){return this._text},set:function(t){t=t.toString()||" ",this._text!==t&&(this._text=t,this.dirty=!0)}},{key:"maxWidth",get:function(){return this._maxWidth},set:function(t){this._maxWidth!==t&&(this._maxWidth=t,this.dirty=!0)}},{key:"maxLineHeight",get:function(){return this.validate(),this._maxLineHeight}},{key:"textWidth",get:function(){return this.validate(),this._textWidth}},{key:"letterSpacing",get:function(){return this._letterSpacing},set:function(t){this._letterSpacing!==t&&(this._letterSpacing=t,this.dirty=!0)}},{key:"textHeight",get:function(){return this.validate(),this._textHeight}}]),e}(h.Container);r.default=v,v.fonts={}},{"../core":65,"../core/math/ObservablePoint":68,"../core/settings":101,"../core/utils":125}],137:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:100,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100;n(this,e);var a=i(this,t.call(this,r));return a.tileTransform=new u.TransformStatic,a._width=o,a._height=s,a._canvasPattern=null,a.uvTransform=r.transform||new u.TextureMatrix(r),a.pluginName="tilingSprite",a.uvRespectAnchor=!1,a}return o(e,t),e.prototype._onTextureUpdate=function(){this.uvTransform&&(this.uvTransform.texture=this._texture),this.cachedTint=16777215},e.prototype._renderWebGL=function(t){var e=this._texture;e&&e.valid&&(this.tileTransform.updateLocalTransform(),this.uvTransform.update(),t.setObjectRenderer(t.plugins[this.pluginName]),t.plugins[this.pluginName].render(this))},e.prototype._renderCanvas=function(t){var e=this._texture;if(e.baseTexture.hasLoaded){var r=t.context,n=this.worldTransform,i=t.resolution,o=2===e.rotate,s=e.baseTexture,a=s.resolution,h=this.tilePosition.x/this.tileScale.x%e.orig.width*a,c=this.tilePosition.y/this.tileScale.y%e.orig.height*a;if(this._textureID!==this._texture._updateID||this.cachedTint!==this.tint){this._textureID=this._texture._updateID;var d=new u.CanvasRenderTarget(e.orig.width,e.orig.height,a);if(16777215!==this.tint)this.tintedTexture=l.default.getTintedTexture(this,this.tint),d.context.drawImage(this.tintedTexture,0,0);else{var f=e._frame.x*a,p=e._frame.y*a,v=e._frame.width*a,g=e._frame.height*a,y=(e.trim?e.trim.width:e.orig.width)*a,m=(e.trim?e.trim.height:e.orig.height)*a,_=(e.trim?e.trim.x:0)*a,b=(e.trim?e.trim.y:0)*a;o?(d.context.rotate(-Math.PI/2),d.context.translate(-m,0),d.context.drawImage(s.source,f,p,v,g,-b,_,m,y)):d.context.drawImage(s.source,f,p,v,g,_,b,y,m)}this.cachedTint=this.tint,this._canvasPattern=d.context.createPattern(d.canvas,"repeat")}r.globalAlpha=this.worldAlpha,r.setTransform(n.a*i,n.b*i,n.c*i,n.d*i,n.tx*i,n.ty*i),t.setBlendMode(this.blendMode),r.fillStyle=this._canvasPattern,r.scale(this.tileScale.x/a,this.tileScale.y/a);var x=this.anchor.x*-this._width*a,T=this.anchor.y*-this._height*a;this.uvRespectAnchor?(r.translate(h,c),r.fillRect(-h+x,-c+T,this._width/this.tileScale.x*a,this._height/this.tileScale.y*a)):(r.translate(h+x,c+T),r.fillRect(-h,-c,this._width/this.tileScale.x*a,this._height/this.tileScale.y*a))}},e.prototype._calculateBounds=function(){var t=this._width*-this._anchor._x,e=this._height*-this._anchor._y,r=this._width*(1-this._anchor._x),n=this._height*(1-this._anchor._y);this._bounds.addFrame(this.transform,t,e,r,n)},e.prototype.getLocalBounds=function(e){return 0===this.children.length?(this._bounds.minX=this._width*-this._anchor._x, +this._bounds.minY=this._height*-this._anchor._y,this._bounds.maxX=this._width*(1-this._anchor._x),this._bounds.maxY=this._height*(1-this._anchor._y),e||(this._localBoundsRect||(this._localBoundsRect=new u.Rectangle),e=this._localBoundsRect),this._bounds.getRectangle(e)):t.prototype.getLocalBounds.call(this,e)},e.prototype.containsPoint=function(t){this.worldTransform.applyInverse(t,c);var e=this._width,r=this._height,n=-e*this.anchor._x;if(c.x>=n&&c.x=i&&c.y0&&void 0!==arguments[0]?arguments[0]:new i.Point,e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.parent?this.parent.toGlobal(this.position,t,e):(t.x=this.position.x,t.y=this.position.y),t}},{"../core":65}],141:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0,r.BitmapText=r.TilingSpriteRenderer=r.TilingSprite=r.AnimatedSprite=void 0;var i=t("./AnimatedSprite");Object.defineProperty(r,"AnimatedSprite",{enumerable:!0,get:function(){return n(i).default}});var o=t("./TilingSprite");Object.defineProperty(r,"TilingSprite",{enumerable:!0,get:function(){return n(o).default}});var s=t("./webgl/TilingSpriteRenderer");Object.defineProperty(r,"TilingSpriteRenderer",{enumerable:!0,get:function(){return n(s).default}});var a=t("./BitmapText");Object.defineProperty(r,"BitmapText",{enumerable:!0,get:function(){return n(a).default}}),t("./cacheAsBitmap"),t("./getChildByName"),t("./getGlobalPosition")},{"./AnimatedSprite":135,"./BitmapText":136,"./TilingSprite":137,"./cacheAsBitmap":138,"./getChildByName":139,"./getGlobalPosition":140,"./webgl/TilingSpriteRenderer":142}],142:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=t("../../core"),a=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(s),u=t("../../core/const"),h=(t("path"),new a.Matrix),l=function(t){function e(r){n(this,e);var o=i(this,t.call(this,r));return o.shader=null,o.simpleShader=null,o.quad=null,o}return o(e,t),e.prototype.onContextChange=function(){var t=this.renderer.gl;this.shader=new a.Shader(t,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n","varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = mod(vTextureCoord - uClampOffset, vec2(1.0, 1.0)) + uClampOffset;\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n vec4 sample = texture2D(uSampler, coord);\n gl_FragColor = sample * uColor;\n}\n"),this.simpleShader=new a.Shader(t,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n","varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\n\nvoid main(void)\n{\n vec4 sample = texture2D(uSampler, vTextureCoord);\n gl_FragColor = sample * uColor;\n}\n"),this.renderer.bindVao(null),this.quad=new a.Quad(t,this.renderer.state.attribState),this.quad.initVao(this.shader)},e.prototype.render=function(t){var e=this.renderer,r=this.quad;e.bindVao(r.vao);var n=r.vertices;n[0]=n[6]=t._width*-t.anchor.x,n[1]=n[3]=t._height*-t.anchor.y,n[2]=n[4]=t._width*(1-t.anchor.x),n[5]=n[7]=t._height*(1-t.anchor.y),t.uvRespectAnchor&&(n=r.uvs,n[0]=n[6]=-t.anchor.x,n[1]=n[3]=-t.anchor.y,n[2]=n[4]=1-t.anchor.x,n[5]=n[7]=1-t.anchor.y),r.upload();var i=t._texture,o=i.baseTexture,s=t.tileTransform.localTransform,l=t.uvTransform,c=o.isPowerOfTwo&&i.frame.width===o.width&&i.frame.height===o.height;c&&(o._glTextures[e.CONTEXT_UID]?c=o.wrapMode!==u.WRAP_MODES.CLAMP:o.wrapMode===u.WRAP_MODES.CLAMP&&(o.wrapMode=u.WRAP_MODES.REPEAT));var d=c?this.simpleShader:this.shader;e.bindShader(d);var f=i.width,p=i.height,v=t._width,g=t._height;h.set(s.a*f/v,s.b*f/g,s.c*p/v,s.d*p/g,s.tx/v,s.ty/g),h.invert(),c?h.prepend(l.mapCoord):(d.uniforms.uMapCoord=l.mapCoord.toArray(!0),d.uniforms.uClampFrame=l.uClampFrame,d.uniforms.uClampOffset=l.uClampOffset),d.uniforms.uTransform=h.toArray(!0),d.uniforms.uColor=a.utils.premultiplyTintToRgba(t.tint,t.worldAlpha,d.uniforms.uColor,o.premultipliedAlpha),d.uniforms.translationMatrix=t.transform.worldTransform.toArray(!0),d.uniforms.uSampler=e.bindTexture(i),e.setBlendMode(a.utils.correctBlendMode(t.blendMode,o.premultipliedAlpha)),r.vao.draw(this.renderer.gl.TRIANGLES,6,0)},e}(a.ObjectRenderer);r.default=l,a.WebGLRenderer.registerPlugin("tilingSprite",l)},{"../../core":65,"../../core/const":46,path:8}],143:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:1;n(this,e);var o=i(this,t.call(this,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}","varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float uAlpha;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord) * uAlpha;\n}\n"));return o.alpha=r,o.glShaderKey="alpha",o}return o(e,t),s(e,[{key:"alpha",get:function(){return this.uniforms.uAlpha},set:function(t){this.uniforms.uAlpha=t}}]),e}(u.Filter));r.default=h},{"../../core":65,path:8}],144:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=function(){function t(t,e){for(var r=0;r=r&&(u=t-h-1),l=l.replace("%value%",e[u]),s+=l,s+="\n"}return n=n.replace("%blur%",s),n=n.replace("%size%",t)}r.__esModule=!0,r.default=n;var i={5:[.153388,.221461,.250301],7:[.071303,.131514,.189879,.214607],9:[.028532,.067234,.124009,.179044,.20236],11:[.0093,.028002,.065984,.121703,.175713,.198596],13:[.002406,.009255,.027867,.065666,.121117,.174868,.197641],15:[489e-6,.002403,.009246,.02784,.065602,.120999,.174697,.197448]},o=["varying vec2 vBlurTexCoords[%size%];","uniform sampler2D uSampler;","void main(void)","{"," gl_FragColor = vec4(0.0);"," %blur%","}"].join("\n")},{}],148:[function(t,e,r){"use strict";function n(t,e){var r=Math.ceil(t/2),n=i,o="",s=void 0;s=e?"vBlurTexCoords[%index%] = aTextureCoord + vec2(%sampleIndex% * strength, 0.0);":"vBlurTexCoords[%index%] = aTextureCoord + vec2(0.0, %sampleIndex% * strength);";for(var a=0;ae;)r-=2;return r}r.__esModule=!0,r.default=n},{}],150:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r 0.0) {\n c.rgb /= c.a;\n }\n\n vec4 result;\n\n result.r = (m[0] * c.r);\n result.r += (m[1] * c.g);\n result.r += (m[2] * c.b);\n result.r += (m[3] * c.a);\n result.r += m[4];\n\n result.g = (m[5] * c.r);\n result.g += (m[6] * c.g);\n result.g += (m[7] * c.b);\n result.g += (m[8] * c.a);\n result.g += m[9];\n\n result.b = (m[10] * c.r);\n result.b += (m[11] * c.g);\n result.b += (m[12] * c.b);\n result.b += (m[13] * c.a);\n result.b += m[14];\n\n result.a = (m[15] * c.r);\n result.a += (m[16] * c.g);\n result.a += (m[17] * c.b);\n result.a += (m[18] * c.a);\n result.a += m[19];\n\n vec3 rgb = mix(c.rgb, result.rgb, uAlpha);\n\n // Premultiply alpha again.\n rgb *= result.a;\n\n gl_FragColor = vec4(rgb, result.a);\n}\n"));return r.uniforms.m=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],r.alpha=1,r}return o(e,t),e.prototype._loadMatrix=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=t;e&&(this._multiply(r,this.uniforms.m,t),r=this._colorMatrix(r)),this.uniforms.m=r},e.prototype._multiply=function(t,e,r){return t[0]=e[0]*r[0]+e[1]*r[5]+e[2]*r[10]+e[3]*r[15],t[1]=e[0]*r[1]+e[1]*r[6]+e[2]*r[11]+e[3]*r[16],t[2]=e[0]*r[2]+e[1]*r[7]+e[2]*r[12]+e[3]*r[17],t[3]=e[0]*r[3]+e[1]*r[8]+e[2]*r[13]+e[3]*r[18],t[4]=e[0]*r[4]+e[1]*r[9]+e[2]*r[14]+e[3]*r[19]+e[4],t[5]=e[5]*r[0]+e[6]*r[5]+e[7]*r[10]+e[8]*r[15],t[6]=e[5]*r[1]+e[6]*r[6]+e[7]*r[11]+e[8]*r[16],t[7]=e[5]*r[2]+e[6]*r[7]+e[7]*r[12]+e[8]*r[17],t[8]=e[5]*r[3]+e[6]*r[8]+e[7]*r[13]+e[8]*r[18],t[9]=e[5]*r[4]+e[6]*r[9]+e[7]*r[14]+e[8]*r[19]+e[9],t[10]=e[10]*r[0]+e[11]*r[5]+e[12]*r[10]+e[13]*r[15],t[11]=e[10]*r[1]+e[11]*r[6]+e[12]*r[11]+e[13]*r[16],t[12]=e[10]*r[2]+e[11]*r[7]+e[12]*r[12]+e[13]*r[17],t[13]=e[10]*r[3]+e[11]*r[8]+e[12]*r[13]+e[13]*r[18],t[14]=e[10]*r[4]+e[11]*r[9]+e[12]*r[14]+e[13]*r[19]+e[14],t[15]=e[15]*r[0]+e[16]*r[5]+e[17]*r[10]+e[18]*r[15],t[16]=e[15]*r[1]+e[16]*r[6]+e[17]*r[11]+e[18]*r[16],t[17]=e[15]*r[2]+e[16]*r[7]+e[17]*r[12]+e[18]*r[17],t[18]=e[15]*r[3]+e[16]*r[8]+e[17]*r[13]+e[18]*r[18],t[19]=e[15]*r[4]+e[16]*r[9]+e[17]*r[14]+e[18]*r[19]+e[19],t},e.prototype._colorMatrix=function(t){var e=new Float32Array(t);return e[4]/=255,e[9]/=255,e[14]/=255,e[19]/=255,e},e.prototype.brightness=function(t,e){var r=[t,0,0,0,0,0,t,0,0,0,0,0,t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.greyscale=function(t,e){var r=[t,t,t,0,0,t,t,t,0,0,t,t,t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.blackAndWhite=function(t){var e=[.3,.6,.1,0,0,.3,.6,.1,0,0,.3,.6,.1,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.hue=function(t,e){t=(t||0)/180*Math.PI;var r=Math.cos(t),n=Math.sin(t),i=Math.sqrt,o=1/3,s=i(o),a=r+(1-r)*o,u=o*(1-r)-s*n,h=o*(1-r)+s*n,l=o*(1-r)+s*n,c=r+o*(1-r),d=o*(1-r)-s*n,f=o*(1-r)-s*n,p=o*(1-r)+s*n,v=r+o*(1-r),g=[a,u,h,0,0,l,c,d,0,0,f,p,v,0,0,0,0,0,1,0];this._loadMatrix(g,e)},e.prototype.contrast=function(t,e){var r=(t||0)+1,n=-.5*(r-1),i=[r,0,0,0,n,0,r,0,0,n,0,0,r,0,n,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.saturate=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments[1],r=2*t/3+1,n=-.5*(r-1),i=[r,n,n,0,0,n,r,n,0,0,n,n,r,0,0,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.desaturate=function(){this.saturate(-1)},e.prototype.negative=function(t){var e=[-1,0,0,1,0,0,-1,0,1,0,0,0,-1,1,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.sepia=function(t){var e=[.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.technicolor=function(t){var e=[1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.polaroid=function(t){var e=[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.toBGR=function(t){var e=[0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.kodachrome=function(t){var e=[1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.browni=function(t){var e=[.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.vintage=function(t){var e=[.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.colorTone=function(t,e,r,n,i){t=t||.2,e=e||.15,r=r||16770432,n=n||3375104;var o=(r>>16&255)/255,s=(r>>8&255)/255,a=(255&r)/255,u=(n>>16&255)/255,h=(n>>8&255)/255,l=(255&n)/255,c=[.3,.59,.11,0,0,o,s,a,t,0,u,h,l,e,0,o-u,s-h,a-l,0,0];this._loadMatrix(c,i)},e.prototype.night=function(t,e){t=t||.1;var r=[-2*t,-t,0,0,0,-t,0,t,0,0,0,t,2*t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.predator=function(t,e){var r=[11.224130630493164*t,-4.794486999511719*t,-2.8746118545532227*t,0*t,.40342438220977783*t,-3.6330697536468506*t,9.193157196044922*t,-2.951810836791992*t,0*t,-1.316135048866272*t,-3.2184197902679443*t,-4.2375030517578125*t,7.476448059082031*t,0*t,.8044459223747253*t,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.lsd=function(t){var e=[2,-.4,.5,0,0,-.5,2,-.4,0,0,-.4,-.5,3,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.reset=function(){var t=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0];this._loadMatrix(t,!1)},s(e,[{key:"matrix",get:function(){return this.uniforms.m},set:function(t){this.uniforms.m=t}},{key:"alpha",get:function(){return this.uniforms.uAlpha}, +set:function(t){this.uniforms.uAlpha=t}}]),e}(u.Filter));r.default=h,h.prototype.grayscale=h.prototype.greyscale},{"../../core":65,path:8}],151:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r lumaMax))\n color = vec4(rgbA, texColor.a);\n else\n color = vec4(rgbB, texColor.a);\n return color;\n}\n\nvoid main() {\n\n vec2 fragCoord = vTextureCoord * filterArea.xy;\n\n vec4 color;\n\n color = fxaa(uSampler, fragCoord, filterArea.xy, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n\n gl_FragColor = color;\n}\n'))}return o(e,t),e}(a.Filter));r.default=u},{"../../core":65,path:8}],153:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./fxaa/FXAAFilter");Object.defineProperty(r,"FXAAFilter",{enumerable:!0,get:function(){return n(i).default}});var o=t("./noise/NoiseFilter");Object.defineProperty(r,"NoiseFilter",{enumerable:!0,get:function(){return n(o).default}});var s=t("./displacement/DisplacementFilter");Object.defineProperty(r,"DisplacementFilter",{enumerable:!0,get:function(){return n(s).default}});var a=t("./blur/BlurFilter");Object.defineProperty(r,"BlurFilter",{enumerable:!0,get:function(){return n(a).default}});var u=t("./blur/BlurXFilter");Object.defineProperty(r,"BlurXFilter",{enumerable:!0,get:function(){return n(u).default}});var h=t("./blur/BlurYFilter");Object.defineProperty(r,"BlurYFilter",{enumerable:!0,get:function(){return n(h).default}});var l=t("./colormatrix/ColorMatrixFilter");Object.defineProperty(r,"ColorMatrixFilter",{enumerable:!0,get:function(){return n(l).default}});var c=t("./alpha/AlphaFilter");Object.defineProperty(r,"AlphaFilter",{enumerable:!0,get:function(){return n(c).default}})},{"./alpha/AlphaFilter":143,"./blur/BlurFilter":144,"./blur/BlurXFilter":145,"./blur/BlurYFilter":146,"./colormatrix/ColorMatrixFilter":150,"./displacement/DisplacementFilter":151,"./fxaa/FXAAFilter":152,"./noise/NoiseFilter":154}],154:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:.5,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Math.random();n(this,e);var s=i(this,t.call(this,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}","precision highp float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform float uNoise;\nuniform float uSeed;\nuniform sampler2D uSampler;\n\nfloat rand(vec2 co)\n{\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main()\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n float randomValue = rand(gl_FragCoord.xy * uSeed);\n float diff = (randomValue - 0.5) * uNoise;\n\n // Un-premultiply alpha before applying the color matrix. See issue #3539.\n if (color.a > 0.0) {\n color.rgb /= color.a;\n }\n\n color.r += diff;\n color.g += diff;\n color.b += diff;\n\n // Premultiply alpha again.\n color.rgb *= color.a;\n\n gl_FragColor = color;\n}\n"));return s.noise=r,s.seed=o,s}return o(e,t),s(e,[{key:"noise",get:function(){return this.uniforms.uNoise},set:function(t){this.uniforms.uNoise=t}},{key:"seed",get:function(){return this.uniforms.uSeed},set:function(t){this.uniforms.uSeed=t}}]),e}(u.Filter));r.default=h},{"../../core":65,path:8}],155:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:1;this.removeEvents(),this.interactionDOMElement=t,this.resolution=e,this.addEvents()},e.prototype.addEvents=function(){this.interactionDOMElement&&(h.ticker.shared.add(this.update,this,h.UPDATE_PRIORITY.INTERACTION),window.navigator.msPointerEnabled?(this.interactionDOMElement.style["-ms-content-zooming"]="none",this.interactionDOMElement.style["-ms-touch-action"]="none"):this.supportsPointerEvents&&(this.interactionDOMElement.style["touch-action"]="none"),this.supportsPointerEvents?(window.document.addEventListener("pointermove",this.onPointerMove,!0),this.interactionDOMElement.addEventListener("pointerdown",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("pointerleave",this.onPointerOut,!0),this.interactionDOMElement.addEventListener("pointerover",this.onPointerOver,!0),window.addEventListener("pointercancel",this.onPointerCancel,!0),window.addEventListener("pointerup",this.onPointerUp,!0)):(window.document.addEventListener("mousemove",this.onPointerMove,!0),this.interactionDOMElement.addEventListener("mousedown",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("mouseout",this.onPointerOut,!0),this.interactionDOMElement.addEventListener("mouseover",this.onPointerOver,!0),window.addEventListener("mouseup",this.onPointerUp,!0)),this.supportsTouchEvents&&(this.interactionDOMElement.addEventListener("touchstart",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("touchcancel",this.onPointerCancel,!0),this.interactionDOMElement.addEventListener("touchend",this.onPointerUp,!0),this.interactionDOMElement.addEventListener("touchmove",this.onPointerMove,!0)),this.eventsAdded=!0)},e.prototype.removeEvents=function(){this.interactionDOMElement&&(h.ticker.shared.remove(this.update,this),window.navigator.msPointerEnabled?(this.interactionDOMElement.style["-ms-content-zooming"]="",this.interactionDOMElement.style["-ms-touch-action"]=""):this.supportsPointerEvents&&(this.interactionDOMElement.style["touch-action"]=""),this.supportsPointerEvents?(window.document.removeEventListener("pointermove",this.onPointerMove,!0),this.interactionDOMElement.removeEventListener("pointerdown",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("pointerleave",this.onPointerOut,!0),this.interactionDOMElement.removeEventListener("pointerover",this.onPointerOver,!0),window.removeEventListener("pointercancel",this.onPointerCancel,!0),window.removeEventListener("pointerup",this.onPointerUp,!0)):(window.document.removeEventListener("mousemove",this.onPointerMove,!0),this.interactionDOMElement.removeEventListener("mousedown",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("mouseout",this.onPointerOut,!0),this.interactionDOMElement.removeEventListener("mouseover",this.onPointerOver,!0),window.removeEventListener("mouseup",this.onPointerUp,!0)),this.supportsTouchEvents&&(this.interactionDOMElement.removeEventListener("touchstart",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("touchcancel",this.onPointerCancel,!0),this.interactionDOMElement.removeEventListener("touchend",this.onPointerUp,!0),this.interactionDOMElement.removeEventListener("touchmove",this.onPointerMove,!0)),this.interactionDOMElement=null,this.eventsAdded=!1)},e.prototype.update=function(t){if(this._deltaTime+=t,!(this._deltaTime=0;l--){var c=h[l],d=this.processInteractive(t,c,r,n,a);if(d){if(!c.parent)continue;a=!1,d&&(t.target&&(n=!1),s=!0)}}return i&&(n&&!t.target&&!e.hitArea&&e.containsPoint&&e.containsPoint(o)&&(s=!0),e.interactive&&(s&&!t.target&&(t.target=e),r&&r(t,e,!!s))),s},e.prototype.onPointerDown=function(t){if(!this.supportsTouchEvents||"touch"!==t.pointerType){var e=this.normalizeToPointerData(t);this.autoPreventDefault&&e[0].isNormalized&&t.preventDefault();for(var r=e.length,n=0;ne?1:this._height/e;t[9]=t[11]=t[13]=t[15]=this._topHeight*r,t[17]=t[19]=t[21]=t[23]=this._height-this._bottomHeight*r,t[25]=t[27]=t[29]=t[31]=this._height},e.prototype.updateVerticalVertices=function(){var t=this.vertices,e=this._leftWidth+this._rightWidth,r=this._width>e?1:this._width/e;t[2]=t[10]=t[18]=t[26]=this._leftWidth*r,t[4]=t[12]=t[20]=t[28]=this._width-this._rightWidth*r,t[6]=t[14]=t[22]=t[30]=this._width},e.prototype._renderCanvas=function(t){var e=t.context,r=this.worldTransform,n=t.resolution,i=16777215!==this.tint,o=this._texture;i&&this._cachedTint!==this.tint&&(this._cachedTint=this.tint,this._tintedTexture=c.default.getTintedTexture(this,this.tint));var s=i?this._tintedTexture:o.baseTexture.source;this._canvasUvs||(this._canvasUvs=[0,0,0,0,0,0,0,0]);var a=this.vertices,u=this._canvasUvs,h=i?0:o.frame.x,l=i?0:o.frame.y,d=h+o.frame.width,f=l+o.frame.height;u[0]=h,u[1]=h+this._leftWidth,u[2]=d-this._rightWidth,u[3]=d,u[4]=l,u[5]=l+this._topHeight,u[6]=f-this._bottomHeight,u[7]=f;for(var p=0;p<8;p++)u[p]*=o.baseTexture.resolution;e.globalAlpha=this.worldAlpha,t.setBlendMode(this.blendMode),t.roundPixels?e.setTransform(r.a*n,r.b*n,r.c*n,r.d*n,r.tx*n|0,r.ty*n|0):e.setTransform(r.a*n,r.b*n,r.c*n,r.d*n,r.tx*n,r.ty*n);for(var v=0;v<3;v++)for(var g=0;g<3;g++){var y=2*g+8*v,m=Math.max(1,u[g+1]-u[g]),_=Math.max(1,u[v+5]-u[v+4]),b=Math.max(1,a[y+10]-a[y]),x=Math.max(1,a[y+11]-a[y+1]);e.drawImage(s,u[g],u[v+4],m,_,a[y],a[y+1],b,x)}},e.prototype._refresh=function(){t.prototype._refresh.call(this);var e=this.uvs,r=this._texture;this._origWidth=r.orig.width,this._origHeight=r.orig.height;var n=1/this._origWidth,i=1/this._origHeight;e[0]=e[8]=e[16]=e[24]=0,e[1]=e[3]=e[5]=e[7]=0,e[6]=e[14]=e[22]=e[30]=1,e[25]=e[27]=e[29]=e[31]=1,e[2]=e[10]=e[18]=e[26]=n*this._leftWidth,e[4]=e[12]=e[20]=e[28]=1-n*this._rightWidth,e[9]=e[11]=e[13]=e[15]=i*this._topHeight,e[17]=e[19]=e[21]=e[23]=1-i*this._bottomHeight,this.updateHorizontalVertices(),this.updateVerticalVertices(),this.dirty++,this.multiplyUvs()},a(e,[{key:"width",get:function(){return this._width},set:function(t){this._width=t,this._refresh()}},{key:"height",get:function(){return this._height},set:function(t){this._height=t,this._refresh()}},{key:"leftWidth",get:function(){return this._leftWidth},set:function(t){this._leftWidth=t,this._refresh()}},{key:"rightWidth",get:function(){return this._rightWidth},set:function(t){this._rightWidth=t,this._refresh()}},{key:"topHeight",get:function(){return this._topHeight},set:function(t){this._topHeight=t,this._refresh()}},{key:"bottomHeight",get:function(){return this._bottomHeight},set:function(t){this._bottomHeight=t,this._refresh()}}]),e}(h.default);r.default=f},{"../core/sprites/canvas/CanvasTinter":104,"./Plane":168}],168:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=t("./Mesh"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=function(t){function e(r,o,s){n(this,e);var u=i(this,t.call(this,r));return u._ready=!0,u.verticesX=o||10,u.verticesY=s||10,u.drawMode=a.default.DRAW_MODES.TRIANGLES,u.refresh(),u}return o(e,t),e.prototype._refresh=function(){for(var t=this._texture,e=this.verticesX*this.verticesY,r=[],n=[],i=[],o=[],s=this.verticesX-1,a=this.verticesY-1,u=t.width/s,h=t.height/a,l=0;l1&&(l=1);var c=Math.sqrt(n*n+i*i),d=this._texture.height/2;n/=c,i/=c,n*=d,i*=d,o[h]=u.x+n,o[h+1]=u.y+i,o[h+2]=u.x-n,o[h+3]=u.y-i,e=u}},e.prototype.updateTransform=function(){this.autoUpdate&&this.refreshVertices(),this.containerUpdateTransform()},e}(a.default);r.default=u},{"./Mesh":166}],170:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../../core"),o=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(i),s=t("../Mesh"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=function(){function t(e){n(this,t),this.renderer=e}return t.prototype.render=function(t){var e=this.renderer,r=e.context,n=t.worldTransform,i=e.resolution;e.roundPixels?r.setTransform(n.a*i,n.b*i,n.c*i,n.d*i,n.tx*i|0,n.ty*i|0):r.setTransform(n.a*i,n.b*i,n.c*i,n.d*i,n.tx*i,n.ty*i),e.context.globalAlpha=t.worldAlpha,e.setBlendMode(t.blendMode),t.drawMode===a.default.DRAW_MODES.TRIANGLE_MESH?this._renderTriangleMesh(t):this._renderTriangles(t)},t.prototype._renderTriangleMesh=function(t){for(var e=t.vertices.length/2,r=0;r0){var O=S/Math.abs(t.worldTransform.a),M=S/Math.abs(t.worldTransform.d),P=(_+b+x)/3,C=(T+w+E)/3,R=_-P,A=T-C,I=Math.sqrt(R*R+A*A);_=P+R/I*(I+O),T=C+A/I*(I+M),R=b-P,A=w-C,I=Math.sqrt(R*R+A*A),b=P+R/I*(I+O),w=C+A/I*(I+M),R=x-P,A=E-C,I=Math.sqrt(R*R+A*A),x=P+R/I*(I+O),E=C+A/I*(I+M)}i.save(),i.beginPath(),i.moveTo(_,T),i.lineTo(b,w),i.lineTo(x,E),i.closePath(),i.clip();var D=d*g+v*p+f*y-g*p-v*f-d*y,L=_*g+v*x+b*y-g*x-v*b-_*y,N=d*b+_*p+f*x-b*p-_*f-d*x,B=d*g*x+v*b*p+_*f*y-_*g*p-v*f*x-d*b*y,k=T*g+v*E+w*y-g*E-v*w-T*y,F=d*w+T*p+f*E-w*p-T*f-d*E,j=d*g*E+v*w*p+T*f*y-T*g*p-v*f*E-d*w*y;i.transform(L/D,k/D,N/D,F/D,B/D,j/D),i.drawImage(h,0,0,l*u.resolution,c*u.resolution,0,0,l,c),i.restore(),this.renderer.invalidateBlendMode()}},t.prototype.renderMeshFlat=function(t){var e=this.renderer.context,r=t.vertices,n=r.length/2;e.beginPath();for(var i=1;i0&&void 0!==arguments[0]?arguments[0]:1500,o=arguments[1],s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:16384,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n(this,e);var h=i(this,t.call(this));return s>16384&&(s=16384),s>r&&(s=r),h._properties=[!1,!0,!1,!1,!1],h._maxSize=r,h._batchSize=s,h._glBuffers={},h._bufferUpdateIDs=[],h._updateID=0,h.interactiveChildren=!1,h.blendMode=u.BLEND_MODES.NORMAL,h.autoResize=a,h.roundPixels=!0,h.baseTexture=null,h.setProperties(o),h._tint=0,h.tintRgb=new Float32Array(4),h.tint=16777215,h}return o(e,t),e.prototype.setProperties=function(t){t&&(this._properties[0]="vertices"in t||"scale"in t?!!t.vertices||!!t.scale:this._properties[0],this._properties[1]="position"in t?!!t.position:this._properties[1],this._properties[2]="rotation"in t?!!t.rotation:this._properties[2],this._properties[3]="uvs"in t?!!t.uvs:this._properties[3],this._properties[4]="tint"in t||"alpha"in t?!!t.tint||!!t.alpha:this._properties[4])},e.prototype.updateTransform=function(){this.displayObjectUpdateTransform()},e.prototype.renderWebGL=function(t){var e=this;this.visible&&!(this.worldAlpha<=0)&&this.children.length&&this.renderable&&(this.baseTexture||(this.baseTexture=this.children[0]._texture.baseTexture,this.baseTexture.hasLoaded||this.baseTexture.once("update",function(){return e.onChildrenChange(0)})),t.setObjectRenderer(t.plugins.particle),t.plugins.particle.render(this))},e.prototype.onChildrenChange=function(t){for(var e=Math.floor(t/this._batchSize);this._bufferUpdateIDs.lengthr&&(o=r);var s=t._glBuffers[i.CONTEXT_UID];s||(s=t._glBuffers[i.CONTEXT_UID]=this.generateBuffers(t));var a=e[0]._texture.baseTexture;this.renderer.setBlendMode(u.utils.correctBlendMode(t.blendMode,a.premultipliedAlpha));var h=i.gl,l=t.worldTransform.copy(this.tempMatrix);l.prepend(i._activeRenderTarget.projectionMatrix),this.shader.uniforms.projectionMatrix=l.toArray(!0),this.shader.uniforms.uColor=u.utils.premultiplyRgba(t.tintRgb,t.worldAlpha,this.shader.uniforms.uColor,a.premultipliedAlpha),this.shader.uniforms.uSampler=i.bindTexture(a);for(var c=!1,d=0,f=0;dn&&(p=n),f>=s.length){if(!t.autoResize)break;s.push(this._generateOneMoreBuffer(t))}var v=s[f];v.uploadDynamic(e,d,p);var g=t._bufferUpdateIDs[f]||0;c=c||v._updateID0?1:-1})},{}],179:[function(t,e,r){"use strict";Number.isInteger||(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t})},{}],180:[function(t,e,r){"use strict";var n=t("object-assign"),i=function(t){return t&&t.__esModule?t:{default:t}}(n);Object.assign||(Object.assign=i.default)},{"object-assign":6}],181:[function(t,e,r){"use strict";t("./Object.assign"),t("./requestAnimationFrame"),t("./Math.sign"),t("./Number.isInteger"),window.ArrayBuffer||(window.ArrayBuffer=Array),window.Float32Array||(window.Float32Array=Array),window.Uint32Array||(window.Uint32Array=Array),window.Uint16Array||(window.Uint16Array=Array)},{"./Math.sign":178,"./Number.isInteger":179,"./Object.assign":180,"./requestAnimationFrame":182}],182:[function(t,e,r){(function(t){"use strict";if(Date.now&&Date.prototype.getTime||(Date.now=function(){return(new Date).getTime()}),!t.performance||!t.performance.now){var e=Date.now();t.performance||(t.performance={}),t.performance.now=function(){return Date.now()-e}}for(var r=Date.now(),n=["ms","moz","webkit","o"],i=0;i=0;n--)this.add(t.children[n]);return this},t.prototype.destroy=function(){this.ticking&&v.remove(this.tick,this),this.ticking=!1,this.addHooks=null,this.uploadHooks=null,this.renderer=null,this.completes=null,this.queue=null,this.limiter=null,this.uploadHookHelper=null},t}();r.default=g},{"../core":65,"./limiters/CountLimiter":186}],184:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){if(e instanceof u.BaseTexture){var r=e.source,n=0===r.width?t.canvas.width:Math.min(t.canvas.width,r.width),i=0===r.height?t.canvas.height:Math.min(t.canvas.height,r.height);return t.ctx.drawImage(r,0,0,n,i,0,0,t.canvas.width,t.canvas.height),!0}return!1}r.__esModule=!0;var a=t("../../core"),u=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(a),h=t("../BasePrepare"),l=function(t){return t&&t.__esModule?t:{default:t}}(h),c=16,d=function(t){function e(r){n(this,e);var o=i(this,t.call(this,r));return o.uploadHookHelper=o,o.canvas=document.createElement("canvas"),o.canvas.width=c,o.canvas.height=c,o.ctx=o.canvas.getContext("2d"),o.registerUploadHook(s),o}return o(e,t),e.prototype.destroy=function(){t.prototype.destroy.call(this),this.ctx=null,this.canvas=null},e}(l.default);r.default=d,u.CanvasRenderer.registerPlugin("prepare",d)},{"../../core":65,"../BasePrepare":183}],185:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./webgl/WebGLPrepare");Object.defineProperty(r,"webgl",{enumerable:!0,get:function(){return n(i).default}});var o=t("./canvas/CanvasPrepare");Object.defineProperty(r,"canvas",{enumerable:!0,get:function(){return n(o).default}});var s=t("./BasePrepare");Object.defineProperty(r,"BasePrepare",{enumerable:!0,get:function(){return n(s).default}});var a=t("./limiters/CountLimiter");Object.defineProperty(r,"CountLimiter",{enumerable:!0,get:function(){return n(a).default}});var u=t("./limiters/TimeLimiter");Object.defineProperty(r,"TimeLimiter",{enumerable:!0,get:function(){return n(u).default}})},{"./BasePrepare":183,"./canvas/CanvasPrepare":184,"./limiters/CountLimiter":186,"./limiters/TimeLimiter":187,"./webgl/WebGLPrepare":188}],186:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(e){n(this,t),this.maxItemsPerFrame=e,this.itemsLeft=0}return t.prototype.beginFrame=function(){this.itemsLeft=this.maxItemsPerFrame},t.prototype.allowedToUpload=function(){return this.itemsLeft-- >0},t}();r.default=i},{}],187:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(e){n(this,t),this.maxMilliseconds=e,this.frameStart=0}return t.prototype.beginFrame=function(){this.frameStart=Date.now()},t.prototype.allowedToUpload=function(){return Date.now()-this.frameStart maxWidth || + canvasHeight > maxHeight + ) { + var factor = maxWidth / canvasWidth; + if (canvasHeight * factor > maxHeight) factor = maxHeight / canvasHeight; + + canvasWidth *= factor; + canvasHeight *= factor; + } + + this._pixiRenderer.view.style['top'] = + this._marginTop + (maxHeight - canvasHeight) / 2 + 'px'; + this._pixiRenderer.view.style['left'] = + this._marginLeft + (maxWidth - canvasWidth) / 2 + 'px'; + this._pixiRenderer.view.style.width = canvasWidth + 'px'; + this._pixiRenderer.view.style.height = canvasHeight + 'px'; + + // Store the canvas size for fast access to it. + this._canvasWidth = canvasWidth; + this._canvasHeight = canvasHeight; +}; + +/** + * Set if the aspect ratio must be kept when the game canvas is resized to fill + * the page. + */ +gdjs.RuntimeGamePixiRenderer.prototype.keepAspectRatio = function(enable) { + if (this._keepRatio === enable) return; + + this._keepRatio = enable; + this._resizeCanvas(); + this._game._notifySceneForResize = true; +}; + +/** + * Change the margin that must be preserved around the game canvas. + */ +gdjs.RuntimeGamePixiRenderer.prototype.setMargins = function( + top, + right, + bottom, + left +) { + if ( + this._marginTop === top && + this._marginRight === right && + this._marginBottom === bottom && + this._marginLeft === left + ) + return; + + this._marginTop = top; + this._marginRight = right; + this._marginBottom = bottom; + this._marginLeft = left; + this._resizeCanvas(); + this._game._notifySceneForResize = true; +}; + +/** + * Update the window size, if possible. + * @param {number} width The new width, in pixels. + * @param {number} height The new height, in pixels. + */ +gdjs.RuntimeGamePixiRenderer.prototype.setWindowSize = function(width, height) { + var electron = this.getElectron(); + if (electron) { + // Use Electron BrowserWindow API + var browserWindow = electron.remote.getCurrentWindow(); + if (browserWindow) { + browserWindow.setContentSize(width, height); + } + } else { + console.warn("Window size can't be changed on this platform."); + } +}; + +/** + * Center the window on screen. + */ +gdjs.RuntimeGamePixiRenderer.prototype.centerWindow = function() { + var electron = this.getElectron(); + if (electron) { + // Use Electron BrowserWindow API + var browserWindow = electron.remote.getCurrentWindow(); + if (browserWindow) { + browserWindow.center(); + } + } else { + // Not supported + } +}; + +/** + * De/activate fullscreen for the game. + */ +gdjs.RuntimeGamePixiRenderer.prototype.setFullScreen = function(enable) { + if (this._forceFullscreen) return; + + if (this._isFullscreen !== enable) { + this._isFullscreen = !!enable; + + var electron = this.getElectron(); + if (electron) { + // Use Electron BrowserWindow API + var browserWindow = electron.remote.getCurrentWindow(); + if (browserWindow) { + browserWindow.setFullScreen(this._isFullscreen); + } + } else { + // Use HTML5 Fullscreen API + //TODO: Do this on a user gesture, otherwise most browsers won't activate fullscreen + if (this._isFullscreen) { + if (document.documentElement.requestFullScreen) { + document.documentElement.requestFullScreen(); + } else if (document.documentElement.mozRequestFullScreen) { + document.documentElement.mozRequestFullScreen(); + } else if (document.documentElement.webkitRequestFullScreen) { + document.documentElement.webkitRequestFullScreen(); + } + } else { + if (document.cancelFullScreen) { + document.cancelFullScreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } + } + } + + this._resizeCanvas(); + this._notifySceneForResize = true; + } +}; + +/** + * Add the standard events handler. + */ +gdjs.RuntimeGamePixiRenderer.prototype.bindStandardEvents = function( + manager, + window, + document +) { + var renderer = this._pixiRenderer; + var canvas = renderer.view; + + //Translate an event (mouse or touch) made on the canvas on the page + //to game coordinates. + var that = this; + function getEventPosition(e) { + var pos = [0, 0]; + if (e.pageX) { + pos[0] = e.pageX - canvas.offsetLeft; + pos[1] = e.pageY - canvas.offsetTop; + } else { + pos[0] = + e.clientX + + document.body.scrollLeft + + document.documentElement.scrollLeft - + canvas.offsetLeft; + pos[1] = + e.clientY + + document.body.scrollTop + + document.documentElement.scrollTop - + canvas.offsetTop; + } + + //Handle the fact that the game is stretched to fill the canvas. + pos[0] *= that._game.getGameResolutionWidth() / (that._canvasWidth || 1); + pos[1] *= that._game.getGameResolutionHeight() / (that._canvasHeight || 1); + + return pos; + } + + //Some browsers lacks definition of some variables used to do calculations + //in getEventPosition. They are defined to 0 as they are useless. + (function ensureOffsetsExistence() { + if (isNaN(canvas.offsetLeft)) { + canvas.offsetLeft = 0; + canvas.offsetTop = 0; + } + if (isNaN(document.body.scrollLeft)) { + document.body.scrollLeft = 0; + document.body.scrollTop = 0; + } + if ( + document.documentElement === undefined || + document.documentElement === null + ) { + document.documentElement = {}; + } + if (isNaN(document.documentElement.scrollLeft)) { + document.documentElement.scrollLeft = 0; + document.documentElement.scrollTop = 0; + } + if (isNaN(canvas.offsetLeft)) { + canvas.offsetLeft = 0; + canvas.offsetTop = 0; + } + })(); + + //Keyboard + document.onkeydown = function(e) { + manager.onKeyPressed(e.keyCode); + }; + document.onkeyup = function(e) { + manager.onKeyReleased(e.keyCode); + }; + //Mouse + renderer.view.onmousemove = function(e) { + var pos = getEventPosition(e); + manager.onMouseMove(pos[0], pos[1]); + }; + renderer.view.onmousedown = function(e) { + manager.onMouseButtonPressed( + e.button === 2 + ? gdjs.InputManager.MOUSE_RIGHT_BUTTON + : e.button === 1 + ? gdjs.InputManager.MOUSE_MIDDLE_BUTTON + : gdjs.InputManager.MOUSE_LEFT_BUTTON + ); + if (window.focus !== undefined) window.focus(); + return false; + }; + renderer.view.onmouseup = function(e) { + manager.onMouseButtonReleased( + e.button === 2 + ? gdjs.InputManager.MOUSE_RIGHT_BUTTON + : e.button === 1 + ? gdjs.InputManager.MOUSE_MIDDLE_BUTTON + : gdjs.InputManager.MOUSE_LEFT_BUTTON + ); + return false; + }; + window.addEventListener( + 'click', + function(e) { + if (window.focus !== undefined) window.focus(); + e.preventDefault(); + return false; + }, + false + ); + renderer.view.oncontextmenu = function(event) { + event.preventDefault(); + event.stopPropagation(); + return false; + }; + renderer.view.onmousewheel = function(event) { + manager.onMouseWheel(event.wheelDelta); + }; + //Touches + //Also simulate mouse events when receiving touch events + window.addEventListener('touchmove', function(e) { + e.preventDefault(); + if (e.changedTouches) { + for (var i = 0; i < e.changedTouches.length; ++i) { + var pos = getEventPosition(e.changedTouches[i]); + manager.onTouchMove(e.changedTouches[i].identifier, pos[0], pos[1]); + } + } + }); + window.addEventListener('touchstart', function(e) { + e.preventDefault(); + if (e.changedTouches) { + for (var i = 0; i < e.changedTouches.length; ++i) { + var pos = getEventPosition(e.changedTouches[i]); + manager.onTouchStart(e.changedTouches[i].identifier, pos[0], pos[1]); + } + } + return false; + }); + window.addEventListener('touchend', function(e) { + e.preventDefault(); + if (e.changedTouches) { + for (var i = 0; i < e.changedTouches.length; ++i) { + var pos = getEventPosition(e.changedTouches[i]); + manager.onTouchEnd(e.changedTouches[i].identifier); + } + } + return false; + }); +}; + +gdjs.RuntimeGamePixiRenderer.prototype.setWindowTitle = function(title) { + if (typeof document !== 'undefined') document.title = title; +}; + +gdjs.RuntimeGamePixiRenderer.prototype.getWindowTitle = function() { + return typeof document !== 'undefined' ? document.title : ''; +}; + +gdjs.RuntimeGamePixiRenderer.prototype.startGameLoop = function(fn) { + requestAnimationFrame(gameLoop); + + var oldTime = 0; + function gameLoop(time) { + var dt = oldTime ? time - oldTime : 0; + oldTime = time; + + if (fn(dt)) requestAnimationFrame(gameLoop); + } +}; + +gdjs.RuntimeGamePixiRenderer.prototype.getPIXIRenderer = function() { + return this._pixiRenderer; +}; + +/** + * Open the given URL in the system browser (or a new tab) + */ +gdjs.RuntimeGamePixiRenderer.prototype.openURL = function(url) { + // Try to detect the environment to use the most adapted + // way of opening an URL. + if (typeof Cocoon !== 'undefined' && Cocoon.App && Cocoon.App.openURL) { + Cocoon.App.openURL(url); + } else if (typeof window !== 'undefined') { + var target = window.cordova ? '_system' : '_blank'; + window.open(url, target); + } +}; + +/** + * Close the game, if applicable + */ +gdjs.RuntimeGamePixiRenderer.prototype.stopGame = function() { + // Try to detect the environment to use the most adapted + // way of closing the app + var electron = this.getElectron(); + if (electron) { + var browserWindow = electron.remote.getCurrentWindow(); + if (browserWindow) { + browserWindow.close(); + } + } else if ( + typeof navigator !== 'undefined' && + navigator.app && + navigator.app.exitApp + ) { + navigator.app.exitApp(); + } + + // HTML5 games on mobile/browsers don't have a way to close their window/page. +}; + +/** + * Get the canvas DOM element. + */ +gdjs.RuntimeGamePixiRenderer.prototype.getCanvas = function() { + return this._pixiRenderer.view; +}; + +/** + * Check if the device supports WebGL. + * @returns {boolean} true if WebGL is supported + */ +gdjs.RuntimeGamePixiRenderer.prototype.isWebGLSupported = function() { + return this._pixiRenderer.type === PIXI.RENDERER_TYPE.WEBGL; +}; + +/** + * Get the electron module, if running as a electron renderer process. + */ +gdjs.RuntimeGamePixiRenderer.prototype.getElectron = function() { + if (typeof require !== 'undefined') { + return require('electron'); + } + + return null; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/runtimescene-pixi-renderer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/runtimescene-pixi-renderer.js new file mode 100644 index 0000000..50ed10a --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/runtimescene-pixi-renderer.js @@ -0,0 +1,87 @@ +gdjs.RuntimeScenePixiRenderer = function(runtimeScene, runtimeGameRenderer) { + this._pixiRenderer = runtimeGameRenderer + ? runtimeGameRenderer.getPIXIRenderer() + : null; + this._runtimeScene = runtimeScene; + this._pixiContainer = new PIXI.Container(); //The Container meant to contains all pixi objects of the scene. +}; + +gdjs.RuntimeSceneRenderer = gdjs.RuntimeScenePixiRenderer; //Register the class to let the engine use it. + +gdjs.RuntimeScenePixiRenderer.prototype.onGameResolutionResized = function() { + if (!this._pixiRenderer) return; + + var runtimeGame = this._runtimeScene.getGame(); + this._pixiContainer.scale.x = + this._pixiRenderer.width / runtimeGame.getGameResolutionWidth(); + this._pixiContainer.scale.y = + this._pixiRenderer.height / runtimeGame.getGameResolutionHeight(); +}; + +gdjs.RuntimeScenePixiRenderer.prototype.render = function() { + if (!this._pixiRenderer) return; + + // this._renderProfileText(); //Uncomment to display profiling times + + // render the PIXI container of the scene + this._pixiRenderer.backgroundColor = this._runtimeScene.getBackgroundColor(); + this._pixiRenderer.render(this._pixiContainer); +}; + +gdjs.RuntimeScenePixiRenderer.prototype._renderProfileText = function() { + if (!this._runtimeScene.getProfiler()) return; + + if (!this._profilerText) { + this._profilerText = new PIXI.Text(" ", { + align: "left", + stroke: "#FFF", + strokeThickness: 1 + }); + this._pixiContainer.addChild(this._profilerText); + } + + var average = this._runtimeScene.getProfiler().getFramesAverageMeasures(); + var outputs = []; + gdjs.Profiler.getProfilerSectionTexts("All", average, outputs); + + this._profilerText.text = outputs.join("\n"); +}; + +gdjs.RuntimeScenePixiRenderer.prototype.renderDebugDraw = function(instances, layersCameraCoordinates) { + if (!this._debugDraw) { + this._debugDraw = new PIXI.Graphics(); + this._pixiContainer.addChild(this._debugDraw); + } + /** @type PIXI.Graphics */ + var debugDraw = this._debugDraw; + + debugDraw.clear(); + debugDraw.beginFill(0x6868e8); + debugDraw.lineStyle(1, 0x6868e8, 1); + debugDraw.fillAlpha = 0.1; + debugDraw.alpha = 0.8; + + for(var i = 0;i < instances.length;i++) { + var object = instances[i]; + var cameraCoords = layersCameraCoordinates[object.getLayer()]; + var rendererObject = object.getRendererObject(); + + if (!cameraCoords || !rendererObject) continue; + + var aabb = object.getAABB(); + debugDraw.drawRect(aabb.min[0], aabb.min[1], aabb.max[0] - aabb.min[0], aabb.max[1] - aabb.min[1]); + } + debugDraw.endFill(); +}; + +gdjs.RuntimeScenePixiRenderer.prototype.hideCursor = function() { + this._pixiRenderer.view.style.cursor = "none"; +}; + +gdjs.RuntimeScenePixiRenderer.prototype.showCursor = function() { + this._pixiRenderer.view.style.cursor = ""; +}; + +gdjs.RuntimeScenePixiRenderer.prototype.getPIXIContainer = function() { + return this._pixiContainer; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/spriteruntimeobject-pixi-renderer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/spriteruntimeobject-pixi-renderer.js new file mode 100644 index 0000000..d8b8b34 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/pixi-renderers/spriteruntimeobject-pixi-renderer.js @@ -0,0 +1,137 @@ +/** + * The renderer for a gdjs.SpriteRuntimeObject using Pixi.js. + * @class SpriteRuntimeObjectPixiRenderer + * @memberof gdjs + * @param {gdjs.SpriteRuntimeObject} runtimeObject The object + * @param {gdjs.RuntimeScene} runtimeScene The scene + */ +gdjs.SpriteRuntimeObjectPixiRenderer = function(runtimeObject, runtimeScene) +{ + /** @type gdjs.SpriteRuntimeObject */ + this._object = runtimeObject; + this._spriteDirty = true; + this._textureDirty = true; + if ( this._sprite === undefined ) + this._sprite = new PIXI.Sprite(runtimeScene.getGame().getImageManager().getInvalidPIXITexture()); + + var layer = runtimeScene.getLayer(""); + if (layer) layer.getRenderer().addRendererObject(this._sprite, runtimeObject.getZOrder()); +} + +gdjs.SpriteRuntimeObjectRenderer = gdjs.SpriteRuntimeObjectPixiRenderer; //Register the class to let the engine use it. + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.getRendererObject = function() { + return this._sprite; +}; + +/** + * Update the internal PIXI.Sprite position, angle... + */ +gdjs.SpriteRuntimeObjectPixiRenderer.prototype._updatePIXISprite = function() { + if (this._object._animationFrame !== null) { + this._sprite.anchor.x = this._object._animationFrame.center.x/this._sprite.texture.frame.width; + this._sprite.anchor.y = this._object._animationFrame.center.y/this._sprite.texture.frame.height; + this._sprite.position.x = this._object.x + (this._object._animationFrame.center.x - this._object._animationFrame.origin.x)*Math.abs(this._object._scaleX); + this._sprite.position.y = this._object.y + (this._object._animationFrame.center.y - this._object._animationFrame.origin.y)*Math.abs(this._object._scaleY); + this._sprite.rotation = gdjs.toRad(this._object.angle); + this._sprite.visible = !this._object.hidden; + this._sprite.blendMode = this._object._blendMode; + this._sprite.alpha = this._sprite.visible ? this._object.opacity/255 : 0; //TODO: Workaround not working property in PIXI.js + this._sprite.scale.x = this._object._scaleX; + this._sprite.scale.y = this._object._scaleY; + this._cachedWidth = Math.abs(this._sprite.width); + this._cachedHeight = Math.abs(this._sprite.height); + } else { + this._sprite.visible = false; + this._sprite.alpha = 0; + this._cachedWidth = 0; + this._cachedHeight = 0; + } + + this._spriteDirty = false; +}; + +/** + * Call this to make sure the sprite is ready to be rendered. + */ +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.ensureUpToDate = function() { + if ( this._spriteDirty ) this._updatePIXISprite(); +}; + +/** + * Update the internal texture of the PIXI sprite. + */ +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.updateFrame = function(animationFrame) { + this._spriteDirty = true; + this._sprite.texture = animationFrame.texture; +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.update = function() { + this._spriteDirty = true; +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.updateX = function() { + this._sprite.position.x = this._object.x + (this._object._animationFrame.center.x - this._object._animationFrame.origin.x)*Math.abs(this._object._scaleX); +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.updateY = function() { + this._sprite.position.y = this._object.y + (this._object._animationFrame.center.y - this._object._animationFrame.origin.y)*Math.abs(this._object._scaleY); +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.updateAngle = function() { + this._sprite.rotation = gdjs.toRad(this._object.angle); +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.updateOpacity = function() { + //TODO: Workaround a not working property in PIXI.js: + this._sprite.alpha = this._sprite.visible ? this._object.opacity/255 : 0; +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.updateVisibility = function() { + this._sprite.visible = !this._object.hidden; + + //TODO: Workaround a not working property in PIXI.js: + this._sprite.alpha = this._sprite.visible ? this._object.opacity/255 : 0; +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.setColor = function(rgbColor) { + var colors = rgbColor.split(";"); + if ( colors.length < 3 ) return; + + this._sprite.tint = "0x" + gdjs.rgbToHex(parseInt(colors[0], 10), parseInt(colors[1], 10), parseInt(colors[2], 10)); +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.getColor = function() { + var rgb = PIXI.utils.hex2rgb(this._sprite.tint) + return Math.floor(rgb[0]*255) + ';' + Math.floor(rgb[1]*255) + ';' + Math.floor(rgb[2]*255); +} + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.getWidth = function() { + if ( this._spriteDirty ) this._updatePIXISprite(); + return this._cachedWidth; +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.getHeight = function() { + if ( this._spriteDirty ) this._updatePIXISprite(); + return this._cachedHeight; +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.getUnscaledWidth = function() { + return this._sprite.texture.frame.width; +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.prototype.getUnscaledHeight = function() { + return this._sprite.texture.frame.height; +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.getAnimationFrame = function(imageManager, imageName) { + return imageManager.getPIXITexture(imageName); +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.getAnimationFrameWidth = function(pixiTexture) { + return pixiTexture.width; +}; + +gdjs.SpriteRuntimeObjectPixiRenderer.getAnimationFrameHeight = function(pixiTexture) { + return pixiTexture.height; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/playerShip1_red.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/playerShip1_red.png new file mode 100644 index 0000000..30b9ad5 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/playerShip1_red.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/polygon.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/polygon.js new file mode 100644 index 0000000..015a4f5 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/polygon.js @@ -0,0 +1,430 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Polygon represents a polygon which can be used to create collisions masks for RuntimeObject. + * + * @memberof gdjs + * @class Polygon + */ +gdjs.Polygon = function() +{ + /** + * The vertices of the polygon + * @member {Array} + */ + this.vertices = []; + + /** + * The edges of the polygon. This property is only valid after calling + * computeEdges, and remains valid until vertices are modified. + * @member {Array} + */ + this.edges = []; + + /** + * The center of the polygon. This property is only valid after calling + * computeCenter, and remains valid until vertices are modified. + * @member {Array} + */ + this.center = [0,0]; +}; + +gdjs.Polygon.prototype.move = function(x,y) { + for(var i = 0, len = this.vertices.length;i= len) v2 = this.vertices[0]; + else v2 = this.vertices[i + 1]; + + this.edges[i][0] = v2[0] - v1[0]; + this.edges[i][1] = v2[1] - v1[1]; + } +}; + +gdjs.Polygon.prototype.isConvex = function() { + this.computeEdges(); + var edgesLen = this.edges.length; + + if ( edgesLen < 3 ) { + return false; + } + + var zProductIsPositive = (this.edges[0][0]*this.edges[0+1][1] - this.edges[0][1]*this.edges[0+1][0]) > 0; + + for (var i = 1;i 0) !== zProductIsPositive ) return false; + } + + var lastZCrossProduct = this.edges[edgesLen-1][0]*this.edges[0][1] - this.edges[edgesLen-1][1]*this.edges[0][0]; + if ( (lastZCrossProduct > 0) !== zProductIsPositive ) return false; + + return true; +}; + +gdjs.Polygon.prototype.computeCenter = function() { + this.center[0] = 0; + this.center[1] = 0; + var len = this.vertices.length; + + for (var i = 0;iSeparating Axis Theorem .
+ * Based on this + * and this article. + * + * @return {{collision: boolean, move_axis: Array}} returnValue.collision is equal to true if polygons are overlapping + * @param {gdjs.Polygon} p1 The first polygon + * @param {gdjs.Polygon} p2 The second polygon + * @param {boolean | undefined} ignoreTouchingEdges If true, then edges that are touching each other, without the polygons actually overlapping, won't be considered in collision. + */ +gdjs.Polygon.collisionTest = function(p1, p2, ignoreTouchingEdges) { + //Algorithm core : + + p1.computeEdges(); + p2.computeEdges(); + + var edge = gdjs.Polygon.collisionTest._statics.edge; + var move_axis = gdjs.Polygon.collisionTest._statics.move_axis; + + var result = gdjs.Polygon.collisionTest._statics.result; + var minDist = Number.MAX_VALUE; + + edge[0] = 0; + edge[1] = 0; + edge[0] = 0; + edge[1] = 0; + + result.collision = false; + result.move_axis[0] = 0; + result.move_axis[1] = 0; + + //Iterate over all the edges composing the polygons + for (var i = 0, len1 = p1.vertices.length, len2 = p2.vertices.length; i < len1+len2; i++) { + if (i < len1) { // or <= + edge = p1.edges[i]; + } else { + edge = p2.edges[i - len1]; + } + + var axis = gdjs.Polygon.collisionTest._statics.axis; //Get the axis to which polygons will be projected + axis[0] = -edge[1]; + axis[1] = edge[0]; + gdjs.Polygon.normalise(axis); + + var minMaxA = gdjs.Polygon.collisionTest._statics.minMaxA; + var minMaxB = gdjs.Polygon.collisionTest._statics.minMaxB; + gdjs.Polygon.project(axis, p1, minMaxA); //Do projection on the axis. + gdjs.Polygon.project(axis, p2, minMaxB); + + //If the projections on the axis do not overlap, then their is no collision + var dist = gdjs.Polygon.distance(minMaxA[0], minMaxA[1], minMaxB[0], minMaxB[1]); + if (dist > 0 || (dist === 0 && ignoreTouchingEdges)) { + result.collision = false; + result.move_axis[0] = 0; + result.move_axis[1] = 0; + return result; + } + + var absDist = Math.abs(dist); + + if (absDist < minDist) { + minDist = absDist; + move_axis[0] = axis[0]; + move_axis[1] = axis[1]; + } + } + + result.collision = true; + + //Ensure move axis is correctly oriented. + var p1Center = p1.computeCenter(); + var p2Center = p2.computeCenter(); + var d = [p1Center[0]-p2Center[0], p1Center[1]-p2Center[1]]; + if (gdjs.Polygon.dotProduct(d, move_axis) < 0) { + move_axis[0] = -move_axis[0]; + move_axis[1] = -move_axis[1]; + } + + //Add the magnitude to the move axis. + result.move_axis[0] = move_axis[0] * minDist; + result.move_axis[1] = move_axis[1] * minDist; + + return result; +}; + +//Arrays and data structure that are (re)used by gdjs.Polygon.collisionTest to +//avoid any allocation. +gdjs.Polygon.collisionTest._statics = { + minMaxA: [0,0], + minMaxB: [0,0], + edge: [0,0], + axis: [0,0], + move_axis: [0,0], + result: { + collision:false, + move_axis:[0,0] + } +}; + +/** + * Do a raycast test.
+ * Please note that the polygon must be convex! + * + * For some theory, check Find the Intersection Point of Two Line Segments. + * + * @param {gdjs.Polygon} poly The polygon to test + * @param {number} startX The raycast start point X + * @param {number} startY The raycast start point Y + * @param {number} endX The raycast end point X + * @param {number} endY The raycast end point Y + * @return A raycast result with the contact points and distances + */ +gdjs.Polygon.raycastTest = function(poly, startX, startY, endX, endY) +{ + var result = gdjs.Polygon.raycastTest._statics.result; + result.collision = false; + + if ( poly.vertices.length < 2 ) + { + return result; + } + + poly.computeEdges(); + var p = gdjs.Polygon.raycastTest._statics.p; + var q = gdjs.Polygon.raycastTest._statics.q; + var r = gdjs.Polygon.raycastTest._statics.r; + var s = gdjs.Polygon.raycastTest._statics.s; + var minSqDist = Number.MAX_VALUE; + + // Ray segment: p + t*r, with p = start and r = end - start + p[0] = startX; + p[1] = startY; + r[0] = endX - startX; + r[1] = endY - startY; + + for(var i=0; i maxOverlap ){ + return result; + } + result.collision = true; + // Zero distance ray + if( rayB === 0 ){ + result.closeX = startX; + result.closeY = startY; + result.closeSqDist = 0; + result.farX = startX; + result.farY = startY; + result.farSqDist = 0; + } + var t1 = minOverlap / Math.abs(rayB); + var t2 = maxOverlap / Math.abs(rayB); + result.closeX = startX + t1*r[0]; + result.closeY = startY + t1*r[1]; + result.closeSqDist = t1*t1*(r[0]*r[0] + r[1]*r[1]); + result.farX = startX + t2*r[0]; + result.farY = startY + t2*r[1]; + result.farSqDist = t2*t2*(r[0]*r[0] + r[1]*r[1]); + + return result; + } + // One point intersection + else if ( crossRS !== 0 && 0<=t && t<=1 && 0<=u && u<=1 ) + { + var x = p[0] + t*r[0]; + var y = p[1] + t*r[1]; + + var sqDist = (x-startX)*(x-startX) + (y-startY)*(y-startY); + if ( sqDist < minSqDist ) + { + if ( !result.collision ){ + result.farX = x; + result.farY = y; + result.farSqDist = sqDist; + } + minSqDist = sqDist; + result.closeX = x; + result.closeY = y; + result.closeSqDist = sqDist; + result.collision = true; + } + else + { + result.farX = x; + result.farY = y; + result.farSqDist = sqDist; + } + } + } + + return result; +}; + +gdjs.Polygon.raycastTest._statics = { + p: [0,0], + q: [0,0], + r: [0,0], + s: [0,0], + deltaQP: [0,0], + axis: [0,0], + result: { + collision: false, + closeX: 0, + closeY: 0, + closeSqDist: 0, + farX: 0, + farY: 0, + farSqDist: 0 + } +} + +//Tools functions : +gdjs.Polygon.normalise = function(v) +{ + var len = Math.sqrt(v[0]*v[0] + v[1]*v[1]); + + if (len != 0) { + v[0] /= len; + v[1] /= len; + } +} + +gdjs.Polygon.dotProduct = function(a, b) +{ + var dp = a[0]*b[0] + a[1]*b[1]; + + return dp; +} + +gdjs.Polygon.crossProduct = function(a, b) +{ + var cp = a[0]*b[1] - a[1]*b[0]; + + return cp; +} + +gdjs.Polygon.project = function(axis, p, result) +{ + var dp = gdjs.Polygon.dotProduct(axis, p.vertices[0]); + result[0] = dp; + result[1] = dp; + + for (var i = 1, len = p.vertices.length; i < len; ++i) { + dp = gdjs.Polygon.dotProduct(axis, p.vertices[i]); + + if (dp < result[0]) + result[0] = dp; + else if (dp > result[1]) + result[1] = dp; + } +} + +gdjs.Polygon.distance = function(minA, maxA, minB, maxB) +{ + if (minA < minB) return minB - maxA; + else return minA - maxB; +} + +/** + * Check if a point is inside a polygon. + * + * Uses PNPOLY by W. Randolph Franklin. + * + * @param {gdjs.Polygon} poly The polygon to test + * @param {number} x The point x coordinate + * @param {number} y The point y coordinate + * @return {boolean} true if the point is inside the polygon + */ +gdjs.Polygon.isPointInside = function(poly, x, y) +{ + var inside = false; + var vi, vj; + for (var i = 0, j = poly.vertices.length-1; i < poly.vertices.length; j = i++) { + vi = poly.vertices[i]; + vj = poly.vertices[j]; + if ( ((vi[1]>y) != (vj[1]>y)) && (x < (vj[0]-vi[0]) * (y-vi[1]) / (vj[1]-vi[1]) + vi[0]) ) + inside = !inside; + } + + return inside; +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/profiler.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/profiler.js new file mode 100644 index 0000000..30451bf --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/profiler.js @@ -0,0 +1,173 @@ +/** + * A basic profiling tool that can be used to measure time spent in sections of the engine. + * @class Profiler + * @see gdjs.RuntimeGame + * @memberof gdjs + */ +gdjs.Profiler = function() { + this._framesMeasures = []; // All the measures for the last frames + this._currentFrameIndex = 0; + this._currentFrameMeasure = null; // The measures being done + this._currentSection = null; // The section being measured + + this._maxFramesCount = 600; + this._framesCount = 0; // The number of frames that have been measured + while (this._framesMeasures.length < this._maxFramesCount) { + this._framesMeasures.push({ + parent: null, + time: 0, + subsections: {}, + }); + } + + this._getTimeNow = + window.performance && typeof window.performance.now === 'function' + ? window.performance.now.bind(window.performance) + : Date.now; +}; + +gdjs.Profiler.prototype.beginFrame = function() { + this._currentFrameMeasure = { + parent: null, + time: 0, + lastStartTime: this._getTimeNow(), + subsections: {}, + }; + this._currentSection = this._currentFrameMeasure; +}; + +gdjs.Profiler.prototype.begin = function(sectionName) { + // Push the new section + var subsections = this._currentSection.subsections; + var subsection = (subsections[sectionName] = subsections[sectionName] || { + parent: this._currentSection, + time: 0, + lastStartTime: 0, + subsections: {}, + }); + this._currentSection = subsection; + + // Start the timer + this._currentSection.lastStartTime = this._getTimeNow(); +}; + +gdjs.Profiler.prototype.end = function(sectionName) { + // Stop the timer + var sectionTime = this._getTimeNow() - this._currentSection.lastStartTime; + this._currentSection.time = (this._currentSection.time || 0) + sectionTime; + + // Pop the section + this._currentSection = this._currentSection.parent; +}; + +gdjs.Profiler.prototype.endFrame = function() { + if (this._currentSection.parent !== null) { + throw new Error( + 'Mismatch in profiler, endFrame should be called on root section' + ); + } + + this.end(); + + this._framesCount++; + if (this._framesCount > this._maxFramesCount) + this._framesCount = this._maxFramesCount; + this._framesMeasures[this._currentFrameIndex] = this._currentFrameMeasure; + this._currentFrameIndex++; + if (this._currentFrameIndex >= this._maxFramesCount) + this._currentFrameIndex = 0; +}; + +gdjs.Profiler._addAverageSectionTimes = function( + section, + destinationSection, + totalCount, + i +) { + destinationSection.time = + (destinationSection.time || 0) + section.time / totalCount; + for (var sectionName in section.subsections) { + if (section.subsections.hasOwnProperty(sectionName)) { + var destinationSubsections = destinationSection.subsections; + var destinationSubsection = (destinationSubsections[ + sectionName + ] = destinationSubsections[sectionName] || { + parent: destinationSection, + time: 0, + subsections: {}, + }); + + gdjs.Profiler._addAverageSectionTimes( + section.subsections[sectionName], + destinationSubsection, + totalCount, + i + ); + } + } +}; + +/** + * Return the measures for all the section of the game during the frames + * captured. + */ +gdjs.Profiler.prototype.getFramesAverageMeasures = function() { + var framesAverageMeasures = { + parent: null, + time: 0, + subsections: {}, + }; + + for (var i = 0; i < this._framesCount; ++i) { + gdjs.Profiler._addAverageSectionTimes( + this._framesMeasures[i], + framesAverageMeasures, + this._framesCount, + i + ); + } + + return framesAverageMeasures; +}; + +/** + * Get stats measured during the frames captured. + */ +gdjs.Profiler.prototype.getStats = function() { + return { + framesCount: this._framesCount, + }; +}; + +/** + * Convert measures for a section into texts. + * Useful for ingame profiling. + * + * @param {string} sectionName The name of the section + * @param {s} profilerSection The section measures + * @param {*} outputs The array where to push the results + */ +gdjs.Profiler.getProfilerSectionTexts = function( + sectionName, + profilerSection, + outputs +) { + var percent = + profilerSection.parent && profilerSection.parent.time !== 0 + ? ((profilerSection.time / profilerSection.parent.time) * 100).toFixed(1) + : '100%'; + var time = profilerSection.time.toFixed(2); + outputs.push(sectionName + ': ' + time + 'ms (' + percent + ')'); + var subsectionsOutputs = []; + + for (var subsectionName in profilerSection.subsections) { + if (profilerSection.subsections.hasOwnProperty(subsectionName)) { + gdjs.Profiler.getProfilerSectionTexts( + subsectionName, + profilerSection.subsections[subsectionName], + subsectionsOutputs + ); + } + } + outputs.push.apply(outputs, subsectionsOutputs); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/right.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/right.png new file mode 100644 index 0000000..98e816a Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/right.png differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimebehavior.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimebehavior.js new file mode 100644 index 0000000..111e532 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimebehavior.js @@ -0,0 +1,149 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * @typedef BehaviorData Properties to set up a behavior. + * @property {string} name The name of the behavior (for getting from an object (object.getBehavior) for example) + * @property {string} type The behavior type. Used by GDJS to find the proper behavior to construct. + */ + +/** + * RuntimeBehavior represents a behavior being used by a RuntimeObject. + * + * @class RuntimeBehavior + * @memberof gdjs + * @param {gdjs.RuntimeScene} runtimeScene The scene owning the object of the behavior + * @param {BehaviorData} behaviorData The properties used to setup the behavior + * @param {gdjs.RuntimeObject} owner The object owning the behavior + */ +gdjs.RuntimeBehavior = function(runtimeScene, behaviorData, owner) +{ + this.name = behaviorData.name || ""; + this.type = behaviorData.type || ""; + this._nameId = gdjs.RuntimeObject.getNameIdentifier(this.name); + this._activated = true; + this.owner = owner; +}; +/** + * Get the name of the behavior. + * @return {string} The behavior's name. + */ +gdjs.RuntimeBehavior.prototype.getName = function() { + return this.name; +}; + +/** + * Get the name identifier of the behavior. + * @return {number} The behavior's name identifier. + */ +gdjs.RuntimeBehavior.prototype.getNameId = function() { + return this._nameId; +}; + +/** + * Called at each frame before events. Call doStepPreEvents.
+ * Behaviors writers: Please do not redefine this method. Redefine doStepPreEvents instead. + * @param {gdjs.RuntimeScene} runtimeScene The runtimeScene owning the object + */ +gdjs.RuntimeBehavior.prototype.stepPreEvents = function(runtimeScene) { + if ( this._activated ) { + var profiler = runtimeScene.getProfiler(); + if (profiler) profiler.begin(this.name); + + this.doStepPreEvents(runtimeScene); + + if (profiler) profiler.end(this.name); + } +}; + +/** + * Called at each frame after events. Call doStepPostEvents.
+ * Behaviors writers: Please do not redefine this method. Redefine doStepPreEvents instead. + * @param {gdjs.RuntimeScene} runtimeScene The runtimeScene owning the object + */ +gdjs.RuntimeBehavior.prototype.stepPostEvents = function(runtimeScene) { + if ( this._activated ) { + var profiler = runtimeScene.getProfiler(); + if (profiler) profiler.begin(this.name); + + this.doStepPostEvents(runtimeScene); + + if (profiler) profiler.end(this.name); + } +}; + +/** + * De/Activate the behavior + * @param {boolean} enable true to enable the behavior, false to disable it + */ +gdjs.RuntimeBehavior.prototype.activate = function(enable) { + if ( enable === undefined ) enable = true; + if ( !this._activated && enable ) { + this._activated = true; + this.onActivate(); + } + else if ( this._activated && !enable ) { + this._activated = false; + this.onDeActivate(); + } +}; + +/** + * Reimplement this to do extra work when the behavior is created (i.e: an + * object using it was created), after the object is fully initialized (so + * you can use `this.owner` without risk). + */ +gdjs.RuntimeBehavior.prototype.onCreated = function() { + +}; + +/** + * Return true if the behavior is activated + */ +gdjs.RuntimeBehavior.prototype.activated = function() { + return this._activated; +}; + +/** + * Reimplement this method to do extra work when the behavior is activated (after + * it has been deactivated, see `onDeActivate`). + */ +gdjs.RuntimeBehavior.prototype.onActivate = function() { + +}; + +/** + * Reimplement this method to do extra work when the behavior is deactivated. + */ +gdjs.RuntimeBehavior.prototype.onDeActivate = function() { + +}; + +/** + * This method is called each tick before events are done. + * @param {gdjs.RuntimeScene} runtimeScene The runtimeScene owning the object + */ +gdjs.RuntimeBehavior.prototype.doStepPreEvents = function(runtimeScene) { + +}; + +/** + * This method is called each tick after events are done. + * @param {gdjs.RuntimeScene} runtimeScene The runtimeScene owning the object + */ +gdjs.RuntimeBehavior.prototype.doStepPostEvents = function(runtimeScene) { + +} + +/** + * This method is called when the owner of the behavior + * is being removed from the scene and is about to be destroyed/reused later, + */ +gdjs.RuntimeBehavior.prototype.onDestroy = function() { + +}; + +gdjs.registerBehavior("", gdjs.RuntimeBehavior); diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimegame.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimegame.js new file mode 100644 index 0000000..0219e66 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimegame.js @@ -0,0 +1,528 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Represents a game being played. + * + * @memberof gdjs + * @class RuntimeGame + * @param {Object} data The object (usually stored in data.json) containing the full project data + * @param {Object=} spec Optional object for specifiying additional options: {forceFullscreen: ...} + */ +gdjs.RuntimeGame = function(data, spec) { + spec = spec || {}; + + this._variables = new gdjs.VariablesContainer(data.variables); + this._data = data; + this._imageManager = new gdjs.ImageManager( + data.resources ? data.resources.resources : undefined + ); + this._soundManager = new gdjs.SoundManager( + data.resources ? data.resources.resources : undefined + ); + this._fontManager = new gdjs.FontManager( + data.resources ? data.resources.resources : undefined + ); + this._jsonManager = new gdjs.JsonManager( + data.resources ? data.resources.resources : undefined + ); + this._maxFPS = data ? parseInt(data.properties.maxFPS, 10) : 60; + this._minFPS = data ? parseInt(data.properties.minFPS, 10) : 15; + + this._gameResolutionWidth = data.properties.windowWidth; + this._gameResolutionHeight = data.properties.windowHeight; + this._originalWidth = this._gameResolutionWidth; + this._originalHeight = this._gameResolutionHeight; + this._resizeMode = data.properties.sizeOnStartupMode; + this._adaptGameResolutionAtRuntime = + data.properties.adaptGameResolutionAtRuntime; + /** @type {string} */ + this._scaleMode = data.properties.scaleMode || 'linear'; + this._renderer = new gdjs.RuntimeGameRenderer( + this, + spec.forceFullscreen || false + ); + + //Game loop management (see startGameLoop method) + this._sceneStack = new gdjs.SceneStack(this); + this._notifyScenesForGameResolutionResize = false; // When set to true, the scenes are notified that gamre resolution size changed. + this._paused = false; + + //Inputs : + this._inputManager = new gdjs.InputManager(); + + //Allow to specify an external layout to insert in the first scene: + this._injectExternalLayout = spec.injectExternalLayout || ''; + + //Optional client to connect to a debugger: + this._debuggerClient = gdjs.DebuggerClient + ? new gdjs.DebuggerClient(this) + : null; +}; + +gdjs.RuntimeGame.prototype.getRenderer = function() { + return this._renderer; +}; + +/** + * Get the variables of the RuntimeGame. + * @return {gdjs.VariablesContainer} The global variables + */ +gdjs.RuntimeGame.prototype.getVariables = function() { + return this._variables; +}; + +/** + * Get the gdjs.SoundManager of the RuntimeGame. + * @return {gdjs.SoundManager} The sound manager. + */ +gdjs.RuntimeGame.prototype.getSoundManager = function() { + return this._soundManager; +}; + +/** + * Get the gdjs.ImageManager of the RuntimeGame. + * @return {gdjs.ImageManager} The image manager. + */ +gdjs.RuntimeGame.prototype.getImageManager = function() { + return this._imageManager; +}; + +/** + * Get the gdjs.FontManager of the RuntimeGame. + * @return {gdjs.FontManager} The font manager. + */ +gdjs.RuntimeGame.prototype.getFontManager = function() { + return this._fontManager; +}; + +/** + * Get the input manager of the game, storing mouse, keyboard + * and touches states. + * @return {gdjs.InputManager} The input manager owned by the game + */ +gdjs.RuntimeGame.prototype.getInputManager = function() { + return this._inputManager; +}; + +/** + * Get the JSON manager of the game, used to load JSON from game + * resources. + * @return {gdjs.JsonManager} The json manager for the game + */ +gdjs.RuntimeGame.prototype.getJsonManager = function() { + return this._jsonManager; +}; + +/** + * Get the object containing the game data + * @return {Object} The object associated to the game. + */ +gdjs.RuntimeGame.prototype.getGameData = function() { + return this._data; +}; + +/** + * Get the data associated to a scene. + * + * @param {string} sceneName The name of the scene. If not defined, the first scene will be returned. + * @return {?Object} The data associated to the scene. + */ +gdjs.RuntimeGame.prototype.getSceneData = function(sceneName) { + var scene = undefined; + for (var i = 0, len = this._data.layouts.length; i < len; ++i) { + var sceneData = this._data.layouts[i]; + + if (sceneName === undefined || sceneData.name === sceneName) { + scene = sceneData; + break; + } + } + + if (scene === undefined) + console.warn('The game has no scene called "' + sceneName + '"'); + + return scene; +}; + +/** + * Check if a scene exists + * + * @param {string=} sceneName The name of the scene to search. + * @return {boolean} true if the scene exists. If sceneName is undefined, true if the game has a scene. + */ +gdjs.RuntimeGame.prototype.hasScene = function(sceneName) { + var isTrue = false; + for (var i = 0, len = this._data.layouts.length; i < len; ++i) { + var sceneData = this._data.layouts[i]; + + if (sceneName === undefined || sceneData.name == sceneName) { + isTrue = true; + break; + } + } + + return isTrue; +}; + +/** + * Get the data associated to an external layout. + * + * @param {string} name The name of the external layout. + * @return {?Object} The data associated to the external layout or null if not found. + */ +gdjs.RuntimeGame.prototype.getExternalLayoutData = function(name) { + var externalLayout = null; + for (var i = 0, len = this._data.externalLayouts.length; i < len; ++i) { + var layoutData = this._data.externalLayouts[i]; + + if (layoutData.name === name) { + externalLayout = layoutData; + break; + } + } + + return externalLayout; +}; + +/** + * Get the data representing all the global objects of the game. + * @return {Object} The data associated to the global objects. + */ +gdjs.RuntimeGame.prototype.getInitialObjectsData = function() { + return this._data.objects || []; +}; + +/** + * Get the original width of the game, as set on the startup of the game. + * + * This is guaranteed to never change, even if the size of the game is changed afterwards. + */ +gdjs.RuntimeGame.prototype.getOriginalWidth = function() { + return this._originalWidth; +}; + +/** + * Get the original height of the game, as set on the startup of the game. + * + * This is guaranteed to never change, even if the size of the game is changed afterwards. + */ +gdjs.RuntimeGame.prototype.getOriginalHeight = function() { + return this._originalHeight; +}; + +/** + * Get the game resolution (the size at which the game is played and rendered) width. + * @returns {number} The game resolution width, in pixels. + */ +gdjs.RuntimeGame.prototype.getGameResolutionWidth = function() { + return this._gameResolutionWidth; +}; + +/** + * Get the game resolution (the size at which the game is played and rendered) height. + * @returns {number} The game resolution height, in pixels. + */ +gdjs.RuntimeGame.prototype.getGameResolutionHeight = function() { + return this._gameResolutionHeight; +}; + +/** + * Change the game resolution. + * + * @param {number} width The new width + * @param {number} height The new height + */ +gdjs.RuntimeGame.prototype.setGameResolutionSize = function(width, height) { + this._gameResolutionWidth = width; + this._gameResolutionHeight = height; + + if (this._adaptGameResolutionAtRuntime) { + if ( + gdjs.RuntimeGameRenderer && + gdjs.RuntimeGameRenderer.getWindowInnerWidth && + gdjs.RuntimeGameRenderer.getWindowInnerHeight + ) { + var windowInnerWidth = gdjs.RuntimeGameRenderer.getWindowInnerWidth(); + var windowInnerHeight = gdjs.RuntimeGameRenderer.getWindowInnerHeight(); + + // Enlarge either the width or the eight to fill the inner window space. + var width = this._gameResolutionWidth; + var height = this._gameResolutionHeight; + if (this._resizeMode === 'adaptWidth') { + this._gameResolutionWidth = + (this._gameResolutionHeight * windowInnerWidth) / windowInnerHeight; + } else if (this._resizeMode === 'adaptHeight') { + this._gameResolutionHeight = + (this._gameResolutionWidth * windowInnerHeight) / windowInnerWidth; + } + } + } else { + // Don't alter the game resolution. The renderer + // will maybe adapt the size of the canvas or whatever is used to render the + // game in the window, but this does not change the "game resolution". + } + + // Notify the renderer that game resolution changed (so that the renderer size + // can be updated, and maybe other things like the canvas size), and let the + // scenes know too. + this._renderer.updateRendererSize(); + this._notifyScenesForGameResolutionResize = true; +}; + +/** + * Set if the width or the height of the game resolution + * should be changed to fit the game window - or if the game + * resolution should not be updated automatically. + * + * @param {string} resizeMode Either "" (don't change game resolution), "adaptWidth" or "adaptHeight". + */ +gdjs.RuntimeGame.prototype.setGameResolutionResizeMode = function(resizeMode) { + this._resizeMode = resizeMode; + this._forceGameResolutionUpdate(); +}; + +/** + * Returns if the width or the height of the game resolution + * should be changed to fit the game window - or if the game + * resolution should not be updated automatically (empty string). + * + * @returns {string} Either "" (don't change game resolution), "adaptWidth" or "adaptHeight". + */ +gdjs.RuntimeGame.prototype.getGameResolutionResizeMode = function() { + return this._resizeMode; +}; + +/** + * Set if the game resolution should be automatically adapted + * when the game window or screen size change. This will only + * be the case if the game resolution resize mode is + * configured to adapt the width or the height of the game. + * @param {boolean} enable true to change the game resolution according to the window/screen size. + */ +gdjs.RuntimeGame.prototype.setAdaptGameResolutionAtRuntime = function(enable) { + this._adaptGameResolutionAtRuntime = enable; + this._forceGameResolutionUpdate(); +}; + +/** + * Returns if the game resolution should be automatically adapted + * when the game window or screen size change. This will only + * be the case if the game resolution resize mode is + * configured to adapt the width or the height of the game. + * @returns {boolean} true if the game resolution is automatically changed according to the window/screen size. + */ +gdjs.RuntimeGame.prototype.getAdaptGameResolutionAtRuntime = function() { + return this._adaptGameResolutionAtRuntime; +}; + +/** + * Return the minimal fps that must be guaranteed by the game + * (otherwise, game is slowed down). + */ +gdjs.RuntimeGame.prototype.getMinimalFramerate = function() { + return this._minFPS; +}; + +/** + * Return the scale mode of the game ("linear" or "nearest"). + */ +gdjs.RuntimeGame.prototype.getScaleMode = function() { + return this._scaleMode; +}; + +/** + * Set or unset the game as paused. + * When paused, the game won't step and will be freezed. Useful for debugging. + * @param {boolean} enable true to pause the game, false to unpause + */ +gdjs.RuntimeGame.prototype.pause = function(enable) { + this._paused = enable; +}; + +/** + * Load all assets, displaying progress in renderer. + */ +gdjs.RuntimeGame.prototype.loadAllAssets = function( + callback, + progressCallback +) { + var loadingScreen = new gdjs.LoadingScreenRenderer( + this.getRenderer(), + this._data.properties.loadingScreen + ); + var allAssetsTotal = this._data.resources.resources.length; + + var that = this; + this._imageManager.loadTextures( + function(count, total) { + var percent = Math.floor((count / allAssetsTotal) * 100); + loadingScreen.render(percent); + if (progressCallback) progressCallback(percent); + }, + function(texturesTotalCount) { + that._soundManager.preloadAudio( + function(count, total) { + var percent = Math.floor( + ((texturesTotalCount + count) / allAssetsTotal) * 100 + ); + loadingScreen.render(percent); + if (progressCallback) progressCallback(percent); + }, + function(audioTotalCount) { + that._fontManager.loadFonts( + function(count, total) { + var percent = Math.floor( + ((texturesTotalCount + audioTotalCount + count) / + allAssetsTotal) * + 100 + ); + loadingScreen.render(percent); + if (progressCallback) progressCallback(percent); + }, + function(fontTotalCount) { + that._jsonManager.preloadJsons( + function(count, total) { + var percent = Math.floor( + ((texturesTotalCount + + audioTotalCount + + fontTotalCount + + count) / + allAssetsTotal) * + 100 + ); + loadingScreen.render(percent); + if (progressCallback) progressCallback(percent); + }, + function() { + loadingScreen.unload(); + callback(); + } + ); + } + ); + } + ); + } + ); +}; + +/** + * Start the game loop, to be called once assets are loaded. + */ +gdjs.RuntimeGame.prototype.startGameLoop = function() { + if (!this.hasScene()) { + console.log('The game has no scene.'); + return; + } + + this._forceGameResolutionUpdate(); + + //Load the first scene + var firstSceneName = this._data.firstLayout; + this._sceneStack.push( + this.hasScene(firstSceneName) ? firstSceneName : this.getSceneData().name, + this._injectExternalLayout + ); + + //Uncomment to profile the first x frames of the game. + // var x = 500; + // var startTime = Date.now(); + // console.profile("Stepping for " + x + " frames") + // for(var i = 0; i < x; ++i) { + // this._sceneStack.step(16); + // } + // console.profileEnd(); + // var time = Date.now() - startTime; + // console.log("Took", time, "ms"); + // return; + + //The standard game loop + var that = this; + var accumulatedElapsedTime = 0; + this._renderer.startGameLoop(function(lastCallElapsedTime) { + if (that._paused) return true; + + // Skip the frame if we rendering frames too fast + accumulatedElapsedTime += lastCallElapsedTime; + if ( + that._maxFPS > 0 && + 1000.0 / accumulatedElapsedTime > that._maxFPS + 7 + ) { + // Only skip frame if the framerate is 7 frames above the maximum framerate. + // Most browser/engines will try to run at slightly more than 60 frames per second. + // If game is set to have a maximum FPS to 60, then one out of two frames will be dropped. + // Hence, we use a 7 frames margin to ensure that we're not skipping frames too much. + return true; + } + var elapsedTime = accumulatedElapsedTime; + accumulatedElapsedTime = 0; + + //Manage resize events. + if (that._notifyScenesForGameResolutionResize) { + that._sceneStack.onGameResolutionResized(); + that._notifyScenesForGameResolutionResize = false; + } + + //Render and step the scene. + if (that._sceneStack.step(elapsedTime)) { + that.getInputManager().onFrameEnded(); + return true; + } + + return false; + }); +}; + +/** + * Called by the game renderer when the window containing the game + * has changed size (this can result from a resize of the window, + * but also other factors like a device orientation change on mobile). + */ +gdjs.RuntimeGame.prototype.onWindowInnerSizeChanged = function() { + this._forceGameResolutionUpdate(); +}; + +/** + * Enlarge/reduce the width (or the height) of the game to fill the inner window. + */ +gdjs.RuntimeGame.prototype._forceGameResolutionUpdate = function() { + this.setGameResolutionSize( + this._gameResolutionWidth, + this._gameResolutionHeight + ); +}; + +/** + * Start a profiler for the currently running scene. + * @param {Function} onProfilerStopped Function to be called when the profiler is stopped. Will be passed the profiler as argument. + */ +gdjs.RuntimeGame.prototype.startCurrentSceneProfiler = function( + onProfilerStopped +) { + var currentScene = this._sceneStack.getCurrentScene(); + if (!currentScene) return false; + + currentScene.startProfiler(onProfilerStopped); + return true; +}; + +/** + * Stop the profiler for the currently running scene. + */ +gdjs.RuntimeGame.prototype.stopCurrentSceneProfiler = function() { + var currentScene = this._sceneStack.getCurrentScene(); + if (!currentScene) return null; + + currentScene.stopProfiler(); +}; + +/** + * Return true if a scene was loaded, false otherwise (i.e: game not yet started). + */ +gdjs.RuntimeGame.prototype.wasFirstSceneLoaded = function() { + return this._sceneStack.wasFirstSceneLoaded(); +} diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimeobject.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimeobject.js new file mode 100644 index 0000000..1c97940 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/runtimeobject.js @@ -0,0 +1,1572 @@ +// @ts-check + +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * @typedef {Object} ObjectData Object containing initial properties for all objects extending {@link gdjs.RuntimeObject}. + * @property {string} name The name of the object. During the game, objects can be queried by their name (see {@link gdjs.RuntimeScene.prototype.getObjects} for example). + * @property {string} type The object type. + * @property {Array} variables The list of default variables. + * @property {Array} behaviors The list of default behaviors. + */ + +/** + * @typedef {Object} AABB An axis-aligned bounding box. Used to represents a box around an object for example. + * @property {Array} min The [x,y] coordinates of the top left point + * @property {Array} max The [x,y] coordinates of the bottom right point + */ + +/** + * RuntimeObject represents an object being used on a RuntimeScene. + * + * The constructor can be called on an already existing RuntimeObject: + * In this case, the constructor will try to reuse as much already existing members + * as possible (recycling). + * + * However, you should not be calling the constructor on an already existing object + * which is not a RuntimeObject. + * + * A `gdjs.RuntimeObject` should not be instantiated directly, always a child class + * (because gdjs.RuntimeObject don't call onCreated at the end of its constructor). + * + * @memberOf gdjs + * @name RuntimeObject + * @class + * @param {gdjs.RuntimeScene} runtimeScene The {@link gdjs.RuntimeScene} the object belongs to. + * @param {ObjectData} objectData The initial properties of the object. + */ +gdjs.RuntimeObject = function(runtimeScene, objectData) { + /** + * @protected + * @type {string} + */ + this.name = objectData.name || ""; + /** + * @protected + * @type {string} + */ + this.type = objectData.type || ""; + /** + * @protected + * @type {number} + */ + this.x = 0; + /** + * @protected + * @type {number} + */ + this.y = 0; + /** + * @protected + * @type {number} + */ + this.angle = 0; + /** + * @protected + * @type {number} + */ + this.zOrder = 0; + /** + * @protected + * @type {boolean} + */ + this.hidden = false; + /** + * @protected + * @type {string} + */ + this.layer = ""; + /** + * @type {number} + * @protected + */ + this._nameId = gdjs.RuntimeObject.getNameIdentifier(this.name); + /** + * @type {boolean} + * @protected + */ + this._livingOnScene = true; + /** + * @type {number} + * @protected + */ + this.id = runtimeScene.createNewUniqueId(); + /** + * @type {gdjs.RuntimeScene} + */ + this._runtimeScene = runtimeScene; + + //Hit boxes: + if ( this._defaultHitBoxes === undefined ) { + /** + * @type {Array} + * @protected + */ + this._defaultHitBoxes = []; + this._defaultHitBoxes.push(gdjs.Polygon.createRectangle(0,0)); + } + /** + * @type {Array} + * @protected + */ + this.hitBoxes = this._defaultHitBoxes; + /** + * @type {boolean} + * @protected + */ + this.hitBoxesDirty = true; + if ( this.aabb === undefined ) + /** + * @type {AABB} + * @protected + */ + this.aabb = { min:[0,0], max:[0,0] }; + else { + this.aabb.min[0] = 0; this.aabb.min[1] = 0; + this.aabb.max[0] = 0; this.aabb.max[1] = 0; + } + + //Variables: + if ( !this._variables ) + /** + * @type {gdjs.VariablesContainer} + * @protected + */ + this._variables = new gdjs.VariablesContainer(objectData ? objectData.variables : undefined); + else + gdjs.VariablesContainer.call(this._variables, objectData ? objectData.variables : undefined); + + //Forces: + if ( this._forces === undefined ) + /** + * @type {Array} + * @protected + */ + this._forces = []; + else + this.clearForces(); + + if (this._averageForce === undefined) this._averageForce = new gdjs.Force(0,0,0); + + //Behaviors: + if (this._behaviors === undefined) + /** + * Contains the behaviors of the object. + * @type {Array} + * @protected + */ + this._behaviors = []; + + if (this._behaviorsTable === undefined) + //TODO: add typing to Hashtable. + /** + * @type {Hashtable} + * @protected + */ + this._behaviorsTable = new Hashtable(); //Also contains the behaviors: Used when a behavior is accessed by its name ( see getBehavior ). + else + this._behaviorsTable.clear(); + + for(var i = 0, len = objectData.behaviors.length;i typing to Hashtable. + /** + * @type {Hashtable} + * @protected + */ + this._timers = new Hashtable(); + else + this._timers.clear(); +}; + +/** + * Table containing the id corresponding to an object name. Do not use directly or modify. + * @static + * @private + */ +gdjs.RuntimeObject._identifiers = gdjs.RuntimeObject._identifiers || new Hashtable(); + +/** + * The next available unique identifier for an object. Do not use directly or modify. + * @static + * @private + */ +gdjs.RuntimeObject._newId = (gdjs.RuntimeObject._newId || 0); + +/** + * Global container for unused forces, avoiding recreating forces each tick. + * @static + * @private + */ +gdjs.RuntimeObject.forcesGarbage = []; + +//Common members functions related to the object and its runtimeScene : + +/** + * To be called by the child classes in their constructor, at the very end. + * Notify the behaviors that they have been constructed (this must be done when + * the object is ready, otherwise behaviors can do operations on the object which + * could be not initialized yet). + * + * If you redefine this function, **make sure to call the original method** + * (`gdjs.RuntimeObject.prototype.onCreated.call(this);`). + */ +gdjs.RuntimeObject.prototype.onCreated = function() { + for(var i =0;i + * Note that common properties (position, angle, z order...) have already been setup. + * + * @param initialInstanceData The data of the initial instance. + */ +gdjs.RuntimeObject.prototype.extraInitializationFromInitialInstance = function(initialInstanceData) { + //Nothing to do. +}; + +/** + * Remove an object from a scene. + * + * Do not change/redefine this method. Instead, redefine the onDestroyFromScene method. + * @param {gdjs.RuntimeScene} runtimeScene The RuntimeScene owning the object. + */ +gdjs.RuntimeObject.prototype.deleteFromScene = function(runtimeScene) { + if ( this._livingOnScene ) { + runtimeScene.markObjectForDeletion(this); + this._livingOnScene = false; + } +}; + +/** + * Called when the object is destroyed (because it is removed from a scene or the scene + * is being unloaded). If you redefine this function, **make sure to call the original method** + * (`gdjs.RuntimeObject.prototype.onDestroyFromScene.call(this, runtimeScene);`). + * + * @param {gdjs.RuntimeScene} runtimeScene The scene owning the object. + */ +gdjs.RuntimeObject.prototype.onDestroyFromScene = function(runtimeScene) { + var theLayer = runtimeScene.getLayer(this.layer); + theLayer.getRenderer().removeRendererObject(this.getRendererObject()); + + for(var j = 0, lenj = this._behaviors.length;j + * The identifier is set by the runtimeScene owning the object.
+ * You can also use the id property (this._object.id) for increased efficiency instead of + * calling this method. + * + * @return {number} The object identifier + */ +gdjs.RuntimeObject.prototype.getUniqueId = function() { + return this.id; +} +; +/** + * Set the position of the object. + * + * @param {number} x The new X position + * @param {number} y The new Y position + */ +gdjs.RuntimeObject.prototype.setPosition = function(x,y) { + this.setX(x); + this.setY(y); +}; + +/** + * Set the X position of the object. + * + * @param {number} x The new X position + */ +gdjs.RuntimeObject.prototype.setX = function(x) { + if ( x === this.x ) return; + + this.x = x; + this.hitBoxesDirty = true; +}; + +/** + * Get the X position of the object. + * + * @return {number} The X position of the object + */ +gdjs.RuntimeObject.prototype.getX = function() { + return this.x; +}; + +/** + * Set the Y position of the object. + * + * @param {number} y The new Y position + */ +gdjs.RuntimeObject.prototype.setY = function(y) { + if ( y === this.y ) return; + + this.y = y; + this.hitBoxesDirty = true; +}; + +/** + * Get the Y position of the object. + * + * @return {number} The Y position of the object + */ +gdjs.RuntimeObject.prototype.getY = function() { + return this.y; +}; + +/** + * Get the X position of the rendered object. + * + * For most objects, this will returns the same value as getX(). But if the object + * has an origin that is not the same as the point (0,0) of the object displayed, + * getDrawableX will differ. + * + * @return {number} The X position of the rendered object. + */ +gdjs.RuntimeObject.prototype.getDrawableX = function() { + return this.getX(); +}; + +/** + * Get the Y position of the rendered object. + * + * For most objects, this will returns the same value as getY(). But if the object + * has an origin that is not the same as the point (0,0) of the object displayed, + * getDrawableY will differ. + * + * @return {number} The Y position of the rendered object. + */ +gdjs.RuntimeObject.prototype.getDrawableY = function() { + return this.getY(); +}; + + +gdjs.RuntimeObject.prototype.rotateTowardPosition = function(x, y, speed, scene) { + this.rotateTowardAngle(Math.atan2(y - (this.getDrawableY() + this.getCenterY()), + x - (this.getDrawableX() + this.getCenterX()))*180/Math.PI, speed, scene); +}; + +gdjs.RuntimeObject.prototype.rotateTowardAngle = function(angle, speed, runtimeScene) { + if (speed === 0) { + this.setAngle(angle); + return; + } + + var angularDiff = gdjs.evtTools.common.angleDifference(this.getAngle(), angle); + var diffWasPositive = angularDiff >= 0; + + var newAngle = this.getAngle() + (diffWasPositive ? -1.0 : 1.0) + * speed * this.getElapsedTime(runtimeScene) / 1000; + // @ts-ignore + if (gdjs.evtTools.common.angleDifference(newAngle, angle) > 0 ^ diffWasPositive) + newAngle = angle; + this.setAngle(newAngle); + + if (this.getAngle() !== newAngle) //Objects like sprite in 8 directions does not handle small increments... + this.setAngle(angle); //...so force them to be in the path angle anyway. +}; + +/** + * Rotate the object at the given speed + * + * @param {number} speed The speed, in degrees per second. + * @param {gdjs.RuntimeScene} runtimeScene The scene where the object is displayed. + */ +gdjs.RuntimeObject.prototype.rotate = function(speed, runtimeScene) { + this.setAngle(this.getAngle() + speed * this.getElapsedTime(runtimeScene) / 1000); +}; + +/** + * Set the angle of the object. + * + * @param {number} angle The new angle of the object + */ +gdjs.RuntimeObject.prototype.setAngle = function(angle) { + if ( this.angle === angle ) return; + + this.angle = angle; + this.hitBoxesDirty = true; +}; + +/** + * Get the rotation of the object. + * + * @return {number} The rotation of the object, in degrees. + */ +gdjs.RuntimeObject.prototype.getAngle = function() { + return this.angle; +}; + +/** + * Set the layer of the object. + * + * @param {string} layer The new layer of the object + */ +gdjs.RuntimeObject.prototype.setLayer = function(layer) { + if (layer === this.layer) return; + var oldLayer = this._runtimeScene.getLayer(this.layer); + + this.layer = layer; + var newLayer = this._runtimeScene.getLayer(this.layer); + + var rendererObject = this.getRendererObject(); + oldLayer.getRenderer().removeRendererObject(rendererObject); + newLayer.getRenderer().addRendererObject(rendererObject, this.zOrder); +}; + +/** + * Get the layer of the object. + * + * @return {string} The layer of the object + */ +gdjs.RuntimeObject.prototype.getLayer = function() { + return this.layer; +}; + +/** + * Return true if the object is on the specified layer + * + * @param {string} layer The layer to be tested. + * @return {boolean} true if the object is on the specified layer + */ +gdjs.RuntimeObject.prototype.isOnLayer = function(layer) { + return this.layer === layer; +}; + + +/** + * Set the Z order of the object. + * + * @param {number} z The new Z order position of the object + */ +gdjs.RuntimeObject.prototype.setZOrder = function(z) { + if ( z === this.zOrder ) return; + this.zOrder = z; + + if ( this.getRendererObject() ) { + var theLayer = this._runtimeScene.getLayer(this.layer); + theLayer.getRenderer().changeRendererObjectZOrder(this.getRendererObject(), z); + } +}; + +/** + * Get the Z order of the object. + * + * @return {number} The Z order of the object + */ +gdjs.RuntimeObject.prototype.getZOrder = function() { + return this.zOrder; +}; + +/** + * Get the container of the object variables + * @return {gdjs.VariablesContainer} The variables of the object + */ +gdjs.RuntimeObject.prototype.getVariables = function() { + return this._variables; +}; + +/** + * Get the value of a variable considered as a number. Equivalent of variable.getAsNumber() + * @param {gdjs.Variable} variable The variable to be accessed + * @return {number} The value of the specified variable + * @static + */ +gdjs.RuntimeObject.getVariableNumber = function(variable) { + return variable.getAsNumber(); +}; +gdjs.RuntimeObject.prototype.getVariableNumber = gdjs.RuntimeObject.getVariableNumber; + +/** + * Return the variable passed as argument without any change. + * Only for usage by events. + * + * @param {gdjs.Variable} variable The variable to be accessed + * @return The specified variable + * @static + */ +gdjs.RuntimeObject.returnVariable = function(variable) { + return variable; +} +gdjs.RuntimeObject.prototype.returnVariable = gdjs.RuntimeObject.returnVariable; + +/** + * Get the value of a variable considered as a string. Equivalent of variable.getAsString() + * @param variable The variable to be accessed + * @return The string of the specified variable + * @static + */ +gdjs.RuntimeObject.getVariableString = function(variable) { + return variable.getAsString(); +}; +gdjs.RuntimeObject.prototype.getVariableString = gdjs.RuntimeObject.getVariableString; + +/** + * Get the number of children from a variable + * @param variable The variable to be accessed + * @return The number of children + * @static + */ +gdjs.RuntimeObject.getVariableChildCount = function(variable) { + if (variable.isStructure() == false) return 0; + return Object.keys(variable.getAllChildren()).length; +}; + +/** + * Shortcut to set the value of a variable considered as a number + * @param variable The variable to be changed + * @param {number} newValue The value to be set + */ +gdjs.RuntimeObject.setVariableNumber = function(variable, newValue) { + variable.setNumber(newValue); +}; +gdjs.RuntimeObject.prototype.setVariableNumber = gdjs.RuntimeObject.setVariableNumber; + +/** + * Shortcut to set the value of a variable considered as a string + * @param variable The variable to be changed + * @param newValue {String} The value to be set + */ +gdjs.RuntimeObject.setVariableString = function(variable, newValue) { + variable.setString(newValue); +}; +gdjs.RuntimeObject.prototype.setVariableString = gdjs.RuntimeObject.setVariableString; + +/** + * @static + * @private + * @param {gdjs.Variable} variable The variable to be tested + * @param {string} childName The name of the child + */ +gdjs.RuntimeObject.variableChildExists = function(variable, childName) { + return variable.hasChild(childName); +}; +gdjs.RuntimeObject.prototype.variableChildExists = gdjs.RuntimeObject.variableChildExists; + +/** + * @static + * @private + * @param {gdjs.Variable} variable The variable to be changed + * @param {string} childName The name of the child + */ +gdjs.RuntimeObject.variableRemoveChild = function(variable, childName) { + return variable.removeChild(childName); +}; +gdjs.RuntimeObject.prototype.variableRemoveChild = gdjs.RuntimeObject.variableRemoveChild; + +/** + * @static + * @private + * @param {gdjs.Variable} variable The variable to be cleared + */ +gdjs.RuntimeObject.variableClearChildren = function(variable) { + variable.clearChildren(); +}; +gdjs.RuntimeObject.prototype.variableClearChildren = gdjs.RuntimeObject.variableClearChildren; + +/** + * Shortcut to test if a variable exists for the object. + * @param {string} name The variable to be tested + * @return {boolean} true if the variable exists. + */ +gdjs.RuntimeObject.prototype.hasVariable = function(name) { + return this._variables.has(name); +}; + +/** + * Hide (or show) the object. + * @param {boolean} enable Set it to true to hide the object, false to show it. + */ +gdjs.RuntimeObject.prototype.hide = function(enable) { + if (enable === undefined) enable = true; + this.hidden = enable; +}; + +/** + * Return true if the object is not hidden. + * + * Note: This is unrelated to the actual visibility of the objec on the screen. + * For this, see `getVisibilityAABB` to get the bounding boxes of the object as displayed + * on the scene. + * + * @return {boolean} true if the object is not hidden. + */ +gdjs.RuntimeObject.prototype.isVisible = function() { + return !this.hidden; +}; + +/** + * Return true if the object is hidden. + * @return {boolean} true if the object is hidden. + */ +gdjs.RuntimeObject.prototype.isHidden = function() { + return this.hidden; +}; + +/** + * Return the width of the object. + * @return {number} The width of the object + */ +gdjs.RuntimeObject.prototype.getWidth = function() { + return 0; +}; + +/** + * Return the width of the object. + * @return {number} The height of the object + */ +gdjs.RuntimeObject.prototype.getHeight = function() { + return 0; +}; + +/** + * Return the X position of the object center, **relative to the object X position** (`getDrawableX`). + * @return {number} the X position of the object center, relative to `getDrawableX()`. + */ +gdjs.RuntimeObject.prototype.getCenterX = function() { + return this.getWidth() / 2; +}; + +/** + * Return the Y position of the object center, **relative to the object position** (`getDrawableY`). + * @return {number} the Y position of the object center, relative to `getDrawableY()`. + */ +gdjs.RuntimeObject.prototype.getCenterY = function() { + return this.getHeight() / 2; +}; + +//Forces : + +/** + * Get a force from the garbage, or create a new force is garbage is empty.
+ * To be used each time a force is created so as to avoid temporaries objects. + * + * @private + * @param {number} x The x coordinates of the force + * @param {number} y The y coordinates of the force + * @param {number} multiplier Set the force multiplier + */ +gdjs.RuntimeObject.prototype._getRecycledForce = function(x, y, multiplier) { + if ( gdjs.RuntimeObject.forcesGarbage.length === 0 ) + return new gdjs.Force(x, y, multiplier); + else { + var recycledForce = gdjs.RuntimeObject.forcesGarbage.pop(); + recycledForce.setX(x); + recycledForce.setY(y); + recycledForce.setMultiplier(multiplier); + return recycledForce; + } +}; + +/** + * Add a force to the object to move it. + * @param {number} x The x coordinates of the force + * @param {number} y The y coordinates of the force + * @param {number} multiplier Set the force multiplier + */ +gdjs.RuntimeObject.prototype.addForce = function(x,y, multiplier) { + this._forces.push(this._getRecycledForce(x, y, multiplier)); +}; + +/** + * Add a force using polar coordinates. + * @param {number} angle The angle of the force, in degrees. + * @param {number} len The length of the force, in pixels. + * @param {number} multiplier Set the force multiplier + */ +gdjs.RuntimeObject.prototype.addPolarForce = function(angle, len, multiplier) { + var angleInRadians = angle/180*3.14159; //TODO: Benchmark with Math.PI + var forceX = Math.cos(angleInRadians)*len; + var forceY = Math.sin(angleInRadians)*len; + + this._forces.push(this._getRecycledForce(forceX, forceY, multiplier)); +}; + +/** + * Add a force oriented toward a position + * @param {number} x The target x position + * @param {number} y The target y position + * @param {number} len The force length, in pixels. + * @param {number} multiplier Set the force multiplier + */ +gdjs.RuntimeObject.prototype.addForceTowardPosition = function(x,y, len, multiplier) { + + var angle = Math.atan2(y - (this.getDrawableY()+this.getCenterY()), + x - (this.getDrawableX()+this.getCenterX())); + + var forceX = Math.cos(angle)*len; + var forceY = Math.sin(angle)*len; + this._forces.push(this._getRecycledForce(forceX, forceY, multiplier)); +}; + +/** + * Add a force oriented toward another object.
+ * (Shortcut for addForceTowardPosition) + * @param {gdjs.RuntimeObject} object The target object + * @param {number} len The force length, in pixels. + * @param {number} multiplier Set the force multiplier + */ +gdjs.RuntimeObject.prototype.addForceTowardObject = function(object, len, multiplier) { + if ( object == null ) return; + + this.addForceTowardPosition(object.getDrawableX() + object.getCenterX(), + object.getDrawableY() + object.getCenterY(), + len, multiplier); +}; + +/** + * Deletes all forces applied on the object + */ +gdjs.RuntimeObject.prototype.clearForces = function() { + gdjs.RuntimeObject.forcesGarbage.push.apply(gdjs.RuntimeObject.forcesGarbage, this._forces); + this._forces.length = 0; +}; + +/** + * Return true if no forces are applied on the object. + * @return {boolean} true if no forces are applied on the object. + */ +gdjs.RuntimeObject.prototype.hasNoForces = function() { + return this._forces.length === 0; +}; + +/** + * Called once a step by runtimeScene to update forces magnitudes and + * remove null ones. + */ +gdjs.RuntimeObject.prototype.updateForces = function(elapsedTime) { + for(var i = 0;i + * The default implementation returns a basic bouding box based the size (getWidth and + * getHeight) and the center point of the object (getCenterX and getCenterY). + * + * You should probably redefine updateHitBoxes instead of this function. + * + * @return {Array} An array composed of polygon. + */ +gdjs.RuntimeObject.prototype.getHitBoxes = function() { + //Avoid a naive implementation requiring to recreate temporaries each time + //the function is called: + //(var rectangle = gdjs.Polygon.createRectangle(this.getWidth(), this.getHeight()); + //...) + if ( this.hitBoxesDirty ) { + this.updateHitBoxes(); + this.updateAABB(); + this.hitBoxesDirty = false; + } + return this.hitBoxes; +}; + +/** + * Update the hit boxes for the object. + * + * The default implementation set a basic bounding box based on the size (getWidth and + * getHeight) and the center point of the object (getCenterX and getCenterY). + * Result is cached until invalidated (by a position change, angle change...). + * + * You should not call this function by yourself, it is called when necessary by getHitBoxes method. + * However, you can redefine it if your object need custom hit boxes. + */ +gdjs.RuntimeObject.prototype.updateHitBoxes = function() { + this.hitBoxes = this._defaultHitBoxes; + var width = this.getWidth(); + var height = this.getHeight(); + var centerX = this.getCenterX(); + var centerY = this.getCenterY(); + + if (centerX === width / 2 && centerY === height / 2) { + this.hitBoxes[0].vertices[0][0] = - centerX; + this.hitBoxes[0].vertices[0][1] = - centerY; + this.hitBoxes[0].vertices[1][0] = + centerX; + this.hitBoxes[0].vertices[1][1] = - centerY; + this.hitBoxes[0].vertices[2][0] = + centerX; + this.hitBoxes[0].vertices[2][1] = + centerY; + this.hitBoxes[0].vertices[3][0] = - centerX; + this.hitBoxes[0].vertices[3][1] = + centerY; + } else { + this.hitBoxes[0].vertices[0][0] = 0 - centerX; + this.hitBoxes[0].vertices[0][1] = 0 - centerY; + this.hitBoxes[0].vertices[1][0] = width - centerX; + this.hitBoxes[0].vertices[1][1] = 0 - centerY; + this.hitBoxes[0].vertices[2][0] = width - centerX; + this.hitBoxes[0].vertices[2][1] = height - centerY; + this.hitBoxes[0].vertices[3][0] = 0 - centerX; + this.hitBoxes[0].vertices[3][1] = height - centerY; + } + + this.hitBoxes[0].rotate(this.getAngle()/180*Math.PI); + this.hitBoxes[0].move(this.getDrawableX()+centerX, this.getDrawableY()+centerY); +}; + +/** + * Get the AABB (axis aligned bounding box) for the object. + * + * The default implementation uses either the position/size of the object (when angle is 0) or + * hitboxes (when angle is not 0) to compute the bounding box. + * Result is cached until invalidated (by a position change, angle change...). + * + * You should probably redefine updateAABB instead of this function. + * + * @return {AABB} The bounding box (example: `{min: [10,5], max:[20,10]}`) + */ +gdjs.RuntimeObject.prototype.getAABB = function() { + if ( this.hitBoxesDirty ) { + this.updateHitBoxes(); + this.updateAABB(); + this.hitBoxesDirty = false; + } + + return this.aabb; +}; + +/** + * Get the AABB (axis aligned bounding box) to be used to determine if the object + * is visible on screen. The gdjs.RuntimeScene will hide the renderer object if + * the object is not visible on screen ("culling"). + * + * The default implementation uses the AABB returned by getAABB. + * + * If `null` is returned, the object is assumed to be always visible. + * + * @return {?AABB} The bounding box (example: `{min: [10,5], max:[20,10]}`) or `null`. + */ +gdjs.RuntimeObject.prototype.getVisibilityAABB = function() { + return this.getAABB(); +}; + +/** + * Update the AABB (axis aligned bounding box) for the object. + * + * Default implementation uses either the position/size of the object (when angle is 0) or + * hitboxes (when angle is not 0) to compute the bounding box. + * + * You should not call this function by yourself, it is called when necessary by getAABB method. + * However, you can redefine it if your object can have a faster implementation. + */ +gdjs.RuntimeObject.prototype.updateAABB = function() { + if (this.getAngle() === 0) { + // Fast/simple computation of AABB for non rotated object + // (works even for object with non default center/origin + // because we're using getDrawableX/Y) + this.aabb.min[0] = this.getDrawableX(); + this.aabb.min[1] = this.getDrawableY(); + this.aabb.max[0] = this.aabb.min[0] + this.getWidth(); + this.aabb.max[1] = this.aabb.min[1] + this.getHeight(); + } else { + // Use hitboxes if object is rotated to ensure that the AABB + // is properly bounding the whole object. + // Slower (10-15% slower). + var first = true; + for(var i = 0;i= timeInSeconds; +}; + +/** + * Test a if a timer is paused + * @param {String} timerName The timer name + * @return {boolean} True if the timer exists and is paused, false otherwise + */ +gdjs.RuntimeObject.prototype.timerPaused = function(timerName) { + if ( !this._timers.containsKey(timerName) ) { + return false; + } + + return this._timers.get(timerName).isPaused(); +}; + +/** + * Reset a timer, if the timer doesn't exist it is created + * @param {String} timerName The timer name + */ +gdjs.RuntimeObject.prototype.resetTimer = function(timerName) { + if ( !this._timers.containsKey(timerName) ) { + this._timers.put(timerName, new gdjs.Timer(timerName)); + } + + this._timers.get(timerName).reset(); +}; + +/** + * Pause a timer, if the timer doesn't exist it is created + * @param {String} timerName The timer name + */ +gdjs.RuntimeObject.prototype.pauseTimer = function(timerName) { + if ( !this._timers.containsKey(timerName) ) { + this._timers.put(timerName, new gdjs.Timer(timerName)); + } + + this._timers.get(timerName).setPaused(true); +}; + +/** + * Unpause a timer, if the timer doesn't exist it is created + * @param {String} timerName The timer name + */ +gdjs.RuntimeObject.prototype.unpauseTimer = function(timerName) { + if ( !this._timers.containsKey(timerName) ) { + this._timers.put(timerName, new gdjs.Timer(timerName)); + } + + this._timers.get(timerName).setPaused(false); +}; + +/** + * Remove a timer + * @param {String} timerName The timer name + */ +gdjs.RuntimeObject.prototype.removeTimer = function(timerName) { + if ( this._timers.containsKey(timerName) ) { + this._timers.remove(timerName); + } +}; + +/** + * Get a timer elapsed time. + * @param {String} timerName The timer name + * @return {number} The timer elapsed time in seconds, 0 if the timer doesn't exist + */ +gdjs.RuntimeObject.prototype.getTimerElapsedTimeInSeconds = function(timerName) { + if ( !this._timers.containsKey(timerName) ) { + return 0; + } + + return this._timers.get(timerName).getTime() / 1000.0; +}; + +//Other : + +/** + * Separate the object from others objects, using their hitboxes. + * @param objects Objects + * @param {boolean | undefined} ignoreTouchingEdges If true, then edges that are touching each other, without the hitbox polygons actually overlapping, won't be considered in collision. + * @return true if the object was moved + */ +gdjs.RuntimeObject.prototype.separateFromObjects = function(objects, ignoreTouchingEdges) { + var moved = false; + var xMove = 0; var yMove = 0; + var hitBoxes = this.getHitBoxes(); + + //Check if their is a collision with each object + for(var i = 0, len = objects.length;i objects[i].getDrawableX()+objects[i].getWidth() ){ + this.setX( objects[i].getDrawableX()+objects[i].getWidth() ); + } + + if ( this.getDrawableY() < objects[i].getDrawableY() ){ + this.setY( objects[i].getDrawableY() - this.getHeight() ); + } + else if ( this.getDrawableY()+this.getHeight() > objects[i].getDrawableY()+objects[i].getHeight() ){ + this.setY( objects[i].getDrawableY()+objects[i].getHeight() ); + } + } + } +}; + +/** + * @deprecated + * @param objectsLists Tables of objects + */ +gdjs.RuntimeObject.prototype.separateObjectsWithForces = function(objectsLists) { + //Prepare the list of objects to iterate over. + var objects = gdjs.staticArray(gdjs.RuntimeObject.prototype.separateObjectsWithForces); + objects.length = 0; + + var lists = gdjs.staticArray2(gdjs.RuntimeObject.prototype.separateObjectsWithForces); + objectsLists.values(lists); + for(var i = 0, len = lists.length;i obj1BoundingRadius + obj2BoundingRadius ) + return false; + + //Do a real check if necessary. + var hitBoxes1 = obj1.getHitBoxes(); + var hitBoxes2 = obj2.getHitBoxes(); + for(var k = 0, lenBoxes1 = hitBoxes1.length;k sqBoundingR + sqDist + 2*Math.sqrt(sqDist*sqBoundingR) ) + return result; + + var testSqDist = closest ? sqDist : 0; + + var hitBoxes = this.getHitBoxes(); + for (var i=0; i testSqDist) && (res.farSqDist <= sqDist) ) { + testSqDist = res.farSqDist; + result = res; + } + } + } + + return result; +}; + +/** + * Return true if the specified position is inside object bounding box. + * + * The position should be in "world" coordinates, i.e use gdjs.Layer.convertCoords + * if you need to pass the mouse or a touch position that you get from gdjs.InputManager. + * + */ +gdjs.RuntimeObject.prototype.insideObject = function(x, y) { + if ( this.hitBoxesDirty ) { + this.updateHitBoxes(); + this.updateAABB(); + this.hitBoxesDirty = false; + } + return this.aabb.min[0] <= x && this.aabb.max[0] >= x + && this.aabb.min[1] <= y && this.aabb.max[1] >= y; +}; + +/** + * Check the distance between two objects. + * @static + */ +gdjs.RuntimeObject.distanceTest = function(obj1, obj2, distance) { + return obj1.getSqDistanceToObject(obj2) <= distance; +}; + +/** + * Return true if the cursor, or any touch, is on the object. + * + * @return true if the cursor, or any touch, is on the object. + */ +gdjs.RuntimeObject.prototype.cursorOnObject = function(runtimeScene) { + var inputManager = runtimeScene.getGame().getInputManager(); + var layer = runtimeScene.getLayer(this.layer); + + var mousePos = layer.convertCoords(inputManager.getMouseX(), inputManager.getMouseY()); + if (this.insideObject(mousePos[0], mousePos[1])) { + return true; + } + + var touchIds = inputManager.getAllTouchIdentifiers(); + for(var i = 0;i cameraCoords[2] || aabb.min[1] > cameraCoords[3] || + aabb.max[0] < cameraCoords[0] || aabb.max[1] < cameraCoords[1])) { + rendererObject.visible = false; + } else { + rendererObject.visible = true; + } + } + } + } +}; + +/** + * Empty the list of the removed objects:
+ * When an object is removed from the scene, it is still kept in the _instancesRemoved member + * of the RuntimeScene.
+ * This method should be called regularly (after events or behaviors steps) so as to clear this list + * and allows the removed objects to be cached (or destroyed if the cache is full).
+ * The removed objects could not be sent directly to the cache, as events may still be using them after + * removing them from the scene for example. + * + * @private + */ +gdjs.RuntimeScene.prototype._cacheOrClearRemovedInstances = function() { + for(var k =0, lenk=this._instancesRemoved.length;k} [points] The points of the frame. + * @property {SpritePoint} originPoint The origin point. + * @property {SpriteCenterPointData} centerPoint The center of the frame. + * @property {boolean} hasCustomCollisionMask Is The collision mask custom? + * @property {Array>} [customCollisionMask] The collision mask if it is custom. + */ + +/** + * @typedef {Object} SpriteDirectionData Represents the data of a {@link gdjs.SpriteAnimationDirection}. + * @property {number} timeBetweenFrames Time between each frame, in seconds. + * @property {boolean} looping Is the animation looping? + * @property {Array} sprites The list of frames. + */ + +/** + * @typedef {Object} SpriteAnimationData Represents the data of a {@link gdjs.SpriteAnimation}. + * @property {string} [name] The name of the animation. + * @property {boolean} useMultipleDirections Does the animation use multiple {@link gdjs.SpriteAnimationDirection}? + * @property {Array} directions The list of {@link SpriteDirectionData} representing {@link gdjs.SpriteAnimationDirection} instances. + */ + +/** + * @typedef {Object} SpriteObjectDataType Represents the data of a {@link gdjs.SpriteRuntimeObject}. + * @property {boolean} updateIfNotVisible Update the object even if he is not visible?. + * @property {Array} animations The list of {@link SpriteAnimationData} representing {@link gdjs.SpriteAnimation} instances. + * + * @typedef {ObjectData & SpriteObjectDataType} SpriteObjectData + */ + +/** + * A frame used by a SpriteAnimation in a {@link gdjs.SpriteRuntimeObject}. + * + * It contains the texture displayed as well as information like the points position + * or the collision mask. + * + * @memberOf gdjs + * @class SpriteAnimationFrame + * @param {gdjs.ImageManager} imageManager The game image manager + * @param {SpriteFrameData} frameData The frame data used to initialize the frame + */ + +gdjs.SpriteAnimationFrame = function(imageManager, frameData) +{ + /** @type {string} */ + this.image = frameData ? frameData.image : ""; //TODO: Rename in imageName, and do not store it in the object? + this.texture = gdjs.SpriteRuntimeObjectRenderer.getAnimationFrame(imageManager, this.image); + + if ( this.center === undefined ) { + /** @type {SpritePoint} */ + this.center = { x:0, y:0 }; + } + if ( this.origin === undefined ) { + /** @type {SpritePoint} */ + this.origin = { x:0, y:0 } + } + /** @type {boolean} */ + this.hasCustomHitBoxes = false; + if ( this.customHitBoxes === undefined ) { + /** @type {Array} */ + this.customHitBoxes = [] + }; + if ( this.points === undefined ){ + /** @type {Hashtable} */ + this.points = new Hashtable(); + } else this.points.clear(); + + //Initialize points: + for(var i = 0, len = frameData.points.length;i} */ + var polygonData = frameData.customCollisionMask[i]; + + //Add a polygon, if necessary (Avoid recreating a polygon if it already exists). + if ( i >= this.customHitBoxes.length ) this.customHitBoxes.push(new gdjs.Polygon()); + + for(var j = 0, len2 = polygonData.length;j= this.customHitBoxes[i].vertices.length ) + this.customHitBoxes[i].vertices.push([0,0]); + + this.customHitBoxes[i].vertices[j][0] = pointData.x; + this.customHitBoxes[i].vertices[j][1] = pointData.y; + } + + this.customHitBoxes[i].vertices.length = j; + } + + this.customHitBoxes.length = i; + } + else { + this.customHitBoxes.length = 0; + } +}; + +/** + * Get a point of the frame.
+ * If the point does not exist, the origin is returned. + * @param {string} name The point's name + * @return {SpritePoint} The requested point. If it doesn't exists returns the origin point. + */ +gdjs.SpriteAnimationFrame.prototype.getPoint = function(name) { + if ( name === "Centre" || name === "Center") return this.center; + else if ( name === "Origin" ) return this.origin; + + return this.points.containsKey(name) ? this.points.get(name) : this.origin; +}; + +/** + * Represents a direction of an animation of a {@link gdjs.SpriteRuntimeObject}. + * + * @class SpriteAnimationDirection + * @memberOf gdjs + * @param {gdjs.ImageManager} imageManager The game image manager + * @param {SpriteDirectionData} directionData The direction data used to initialize the direction + */ +gdjs.SpriteAnimationDirection = function(imageManager, directionData) +{ + /** @type {number} */ + this.timeBetweenFrames = directionData ? directionData.timeBetweenFrames : + 1.0; + /** @type {boolean} */ + this.loop = !!directionData.looping; + + if ( this.frames === undefined ) { + /** @type {Array} */ + this.frames = []; + } + for(var i = 0, len = directionData.sprites.length;i} */ + if ( this.directions === undefined ) this.directions = []; + for(var i = 0, len = animData.directions.length;i} */ + this._animations = []; + } + for(var i = 0, len = spriteObjectData.animations.length;i, customSize: {width: number, height: number}}} initialInstanceData The extra parameters + */ +gdjs.SpriteRuntimeObject.prototype.extraInitializationFromInitialInstance = function(initialInstanceData) { + if ( initialInstanceData.numberProperties ) { + for(var i = 0, len = initialInstanceData.numberProperties.length;i= this._animations.length || + this._currentDirection >= this._animations[this._currentAnimation].directions.length) { + return; + } + var direction = this._animations[this._currentAnimation].directions[this._currentDirection]; + var oldFrame = this._currentFrame; + + if (!direction.loop && this._currentFrame >= direction.frames.length) { + //*Optimization*: Animation is finished, don't change the current frame + //and compute nothing more. + } else { + var elapsedTime = this.getElapsedTime(runtimeScene) / 1000; + this._frameElapsedTime += this._animationPaused ? 0 : elapsedTime * this._animationSpeedScale; + + if ( this._frameElapsedTime > direction.timeBetweenFrames ) { + var count = Math.floor(this._frameElapsedTime / direction.timeBetweenFrames); + this._currentFrame += count; + this._frameElapsedTime = this._frameElapsedTime-count*direction.timeBetweenFrames; + if ( this._frameElapsedTime < 0 ) this._frameElapsedTime = 0; + } + + if ( this._currentFrame >= direction.frames.length ) { + this._currentFrame = direction.loop ? this._currentFrame % direction.frames.length : direction.frames.length-1; + } + if ( this._currentFrame < 0 ) this._currentFrame = 0; //May happen if there is no frame. + } + + if ( oldFrame !== this._currentFrame || this._animationFrameDirty ) this._updateAnimationFrame(); + if ( oldFrame !== this._currentFrame ) this.hitBoxesDirty = true; + + this._renderer.ensureUpToDate(); +}; + +/** + * Update `this._animationFrame` according to the current animation/direction/frame values + * (`this._currentAnimation`, `this._currentDirection`, `this._currentFrame`) and set + * `this._animationFrameDirty` back to false. + * + * Trigger a call to the renderer to change the texture being shown (if the animation/direction/frame + * is valid). + * If invalid, `this._animationFrame` will be `null` after calling this function. + */ +gdjs.SpriteRuntimeObject.prototype._updateAnimationFrame = function() { + this._animationFrameDirty = false; + + if ( this._currentAnimation < this._animations.length && + this._currentDirection < this._animations[this._currentAnimation].directions.length) { + var direction = this._animations[this._currentAnimation].directions[this._currentDirection]; + + if ( this._currentFrame < direction.frames.length ) { + this._animationFrame = direction.frames[this._currentFrame]; + if ( this._animationFrame !== null ) { + this._renderer.updateFrame(this._animationFrame); + } + + return; + } + } + + //Invalid animation/direction/frame: + this._animationFrame = null; +}; + +gdjs.SpriteRuntimeObject.prototype.getRendererObject = function() { + return this._renderer.getRendererObject(); +}; + +/** + * Update the hit boxes for the object. + * Fallback to the default implementation (rotated bounding box) if there is no custom + * hitboxes defined for the current animation frame. + */ +gdjs.SpriteRuntimeObject.prototype.updateHitBoxes = function() { + if ( this._animationFrameDirty ) { + this._updateAnimationFrame(); + } + if ( this._animationFrame === null ) return; //Beware, `this._animationFrame` can still be null. + + if ( !this._animationFrame.hasCustomHitBoxes ) + return gdjs.RuntimeObject.prototype.updateHitBoxes.call(this); + + //console.log("Update for "+this.name); //Uncomment to track updates + //(and in particular be sure that unnecessary update are avoided). + + //Update the current hitboxes with the frame custom hit boxes + //and apply transformations. + for (var i = 0;i= this.hitBoxes.length ) + this.hitBoxes.push(new gdjs.Polygon()); + + for (var j = 0;j= this.hitBoxes[i].vertices.length ) + this.hitBoxes[i].vertices.push([0,0]); + + this._transformToGlobal(this._animationFrame.customHitBoxes[i].vertices[j][0], + this._animationFrame.customHitBoxes[i].vertices[j][1], + this.hitBoxes[i].vertices[j]); + } + this.hitBoxes[i].vertices.length = this._animationFrame.customHitBoxes[i].vertices.length; + } + this.hitBoxes.length = this._animationFrame.customHitBoxes.length; + + //Rotate and scale and flipping have already been applied to the point by _transformToGlobal. +}; + +//Animations : + +/** + * Change the animation being played. + * @param {number} newAnimation The index of the new animation to be played + */ +gdjs.SpriteRuntimeObject.prototype.setAnimation = function(newAnimation) { + newAnimation = newAnimation | 0; + if ( newAnimation < this._animations.length && + this._currentAnimation !== newAnimation && + newAnimation >= 0) { + this._currentAnimation = newAnimation; + this._currentFrame = 0; + this._frameElapsedTime = 0; + this._renderer.update(); //TODO: This may be unnecessary. + this._animationFrameDirty = true; + this.hitBoxesDirty = true; + } +}; + +/** + * Change the animation being played. + * @param {string} newAnimationName The name of the new animation to be played + */ +gdjs.SpriteRuntimeObject.prototype.setAnimationName = function(newAnimationName) { + if (!newAnimationName) return; + + for(var i = 0;i < this._animations.length;++i) { + if (this._animations[i].name === newAnimationName) { + return this.setAnimation(i); + } + } +}; + +/** + * Get the index of the animation being played. + * @return {number} The index of the new animation being played + */ +gdjs.SpriteRuntimeObject.prototype.getAnimation = function() { + return this._currentAnimation; +}; + +/** + * Get the name of the animation being played. + * @return {string} The name of the new animation being played + */ +gdjs.SpriteRuntimeObject.prototype.getAnimationName = function() { + if ( this._currentAnimation >= this._animations.length ) { + return ''; + } + + return this._animations[this._currentAnimation].name; +}; + +gdjs.SpriteRuntimeObject.prototype.isCurrentAnimationName = function(name) { + return this.getAnimationName() === name; +}; + +/** + * Change the angle (or direction index) of the object + * @return {number} The new angle (or direction index) to be applied + */ +gdjs.SpriteRuntimeObject.prototype.setDirectionOrAngle = function(newValue) { + if ( this._currentAnimation >= this._animations.length ) { + return; + } + + var anim = this._animations[this._currentAnimation]; + if ( !anim.hasMultipleDirections ) { + if ( this.angle === newValue ) return; + + this.angle = newValue; + this.hitBoxesDirty = true; + this._renderer.updateAngle(); + } + else { + newValue = newValue | 0; + + if (newValue === this._currentDirection + || newValue >= anim.directions.length + || anim.directions[newValue].frames.length === 0) + return; + + this._currentDirection = newValue; + this._currentFrame = 0; + this._frameElapsedTime = 0; + this.angle = 0; + + this._renderer.update(); //TODO: This may be unnecessary. + this._animationFrameDirty = true; + this.hitBoxesDirty = true; + } +}; + +gdjs.SpriteRuntimeObject.prototype.getDirectionOrAngle = function() { + if ( this._currentAnimation >= this._animations.length ) { + return 0; + } + + if ( !this._animations[this._currentAnimation].hasMultipleDirections ) { + return this.angle; + } + else { + return this._currentDirection; + } +}; + +/** + * Change the current frame displayed by the animation + * @param {number} newFrame The index of the frame to be displayed + */ +gdjs.SpriteRuntimeObject.prototype.setAnimationFrame = function(newFrame) { + if ( this._currentAnimation >= this._animations.length || + this._currentDirection >= this._animations[this._currentAnimation].directions.length) { + return; + } + var direction = this._animations[this._currentAnimation].directions[this._currentDirection]; + + if ( newFrame >= 0 && newFrame < direction.frames.length && newFrame !== this._currentFrame ) { + this._currentFrame = newFrame; + this._animationFrameDirty = true; + this.hitBoxesDirty = true; + } +}; + +/** + * Get the index of the current frame displayed by the animation + * @return {number} newFrame The index of the frame being displayed + */ +gdjs.SpriteRuntimeObject.prototype.getAnimationFrame = function() { + return this._currentFrame; +}; + +/** + * Return true if animation has ended. + */ +gdjs.SpriteRuntimeObject.prototype.hasAnimationEnded = function() { + if ( this._currentAnimation >= this._animations.length || + this._currentDirection >= this._animations[this._currentAnimation].directions.length) { + return true; + } + if ( this._animations[this._currentAnimation].loop ) return false; + var direction = this._animations[this._currentAnimation].directions[this._currentDirection]; + + return this._currentFrame === direction.frames.length-1; +}; + +gdjs.SpriteRuntimeObject.prototype.animationPaused = function() { + return this._animationPaused; +}; + +gdjs.SpriteRuntimeObject.prototype.pauseAnimation = function() { + this._animationPaused = true; +}; + +gdjs.SpriteRuntimeObject.prototype.playAnimation = function() { + this._animationPaused = false; +}; + +gdjs.SpriteRuntimeObject.prototype.getAnimationSpeedScale = function() { + return this._animationSpeedScale; +}; + +gdjs.SpriteRuntimeObject.prototype.setAnimationSpeedScale = function(ratio) { + this._animationSpeedScale = ratio +}; + +//Position : + +/** + * Get the position on X axis on the scene of the given point. + * @param {string} name The point name + * @return {number} the position on X axis on the scene of the given point. + */ +gdjs.SpriteRuntimeObject.prototype.getPointX = function(name) { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + if ( name.length === 0 || this._animationFrame === null ) return this.getX(); + + var pt = this._animationFrame.getPoint(name); + var pos = gdjs.staticArray(gdjs.SpriteRuntimeObject.prototype.getPointX); + this._transformToGlobal(pt.x, pt.y, pos); + + return pos[0]; +}; + +/** + * Get the position on Y axis on the scene of the given point. + * @param {string} name The point name + * @return {number} the position on Y axis on the scene of the given point. + */ +gdjs.SpriteRuntimeObject.prototype.getPointY = function(name) { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + if ( name.length === 0 || this._animationFrame === null ) return this.getY(); + + var pt = this._animationFrame.getPoint(name); + var pos = gdjs.staticArray(gdjs.SpriteRuntimeObject.prototype.getPointY); + this._transformToGlobal(pt.x, pt.y, pos); + + return pos[1]; +}; + +/** + * Return an array containing the coordinates of the point passed as parameter + * in world coordinates (as opposed to the object local coordinates). + * + * Beware: this._animationFrame and this._sprite must *not* be null! + * + * All transformations (flipping, scale, rotation) are supported. + * + * @param {number} pointX The X position of the point, in object coordinates. + * @param {number} pointY The Y position of the point, in object coordinates. + * @param {Array} result Array that will be updated with the result (x and y position of the point + * in global coordinates) + * @private + */ +gdjs.SpriteRuntimeObject.prototype._transformToGlobal = function(x, y, result) { + var cx = this._animationFrame.center.x; + var cy = this._animationFrame.center.y; + + //Flipping + if ( this._flippedX ) { + x = x + (cx - x) * 2; + } + if ( this._flippedY ) { + y = y + (cy - y) * 2; + } + + //Scale + var absScaleX = Math.abs(this._scaleX); + var absScaleY = Math.abs(this._scaleY); + x *= absScaleX; + y *= absScaleY; + cx *= absScaleX; + cy *= absScaleY; + + //Rotation + var oldX = x; + var angleInRadians = this.angle/180*Math.PI; + var cosValue = Math.cos(angleInRadians); // Only compute cos and sin once (10% faster than doing it twice) + var sinValue = Math.sin(angleInRadians); + var xToCenterXDelta = x-cx; + var yToCenterYDelta = y-cy; + x = cx + cosValue*(xToCenterXDelta) - sinValue*(yToCenterYDelta); + y = cy + sinValue*(xToCenterXDelta) + cosValue*(yToCenterYDelta); + + result.length = 2; + result[0] = x + (this.x - this._animationFrame.origin.x*absScaleX); + result[1] = y + (this.y - this._animationFrame.origin.y*absScaleY); +}; + +/** + * Get the X position, on the scene, of the origin of the texture of the object. + * @return {number} the X position, on the scene, of the origin of the texture of the object. + */ +gdjs.SpriteRuntimeObject.prototype.getDrawableX = function() { + if ( this._animationFrame === null ) return this.x; + + var absScaleX = Math.abs(this._scaleX); + + if (!this._flippedX) { + return this.x - this._animationFrame.origin.x*absScaleX; + } else { + return this.x + (-this._animationFrame.origin.x + - this._renderer.getUnscaledWidth() + 2*this._animationFrame.center.x)*absScaleX; + } +}; + +/** + * Get the Y position, on the scene, of the origin of the texture of the object. + * @return {number} the Y position, on the scene, of the origin of the texture of the object. + */ +gdjs.SpriteRuntimeObject.prototype.getDrawableY = function() { + if ( this._animationFrame === null ) return this.y; + + var absScaleY = Math.abs(this._scaleY); + + if (!this._flippedY) { + return this.y - this._animationFrame.origin.y*absScaleY; + } else { + return this.y + (-this._animationFrame.origin.y + - this._renderer.getUnscaledHeight() + 2*this._animationFrame.center.y)*absScaleY; + } +}; + +/** + * Get the X position of the center of the object, relative to top-left of the texture of the object (`getDrawableX`). + * @return {number} X position of the center of the object, relative to `getDrawableX()`. + */ +gdjs.SpriteRuntimeObject.prototype.getCenterX = function() { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + if ( this._animationFrame === null ) return 0; + + if (!this._flippedX) { + //Just need to multiply by the scale as it is the center. + return this._animationFrame.center.x*Math.abs(this._scaleX); + } else { + return (this._renderer.getUnscaledWidth() - this._animationFrame.center.x)*Math.abs(this._scaleX); + } +}; + +/** + * Get the Y position of the center of the object, relative to top-left of the texture of the object (`getDrawableY`). + * @return {number} Y position of the center of the object, relative to `getDrawableY()`. + */ +gdjs.SpriteRuntimeObject.prototype.getCenterY = function() { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + if ( this._animationFrame === null ) return 0; + + if (!this._flippedY) { + //Just need to multiply by the scale as it is the center. + return this._animationFrame.center.y*Math.abs(this._scaleY); + } else { + return (this._renderer.getUnscaledHeight() - this._animationFrame.center.y)*Math.abs(this._scaleY); + } +}; + +/** + * Set the X position of the (origin of the) object. + * @param {number} x The new X position. + */ +gdjs.SpriteRuntimeObject.prototype.setX = function(x) { + if ( x === this.x ) return; + + this.x = x; + if (this._animationFrame !== null) { + this.hitBoxesDirty = true; + this._renderer.updateX(); + } +}; + +/** + * Set the Y position of the (origin of the) object. + * @param {number} y The new Y position. + */ +gdjs.SpriteRuntimeObject.prototype.setY = function(y) { + if ( y === this.y ) return; + + this.y = y; + if ( this._animationFrame !== null) { + this.hitBoxesDirty = true; + this._renderer.updateY(); + } +}; + +/** + * Set the angle of the object. + * @param {number} angle The new angle, in degrees. + */ +gdjs.SpriteRuntimeObject.prototype.setAngle = function(angle) { + if ( this._currentAnimation >= this._animations.length ) { + return; + } + + if ( !this._animations[this._currentAnimation].hasMultipleDirections ) { + if (this.angle === angle) return; + + this.angle = angle; + this._renderer.updateAngle(); + this.hitBoxesDirty = true; + } else { + angle = angle % 360; + if ( angle < 0 ) angle += 360; + this.setDirectionOrAngle(Math.round(angle/45) % 8); + } +}; + +/** + * Get the angle of the object. + * @return {number} The angle, in degrees. + */ +gdjs.SpriteRuntimeObject.prototype.getAngle = function(angle) { + if ( this._currentAnimation >= this._animations.length ) { + return 0; + } + + if ( !this._animations[this._currentAnimation].hasMultipleDirections ) + return this.angle; + else + return this._currentDirection * 45; +}; + +//Visibility and display : + +gdjs.SpriteRuntimeObject.prototype.setBlendMode = function(newMode) { + if (this._blendMode === newMode) return; + + this._blendMode = newMode; + this._renderer.update(); +}; + +gdjs.SpriteRuntimeObject.prototype.getBlendMode = function() { + return this._blendMode; +}; + +/** + * Change the transparency of the object. + * @param {number} opacity The new opacity, between 0 (transparent) and 255 (opaque). + */ +gdjs.SpriteRuntimeObject.prototype.setOpacity = function(opacity) { + if ( opacity < 0 ) opacity = 0; + if ( opacity > 255 ) opacity = 255; + + this.opacity = opacity; + this._renderer.updateOpacity(); +}; + +/** + * Get the transparency of the object. + * @return {number} The opacity, between 0 (transparent) and 255 (opaque). + */ +gdjs.SpriteRuntimeObject.prototype.getOpacity = function() { + return this.opacity; +}; + +/** + * Hide (or show) the object + * @param {boolean} enable true to hide the object, false to show it again. + */ +gdjs.SpriteRuntimeObject.prototype.hide = function(enable) { + if ( enable === undefined ) enable = true; + this.hidden = enable; + + this._renderer.updateVisibility(); +}; + +/** + * Change the tint of the sprite object. + * + * @param {string} rgbColor The color, in RGB format ("128;200;255"). + */ +gdjs.SpriteRuntimeObject.prototype.setColor = function(rgbColor) { + this._renderer.setColor(rgbColor); +}; + +/** + * Get the tint of the sprite object. + * + * @returns {string} rgbColor The color, in RGB format ("128;200;255"). + */ +gdjs.SpriteRuntimeObject.prototype.getColor = function() { + return this._renderer.getColor(); +}; + +gdjs.SpriteRuntimeObject.prototype.flipX = function(enable) { + if ( enable !== this._flippedX ) { + this._scaleX *= -1; + this._flippedX = enable; + this.hitBoxesDirty = true; + this._renderer.update(); + } +}; + +gdjs.SpriteRuntimeObject.prototype.flipY = function(enable) { + if ( enable !== this._flippedY ) { + this._scaleY *= -1; + this._flippedY = enable; + this.hitBoxesDirty = true; + this._renderer.update(); + } +}; + +gdjs.SpriteRuntimeObject.prototype.isFlippedX = function() { + return this._flippedX; +}; + +gdjs.SpriteRuntimeObject.prototype.isFlippedY = function() { + return this._flippedY; +}; + +//Scale and size : + +/** + * Get the width of the object. + * + * @return {number} The width of the object, in pixels. + */ +gdjs.SpriteRuntimeObject.prototype.getWidth = function() { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + return this._renderer.getWidth(); +}; + +/** + * Get the height of the object. + * + * @return {number} The height of the object, in pixels. + */ +gdjs.SpriteRuntimeObject.prototype.getHeight = function() { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + return this._renderer.getHeight(); +}; + +/** + * Change the width of the object. This changes the scale on X axis of the object. + * + * @param {number} width The new width of the object, in pixels. + */ +gdjs.SpriteRuntimeObject.prototype.setWidth = function(newWidth) { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + + var unscaledWidth = this._renderer.getUnscaledWidth(); + if (unscaledWidth !== 0) this.setScaleX(newWidth / unscaledWidth); +}; + +/** + * Change the height of the object. This changes the scale on Y axis of the object. + * + * @param {number} height The new height of the object, in pixels. + */ +gdjs.SpriteRuntimeObject.prototype.setHeight = function(newHeight) { + if ( this._animationFrameDirty ) this._updateAnimationFrame(); + + var unscaledHeight = this._renderer.getUnscaledHeight(); + if (unscaledHeight !== 0) this.setScaleY(newHeight / unscaledHeight); +}; + +/** + * Change the scale on X and Y axis of the object. + * + * @param {number} newScale The new scale (must be greater than 0). + */ +gdjs.SpriteRuntimeObject.prototype.setScale = function(newScale) { + if ( newScale < 0 ) newScale = 0; + if ( newScale === Math.abs(this._scaleX) && newScale === Math.abs(this._scaleY) ) return; + + this._scaleX = newScale * (this._flippedX ? -1 : 1); + this._scaleY = newScale * (this._flippedY ? -1 : 1); + this._renderer.update(); + this.hitBoxesDirty = true; +}; + +/** + * Change the scale on X axis of the object (changing its width). + * + * @param {number} newScale The new scale (must be greater than 0). + */ +gdjs.SpriteRuntimeObject.prototype.setScaleX = function(newScale) { + if ( newScale < 0 ) newScale = 0; + if ( newScale === Math.abs(this._scaleX) ) return; + + this._scaleX = newScale * (this._flippedX ? -1 : 1); + this._renderer.update(); + this.hitBoxesDirty = true; +}; + +/** + * Change the scale on Y axis of the object (changing its width). + * + * @param {number} newScale The new scale (must be greater than 0). + */ +gdjs.SpriteRuntimeObject.prototype.setScaleY = function(newScale) { + if ( newScale < 0 ) newScale = 0; + if ( newScale === Math.abs(this._scaleY) ) return; + + this._scaleY = newScale * (this._flippedY ? -1 : 1); + this._renderer.update(); + this.hitBoxesDirty = true; +}; + +/** + * Get the scale of the object (or the average of the X and Y scale in case they are different). + * + * @return {number} the scale of the object (or the average of the X and Y scale in case they are different). + */ +gdjs.SpriteRuntimeObject.prototype.getScale = function() { + return (Math.abs(this._scaleX)+Math.abs(this._scaleY))/2.0; +}; + +/** + * Get the scale of the object on Y axis. + * + * @return {number} the scale of the object on Y axis + */ +gdjs.SpriteRuntimeObject.prototype.getScaleY = function() { + return Math.abs(this._scaleY); +}; + +/** + * Get the scale of the object on X axis. + * + * @return {number} the scale of the object on X axis + */ +gdjs.SpriteRuntimeObject.prototype.getScaleX = function() { + return Math.abs(this._scaleX); +}; + +//Other : + +/** + * @param obj The target object + * @param scene The scene containing the object + * @deprecated + */ +gdjs.SpriteRuntimeObject.prototype.turnTowardObject = function(obj, scene) { + if ( obj === null ) return; + + this.rotateTowardPosition(obj.getDrawableX()+obj.getCenterX(), + obj.getDrawableY()+obj.getCenterY(), 0, scene); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/timemanager.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/timemanager.js new file mode 100644 index 0000000..636e5d9 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/timemanager.js @@ -0,0 +1,101 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Manage the timers and times elapsed during last + * frame, since the beginning of the scene and other time related values. + * + * @class TimeManager + * @memberof gdjs + */ +gdjs.TimeManager = function() +{ + this.reset(); +} + +gdjs.TimeManager.prototype.reset = function() { + this._elapsedTime = 0; + this._timeScale = 1; + this._timeFromStart = 0; + this._firstFrame = true; + this._timers = new Hashtable(); +} + +gdjs.TimeManager.prototype.update = function(elapsedTime, minimumFPS) { + if (this._firstUpdateDone) this._firstFrame = false; + this._firstUpdateDone = true; + + //Compute the elapsed time since last frame + this._elapsedTime = Math.min(elapsedTime, 1000/minimumFPS); + this._elapsedTime *= this._timeScale; + + //Update timers and others members + for(var name in this._timers.items) { + if (this._timers.items.hasOwnProperty(name)) { + this._timers.items[name].updateTime(this._elapsedTime); + } + } + + this._timeFromStart += this._elapsedTime; +}; + + +/** + * Set the time scale: time will be slower if time scale is < 1, + * faster if > 1. + * @param {number} timeScale The new time scale (must be positive). + */ +gdjs.TimeManager.prototype.setTimeScale = function(timeScale) { + if ( timeScale >= 0 ) this._timeScale = timeScale; +}; + +/** + * Get the time scale. + * @return {number} The time scale (positive, 1 is normal speed). + */ +gdjs.TimeManager.prototype.getTimeScale = function() { + return this._timeScale; +}; + +/** + * Get the time since the instanciation of the manager (i.e: since + * the beginning of the scene most of the time), in milliseconds. + */ +gdjs.TimeManager.prototype.getTimeFromStart = function() { + return this._timeFromStart; +}; + +/** + * Return true if update was called only once (i.e: if the scene + * is rendering its first frame). + */ +gdjs.TimeManager.prototype.isFirstFrame = function() { + return this._firstFrame; +}; + +/** + * Return the time elapsed since the last call to update + * (i.e: the last frame), in milliseconds. + */ +gdjs.TimeManager.prototype.getElapsedTime = function() { + return this._elapsedTime; +}; + +gdjs.TimeManager.prototype.addTimer = function(name) { + this._timers.put(name, new gdjs.Timer(name)); +}; + +gdjs.TimeManager.prototype.hasTimer = function(name) { + return this._timers.containsKey(name); +}; + +gdjs.TimeManager.prototype.getTimer = function(name) { + return this._timers.get(name); +}; + +gdjs.TimeManager.prototype.removeTimer = function(name) { + if (this._timers.containsKey(name)) this._timers.remove(name); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/timer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/timer.js new file mode 100644 index 0000000..56a29ff --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/timer.js @@ -0,0 +1,73 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * Represents a timer, which must be updated manually with {@link gdjs.Timer#updateTime}. + * + * @class Timer + * @memberof gdjs + * @param {string} name The name of the timer. + */ +gdjs.Timer = function(name) +{ + this._name = name; + this._time = 0; + this._paused = false; +} + +/** + * Get the name of the timer + * @return {string} The name of the timer + */ +gdjs.Timer.prototype.getName = function() { + return this._name; +} + +/** + * Get the time of the timer, in milliseconds. + * @return {number} The time of the timer, in milliseconds. + */ +gdjs.Timer.prototype.getTime = function() { + return this._time; +} + +/** + * Notify the timer that some time has passed. + * @param {number} time The elapsed time, in milliseconds. + */ +gdjs.Timer.prototype.updateTime = function(time) { + if ( !this._paused ) this._time += time; +} + +/** + * Change the time. + * @param {number} time The new time, in milliseconds. + */ +gdjs.Timer.prototype.setTime = function(time) { + this._time = time; +} + +/** + * Reset the time to zero. + */ +gdjs.Timer.prototype.reset = function() { + this.setTime(0); +} + +/** + * Set if the timer is paused. + * @param {boolean} enable true to pause the timer, false otherwise. + */ +gdjs.Timer.prototype.setPaused = function(enable) { + this._paused = enable; +} + +/** + * Check if the timer is paused. + */ +gdjs.Timer.prototype.isPaused = function() { + return this._paused; +} diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/twoTone1.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/twoTone1.ogg new file mode 100644 index 0000000..82653ad Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/twoTone1.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/variable.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/variable.js new file mode 100644 index 0000000..a220689 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/variable.js @@ -0,0 +1,273 @@ +// @ts-check + +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * @typedef {Object} VariableData Data representation of a GDevelop variable + * @property {string} [name] The name of the variable. Used if a child variable. + * @property {string} [value] The value of the variable, either string or number. Leave blank for structures. + * @property {Array} [children] The children of the structure. Leave blank if value is defined. + */ + +/** + * A Variable is an object storing a value (number or a string) or children variables. + * + * @memberOf gdjs + * @class Variable + * @param {VariableData} [varData] The optional initial content of the variable. + */ +gdjs.Variable = function(varData) +{ + /** @type {number} */ + this._value = 0; + /** @type {string} */ + this._str = ""; + /** @type {boolean} */ + this._numberDirty = false; + /** @type {boolean} */ + this._stringDirty = true; + /** @type {boolean} */ + this._isStructure = false; + /** @type {Object.} */ + this._children = {}; + /** @type {boolean} */ + this._undefinedInContainer = false; + + if ( varData !== undefined ) { + if ( varData.value !== undefined ) { //Variable is a string or a number + var initialValue = varData.value; + + //Try to guess the type of the value, as GD has no way ( for now ) to specify + //the type of a variable. + var valueWhenConsideredAsNumber = parseFloat(initialValue); + if(valueWhenConsideredAsNumber === valueWhenConsideredAsNumber && valueWhenConsideredAsNumber.toString() === initialValue) { //"Since NaN is the only JavaScript value that is treated as unequal to itself, you can always test if a value is NaN by checking it for equality to itself" + this._value = parseFloat(initialValue); + } + else { //We have a string (Maybe empty). + if ( initialValue.length === 0 ) + this._value = 0; + else { + this._str = initialValue; + this._numberDirty = true; + this._stringDirty = false; + } + } + } else { //Variable is a structure + this._isStructure = true; + + if (varData.children !== undefined) { + for(var i = 0, len = varData.children.length;i} All the children of the variable + */ +gdjs.Variable.prototype.getAllChildren = function() { + return this._children; +}; + +/** + * Add the given number to the variable value + * @method + * @param {number} val the number to add + */ +gdjs.Variable.prototype.add = function(val) { + this.setNumber(this.getAsNumber()+val); +}; + +/** + * Subtract the given number to the variable value + * @method + * @param {number} val the number to subtract + */ +gdjs.Variable.prototype.sub = function(val) { + this.setNumber(this.getAsNumber()-val); +}; + +/** + * Multiply the variable value by the given number + * @method + * @param {number} val the factor + */ +gdjs.Variable.prototype.mul = function(val) { + this.setNumber(this.getAsNumber()*val); +}; + +/** + * Divide the variable value by the given number + * @method + * @param {number} val the divisor + */ +gdjs.Variable.prototype.div = function(val) { + this.setNumber(this.getAsNumber()/val); +}; + +/** + * Concatenate the given string at the end of the variable value + * @method + * @param {string} str the string to append + */ +gdjs.Variable.prototype.concatenate = function(str) { + this.setString(this.getAsString()+str); +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/variablescontainer.js b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/variablescontainer.js new file mode 100644 index 0000000..cc083a2 --- /dev/null +++ b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/variablescontainer.js @@ -0,0 +1,197 @@ +// @ts-check + +/* + * GDevelop JS Platform + * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * VariablesContainer stores variables, usually for a a RuntimeGame, a RuntimeScene + * or a RuntimeObject. + * + * @memberof gdjs + * @class VariablesContainer + * @param {Array} [initialVariablesData] Optional array containing representations of the base variables. + */ +gdjs.VariablesContainer = function(initialVariablesData) +{ + if ( this._variables === undefined ) this._variables = new Hashtable(); + if ( this._variablesArray === undefined ) this._variablesArray = []; + + if ( initialVariablesData !== undefined ) this.initFrom(initialVariablesData); +}; + +gdjs.VariablesContainer._deletedVars = gdjs.VariablesContainer._deletedVars || []; + +/** + * Initialize variables from a container data.
+ * If `keepOldVariables` is set to false (by default), all already existing variables will be + * erased, but the new variables will be accessible thanks to getFromIndex.
+ * if `keepOldVariables` is set to true, already existing variables won't be erased and will be + * still accessible thanks to getFromIndex. + * + * @param {Array} data The array containing data used to initialize variables. + * @param {Boolean} [keepOldVariables] If set to true, already existing variables won't be erased. + */ +gdjs.VariablesContainer.prototype.initFrom = function(data, keepOldVariables) { + if ( keepOldVariables === undefined ) keepOldVariables = false; + if ( !keepOldVariables ) { + gdjs.VariablesContainer._deletedVars = gdjs.VariablesContainer._deletedVars || []; + this._variables.keys(gdjs.VariablesContainer._deletedVars); + } + + var that = this; + var i = 0; + for(var j = 0;j= this._variablesArray.length ) { //Add automatically non-existing variables. + var variable = new gdjs.Variable(); + this._variables.put(name, variable); + return variable; + } else { + /** @type {gdjs.Variable} */ + var variable = this._variablesArray[id]; + if ( variable.isUndefinedInContainer() ) { //Reuse variables removed before. + gdjs.Variable.call(variable); + } + return variable; + } +}; + +/** + * Check if a variable exists in the container. + * @param {string} name The variable's name + * @return {boolean} true if the variable exists. + */ +gdjs.VariablesContainer.prototype.has = function(name) { + var variable = this._variables.get(name); + return variable && !variable.isUndefinedInContainer(); +}; + + +/** + * "Bad" variable container, used by events when no other valid container can be found. + * This container has no state and always returns the bad variable ( see gdjs.VariablesContainer.badVariable ). + * @static + * @private + */ +gdjs.VariablesContainer.badVariablesContainer = { + has: function() {return false;}, + getFromIndex : function() { return gdjs.VariablesContainer.badVariable; }, + get : function() { return gdjs.VariablesContainer.badVariable; }, + remove : function() { return; }, + add : function() { return; }, + initFrom : function() { return; } +}; + +/** + * "Bad" variable, used by events when no other valid variable can be found. + * This variable has no state and always return 0 or the empty string. + * @static + * @private + */ +gdjs.VariablesContainer.badVariable = { + getChild : function() { return gdjs.VariablesContainer.badVariable; }, + hasChild: function() {return false;}, + isStructure: function() {return false;}, + isNumber: function() {return true;}, + removeChild : function() { return; }, + setNumber : function() { return; }, + setString : function() { return; }, + getAsString : function() { return ""; }, + getAsNumber : function() { return 0; }, + getAllChildren : function() { return {}; }, + add : function() { return; }, + sub : function() { return; }, + mul : function() { return; }, + div : function() { return; }, + concatenate : function() { return; }, + setUndefinedInContainer : function() { return; }, + isUndefinedInContainer : function() { return; } +}; diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/vlc-record-2020-03-28-18h19m15s-WhatsApp Ptt 2020-03-28 at 18.10.19.ogg-.ogg b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/vlc-record-2020-03-28-18h19m15s-WhatsApp Ptt 2020-03-28 at 18.10.19.ogg-.ogg new file mode 100644 index 0000000..d7a4044 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/vlc-record-2020-03-28-18h19m15s-WhatsApp Ptt 2020-03-28 at 18.10.19.ogg-.ogg differ diff --git a/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/win3.png b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/win3.png new file mode 100644 index 0000000..fb807f5 Binary files /dev/null and b/games.gdevelop-app.com/vincenzo/game-adbfc30b-3d8b-43b1-87ab-07f330a01272/win3.png differ