// @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); };