diff --git a/script/engine.js b/script/engine.js
index bf643c3..db3be3a 100644
--- a/script/engine.js
+++ b/script/engine.js
@@ -7,9 +7,12 @@ var Engine = {
* That would be so elegant and awesome.
*/
SITE_URL: encodeURIComponent("http://adarkroom.doublespeakgames.com"),
- VERSION: 1.2;
+ VERSION: 1.2,
MAX_STORE: 99999999999999,
SAVE_DISPLAY: 30 * 1000,
+
+ //object event types
+ topics: {},
Perks: {
'boxer': {
@@ -112,6 +115,9 @@ var Engine = {
swipeElement.on('swiperight', Engine.swipeRight);
swipeElement.on('swipeup', Engine.swipeUp);
swipeElement.on('swipedown', Engine.swipeDown);
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Engine.handleStateUpdates);
$SM.init();
Notifications.init();
@@ -165,6 +171,7 @@ var Engine = {
Engine.log("loaded save!");
}
} catch(e) {
+ State = {};
$SM.set('verson', Engine.VERSION);
Engine.event('progress', 'new game');
}
@@ -384,11 +391,27 @@ var Engine = {
handleStateUpdates: function(e){
- },
+ }
};
-//listener for StateManager update events
-$(Engine).on('stateUpdate', Engine.handleStateUpdates);
+//create jQuery Callbacks() to handle object events
+$.Dispatch = function( id ) {
+ var callbacks,
+ method,
+ topic = id && Engine.topics[ id ];
+ if ( !topic ) {
+ callbacks = jQuery.Callbacks();
+ topic = {
+ publish: callbacks.fire,
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ if ( id ) {
+ Engine.topics[ id ] = topic;
+ }
+ }
+ return topic;
+};
$(function() {
Engine.init();
diff --git a/script/events.js b/script/events.js
index e76af55..f8eb520 100644
--- a/script/events.js
+++ b/script/events.js
@@ -26,6 +26,9 @@ var Events = {
Events.eventStack = [];
Events.scheduleNextEvent();
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Events.handleStateUpdates);
},
options: {}, // Nothing for now
@@ -806,12 +809,8 @@ var Events = {
},
handleStateUpdates: function(e){
- //updates to run on stores changes if an event is active
- if(e.stateName.indexOf('stores') == 0 && Events.activeEvent() != null){
+ if(e.category == 'stores' && Events.activeEvent() != null){
Events.updateButtons();
}
- },
-};
-
-//listener for StateManager update events
-$(Events).on('stateUpdate', Events.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file
diff --git a/script/outside.js b/script/outside.js
index bee2027..31764ef 100644
--- a/script/outside.js
+++ b/script/outside.js
@@ -135,8 +135,11 @@ var Outside = {
.addClass('location')
.appendTo('div#locationSlider');
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Outside.handleStateUpdates);
+
if(typeof $SM.get('features.location.outside') == 'undefined') {
- $SM.set('features.location.outside', true);
+ $SM.set('features.location.outside');
$SM.setM('game.outside', {
buildings: {},
population: 0,
@@ -631,12 +634,8 @@ var Outside = {
},
handleStateUpdates: function(e){
- //updates to run on stores changes
- if(e.stateName.indexOf('stores') == 0){
+ if(e.category == 'stores'){
Outside.updateVillage();
}
- },
-};
-
-//listener for StateManager update events
-$(Outside).on('stateUpdate', Outside.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file
diff --git a/script/path.js b/script/path.js
index 8153e64..22dde15 100644
--- a/script/path.js
+++ b/script/path.js
@@ -49,6 +49,9 @@ var Path = {
Path.outfit = {};
Engine.updateSlider();
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Path.handleStateUpdates);
},
openPath: function() {
@@ -131,7 +134,7 @@ var Path = {
armour = "steel";
else if($SM.get('stores[\'i armour\']', true) > 0)
armour = "iron";
- else if($SM.get('stores[\'l armour']', true) > 0)
+ else if($SM.get('stores[\'l armour\']', true) > 0)
armour = "leather";
var aRow = $('#armourRow');
if(aRow.length == 0) {
@@ -301,11 +304,8 @@ var Path = {
},
handleStateUpdates: function(e){
- if(e.stateName.indexOf('character.perks') == 0 && Engine.activeModule == Path){
+ if(e.category == 'character' && e.stateName.indexOf('character.perks') == 0 && Engine.activeModule == Path){
Path.updatePerks();
};
- },
-};
-
-//listener for StateManager update events
-$(Path).on('stateUpdate', Path.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file
diff --git a/script/room.js b/script/room.js
index cb89384..fc588bf 100644
--- a/script/room.js
+++ b/script/room.js
@@ -487,6 +487,9 @@ var Room = {
// Create the stores container
$('
').attr('id', 'storesContainer').appendTo('div#roomPanel');
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Room.handleStateUpdates);
+
Room.updateButton();
Room.updateStoresView();
Room.updateIncomeView();
@@ -606,7 +609,7 @@ var Room = {
_fireTimer: null,
_tempTimer: null,
lightFire: function() {
- var wood = $SM.get('stores.wood', true);
+ var wood = $SM.get('stores.wood');
if(wood < 5) {
Notifications.notify(Room, "not enough wood to get the fire going");
Button.clearCooldown($('#lightButton.button'));
@@ -619,7 +622,7 @@ var Room = {
},
stokeFire: function() {
- var wood = $SM.get('stores.wood', true);
+ var wood = $SM.get('stores.wood');
if(wood === 0) {
Notifications.notify(Room, "the wood has run out");
Button.clearCooldown($('#stokeButton.button'));
@@ -956,7 +959,7 @@ var Room = {
return false;
}
for(var c in cost) {
- if(!$SM.get('stores[\''+c'\']')) {
+ if(!$SM.get('stores[\''+c+'\']')) {
return false;
}
}
@@ -1082,15 +1085,11 @@ var Room = {
},
handleStateUpdates: function(e){
- //updates to run on stores changes
- if(e.stateName.indexOf('stores') == 0){
+ if(e.category == 'stores'){
Room.updateStoresView();
Room.updateBuildButtons();
- } else if(e.stateName.indexOf('income') == 0){
+ } else if(e.category == 'income'){
Room.updateIncomeView();
};
- },
-};
-
-//listener for StateManager update events
-$(Room).on('stateUpdate', Room.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file
diff --git a/script/ship.js b/script/ship.js
index 202dde7..00b1a4e 100644
--- a/script/ship.js
+++ b/script/ship.js
@@ -16,7 +16,7 @@ var Ship = {
);
if(!$SM.get('features.location.spaceShip')) {
- $SM.set('features.location.spaceShip', true);
+ $SM.set('features.location.spaceShip');
$SM.setM('game.spaceShip', {
hull: Ship.BASE_HULL,
thrusters: Ship.BASE_THRUSTERS
@@ -78,6 +78,9 @@ var Ship = {
// Init Space
Space.init();
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Ship.handleStateUpdates);
},
options: {}, // Nothing for now
@@ -168,8 +171,5 @@ var Ship = {
handleStateUpdates: function(e){
- },
-};
-
-//listener for StateManager update events
-$(Ship).on('stateUpdate', Ship.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file
diff --git a/script/space.js b/script/space.js
index 9752340..1003506 100644
--- a/script/space.js
+++ b/script/space.js
@@ -41,6 +41,9 @@ var Space = {
var h = $('
').attr('id', 'hullRemaining').appendTo(this.panel);
$('
').addClass('row_key').text('hull: ').appendTo(h);
$('
').addClass('row_val').appendTo(h);
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(Space.handleStateUpdates);
},
options: {}, // Nothing for now
@@ -449,8 +452,5 @@ var Space = {
handleStateUpdates: function(e){
- },
-};
-
-//listener for StateManager update events
-$(Space).on('stateUpdate', Space.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file
diff --git a/script/state_manager.js b/script/state_manager.js
index 25c4b7d..3871ca9 100644
--- a/script/state_manager.js
+++ b/script/state_manager.js
@@ -40,6 +40,9 @@ var StateManager = {
for(var which in cats) {
if(!$SM.get(cats[which])) $SM.set(cats[which], {});
};
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe($SM.handleStateUpdates);
},
//create the parent of a given state, recursive as needed
@@ -129,8 +132,8 @@ var StateManager = {
//to be a count, but that might be unwanted behavior (add with loose eval probably will happen anyways)
var old = $SM.get(stateName, true);
- //check for NaN (old == old) and non number values
- if(old == old){
+ //check for NaN (old != old) and non number values
+ if(old != old){
Engine.log('WARNING: '+stateName+' was corrupted (NaN). Resetting to 0.');
old = 0;
$SM.set(stateName, old + value, noEvent);//setState handles event and save
@@ -200,17 +203,33 @@ var StateManager = {
return 'State' + dot + input;
},
-
-
fireUpdate: function(stateName, save){
- if(stateName == undefined) stateName = 'all'; //best if this doesn't happen as it will trigger more stuff
- $.event.trigger({
- 'type': 'stateUpdate',
- 'stateName': stateName,
- });
+ var category = $SM.getCategory(stateName);
+ if(stateName == undefined) stateName = category = 'all'; //best if this doesn't happen as it will trigger more stuff
+ $.Dispatch('stateUpdate').publish({'category': category, 'stateName':stateName})
+ //$.event.trigger({
+ // type: "stateUpdate",
+ // 'stateName': stateName
+ //});
if(save) Engine.saveGame();
},
+ getCategory: function(stateName){
+ var firstOB = stateName.indexOf('[');
+ var firstDot = stateName.indexOf('.');
+ var cutoff = null;
+ if(firstOB == -1 || firstDot == -1){
+ cutoff = firstOB > firstDot ? firstOB : firstDot;
+ } else {
+ cutoff = firstOB < firstDot ? firstOB : firstDot;
+ }
+ if (cutoff == -1){
+ return stateName;
+ } else {
+ return stateName.substr(0,cutoff);
+ }
+ },
+
//Use this function to make old save games compatible with new version
updateOldState: function(){
var version = $SM.get('version');
@@ -329,11 +348,8 @@ var StateManager = {
handleStateUpdates: function(e){
- },
+ }
};
//alias
-var $SM = StateManager;
-
-//listener for StateManager update events
-$(StateManager).on('stateUpdate', $SM.handleStateUpdates);
\ No newline at end of file
+var $SM = StateManager;
\ No newline at end of file
diff --git a/script/world.js b/script/world.js
index 45e174f..0fe9ba0 100644
--- a/script/world.js
+++ b/script/world.js
@@ -129,7 +129,7 @@ var World = {
World.LANDMARKS[World.TILE.SWAMP] = {num: 1, minRadius: 15, maxRadius: World.RADIUS * 1.5, scene: 'swamp', label: 'A Murky Swamp'};
if(typeof $SM.get('features.location.world') == 'undefined') {
- $SM.set('features.location.world', true);
+ $SM.set('features.location.world');
$SM.setM('game.world', {
map: World.generateMap(),
mask: World.newMask()
@@ -149,6 +149,9 @@ var World = {
$('
').attr('id', 'healthCounter').appendTo(outer);
Engine.updateOuterSlider();
+
+ //subscribe to stateUpdates
+ $.Dispatch('stateUpdate').subscribe(World.handleStateUpdates);
},
clearDungeon: function() {
@@ -870,7 +873,7 @@ var World = {
return World.BASE_HEALTH + 35;
} else if($SM.get('stores[\'i armour\']', true) > 0) {
return World.BASE_HEALTH + 15;
- } else if($SM.get('stores[\'l armour']', true) > 0) {
+ } else if($SM.get('stores[\'l armour\']', true) > 0) {
return World.BASE_HEALTH + 5;
}
return World.BASE_HEALTH;
@@ -940,8 +943,5 @@ var World = {
handleStateUpdates: function(e){
- },
-};
-
-//listener for StateManager update events
-$(World).on('stateUpdate', World.handleStateUpdates);
\ No newline at end of file
+ }
+};
\ No newline at end of file