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