diff --git a/src/index.html b/src/index.html index 87210eb..e3f40ff 100644 --- a/src/index.html +++ b/src/index.html @@ -7,6 +7,7 @@ + diff --git a/src/js/automaton.js b/src/js/automaton.js index 38265d4..0741af6 100644 --- a/src/js/automaton.js +++ b/src/js/automaton.js @@ -1,4 +1,4 @@ -function Automaton(async, dom, messaging, screen, session, ui) { +function Automaton(async, cache, dom, messaging, screen, session, ui) { var menus = { start: { entries: [ @@ -56,6 +56,15 @@ function Automaton(async, dom, messaging, screen, session, ui) { name: 'textSpeed' } }; + var areas = new cache.make(function(key) { + messaging.send({tag: 'Load', area: key}); + return async.bind( + messaging.receive(function(message) { + return message.tag == 'Area'; + }), + function(message) { return async.wrap(message.contents); } + ); + }); var game = session.get('game'); if(game != undefined) { menus.start.entries.unshift( diff --git a/src/js/cache.js b/src/js/cache.js new file mode 100644 index 0000000..6d345e9 --- /dev/null +++ b/src/js/cache.js @@ -0,0 +1,54 @@ +function Cache(async) { + function Cache(loader) { + this.loader = loader; + this.loaded = {}; + this.loading = {}; + } + + Cache.prototype.get = function(key) { + return function(f) { + if(this.loaded[key] != undefined) { + f(this.loaded[key]); + } else { + this.startLoading(key); + this.loading[key].push(f); + this.loader(key)(this.store(key)); + } + }.bind(this); + }; + + Cache.prototype.warmUp = function(key) { + if(this.loaded[key] == undefined) { + this.startLoading(key); + this.loader(key)(this.store(key)); + } + }; + + Cache.prototype.startLoading = function(key) { + if(this.loading[key] == undefined) { + this.loading[key] = []; + } + }; + + Cache.prototype.store = function(key) { + return function(value) { + this.loaded[key] = value; + for(var i = 0; i < this.loading[key].length; i++) { + this.loading[key][i](value); + } + this.loading[key] = null; + }.bind(this); + }; + + return { + make: make + }; + + function make(loader) { + var cache = new Cache(loader); + return { + get: cache.get.bind(cache), + warmUp: cache.warmUp.bind(cache) + }; + } +} diff --git a/src/js/main.js b/src/js/main.js index 1014d3f..ead7a31 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -4,7 +4,8 @@ window.addEventListener('load', function() { dom = Dom(); screen = Screen(dom); session = Session(async); + cache = Cache(async); buttons = Buttons(session); ui = UI(async, buttons, dom, screen, session); - automaton = Automaton(async, dom, messaging, screen, session, ui); + automaton = Automaton(async, cache, dom, messaging, screen, session, ui); });