From e4cde4d8c7e179e155d46487b58a42a44db8ea00 Mon Sep 17 00:00:00 2001 From: Is Isilon Date: Tue, 23 Feb 2016 17:53:48 +0800 Subject: [PATCH] Element store, and clear all --- css/style.css | 5 +- index.html | 17 +- js/app.js | 44 +++-- js/detector/bubblr.js | 345 ++++++++++++++++++++-------------------- js/detector/detector.js | 18 ++- js/game.js | 215 +++++++++++++------------ js/gameobjects.js | 44 ++++- 7 files changed, 384 insertions(+), 304 deletions(-) diff --git a/css/style.css b/css/style.css index 080b59c..1f20db8 100644 --- a/css/style.css +++ b/css/style.css @@ -316,7 +316,7 @@ h1 br { min-height: 500px; } -.ui-draggable-handle { +.ui-draggable { cursor: move; } .element { @@ -329,6 +329,9 @@ h1 br { .element.empty { opacity: 0.2; } +.white-badge.empty { + opacity: 0.2; +} #observationsContent { font-size: 24px; } diff --git a/index.html b/index.html index 0301be6..60b6162 100644 --- a/index.html +++ b/index.html @@ -87,10 +87,10 @@
-
- + {{r.key}} - {{r.state.amount}} + {{r.state.amount}}
@@ -119,13 +119,13 @@
{{r.key}} @@ -139,7 +139,7 @@ id="detector-core" width="400" height="400" - class="test-tube prevent-select center-block " + class="test-tube prevent-select center-block" data-drop="true" jqyoui-droppable="{onDrop: 'dc.onDrop'}" data-jqyoui-options="{{dc.dropOptions}}" @@ -149,10 +149,11 @@ Your bunsen burner. Click it to turn on and off. +
-
+
Data
diff --git a/js/app.js b/js/app.js index fd67122..d66358e 100644 --- a/js/app.js +++ b/js/app.js @@ -24,14 +24,17 @@ var app = (function () { // factories to provide services. They serve shared game objects - app.factory('elements', function () { - var elements = Helpers.loadFile('json/elements.json'); - elements = elements.map( - function (r) { - return new GameObjects.Element(r); - }); - return elements - }); + // app.factory('elements', function () { + // var elements = Helpers.loadFile('json/elements.json'); + // elements = elements.map( + // function (r) { + // return new GameObjects.Element(r); + // }); + // // put in extended array with helper methods + // elementStore = new GameObjects.ElementStore(); + // elementStore.push.apply(elementStore,elements); + // return elementStore; + // }); app.factory('game', function () { var game = new Game(); @@ -91,23 +94,12 @@ var app = (function () { var draggable = angular.element(ui.draggable); var key = draggable.data('element'); if (!draggable.hasClass('element-icon')) { - var elementStore = vs.elements.filter(function (e) { - return e.key === key; - })[0]; - var hashKey=draggable.data('hashkey'); - var found=false; - for (var i = 0; i < detector.elements.length; i++) { - if (detector.elements[i].$$hashKey===hashKey){ - // delete detector.elements[i]; - detector.elements.splice(i,1); - var found=true; - break; - } - } - if (!found) console.warn('Could not find dragged element in detector.elements',draggable); - else elementStore.state.amount+=1; + var elementStore = vs.elements.get(key); + var i = findIndexByHashKey(draggable.data('hashkey')); + detector.elements.splice(i,1); + elementStore.state.amount+=1; } - } + }; vs.doElement = function (item) { var cost = item.element(game.lab); if (cost > 0) { @@ -149,12 +141,16 @@ var app = (function () { game.lab.clickDetector(); detector.addEvent(); UI.showUpdateValue("#update-data", game.lab.state.detector); + game.elements.addToStore(); return false; }; vm.toggleFlameFuel = function () { console.log('toggleFlameFuel'); detector.flamer.toggleFuel(); }; + vm.clearAll = function(){ + detector.clearAll(game); + } }]); app.controller('LabController', ['$interval', 'game', 'detector', function ($interval, game, detector) { diff --git a/js/detector/bubblr.js b/js/detector/bubblr.js index 8772082..889b045 100644 --- a/js/detector/bubblr.js +++ b/js/detector/bubblr.js @@ -5,221 +5,226 @@ This plugin available for use in all personal or commercial projects under both MIT and GPL licenses. */ -(function ( $, window, document, undefined ) { +(function ($, window, document, undefined) { - var pluginName = "bubblr"; + var pluginName = "bubblr"; - /** default options **/ + /** default options **/ var defaults = { - numberOfBubbles: 10, - backgroundColor: "transparent", - bubbleColor: "White", - bubbleOpacity: 0.7, - bubbleMinSize: 1, - bubbleMaxSize: 2, - bubbleMaxSpeed: 2, - bubbleMinSpeed: 1, - animationSpeed: 10 - }; + numberOfBubbles: 10, + backgroundColor: "transparent", + bubbleColor: "White", + bubbleOpacity: 0.7, + bubbleMinSize: 1, + bubbleMaxSize: 2, + bubbleMaxSpeed: 2, + bubbleMinSpeed: 1, + animationSpeed: 10 + }; - /** - * Create the bubblr - * @param {dom element} element - dom canvas element - * @param {object} options - options see Bubblr._defaults for options - */ - function Bubblr( element, options ) { + /** + * Create the bubblr + * @param {dom element} element - dom canvas element + * @param {object} options - options see Bubblr._defaults for options + */ + function Bubblr(element, options) { this.element = element; - this.options = $.extend( {}, defaults, options) ; + this.options = $.extend({}, defaults, options); this._defaults = defaults; - this.state = { - bubbles: [], - started: false, - globalTick: 0, - genBubbles: false, - } + this.state = { + bubbles: [], + started: false, + globalTick: 0, + genBubbles: false, + } this.init(); - this.start(); + this.start(); } - Bubblr.prototype.init = function () { + Bubblr.prototype.init = function () { - if(this.element.getContext) { - this.ctx = this.element.getContext("2d"); - } - else { - return; - } + if (this.element.getContext) { + this.ctx = this.element.getContext("2d"); + } else { + return; + } - $canvas = $(this.element); + $canvas = $(this.element); - this.width = $canvas.width(); - this.height = $canvas.height(); + this.width = $canvas.width(); + this.height = $canvas.height(); - // this.state.globalTick=0; - // this.state.continuous=false; // new bubbles - // this.state.started = false // if there is an animation loop + $canvas.css("background-color", this.options.backgroundColor) - $canvas.css("background-color", this.options.backgroundColor) - - // this.state.bubbles = new Array(); - - // initial bubbles - for(i = 0; i < this.options.numberOfBubbles; i++) { - this.state.bubbles[i] = this.generateBubble(); - } - for(i in this.state.bubbles) { - this.drawBubble(this.state.bubbles[i]); - } + // initial bubbles + for (i = 0; i < this.options.numberOfBubbles; i++) { + this.state.bubbles[i] = this.generateBubble(); + } + for (i in this.state.bubbles) { + this.drawBubble(this.state.bubbles[i]); + } }; - /** - * Recenter on resize, - * bind this to $(window).on('resize',bubblr.onResize.bind(bubblr);) if needed - **/ - Bubblr.prototype.onResize= function(){ - this.clear(); - this.width = $(this.element).outerWidth(); - this.height = $(this.element).outerWidth(); - }; + /** + * Recenter on resize, + * bind this to $(window).on('resize',bubblr.onResize.bind(bubblr);) if needed + **/ + Bubblr.prototype.onResize = function () { + this.clear(); + this.width = $(this.element).outerWidth(); + this.height = $(this.element).outerWidth(); + }; - /** Start animation loop if not started **/ - Bubblr.prototype.start = function() { - if (!this.state.started){ - this.state.started=true; - this.animationLoop(); - } - }; + /** Start animation loop if not started **/ + Bubblr.prototype.start = function () { + if (!this.state.started) { + this.state.started = true; + this.animationLoop(); + } + }; - /** Stop animation loop **/ - Bubblr.prototype.stop = function() { - this.state.started=false; - this.clear(); - }; + /** Stop animation loop **/ + Bubblr.prototype.stop = function () { + this.state.started = false; + this.clear(); + }; - /** Animation loop run Bubblr.stop and start control this **/ - Bubblr.prototype.animationLoop = function() { - window.requestAnimFrame(this.animationLoop.bind(this)); - this.state.globalTick++; - if (this.state.started) this.animate(); - }; + /** Animation loop run Bubblr.stop and start control this **/ + Bubblr.prototype.animationLoop = function () { + window.requestAnimFrame(this.animationLoop.bind(this)); + this.state.globalTick++; + if (this.state.started) this.animate(); + }; - Bubblr.prototype.animate = function (arguments) { - this.clear(); - for(i in this.state.bubbles) { - this.update(i, this.state.bubbles[i]); - this.draw(i, this.state.bubbles[i]); - } - } + Bubblr.prototype.animate = function (arguments) { + this.clear(); + for (i in this.state.bubbles) { + this.update(i, this.state.bubbles[i]); + this.draw(i, this.state.bubbles[i]); + } - Bubblr.prototype.clear = function () { - this.ctx.globalAlpha = 1; - this.ctx.fillStyle = this.options.backgroundColor; - this.ctx.clearRect(0,0,this.width, this.height); - }; + // clear bubbles where y<0 (pop em) + var toRemove = this.state.bubbles.findIndex(function (b) { + return b.y < 0; + }); + for (var i = 0; i < toRemove.length; i++) { + var bubble = this.state.bubbles.splice(toRemove[i], 1)[0]; + //bubble.pop(); + } + + }; + + Bubblr.prototype.clear = function () { + this.ctx.globalAlpha = 1; + this.ctx.fillStyle = this.options.backgroundColor; + this.ctx.clearRect(0, 0, this.width, this.height); + }; - Bubblr.prototype.draw = function (index, bubble) { - this.ctx.globalAlpha = this.options.bubbleOpacity; - this.drawBubble(bubble); - }; + Bubblr.prototype.draw = function (index, bubble) { + this.ctx.globalAlpha = this.options.bubbleOpacity; + this.drawBubble(bubble); + }; - /** Update bubble position **/ - Bubblr.prototype.update = function (index, bubble) { - bubble.y = bubble.y - bubble.speed + /** Update bubble position **/ + Bubblr.prototype.update = function (index, bubble) { + bubble.y = bubble.y - bubble.speed - if(bubble.y < 0 && this.state.continuous) - // reset to bottom if continuous running is on - this.state.bubbles[index] = this.generateBubble(true); - }; + if (bubble.y < 0 && this.state.continuous) + // reset to bottom if continuous running is on + this.state.bubbles[index] = this.generateBubble(true); + else {} - /** - * Generate a single bubble - * @param {object} options - options for the bubble - * @param {Number} options.x - Starting x position. Defaults to a random - * location. - * @param {Number} options.y - starting y level. Default to the bottom or - * null for random position, a number sets a - * specific level. Note the top is 0, while the - * bottom is `-$(element).height()` - */ - Bubblr.prototype.bubble = function (options){ - this.state.bubbles.push(this.generateBubble(options)); - } + }; - /** - * Helper to generate multiple bubble - * @param {[type]} amount - amount of bubbles to create - * @param {[type]} options - see Bubblr.bubble for description - */ - Bubblr.prototype.genBubbles = function (amount,options) { - for (var i = 0; i < amount; i++) { - this.state.bubbles.push(this.generateBubble(options)); - } - } + /** + * Generate a single bubble + * @param {object} options - options for the bubble + * @param {Number} options.x - Starting x position. Defaults to a random + * location. + * @param {Number} options.y - starting y level. Default to the bottom or + * null for random position, a number sets a + * specific level. Note the top is 0, while the + * bottom is `-$(element).height()` + */ + Bubblr.prototype.bubble = function (options) { + this.state.bubbles.push(this.generateBubble(options)); + }; - Bubblr.prototype.drawBubble = function(bubble) { - this.ctx.fillStyle = this.options.bubbleColor; - this.ctx.beginPath(); - this.ctx.arc(bubble.x, bubble.y, bubble.radius, 0, Math.PI*2, true); - this.ctx.closePath(); - this.ctx.fill(); - }; + /** + * Helper to generate multiple bubble + * @param {[type]} amount - amount of bubbles to create + * @param {[type]} options - see Bubblr.bubble for description + */ + Bubblr.prototype.genBubbles = function (amount, options) { + for (var i = 0; i < amount; i++) { + this.state.bubbles.push(this.generateBubble(options)); + } + } - Bubblr.prototype.generateBubble = function(options) { - options = options || {}; - var bubble = new Object(); + Bubblr.prototype.drawBubble = function (bubble) { + this.ctx.fillStyle = this.options.bubbleColor; + this.ctx.beginPath(); + this.ctx.arc(bubble.x, bubble.y, bubble.radius, 0, Math.PI * 2, true); + this.ctx.closePath(); + this.ctx.fill(); + }; + + Bubblr.prototype.generateBubble = function (options) { + options = options || {}; + var bubble = new Object(); - if(options.x===undefined || options.x===null) - bubble.x = this.randomize(1,this.width); - else - bubble.x = options.x + if (options.x === undefined || options.x === null) + bubble.x = this.randomize(1, this.width); + else + bubble.x = options.x - if(options.y===undefined) - bubble.y = this.height; - else if (options.y===null) - bubble.y = this.randomize(1,this.height); - else - bubble.y = options.y + if (options.y === undefined) + bubble.y = this.height; + else if (options.y === null) + bubble.y = this.randomize(1, this.height); + else + bubble.y = options.y - if (options.radius) - bubble.radius = options.radius - else - bubble.radius = this.randomize(this.options.bubbleMinSize, this.options.bubbleMaxSize); + if (options.radius) + bubble.radius = options.radius + else + bubble.radius = this.randomize(this.options.bubbleMinSize, this.options.bubbleMaxSize); - if (options.speed) - bubble.speed = options.speed; - else - bubble.speed = this.randomize(this.options.bubbleMinSpeed, this.options.bubbleMaxSpeed); + if (options.speed) + bubble.speed = options.speed; + else + bubble.speed = this.randomize(this.options.bubbleMinSpeed, this.options.bubbleMaxSpeed); - return bubble; - }; + return bubble; + }; - Bubblr.prototype.randomize = function(min,max) { - return Math.floor((Math.random()*max)+min); - }; + Bubblr.prototype.randomize = function (min, max) { + return Math.floor((Math.random() * max) + min); + }; - // $.flame will create or return the bubblr element - $.fn[pluginName] = function ( options ) { + // $.flame will create or return the bubblr element + $.fn[pluginName] = function (options) { return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) { $.data(this, 'plugin_' + pluginName, - new Bubblr( this, options )); + new Bubblr(this, options)); } }); } -})( jQuery, window, document ); +})(jQuery, window, document); // shim for requestAnimFrame -window.requestAnimFrame = (function(){ - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(/* function */ callback, /* DOMElement */ element){ - window.setTimeout(callback, 1000 / 60); - }; +window.requestAnimFrame = (function () { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function ( /* function */ callback, /* DOMElement */ element) { + window.setTimeout(callback, 1000 / 60); + }; })(); diff --git a/js/detector/detector.js b/js/detector/detector.js index c143922..9debe87 100644 --- a/js/detector/detector.js +++ b/js/detector/detector.js @@ -23,7 +23,7 @@ var Detector = function(){ ctx: null }, - elements: [], + elements: new GameObjects.ElementStore(), visible: true, @@ -120,7 +120,7 @@ var Detector = function(){ /** When a worker clicks the detector **/ addEventExternal: function(numWorkers) { - // this.bubblr.bubble(numWorkers); + this.bubblr.genBubbles(numWorkers); }, /** Draw current events **/ @@ -129,6 +129,20 @@ var Detector = function(){ this.bubblr.bubble(); }, + /** Clear an element back to element Store **/ + storeElementByHashKey: function(hashKey,game){ + var i = this.elements.findIndexByHashKey(hashKey); + var removedElement = this.elements.splice(i,1)[0]; + return game.elements.get(removedElement.key).state.amount+=1; + }, + + clearAll: function(game){ + var hashKeys = this.elements.map(function(e){return e.$$hashKey;}); + for (var i = 0; i < hashKeys.length; i++) { + this.storeElementByHashKey(hashKeys[i], game); + } + }, + onDrop: function(event, ui, game){ var self=this; console.debug('onDrop',arguments); diff --git a/js/game.js b/js/game.js index ac2a892..dae65f9 100644 --- a/js/game.js +++ b/js/game.js @@ -1,109 +1,128 @@ /** * Game object load/saves game resources and stores game objects */ -var Game = (function(Helpers,GameObjects,ObjectStorage) { - 'use strict'; +var Game = (function (Helpers, GameObjects, ObjectStorage) { + 'use strict'; - var Game = function() { - this.lab = new GameObjects.Lab(); - this.elements = null; - this.workers = null; - this.upgrades = null; - this.achievements = null; - this.allObjects = {lab : this.lab}; - this.loaded = false; - this.rules= null; - }; - - Game.prototype.load = function() { - if (this.loaded) { - return; - } - - // I know synchronous requests are bad as they will block the browser. - // However, I don't see any other reasonable way to do this in order to - // make it work with Angular. If you know a way, let me know, and I'll - // give you a beer. - Kevin - this.elements = Helpers.loadFile('json/elements.json'); - this.workers = Helpers.loadFile('json/workers.json'); - this.upgrades = Helpers.loadFile('json/upgrades.json'); - this.achievements = Helpers.loadFile('json/achievements.json'); - this.keywords = Helpers.loadFile('json/keywords.json'); - - // Turn JSON files into actual game objects and fill map of all objects - var _this = this; - var makeGameObject = function(type, object) { - // It's okay to define this function here since load is only called - // once anyway... - var o = new type(object); - _this.allObjects[o.key] = o; - return o; + var Game = function () { + this.lab = new GameObjects.Lab(); + this.elements = null; + this.workers = null; + this.upgrades = null; + this.achievements = null; + this.allObjects = { + lab: this.lab + }; + this.loaded = false; + this.rules = null; }; - this.elements = this.elements.map( - function(r) { return makeGameObject(GameObjects.Element, r); }); - this.workers = this.workers.map( - function(w) { return makeGameObject(GameObjects.Worker, w); }); - this.upgrades = this.upgrades.map( - function(u) { return makeGameObject(GameObjects.Upgrade, u); }); - this.achievements = this.achievements.map( - function(a) { return makeGameObject(GameObjects.Achievement, a); }); - // Load states from local store - for (var key in this.allObjects) { - var o = this.allObjects[key]; - o.loadState(ObjectStorage.load(key)); - } - // this.detector.init(400,$('#detector')); + Game.prototype.load = function () { + if (this.loaded) { + return; + } - this.rules = this.generateRules(); + // I know synchronous requests are bad as they will block the browser. + // However, I don't see any other reasonable way to do this in order to + // make it work with Angular. If you know a way, let me know, and I'll + // give you a beer. - Kevin + this.elements = Helpers.loadFile('json/elements.json'); + this.workers = Helpers.loadFile('json/workers.json'); + this.upgrades = Helpers.loadFile('json/upgrades.json'); + this.achievements = Helpers.loadFile('json/achievements.json'); + this.keywords = Helpers.loadFile('json/keywords.json'); - this.loaded = true; - }; + // Turn JSON files into actual game objects and fill map of all objects + var _this = this; + var makeGameObject = function (type, object) { + // It's okay to define this function here since load is only called + // once anyway... + var o = new type(object); + _this.allObjects[o.key] = o; + return o; + }; + this.elements = this.elements.map( + function (r) { + return makeGameObject(GameObjects.Element, r); + }); + this.workers = this.workers.map( + function (w) { + return makeGameObject(GameObjects.Worker, w); + }); + this.upgrades = this.upgrades.map( + function (u) { + return makeGameObject(GameObjects.Upgrade, u); + }); + this.achievements = this.achievements.map( + function (a) { + return makeGameObject(GameObjects.Achievement, a); + }); + // Load states from local store + for (var key in this.allObjects) { + var o = this.allObjects[key]; + o.loadState(ObjectStorage.load(key)); + } - /** Generate rules between runes **/ - Game.prototype.generateRules= function(){ - var elements = this.elements; - // generate rules and store them with a hash of inredients - // the rule will be an object with ingredients, catalysts, conditions, results - // todo make a strcture that's more like a tree with progression etc - // todo add duds, misleading ones, explosions wildcards - // todo make this theory based? - // todo simulation - var rules={}; - for (var k = 0; k < this.elements.length*5; k++) { - // make a rules - var rule={ingredients:[],catalysts:[],conditions:[],results:[],inputs:[]} - var numOfIngredients = 2+Math.round(Math.random()*2); - for (var i = 0; i < numOfIngredients; i++) { - var j = Math.round(Math.random()*(elements.length-1)); - rule.ingredients.push(elements[j].key); - } + // put elements in extended array with utility methods + this.elementStore = new GameObjects.ElementStore(); + this.elementStore.push.apply(this.elementStore,this.elements); + this.elements=this.elementStore; - if (Math.random()<0.1) { - var j = Math.round(Math.random()*(elements.length-1)); - rule.catalysts.push(elements[j].key); - } - var numOfresults = Math.round(Math.random()*3); - for (var i = 0; i < numOfresults; i++) { - var j = Math.round(Math.random()*(elements.length-1)); - rule.results.push(elements[j].key); - } - rule.inputs=[].concat(rule.ingredients,rule.catalysts) - rule.ingredients.sort() - rule.results.sort() - rule.catalysts.sort() - rule.inputs.sort(); - // index byhash of sorted array of ingredients - rules[rule.inputs]=rule - } - return rules; - }, - Game.prototype.save = function() { - // Save every object's state to local storage - for (var key in this.allObjects) { - ObjectStorage.save(key, this.allObjects[key].state); - } - }; + this.rules = this.generateRules(); - return Game; -}(Helpers,GameObjects,ObjectStorage)); + this.loaded = true; + }; + + /** Generate rules between runes **/ + Game.prototype.generateRules = function () { + var elements = this.elements; + // generate rules and store them with a hash of inredients + // the rule will be an object with ingredients, catalysts, conditions, results + // todo make a strcture that's more like a tree with progression etc + // todo add duds, misleading ones, explosions wildcards + // todo make this theory based? + // todo simulation + var rules = {}; + for (var k = 0; k < this.elements.length * 5; k++) { + // make a rules + var rule = { + ingredients: [], + catalysts: [], + conditions: [], + results: [], + inputs: [] + } + var numOfIngredients = 2 + Math.round(Math.random() * 2); + for (var i = 0; i < numOfIngredients; i++) { + var j = Math.round(Math.random() * (elements.length - 1)); + rule.ingredients.push(elements[j].key); + } + + if (Math.random() < 0.1) { + var j = Math.round(Math.random() * (elements.length - 1)); + rule.catalysts.push(elements[j].key); + } + var numOfresults = Math.round(Math.random() * 3); + for (var i = 0; i < numOfresults; i++) { + var j = Math.round(Math.random() * (elements.length - 1)); + rule.results.push(elements[j].key); + } + rule.inputs = [].concat(rule.ingredients, rule.catalysts) + rule.ingredients.sort() + rule.results.sort() + rule.catalysts.sort() + rule.inputs.sort(); + // index byhash of sorted array of ingredients + rules[rule.inputs] = rule + } + return rules; + }, + Game.prototype.save = function () { + // Save every object's state to local storage + for (var key in this.allObjects) { + ObjectStorage.save(key, this.allObjects[key].state); + } + }; + + return Game; +}(Helpers, GameObjects, ObjectStorage)); diff --git a/js/gameobjects.js b/js/gameobjects.js index 45fe717..50f126d 100644 --- a/js/gameobjects.js +++ b/js/gameobjects.js @@ -86,6 +86,47 @@ var GameObjects = (function () { return false; }; + var ElementStore = function (obj) { + Array.apply(this, [obj]); + }; + + ElementStore.prototype = Object.create(Array.prototype); + + ElementStore.prototype.constructor = ElementStore; + + /** Add a random element or specify it's key **/ + ElementStore.prototype.addToStore = function(element){ + if (!element) this.get(element); + if (!element) element = this.select(); + return element.state.amount+=1; + }; + + /** Select random element from store **/ + ElementStore.prototype.select = function () { + var i = Math.floor((this.length-1)*Math.random()); + return this[i]; + }; + /** Get element by hashid **/ + ElementStore.prototype.get = function (key) { + return this.filter(function (e) { + return e.key === key; + })[0]; + } + + /** Get element by hashid **/ + ElementStore.prototype.getByHashKey = function (hashKey) { + return this.filter(function (e) { + return e.$$hashKey === hashKey; + })[0]; + } + + /** Get element by hashid **/ + ElementStore.prototype.findIndexByHashKey = function (hashKey) { + return this.findIndex(function (e) { + return e.$$hashKey === hashKey; + })[0]; + } + /** @class Element */ var Element = function (obj) { @@ -279,6 +320,7 @@ var GameObjects = (function () { Element: Element, Worker: Worker, Upgrade: Upgrade, - Achievement: Achievement + Achievement: Achievement, + ElementStore: ElementStore }; }());