From db4a346d2121e1d9c46c9c0b80c54ed2375235a1 Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Tue, 23 Jul 2013 01:24:47 -0600 Subject: [PATCH 01/13] create StateManager, change all State calls to managed calls Introduced state_manager.js almost all State gets/sets are now run through the manager (alias $SM). For now it was a simple, mostly straightforward replacement of calls. This means that there are redundancies and a lot of now unneeded code for things the SM will handle. However, since I had trouble with making those changes as well as introducing the manager all at once my first attempt, I am taking the wiser approach and making "one change" at a time like I should have instead of being too sure of myself. At this point, it seems to work, but there may be bugs I didn't catch. There was also no attempt made to update old saves to work with this. In theory, it shouldn't be too hard. (included is a list of all state changes) TODO: Save Update. Refactor: a lot, many many redundancies now. Refactor: "location centric" to "global centric". Relocate all calls to different update functions to event listeners where possible. ====================================================== The changes to State are as follows: .room (exists) > features.location.room .room > game.room .room.builder > game.room.builder .room.temperature > game.room.temperature .room.fire > game.room.fire .room.buttons > game.room.buttons .outside (exists) > features.location.outside .outside > game.outside .outside.population > game.outside.population .outside.buildings > game.outside.buildings .outside.workers > game.outside.workers .outside.seenForest > game.outside.seenForest .world (exists) > features.location.world .world > game.world .world.map > game.world.map .world.mask > game.world.mask .starved > character.starved .dehydrated > character.dehydrated .ship (exists) > featuers.location.spaceShip .ship > game.spaceShip .ship.hull > game.spaceShip.hull .ship.thrusters > game.spaceShip.thrusters .ship.seenWarning > game.spaceShip.seenWarning .ship.seenShip > game.spaceShip.seenShip .punches > character.punches .perks > character.perks .thieves > game.thieves .stolen > game.stolen .cityCleared > game.cityCleared .stores > stores .income > income --- index.html | 5 +- script/engine.js | 85 ++++++--------- script/events.js | 10 +- script/events/global.js | 8 +- script/events/outside.js | 2 +- script/events/room.js | 6 +- script/events/setpieces.js | 30 +++--- script/outside.js | 91 ++++++++-------- script/path.js | 8 +- script/room.js | 118 +++++++++++---------- script/ship.js | 33 +++--- script/space.js | 2 +- script/state_manager.js | 212 +++++++++++++++++++++++++++++++++++++ script/world.js | 29 ++--- 14 files changed, 418 insertions(+), 221 deletions(-) create mode 100644 script/state_manager.js diff --git a/index.html b/index.html index 78e532c..e1fe8cc 100644 --- a/index.html +++ b/index.html @@ -15,12 +15,15 @@ - + + + diff --git a/script/engine.js b/script/engine.js index 189454b..ef0d725 100644 --- a/script/engine.js +++ b/script/engine.js @@ -59,8 +59,8 @@ var Engine = { options: { state: null, - debug: false, - log: false + debug: true, + log: true }, init: function(options) { @@ -112,6 +112,7 @@ var Engine = { swipeElement.on('swipeup', Engine.swipeUp); swipeElement.on('swipedown', Engine.swipeDown); + $SM.init(); Notifications.init(); Events.init(); Room.init(); @@ -122,7 +123,7 @@ var Engine = { if(Engine.getStore('compass') > 0) { Path.init(); } - if(State.ship) { + if($SM.get('features.location.spaceShip')) { Ship.init(); } @@ -165,8 +166,6 @@ var Engine = { } catch(e) { State = { version: 1.2, - stores: {}, - perks: {} }; Engine.event('progress', 'new game'); } @@ -324,10 +323,10 @@ var Engine = { }, addPerk: function(name) { - if(!State.perks) { - State.perks = {}; + if(!$SM.get('character.perks')) { + $SM.set('character.perks', {}); } - State.perks[name] = true; + $SM.set('character.perks[\''+name+'\']', true); Notifications.notify(null, Engine.Perks[name].notify); if(Engine.activeModule == Path) { Path.updatePerks(); @@ -335,47 +334,37 @@ var Engine = { }, hasPerk: function(name) { - return typeof State.perks == 'object' && State.perks[name] == true; + return typeof $SM.get('character.perks') == 'object' && $SM.get('character.perks[\''+name+'\']') == true; }, setStore: function(name, number) { - if(typeof State.stores == 'undefined') { - State.stores = {}; - } - if(number > Engine.MAX_STORE) number = Engine.MAX_STORE; - State.stores[name] = number; + $SM.set('stores[\''+name+'\']', number); Room.updateStoresView(); Room.updateBuildButtons(); - if(State.outside) { + if($SM.get('features.location.outside')) { Outside.updateVillage(); } Engine.saveGame(); }, setStores: function(list) { - if(typeof State.stores == 'undefined') { - State.stores = {}; - } for(k in list) { - State.stores[k] = list[k] > Engine.MAX_STORE ? Engine.MAX_STORE : list[k]; + $SM.set('stores[\''+k+'\']', list[k]); } Room.updateStoresView(); Room.updateBuildButtons(); - if(State.outside) { + if($SM.get('features.location.outside')) { Outside.updateVillage(); } Engine.saveGame(); }, addStore: function(name, number) { - if(typeof State.stores == 'undefined') { - State.stores = {}; - } - var num = State.stores[name]; + var num = $SM.get('stores[\''+name+'\']'); if(typeof num != 'number' || isNaN(num) || num < 0) num = 0; num += number; if(num > Engine.MAX_STORE) num = Engine.MAX_STORE; - State.stores[name] = num; + $SM.set('stores[\''+name+'\']', num); Room.updateStoresView(); Room.updateBuildButtons(); Outside.updateVillage(); @@ -386,14 +375,10 @@ var Engine = { }, addStores: function(list, ignoreCosts) { - if(typeof State.stores == 'undefined') { - State.stores = {}; - } - // Make sure any income costs can be paid if(!ignoreCosts) { for(k in list) { - var num = State.stores[k]; + var num = $SM.get('stores[\''+k+'\']'); if(typeof num != 'number' || isNaN(num) || num < 0) num = 0; if(num + list[k] < 0) { return false; @@ -403,12 +388,12 @@ var Engine = { // Actually do the update for(k in list) { - var num = State.stores[k]; + var num = $SM.get('stores[\''+k+'\']'); if(typeof num != 'number') num = 0; num += list[k]; num = num < 0 ? 0 : num; num = num > Engine.MAX_STORE ? Engine.MAX_STORE : num; - State.stores[k] = num; + $SM.set('stores[\''+k+'\']', num); } Room.updateStoresView(); Room.updateBuildButtons(); @@ -421,32 +406,26 @@ var Engine = { }, storeAvailable: function(name) { - return typeof State.stores[name] == 'number'; + return typeof $SM.get('stores[\''+name+'\']') == 'number'; }, getStore: function(name) { - if(typeof State.stores == 'undefined' || typeof State.stores[name] == 'undefined' ) { + if(typeof $SM.get('stores[\''+name+'\']') == 'undefined') { return 0; } - return State.stores[name]; + return $SM.get('stores[\''+name+'\']'); }, setIncome: function(source, options) { - if(typeof State.income == 'undefined') { - State.income = {}; - } - var existing = State.income[source]; + var existing = $SM.get('income[\''+source+'\']'); if(typeof existing != 'undefined') { options.timeLeft = existing.timeLeft; } - State.income[source] = options; + $SM.set('income[\''+source+'\']', options); }, getIncome: function(source) { - if(typeof State.income == 'undefined') { - State.income = {}; - } - var existing = State.income[source]; + var existing = $SM.get('income[\''+source+'\']'); if(typeof existing != 'undefined') { return existing; } @@ -454,17 +433,15 @@ var Engine = { }, removeIncome: function(source) { - if(State.income) { - delete State.income[source]; - } + $SM.remove('income[\''+source+'\']'); Room.updateIncomeView(); }, collectIncome: function() { - if(typeof State.income != 'undefined' && Engine.activeModule != Space) { + if(typeof $SM.get('income') != 'undefined' && Engine.activeModule != Space) { var changed = false; - for(var source in State.income) { - var income = State.income[source]; + for(var source in $SM.get('income')) { + var income = $SM.get('income[\''+source+'\']'); if(typeof income.timeLeft != 'number') { income.timeLeft = 0; @@ -501,15 +478,15 @@ var Engine = { }, addStolen: function(stores) { - if(!State.stolen) State.stolen = {}; + if(!$SM.get('game.stolen')) $SM.set('game.stolen', {}); for(var k in stores) { - if(!State.stolen[k]) State.stolen[k] = 0; - State.stolen[k] -= stores[k]; + if(!$SM.get('game.stolen[\''+k+'\']')) $SM.set('game.stolen[\''+k+'\']', 0); + $SM.add('game.stolen[\''+k+'\']', stores[k] * -1); } }, startThieves: function() { - State.thieves = 1; + $SM.set('game.thieves', 1); Engine.setIncome('thieves', { delay: 10, stores: { diff --git a/script/events.js b/script/events.js index 6fee7b0..1148c2e 100644 --- a/script/events.js +++ b/script/events.js @@ -243,13 +243,13 @@ var Events = { var weaponName = btn.attr('id').substring(7).replace('-', ' '); var weapon = World.Weapons[weaponName]; if(weapon.type == 'unarmed') { - if(!State.punches) State.punches = 0; - State.punches++; - if(State.punches == 50 && !Engine.hasPerk('boxer')) { + if(!$SM.get('character.punches')) $SM.set('character.punches', 0); + $SM.add('character.punches', 1); + if($SM.get('character.punches') == 50 && !Engine.hasPerk('boxer')) { Engine.addPerk('boxer'); - } else if(State.punches == 150 && !Engine.hasPerk('martial artist')) { + } else if($SM.get('character.punches') == 150 && !Engine.hasPerk('martial artist')) { Engine.addPerk('martial artist'); - } else if(State.punches == 300 && !Engine.hasPerk('unarmed master')) { + } else if($SM.get('character.punches') == 300 && !Engine.hasPerk('unarmed master')) { Engine.addPerk('unarmed master'); } diff --git a/script/events/global.js b/script/events/global.js index 64f4021..7c623b0 100644 --- a/script/events/global.js +++ b/script/events/global.js @@ -5,7 +5,7 @@ Events.Global = [ { /* The Thief */ title: 'The Thief', isAvailable: function() { - return (Engine.activeModule == Room || Engine.activeModule == Outside) && State.thieves == 1; + return (Engine.activeModule == Room || Engine.activeModule == Outside) && $SM.get('game.thieves') == 1; }, scenes: { 'start': { @@ -32,9 +32,9 @@ Events.Global = [ 'the point is made. in the next few days, the missing supplies are returned.' ], onLoad: function() { - State.thieves = 2; + $SM.set('game.thieves', 2); Engine.removeIncome('thieves'); - Engine.addStores(State.stolen); + Engine.addStores($SM.get('game.stolen')); }, buttons: { 'leave': { @@ -49,7 +49,7 @@ Events.Global = [ "shares what he knows about sneaking before he goes." ], onLoad: function() { - State.thieves = 2; + $SM.set('game.thieves', 2); Engine.removeIncome('thieves'); Engine.addPerk('stealthy'); }, diff --git a/script/events/outside.js b/script/events/outside.js index aa1b7c7..109eb49 100644 --- a/script/events/outside.js +++ b/script/events/outside.js @@ -211,7 +211,7 @@ Events.Outside = [ { /* Soldier attack */ title: 'A Military Raid', isAvailable: function() { - return Engine.activeModule == Outside && Outside.getPopulation() > 0 && State.cityCleared; + return Engine.activeModule == Outside && Outside.getPopulation() > 0 && $SM.get('game.cityCleared');; }, scenes: { 'start': { diff --git a/script/events/room.js b/script/events/room.js index 246ff06..0350053 100644 --- a/script/events/room.js +++ b/script/events/room.js @@ -397,7 +397,7 @@ Events.Room = [ { /* The Scout -- Map Merchant */ title: 'The Scout', isAvailable: function() { - return Engine.activeModule == Room && typeof State.world == 'object'; + return Engine.activeModule == Room && $SM.get('features.location.world'); }, scenes: { 'start': { @@ -435,7 +435,7 @@ Events.Room = [ { /* The Wandering Master */ title: 'The Master', isAvailable: function() { - return Engine.activeModule == Room && typeof State.world == 'object'; + return Engine.activeModule == Room && $SM.get('features.location.world'); }, scenes: { 'start': { @@ -507,7 +507,7 @@ Events.Room = [ { /* The Sick Man */ title: 'The Sick Man', isAvailable: function() { - return Engine.activeModule == Room && typeof State.world == 'object'; + return Engine.activeModule == Room && $SM.get('features.location.world'); }, scenes: { 'start': { diff --git a/script/events/setpieces.js b/script/events/setpieces.js index 41cff66..9e00e9f 100644 --- a/script/events/setpieces.js +++ b/script/events/setpieces.js @@ -2244,7 +2244,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { bullets: { @@ -2278,7 +2278,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { torch: { @@ -2308,7 +2308,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { rifle: { @@ -2354,7 +2354,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { rifle: { @@ -2389,7 +2389,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { rifle: { @@ -2429,7 +2429,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'laser rifle': { @@ -2464,7 +2464,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'steel sword': { @@ -2499,7 +2499,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'steel sword': { @@ -2534,7 +2534,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'rifle': { @@ -2574,7 +2574,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'energy cell': { @@ -2613,7 +2613,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'energy cell': { @@ -2646,7 +2646,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'energy cell': { @@ -2695,7 +2695,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'steel sword': { @@ -2739,7 +2739,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'energy cell': { @@ -2782,7 +2782,7 @@ Events.Setpieces = { ], onLoad: function() { World.clearDungeon(); - State.cityCleared = true; + $SM.set('game.cityCleared', true); }, loot: { 'alien alloy': { diff --git a/script/outside.js b/script/outside.js index 23daebd..c86c002 100644 --- a/script/outside.js +++ b/script/outside.js @@ -135,12 +135,13 @@ var Outside = { .addClass('location') .appendTo('div#locationSlider'); - if(typeof State.outside == 'undefined') { - State.outside = { + if(typeof $SM.get('features.location.outside') == 'undefined') { + $SM.set('features.location.outside', true); + $SM.setM('game.outside', { buildings: {}, population: 0, workers: {} - } + }); } this.updateVillage(); @@ -159,27 +160,27 @@ var Outside = { }, numBuilding: function(bName) { - return State.outside && - State.outside.buildings && - State.outside.buildings[bName] ? State.outside.buildings[bName] : 0; + return $SM.get('features.location.outside') && + $SM.get('game.outside.buildings') && + $SM.get('game.outside.buildings[\''+bName+'\']', true); }, addBuilding: function(bName, num) { - var cur = State.outside.buildings[bName]; + var cur = $SM.get('game.outside.buildings[\''+bName+'\']'); if(typeof cur != 'number') cur = 0; cur += num; if(cur < 0) cur = 0; - State.outside.buildings[bName] = cur; + $SM.set('game.outside.buildings[\''+bName+'\']', cur); this.updateVillage(); Engine.saveGame(); }, addBuildings: function(list) { for(k in list) { - var num = State.outside.buildings[k]; + var num = $SM.get('game.outside.buildings[\''+k+'\']'); if(typeof num != 'number') num = 0; num += list[k]; - State.outside.buildings[k] = num; + $SM.set('game.outside.buildings[\''+k+'\']', num); } this.updateVillage(); Engine.saveGame(); @@ -190,14 +191,14 @@ var Outside = { }, getPopulation: function() { - if(State.outside && State.outside.population) { - return State.outside.population; + if($SM.get('features.location.outside') && $SM.get('game.outside.population')) { + return $SM.get('game.outside.population'); } return 0; }, increasePopulation: function() { - var space = Outside.getMaxPopulation() - State.outside.population; + var space = Outside.getMaxPopulation() - $SM.get('game.outside.population'); if(space > 0) { var num = Math.floor(Math.random()*(space/2) + space/2); if(num == 0) num = 1; @@ -213,7 +214,7 @@ var Outside = { Notifications.notify(null, "the town's booming. word does get around."); } Engine.log('population increased by ' + num); - State.outside.population += num; + $SM.add('game.outside.population', num); Outside.updateVillage(); Outside.updateWorkersView(); Outside.updateVillageIncome(); @@ -222,20 +223,20 @@ var Outside = { }, killVillagers: function(num) { - State.outside.population -= num; - if(State.outside.population < 0) { - State.outside.population = 0; + $SM.add('game.outside.population', num * -1); + if($SM.get('game.outside.population') < 0) { + $SM.set('game.outside.population', 0); } var remaining = Outside.getNumGatherers(); if(remaining < 0) { var gap = -remaining; - for(var k in State.outside.workers) { - var num = State.outside.workers[k]; + for(var k in $SM.get('game.outside.workers')) { + var num = $SM.get('game.outside.workers[\''+k+'\']'); if(num < gap) { gap -= num; - State.outside.workers[k] = 0; + $SM.set('game.outside.workers[\''+k+'\']', 0); } else { - State.outside.workers[k] -= gap; + $SM.add('game.outside.workers[\''+k+'\']', gap * -1); break; } } @@ -256,7 +257,7 @@ var Outside = { // If our population is 0 and we don't already have a workers view, // there's nothing to do here. - if(!workers.length && State.outside.population == 0) return; + if(!workers.length && $SM.get('game.outside.population') == 0) return; var needsAppend = false; if(workers.length == 0) { @@ -264,13 +265,13 @@ var Outside = { workers = $('
').attr('id', 'workers').css('opacity', 0); } - var numGatherers = State.outside.population; + var numGatherers = $SM.get('game.outside.population'); var gatherer = $('div#workers_row_gatherer', workers); - for(var k in State.outside.workers) { + for(var k in $SM.get('game.outside.workers')) { var row = $('div#workers_row_' + k.replace(' ', '-'), workers); if(row.length == 0) { - row = Outside.makeWorkerRow(k, State.outside.workers[k]); + row = Outside.makeWorkerRow(k, $SM.get('game.outside.workers[\''+k+'\']')); var curPrev = null; workers.children().each(function(i) { @@ -295,10 +296,10 @@ var Outside = { } } else { - $('div#' + row.attr('id') + ' > div.row_val > span', workers).text(State.outside.workers[k]); + $('div#' + row.attr('id') + ' > div.row_val > span', workers).text($SM.get('game.outside.workers[\''+k+'\']')); } - numGatherers -= State.outside.workers[k]; - if(State.outside.workers[k] == 0) { + numGatherers -= $SM.get('game.outside.workers[\''+k+'\']'); + if($SM.get('game.outside.workers[\''+k+'\']') == 0) { $('.dnBtn', row).addClass('disabled'); $('.dnManyBtn', row).addClass('disabled'); } else { @@ -329,9 +330,9 @@ var Outside = { }, getNumGatherers: function() { - var num = State.outside.population; - for(var k in State.outside.workers) { - num -= State.outside.workers[k]; + var num = $SM.get('game.outside.population'); + for(var k in $SM.get('game.outside.workers')) { + num -= $SM.get('game.outside.workers[\''+k+'\']'); } return num; }, @@ -371,7 +372,7 @@ var Outside = { if(Outside.getNumGatherers() > 0) { var increaseAmt = Math.min(Outside.getNumGatherers(), btn.data); Engine.log('increasing ' + worker + ' by ' + increaseAmt); - State.outside.workers[worker] += increaseAmt; + $SM.add('game.outside.workers[\''+worker+'\']', increaseAmt); Outside.updateVillageIncome(); Outside.updateWorkersView(); } @@ -379,10 +380,10 @@ var Outside = { decreaseWorker: function(btn) { var worker = $(this).closest('.workerRow').children('.row_key').text(); - if(State.outside.workers[worker] > 0) { - var decreaseAmt = Math.min(State.outside.workers[worker] || 0, btn.data); + if($SM.get('game.outside.workers[\''+worker+'\']') > 0) { + var decreaseAmt = Math.min($SM.get('game.outside.workers[\''+worker+'\']') || 0, btn.data); Engine.log('decreasing ' + worker + ' by ' + decreaseAmt); - State.outside.workers[worker] -= decreaseAmt; + $SM.add('game.outside.workers[\''+worker+'\']', decreaseAmt * -1); Outside.updateVillageIncome(); Outside.updateWorkersView(); } @@ -428,9 +429,9 @@ var Outside = { population = $('
').attr('id', 'population').appendTo(village); } - for(var k in State.outside.buildings) { + for(var k in $SM.get('game.outside.buildings')) { if(k == 'trap') { - var numTraps = State.outside.buildings[k]; + var numTraps = $SM.get('game.outside.buildings[\''+k+'\']'); var numBait = Engine.getStore('bait'); var traps = numTraps - numBait; traps = traps < 0 ? 0 : traps; @@ -440,11 +441,11 @@ var Outside = { if(Outside.checkWorker(k)) { Outside.updateWorkersView(); } - Outside.updateVillageRow(k, State.outside.buildings[k], village); + Outside.updateVillageRow(k, $SM.get('game.outside.buildings[\''+k+'\']'), village); } } - population.text('pop ' + State.outside.population + '/' + this.getMaxPopulation()); + population.text('pop ' + $SM.get('game.outside.population') + '/' + this.getMaxPopulation()); var hasPeeps; if(Outside.numBuilding('hut') == 0) { @@ -488,10 +489,10 @@ var Outside = { if(typeof jobs == 'object') { for(var i = 0, len = jobs.length; i < len; i++) { var job = jobs[i]; - if(typeof State.outside.buildings[name] == 'number' && - typeof State.outside.workers[job] != 'number') { + if(typeof $SM.get('game.outside.buildings[\''+name+'\']') == 'number' && + typeof $SM.get('game.outside.workers[\''+job+'\']') != 'number') { Engine.log('adding ' + job + ' to the workers list') - State.outside.workers[job] = 0; + $SM.set('game.outside.workers[\''+job+'\']', 0); added = true; } } @@ -502,7 +503,7 @@ var Outside = { updateVillageIncome: function() { for(var worker in Outside._INCOME) { var income = Outside._INCOME[worker]; - var num = worker == 'gatherer' ? Outside.getNumGatherers() : State.outside.workers[worker]; + var num = worker == 'gatherer' ? Outside.getNumGatherers() : $SM.get('game.outside.workers[\''+worker+'\']'); if(typeof num == 'number') { var stores = {}; if(num < 0) num = 0; @@ -575,9 +576,9 @@ var Outside = { onArrival: function(transition_diff) { Outside.setTitle(); - if(!State.seenForest) { + if(!$SM.get('game.outside.seenForest')) { Notifications.notify(Outside, "the sky is grey and the wind blows relentlessly"); - State.seenForest = true; + $SM.set('game.outside.seenForest', true); } Outside.updateTrapButton(); Outside.updateVillage(); diff --git a/script/path.js b/script/path.js index 17abf0b..d880eb2 100644 --- a/script/path.js +++ b/script/path.js @@ -85,17 +85,17 @@ var Path = { }, updatePerks: function() { - if(State.perks) { + if($SM.get('character.perks')) { var perks = $('#perks'); var needsAppend = false; if(perks.length == 0) { needsAppend = true; perks = $('
').attr('id', 'perks'); } - for(var k in State.perks) { + for(var k in $SM.get('character.perks')) { var id = 'perk_' + k.replace(' ', '-'); var r = $('#' + id); - if(State.perks[k] && r.length == 0) { + if($SM.get('character.perks[\''+k+'\']') && r.length == 0) { r = $('
').attr('id', id).addClass('perkRow').appendTo(perks); $('
').addClass('row_key').text(k).appendTo(r); $('
').addClass('tooltip bottom right').text(Engine.Perks[k].desc).appendTo(r); @@ -166,7 +166,7 @@ var Path = { for(var k in carryable) { var store = carryable[k]; - var have = State.stores[k]; + var have = $SM.get('stores[\''+k+'\']'); var num = Path.outfit[k]; num = typeof num == 'number' ? num : 0; var numAvailable = Engine.getStore(k); diff --git a/script/room.js b/script/room.js index aff291d..3131269 100644 --- a/script/room.js +++ b/script/room.js @@ -437,19 +437,20 @@ var Room = { ); if(Engine._debug) { - this._ROOM_WARM_DELAY = 1; - this._BUILDER_STATE_DELAY = 1; + this._ROOM_WARM_DELAY = 5000; + this._BUILDER_STATE_DELAY = 5000; this._STOKE_COOLDOWN = 0; - this._NEED_WOOD_DELAY = 1; + this._NEED_WOOD_DELAY = 5000; } - if(typeof State.room == 'undefined') { - State.room = { + if(typeof $SM.get('features.location.room') == 'undefined') { + $SM.set('features.location.room', true); + $SM.set('game.room', { temperature: this.TempEnum.Cold, fire: this.FireEnum.Dead, buttons: {}, builder: -1 - }; + }); } // Create the room tab @@ -502,16 +503,16 @@ var Room = { * 3 - Sleeping * 4 - Helping */ - if(State.room.builder >= 0 && State.room.builder < 3) { + if($SM.get('game.room.builder') >= 0 && $SM.get('game.room.builder') < 3) { Room._builderTimer = setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } - if(State.room.builder == 1 && Engine.getStore('wood') < 0) { + if($SM.get('game.room.builder') == 1 && Engine.getStore('wood') < 0) { setTimeout(Room.unlockForest, Room._NEED_WOOD_DELAY); } setTimeout(Engine.collectIncome, 1000); - Notifications.notify(Room, "the room is " + State.room.temperature.text); - Notifications.notify(Room, "the fire is " + State.room.fire.text); + Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text')); + Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text')); }, options: {}, // Nothing for now @@ -519,12 +520,12 @@ var Room = { onArrival: function(transition_diff) { Room.setTitle(); if(Room.changed) { - Notifications.notify(Room, "the fire is " + State.room.fire.text); - Notifications.notify(Room, "the room is " + State.room.temperature.text); + Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text')); + Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text')); Room.changed = false; } - if(State.room.builder == 3) { - State.room.builder++; + if($SM.get('game.room.builder') == 3) { + $SM.add('game.room.builder', 1); Engine.setIncome('builder', { delay: 10, stores: {'wood' : 2 } @@ -569,7 +570,7 @@ var Room = { }, setTitle: function() { - var title = State.room.fire.value < 2 ? "A Dark Room" : "A Firelit Room"; + var title = $SM.get('game.room.fire.value') < 2 ? "A Dark Room" : "A Firelit Room"; if(Engine.activeModule == this) { document.title = title; } @@ -579,7 +580,7 @@ var Room = { updateButton: function() { var light = $('#lightButton.button'); var stoke = $('#stokeButton.button'); - if(State.room.fire.value == Room.FireEnum.Dead.value && stoke.css('display') != 'none') { + if($SM.get('game.room.fire.value') == Room.FireEnum.Dead.value && stoke.css('display') != 'none') { stoke.hide(); light.show(); if(stoke.hasClass('disabled')) { @@ -613,7 +614,7 @@ var Room = { } else if(wood > 4) { Engine.setStore('wood', wood - 5); } - State.room.fire = Room.FireEnum.Burning; + $SM.set('game.room.fire', Room.FireEnum.Burning); Room.onFireChange(); }, @@ -627,8 +628,8 @@ var Room = { if(wood > 0) { Engine.setStore('wood', wood - 1); } - if(State.room.fire.value < 4) { - State.room.fire = Room.FireEnum.fromInt(State.room.fire.value + 1); + if($SM.get('game.room.fire.value') < 4) { + $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') + 1)); } Room.onFireChange(); }, @@ -637,9 +638,9 @@ var Room = { if(Engine.activeModule != Room) { Room.changed = true; } - Notifications.notify(Room, "the fire is " + State.room.fire.text, true); - if(State.room.fire.value > 1 && State.room.builder < 0) { - State.room.builder = 0; + Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text'), true); + if($SM.get('game.room.fire.value') > 1 && $SM.get('game.room.builder') < 0) { + $SM.set('game.room.builder', 0); Notifications.notify(Room, "the light from the fire spills from the windows, out into the dark"); setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } @@ -650,30 +651,30 @@ var Room = { }, coolFire: function() { - if(State.room.fire.value <= Room.FireEnum.Flickering.value && - State.room.builder > 3 && Engine.getStore('wood') > 0) { + if($SM.get('game.room.fire.value') <= Room.FireEnum.Flickering.value && + $SM.get('game.room.builder') > 3 && Engine.getStore('wood') > 0) { Notifications.notify(Room, "builder stokes the fire", true); Engine.setStore('wood', Engine.getStore('wood') - 1); - State.room.fire = Room.FireEnum.fromInt(State.room.fire.value + 1); + $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') + 1)); } - if(State.room.fire.value > 0) { - State.room.fire = Room.FireEnum.fromInt(State.room.fire.value - 1); + if($SM.get('game.room.fire.value') > 0) { + $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') - 1)); Room._fireTimer = setTimeout(Room.coolFire, Room._FIRE_COOL_DELAY); Room.onFireChange(); } }, adjustTemp: function() { - var old = State.room.temperature.value; - if(State.room.temperature.value > 0 && State.room.temperature.value > State.room.fire.value) { - State.room.temperature = Room.TempEnum.fromInt(State.room.temperature.value - 1); - Notifications.notify(Room, "the room is " + State.room.temperature.text, true); + var old = $SM.get('game.room.temperature.value'); + if($SM.get('game.room.temperature.value') > 0 && $SM.get('game.room.temperature.value') > $SM.get('game.room.fire.value')) { + $SM.set('game.room.temperature', Room.TempEnum.fromInt($SM.get('game.room.temperature.value') - 1)); + Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text'), true); } - if(State.room.temperature.value < 4 && State.room.temperature.value < State.room.fire.value) { - State.room.temperature = Room.TempEnum.fromInt(State.room.temperature.value + 1); - Notifications.notify(Room, "the room is " + State.room.temperature.text, true); + if($SM.get('game.room.temperature.value') < 4 && $SM.get('game.room.temperature.value') < $SM.get('game.room.fire.value')) { + $SM.set('game.room.temperature', Room.TempEnum.fromInt($SM.get('game.room.temperature.value') + 1)); + Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text'), true); } - if(State.room.temperature.value != old) { + if($SM.get('game.room.temperature.value') != old) { Room.changed = true; } Room._tempTimer = setTimeout(Room.adjustTemp, Room._ROOM_WARM_DELAY); @@ -690,14 +691,14 @@ var Room = { }, updateBuilderState: function() { - if(State.room.builder == 0) { + if($SM.get('game.room.builder') == 0) { Notifications.notify(Room, "a ragged stranger stumbles through the door and collapses in the corner"); - State.room.builder = 1; + $SM.set('game.room.builder', 1); setTimeout(Room.unlockForest, Room._NEED_WOOD_DELAY); } - else if(State.room.builder < 3 && State.room.temperature.value >= Room.TempEnum.Warm.value) { + else if($SM.get('game.room.builder') < 3 && $SM.get('game.room.temperature.value') >= Room.TempEnum.Warm.value) { var msg; - switch(State.room.builder) { + switch($SM.get('game.room.builder')) { case 1: msg = "the stranger shivers, and mumbles quietly. her words are unintelligible."; break; @@ -706,11 +707,11 @@ var Room = { break; } Notifications.notify(Room, msg); - if(State.room.builder < 3) { - State.room.builder++; + if($SM.get('game.room.builder') < 3) { + $SM.add('game.room.builder', 1); } } - if(State.room.builder < 3) { + if($SM.get('game.room.builder') < 3) { setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } Engine.saveGame(); @@ -732,7 +733,7 @@ var Room = { }).css('opacity', 0); wNeedsAppend = true; } - for(var k in State.stores) { + for(var k in $SM.get('stores')) { var type = null; if(Room.Craftables[k]) { @@ -758,17 +759,18 @@ var Room = { var id = "row_" + k.replace(' ', '-'); var row = $('div#' + id, location); - var num = State.stores[k]; + var num = $SM.get('stores[\''+k+'\']'); if(typeof num != 'number' || isNaN(num)) { // No idea how counts get corrupted, but I have reason to believe that they occassionally do. // Build a little fence around it! - num = State.stores[k] = 0; + num = 0; + $SM.set('stores[\''+k+'\']', 0); } // thieves? - if(typeof State.thieves == 'undefined' && num > 5000 && State.world) { + if(typeof $SM.get('game.thieves') == 'undefined' && num > 5000 && $SM.get('features.location.world')) { Engine.startThieves(); } @@ -819,14 +821,14 @@ var Room = { updateIncomeView: function() { var stores = $('div#stores'); - if(stores.length == 0 || typeof State.income == 'undefined') return; + if(stores.length == 0 || typeof $SM.get('income') == 'undefined') return; $('div.storeRow', stores).each(function(index, el) { el = $(el); $('div.tooltip', el).remove(); var tt = $('
').addClass('tooltip bottom right'); var storeName = el.attr('id').substring(4).replace('-', ' '); - for(var incomeSource in State.income) { - var income = State.income[incomeSource]; + for(var incomeSource in $SM.get('income')) { + var income = $SM.get('income[\''+incomeSource+'\']'); for(var store in income.stores) { if(store == storeName && income.stores[store] != 0) { $('
').addClass('row_key').text(incomeSource).appendTo(tt); @@ -878,7 +880,7 @@ var Room = { build: function(buildBtn) { var thing = $(buildBtn).attr('buildThing'); - if(State.room.temperature.value <= Room.TempEnum.Cold.value) { + if($SM.get('game.room.temperature.value') <= Room.TempEnum.Cold.value) { Notifications.notify(Room, "builder just shivers"); return false; } @@ -938,12 +940,12 @@ var Room = { }, craftUnlocked: function(thing) { - if(typeof State.room != 'undefined' && - typeof State.room.buttons != 'undefined' && - State.room.buttons[thing]) { + if(typeof $SM.get('features.location.room') != 'undefined' && + typeof $SM.get('game.room.buttons') != 'undefined' && + $SM.get('game.room.buttons[\''+thing+'\']')) { return true; } - if(State.room.builder < 4) return false; + if($SM.get('game.room.builder') < 4) return false; var craftable = Room.Craftables[thing]; if(Room.needsWorkshop(craftable.type) && Outside.numBuilding('workshop') == 0) return false; var cost = craftable.cost(); @@ -958,15 +960,15 @@ var Room = { } } - State.room.buttons[thing] = true; + $SM.set('game.room.buttons[\''+thing+'\']', true); Notifications.notify(Room, craftable.availableMsg); return true; }, buyUnlocked: function(thing) { - if(typeof State.room != 'undefined' && - typeof State.room.buttons != 'undefined' && - State.room.buttons[thing]) { + if(typeof $SM.get('features.location.room') != 'undefined' && + typeof $SM.get('game.room.buttons') != 'undefined' && + $SM.get('game.room.buttons[\''+thing+'\']')) { return true; } else if(Outside.numBuilding('trading post') > 0) { if(thing == 'compass' || Engine.storeAvailable(thing)) { diff --git a/script/ship.js b/script/ship.js index 0fad202..64dce98 100644 --- a/script/ship.js +++ b/script/ship.js @@ -15,11 +15,12 @@ var Ship = { options ); - if(!State.ship) { - State.ship = { + if(!$SM.get('features.location.spaceShip')) { + $SM.set('features.location.spaceShip', true); + $SM.setM('game.spaceShip', { hull: Ship.BASE_HULL, thrusters: Ship.BASE_THRUSTERS - } + }); } // Create the Ship tab @@ -35,13 +36,13 @@ var Ship = { // Draw the hull label var hullRow = $('
').attr('id', 'hullRow').appendTo('div#shipPanel'); $('
').addClass('row_key').text('hull:').appendTo(hullRow); - $('
').addClass('row_val').text(State.ship.hull).appendTo(hullRow); + $('
').addClass('row_val').text($SM.get('game.spaceShip.hull')).appendTo(hullRow); $('
').addClass('clear').appendTo(hullRow); // Draw the thrusters label var engineRow = $('
').attr('id', 'engineRow').appendTo('div#shipPanel'); $('
').addClass('row_key').text('engine:').appendTo(engineRow); - $('
').addClass('row_val').text(State.ship.thrusters).appendTo(engineRow); + $('
').addClass('row_val').text($SM.get('game.spaceShip.thrusters')).appendTo(engineRow); $('
').addClass('clear').appendTo(engineRow); // Draw the reinforce button @@ -71,7 +72,7 @@ var Ship = { cooldown: Ship.LIFTOFF_COOLDOWN }).appendTo('div#shipPanel'); - if(State.ship.hull <= 0) { + if($SM.get('game.spaceShip.hull') <= 0) { Button.setDisabled(b, true); } @@ -83,9 +84,9 @@ var Ship = { onArrival: function(transition_diff) { Ship.setTitle(); - if(!State.seenShip) { + if(!$SM.get('game.spaceShip.seenShip')) { Notifications.notify(Ship, 'somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.'); - State.seenShip = true; + $SM.set('game.spaceShip.seenShip', true); Engine.saveGame(); } @@ -104,11 +105,11 @@ var Ship = { return false; } Engine.addStore('alien alloy', -Ship.ALLOY_PER_HULL); - State.ship.hull++; - if(State.ship.hull > 0) { + $SM.add('game.spaceShip.hull', 1); + if($SM.get('game.spaceShip.hull') > 0) { Button.setDisabled($('#liftoffButton', Ship.panel), false); } - $('#hullRow .row_val', Ship.panel).text(State.ship.hull); + $('#hullRow .row_val', Ship.panel).text($SM.get('game.spaceShip.hull')); }, upgradeEngine: function() { @@ -117,16 +118,16 @@ var Ship = { return false; } Engine.addStore('alien alloy', -Ship.ALLOY_PER_THRUSTER); - State.ship.thrusters++; - $('#engineRow .row_val', Ship.panel).text(State.ship.thrusters); + $SM.add('game.spaceShip.thrusters', 1) + $('#engineRow .row_val', Ship.panel).text($SM.get('game.spaceShip.thrusters')); }, getMaxHull: function() { - return State.ship.hull; + return $SM.get('game.spaceShip.hull'); }, checkLiftOff: function() { - if(!State.ship.seenWarning) { + if(!$SM.get('game.spaceShip.seenWarning')) { Events.startEvent({ title: 'Ready to Leave?', scenes: { @@ -138,7 +139,7 @@ var Ship = { 'fly': { text: 'lift off', onChoose: function() { - State.ship.seenWarning = true; + $SM.set('game.spaceShip.seenWarning', true); Ship.liftOff(); }, nextScene: 'end' diff --git a/script/space.js b/script/space.js index 488de1c..16b8c64 100644 --- a/script/space.js +++ b/script/space.js @@ -87,7 +87,7 @@ var Space = { }, getSpeed: function() { - return Space.SHIP_SPEED + State.ship.thrusters; + return Space.SHIP_SPEED + $SM.get('game.spaceShip.thrusters'); }, updateHull: function() { diff --git a/script/state_manager.js b/script/state_manager.js new file mode 100644 index 0000000..5615bda --- /dev/null +++ b/script/state_manager.js @@ -0,0 +1,212 @@ +/* + * Module for handling States + * + * All states should be get and set through the StateManager ($SM). + * + * The manager is intended to handle all needed checks and error catching. + * This includes creating the parents of layered/deep states so undefined states + * do not need to be tested for and created beforehand. + * + * When a state is changed, an update event is sent out containing the name of the state + * changed or in the case of multiple changes (.setM, .addM) the parent class changed. + * Event: type: 'stateUpdate', stateName: + * + * Original file created by: Michael Galusha + */ + +var StateManager = { + + MAX_STORE: 99999999999999, + + options: {}, + + init: function(options) { + this.options = $.extend( + this.options, + options + ); + + //create categories + var cats = [ + 'features', //big features like buildings, location availability, unlocks, etc + 'stores', //little stuff, items, weapons, etc + 'character', //this is for player's character stats such as perks + 'income', + 'timers', + 'game', //mostly location related: fire temp, workers, population, world map, etc + 'playStats', //anything play related: play time, loads, etc + ]; + + for(var which in cats) { + if(!$SM.get(cats[which])) $SM.set(cats[which], {}); + }; + }, + + //create the parent of a given state, recursive as needed + createParent: function(stateName) { + var err = 0; + + //parse path to find last child + var lastDot = stateName.lastIndexOf('.'); //if ends with a dot, there is a coding bug, not like ending in a bracket, so don't account for it + if(lastDot == stateName.length) { + Engine.log('ERROR: '+stateName+' is invalid. Cannot end in a dot.'); + return; + } + var lastOB = stateName.lastIndexOf('['); + //make sure last bracket isn't just end of the line + var lastCB = stateName.substr(0, stateName.length -1).lastIndexOf(']'); + //find last child or return if no more children + var cutoff = Math.max(lastDot, lastOB, lastCB); + if(cutoff <= 0) return; + + var parentPath = $SM.buildPath(stateName.substr(0,cutoff)); + + //try creating the parent + try { + eval('('+parentPath+') = {}'); + } catch (e) { + //need to go up another level and make parent of whichParent + $SM.createParent(stateName.substr(0,cutoff)); + //then it will definitely work if not, something is fubar + eval('('+parentPath+') = {}'); + } + }, + + //set single state + //if noEvent is true, the update event won't trigger, useful for setting multiple states first + set: function(stateName, value, noEvent) { + var fullPath = $SM.buildPath(stateName); + + //make sure the value isn't over the engine maximum + if(typeof value == 'number' && value > $SM.MAX_STORE) value = $SM.MAX_STORE; + + try{ + eval('('+fullPath+') = value'); + } catch (e) { + //parent doesn't exist, so make parent + $SM.createParent(stateName); + //now it will definitely work. if not, something is broken + eval('('+fullPath+') = value'); + } + + //stores values can not be negative + if(stateName.indexOf('stores') == 0 && $SM.get(stateName, true) < 0) { + eval('('+fullPath+') = 0');; + Engine.log('WARNING: state:' + stateName + ' can not be a negative value. Set to 0 instead.') + } + + if(!noEvent) { + Engine.saveGame(); + $SM.fireUpdate(stateName); + } + }, + + //sets a list of states + setM: function(parentName, list, noEvent) { + var whichParent = $SM.buildPath(parentName); + + //make sure the state exists to avoid errors, + if($SM.get(parentName) == undefined) $SM.set(parentName, {}, true); + + for(var k in list){ + $SM.set(parentName+'[\''+k+'\']', list[k], true); + } + + if(!noEvent) { + Engine.saveGame(); + $SM.fireUpdate(parentName); + } + }, + + //shortcut for altering number values, return 1 if state wasn't a number + add: function(stateName, value, noEvent) { + var err = 0; + //0 if undefined, null (but not {}) should allow adding to new objects, helps avoid existence checks and NaN for stores + //could also add in a true = 1 thing, to have something go from existing (true) to be a count, but that might be unwanted behavior + var old = $SM.get(stateName, true); + + if(typeof old != 'number' || typeof value != 'number'){ + Engine.log('WARNING: Can not do math with state:'+stateName+' or value:'+value+' because at least one is not a number.'); + err = 1 + } else { + $SM.set(stateName, old + value, noEvent); //setState handles event and save + } + + return err; + }, + + //alters multiple number values, return number of fails + addM: function(parentName, list, noEvent) { + var err = 0; + + //make sure the parent exists to avoid errors + if($SM.get(parentName) == undefined) $SM.set(parentName, {}, true); + + for(var k in list){ + if(!$SM.add(parentName+'[\''+k+'\']', list[k], true)) err++; + } + + if(!noEvent) { + Engine.saveGame(); + $SM.fireUpdate(parentName); + } + return err; + }, + + //return state, undefined or 0 + get: function(stateName, requestZero) { + var whichState = null; + var fullPath = $SM.buildPath(stateName, name); + + //catch errors if parent of state doesn't exist + try{ + eval('whichState = ('+fullPath+')'); + } catch (e) { + whichState = undefined; + } + + //prevents repeated if undefined, null, false or {}, then x = 0 situations + if((!whichState || whichState == {}) && requestZero) return 0; + else return whichState; + }, + + remove: function(stateName) { + var whichState = $SM.buildPath(whichState); + try{ + delete eval(whichState); + } catch (e) { + //it didn't exist in the first place + Engine.log('WARNING: Tried to remove non-existant state \''+stateName+'\'.'); + } + Engine.saveGame(); + $SM.fireUpdate(stateName); + }, + + //creates full reference from input + //hopefully this won't ever need to be more complicated + buildPath: function(input){ + var dot = (input.charAt(0) == '[')? '' : '.'; //if it starts with [foo] no dot to join + 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, + }); + if(save) Engine.saveGame(); + }, + + handleStateUpdates: function(e){ + + }, +}; + +//alias +var $SM = StateManager; + +//listener for StateManager update events +$(StateManager).on('stateUpdate', $SM.handleStateUpdates); \ No newline at end of file diff --git a/script/world.js b/script/world.js index d20f6b6..c608aab 100644 --- a/script/world.js +++ b/script/world.js @@ -128,11 +128,12 @@ var World = { World.LANDMARKS[World.TILE.BATTLEFIELD] = {num: 5, minRadius: 18, maxRadius: World.RADIUS * 1.5, scene: 'battlefield', label: 'A Battlefield'}; World.LANDMARKS[World.TILE.SWAMP] = {num: 1, minRadius: 15, maxRadius: World.RADIUS * 1.5, scene: 'swamp', label: 'A Murky Swamp'}; - if(typeof State.world == 'undefined') { - State.world = { + if(typeof $SM.get('features.location.world') == 'undefined') { + $SM.set('features.location.world', true); + $SM.setM('game.world', { map: World.generateMap(), mask: World.newMask() - }; + }); } // Create the World panel @@ -440,9 +441,9 @@ var World = { Notifications.notify(World, 'starvation sets in') World.starvation = true; } else { - State.starved = State.starved ? State.starved : 0; - State.starved++; - if(State.starved >= 10 && !Engine.hasPerk('slow metabolism')) { + $SM.set('character.starved', $SM.get('character.starved', true)); + $SM.add('character.starved', 1); + if($SM.get('character.starved') >= 10 && !Engine.hasPerk('slow metabolism')) { Engine.addPerk('slow metabolism'); } World.die(); @@ -469,9 +470,9 @@ var World = { Notifications.notify(World, 'the thirst becomes unbearable'); World.thirst = true; } else { - State.dehydrated = State.dehydrated ? State.dehydrated : 0; - State.dehydrated++; - if(State.dehydrated >= 10 && !Engine.hasPerk('desert rat')) { + $SM.set('character.dehydrated', $SM.get('character.dehydrated', true)); + $SM.add('character.dehydrated', 1); + if($SM.get('character.dehydrated') >= 10 && !Engine.hasPerk('desert rat')) { Engine.addPerk('desert rat'); } World.die(); @@ -604,7 +605,7 @@ var World = { applyMap: function() { var x = Math.floor(Math.random() * (World.RADIUS * 2) + 1); var y = Math.floor(Math.random() * (World.RADIUS * 2) + 1); - World.uncoverMap(x, y, 5, State.world.mask); + World.uncoverMap(x, y, 5, $SM.get('game.world.mask')); }, generateMap: function() { @@ -822,7 +823,7 @@ var World = { goHome: function() { // Home safe! Commit the changes. - State.world = World.state; + $SM.setM('game.world', World.state); if(World.state.sulphurmine && Outside.numBuilding('sulphur mine') == 0) { Outside.addBuilding('sulphur mine', 1); Engine.event('progress', 'sulphur mine'); @@ -835,7 +836,7 @@ var World = { Outside.addBuilding('coal mine', 1); Engine.event('progress', 'coal mine'); } - if(World.state.ship && !State.ship) { + if(World.state.ship && !$SM.get('features.location.spaceShip')) { Ship.init(); Engine.event('progress', 'ship'); } @@ -904,7 +905,7 @@ var World = { Notifications.notify(null, 'water replenished'); World.setWater(World.getMaxWater()); // Save progress at outposts - State.world = World.state; + $SM.setM('game.world', World.state); // Mark this outpost as used World.usedOutposts[World.curPos[0] + ',' + World.curPos[1]] = true; }, @@ -912,7 +913,7 @@ var World = { onArrival: function() { Engine.keyLock = false; // Explore in a temporary world-state. We'll commit the changes if you return home safe. - World.state = $.extend(true, {}, State.world); + World.state = $.extend(true, {}, $SM.get('game.world')); World.setWater(World.getMaxWater()); World.setHp(World.getMaxHealth()); World.foodMove = 0; From dee7cbb9b34f7798e6b98658c25e490ffe26a8a6 Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Wed, 24 Jul 2013 17:41:36 -0600 Subject: [PATCH 02/13] refactor Engine.js for use with $SM ====functions removed==== //I just removed these because most were simpler or at least equal as direct $SM get/set/add calls, I realize the store ones are kind of subjective since calls were about equal, but oh well. If someone really feels we need the shortcut/named functions for manipulating stores specifically, it shouldn't be crazy to reimplement in $SM Engine.setStore >> $SM.set Engine.setStores >> $SM.setM Engine.addStore >> $SM.add Engine.addStores >> $SM.addM Engine.getStore >> $SM.get(requestZero = true) Engine.storeAvailable >> $SM.get; Engine.removeIncome >> $SM.remove //updates moved to handler ====functions moved==== //Any moved function I felt was more directly related to States or didn't belong where it was Engine.addPerk > $SM.addPerk //kept function for now because of notify call inside, 'deep' state Engine.hasPerk > $SM.hasPerk //kept function because of 'deep' state name Engine.setIncome > $SM.setIncome //kept because it has internal logic **Engine.getIncome > $SM.getIncome //**easily removable with Outside.updateVillageIncome refactor Engine.openPath > Path.openPath //Since I'm refactoring anyways Engine.addStolen > $SM.addStolen //internal logic Engine.startThieves > $SM.startThieves //not sure $SM is a better place, but Engine should be nice and clean by the end of this, handling only engine mechanics Engine.num > $SM.num //after Outside refacter, this is basically just a fancy $SM.get Engine.upgradeState > $SM.updateOldState ====functions refactored==== $SM.addPerk; //updates moved to event handler, no check/create new perk $SM.hasPerk; //don't need to check exist and ==true $SM.collectIncome //removed changed check, update calls now handled by 'stateUpdate' event listening $SM.addStolen //fix to set stolen items in case a partial steal happens $SM.startThieves //updates in handler $SM.updateOldState //use $SM calls, add placeholder for updating to post $SM state when more finalized ====functions affected (by removed)==== Engine.init (Engine.getStore, Engine.storeAvailable) Engine.collectIncome (Engine.addStores) Engine.num (Engine.getStore) Engine.travelTo (Engine.storeAvailable) Room.init (Engine.getStore) Room.unlockForest (Engine.setStore) Room.lightFire (Engine.setStore, Engine.getStore, Engine.storeAvailable) Room.stokeFire (Engine.setStore, Engine.getStore, Engine.storeAvailable) Room.coolFire (Engine.setStore) Room.buy (Engine.setStores, Engine.addStore, Engine.getStore) Room.build (Engine.setStores, Engine.getStore) Room.craftUnlocked (Engine.getStore, Engine.storeAvailable) Room.buyUnlocked (Engine.storeAvailable) Room.updateButton (Engine.storeAvailable) Outside.gatherWood (Engine.addStores) Outside.checkTraps (Engine.addStores, Engine.getStore) Outside.updateVillage (Engine.getStore) Path.embark (Engine.addStore) Path.getCapacity (Engine.getStore) Path.updateOutfitting (Engine.getStore) Path.createOutfittingRow (Engine.getStore) Path.increaseSupply (Engine.getStore) World.goHome (Engine.addStore) World.updateSupplies (Engine.getStore) World.checkDanger (Engine.getStore) World.getMaxHealth (Engine.getStore) World.getMaxWater (Engine.getStore) Ship.reinforceHull (Engine.addStore, Engine.getStore) Ship.upgradeEngine (Engine.addStore, Engine.getStore) Events.loadScene (Engine.addStores) Events.updateButtons (Engine.getStore) Events.buttonClick (Engine.getStore) Events.Global (Engine.addStores, Engine.removeIncome) Events.Room (Engine.addStore, Engine.addStores, Engine.getStore, Engine.storeAvailable) --- script/engine.js | 234 +++---------------------------------- script/events.js | 48 +++++--- script/events/global.js | 8 +- script/events/room.js | 58 ++++----- script/events/setpieces.js | 2 +- script/outside.js | 27 +++-- script/path.js | 41 ++++--- script/room.js | 72 +++++++----- script/ship.js | 19 ++- script/space.js | 11 +- script/state_manager.js | 141 ++++++++++++++++++++-- script/world.js | 53 +++++---- 12 files changed, 353 insertions(+), 361 deletions(-) diff --git a/script/engine.js b/script/engine.js index ef0d725..bf643c3 100644 --- a/script/engine.js +++ b/script/engine.js @@ -7,6 +7,7 @@ var Engine = { * That would be so elegant and awesome. */ SITE_URL: encodeURIComponent("http://adarkroom.doublespeakgames.com"), + VERSION: 1.2; MAX_STORE: 99999999999999, SAVE_DISPLAY: 30 * 1000, @@ -117,10 +118,10 @@ var Engine = { Events.init(); Room.init(); - if(Engine.storeAvailable('wood')) { + if($SM.get('stores.wood')) { Outside.init(); } - if(Engine.getStore('compass') > 0) { + if($SM.get('stores.compass', true) > 0) { Path.init(); } if($SM.get('features.location.spaceShip')) { @@ -160,41 +161,15 @@ var Engine = { var savedState = JSON.parse(localStorage.gameState); if(savedState) { State = savedState; - Engine.upgradeState(); + $SM.updateOldState(); Engine.log("loaded save!"); } } catch(e) { - State = { - version: 1.2, - }; + $SM.set('verson', Engine.VERSION); Engine.event('progress', 'new game'); } }, - upgradeState: function() { - /* Use this function to make old - * save games compatible with newer versions */ - if(typeof State.version != 'number') { - Engine.log('upgraded save to v1.0'); - State.version = 1.0; - } - if(State.version == 1.0) { - // v1.1 introduced the Lodge, so get rid of lodgeless hunters - delete State.outside.workers.hunter; - delete State.income.hunter; - Engine.log('upgraded save to v1.1'); - State.version = 1.1; - } - if(State.version == 1.1) { - //v1.2 added the Swamp to the map, so add it to already generated maps - if(State.world) { - World.placeLandmark(15, World.RADIUS * 1.5, World.TILE.SWAMP, State.world.map); - } - Engine.log('upgraded save to v1.2'); - State.version = 1.2; - } - }, - event: function(cat, act) { if(typeof ga === 'function') { ga('send', 'event', cat, act); @@ -297,7 +272,7 @@ var Engine = { var diff = Math.abs(panelIndex - currentIndex); slider.animate({left: -(panelIndex * 700) + 'px'}, 300 * diff); - if(Engine.storeAvailable('wood')) { + if($SM.get('stores.wood')) { // FIXME Why does this work if there's an animation queue...? stores.animate({right: -(panelIndex * 700) + 'px'}, 300 * diff); } @@ -321,182 +296,6 @@ var Engine = { Notifications.printQueue(module); } }, - - addPerk: function(name) { - if(!$SM.get('character.perks')) { - $SM.set('character.perks', {}); - } - $SM.set('character.perks[\''+name+'\']', true); - Notifications.notify(null, Engine.Perks[name].notify); - if(Engine.activeModule == Path) { - Path.updatePerks(); - } - }, - - hasPerk: function(name) { - return typeof $SM.get('character.perks') == 'object' && $SM.get('character.perks[\''+name+'\']') == true; - }, - - setStore: function(name, number) { - $SM.set('stores[\''+name+'\']', number); - Room.updateStoresView(); - Room.updateBuildButtons(); - if($SM.get('features.location.outside')) { - Outside.updateVillage(); - } - Engine.saveGame(); - }, - - setStores: function(list) { - for(k in list) { - $SM.set('stores[\''+k+'\']', list[k]); - } - Room.updateStoresView(); - Room.updateBuildButtons(); - if($SM.get('features.location.outside')) { - Outside.updateVillage(); - } - Engine.saveGame(); - }, - - addStore: function(name, number) { - var num = $SM.get('stores[\''+name+'\']'); - if(typeof num != 'number' || isNaN(num) || num < 0) num = 0; - num += number; - if(num > Engine.MAX_STORE) num = Engine.MAX_STORE; - $SM.set('stores[\''+name+'\']', num); - Room.updateStoresView(); - Room.updateBuildButtons(); - Outside.updateVillage(); - if(Engine.activeModule == Path) { - Path.updateOutfitting(); - } - Engine.saveGame(); - }, - - addStores: function(list, ignoreCosts) { - // Make sure any income costs can be paid - if(!ignoreCosts) { - for(k in list) { - var num = $SM.get('stores[\''+k+'\']'); - if(typeof num != 'number' || isNaN(num) || num < 0) num = 0; - if(num + list[k] < 0) { - return false; - } - } - } - - // Actually do the update - for(k in list) { - var num = $SM.get('stores[\''+k+'\']'); - if(typeof num != 'number') num = 0; - num += list[k]; - num = num < 0 ? 0 : num; - num = num > Engine.MAX_STORE ? Engine.MAX_STORE : num; - $SM.set('stores[\''+k+'\']', num); - } - Room.updateStoresView(); - Room.updateBuildButtons(); - Outside.updateVillage(); - if(Engine.activeModule == Path) { - Path.updateOutfitting(); - } - Engine.saveGame(); - return true; - }, - - storeAvailable: function(name) { - return typeof $SM.get('stores[\''+name+'\']') == 'number'; - }, - - getStore: function(name) { - if(typeof $SM.get('stores[\''+name+'\']') == 'undefined') { - return 0; - } - return $SM.get('stores[\''+name+'\']'); - }, - - setIncome: function(source, options) { - var existing = $SM.get('income[\''+source+'\']'); - if(typeof existing != 'undefined') { - options.timeLeft = existing.timeLeft; - } - $SM.set('income[\''+source+'\']', options); - }, - - getIncome: function(source) { - var existing = $SM.get('income[\''+source+'\']'); - if(typeof existing != 'undefined') { - return existing; - } - return {}; - }, - - removeIncome: function(source) { - $SM.remove('income[\''+source+'\']'); - Room.updateIncomeView(); - }, - - collectIncome: function() { - if(typeof $SM.get('income') != 'undefined' && Engine.activeModule != Space) { - var changed = false; - for(var source in $SM.get('income')) { - var income = $SM.get('income[\''+source+'\']'); - if(typeof income.timeLeft != 'number') - { - income.timeLeft = 0; - } - income.timeLeft--; - - if(income.timeLeft <= 0) { - Engine.log('collection income from ' + source); - if(source == 'thieves') { - Engine.addStolen(income.stores); - } - changed = Engine.addStores(income.stores) || changed; - if(typeof income.delay == 'number') { - income.timeLeft = income.delay; - } - } - } - if(changed) { - Room.updateStoresView(); - Room.updateBuildButtons(); - Engine.saveGame(); - if(Events.activeEvent() != null) { - Events.updateButtons(); - } - } - } - Engine._incomeTimeout = setTimeout(Engine.collectIncome, 1000); - }, - - openPath: function() { - Path.init(); - Engine.event('progress', 'path'); - Notifications.notify(Room, 'the compass points ' + World.dir); - }, - - addStolen: function(stores) { - if(!$SM.get('game.stolen')) $SM.set('game.stolen', {}); - for(var k in stores) { - if(!$SM.get('game.stolen[\''+k+'\']')) $SM.set('game.stolen[\''+k+'\']', 0); - $SM.add('game.stolen[\''+k+'\']', stores[k] * -1); - } - }, - - startThieves: function() { - $SM.set('game.thieves', 1); - Engine.setIncome('thieves', { - delay: 10, - stores: { - 'wood': -10, - 'fur': -5, - 'meat': -5 - } - }); - Room.updateIncomeView(); - }, // Move the stores panel beneath top_container (or to top: 0px if top_container // either hasn't been filled in or is null) using transition_diff to sync with @@ -521,18 +320,6 @@ var Engine = { } }, - num: function(name, craftable) { - switch(craftable.type) { - case 'good': - case 'tool': - case 'weapon': - case 'upgrade': - return Engine.getStore(name); - case 'building': - return Outside.numBuilding(name); - } - }, - log: function(msg) { if(this._log) { console.log(msg); @@ -593,9 +380,16 @@ var Engine = { if(Engine.activeModule.swipeDown) { Engine.activeModule.swipeDown(e); } - } + }, + + handleStateUpdates: function(e){ + + }, }; +//listener for StateManager update events +$(Engine).on('stateUpdate', Engine.handleStateUpdates); + $(function() { Engine.init(); }); \ No newline at end of file diff --git a/script/events.js b/script/events.js index 1148c2e..e76af55 100644 --- a/script/events.js +++ b/script/events.js @@ -41,7 +41,7 @@ var Events = { // Scene reward if(scene.reward) { - Engine.addStores(scene.reward, true); + $SM.addM('stores', scene.reward); } // onLoad @@ -157,7 +157,7 @@ var Events = { var weapon = World.Weapons[weaponName]; var cd = weapon.cooldown; if(weapon.type == 'unarmed') { - if(Engine.hasPerk('unarmed master')) { + if($SM.hasPerk('unarmed master')) { cd /= 2; } } @@ -245,12 +245,12 @@ var Events = { if(weapon.type == 'unarmed') { if(!$SM.get('character.punches')) $SM.set('character.punches', 0); $SM.add('character.punches', 1); - if($SM.get('character.punches') == 50 && !Engine.hasPerk('boxer')) { - Engine.addPerk('boxer'); - } else if($SM.get('character.punches') == 150 && !Engine.hasPerk('martial artist')) { - Engine.addPerk('martial artist'); - } else if($SM.get('character.punches') == 300 && !Engine.hasPerk('unarmed master')) { - Engine.addPerk('unarmed master'); + if($SM.get('character.punches') == 50 && !$SM.hasPerk('boxer')) { + $SM.addPerk('boxer'); + } else if($SM.get('character.punches') == 150 && !$SM.hasPerk('martial artist')) { + $SM.addPerk('martial artist'); + } else if($SM.get('character.punches') == 300 && !$SM.hasPerk('unarmed master')) { + $SM.addPerk('unarmed master'); } } @@ -294,16 +294,16 @@ var Events = { if(Math.random() <= World.getHitChance()) { dmg = weapon.damage; if(typeof dmg == 'number') { - if(weapon.type == 'unarmed' && Engine.hasPerk('boxer')) { + if(weapon.type == 'unarmed' && $SM.hasPerk('boxer')) { dmg *= 2 } - if(weapon.type == 'unarmed' && Engine.hasPerk('martial artist')) { + if(weapon.type == 'unarmed' && $SM.hasPerk('martial artist')) { dmg *= 3; } - if(weapon.type == 'unarmed' && Engine.hasPerk('unarmed master')) { + if(weapon.type == 'unarmed' && $SM.hasPerk('unarmed master')) { dmg *= 2; } - if(weapon.type == 'melee' && Engine.hasPerk('barbarian')) { + if(weapon.type == 'melee' && $SM.hasPerk('barbarian')) { dmg = Math.floor(dmg * 1.5); } } @@ -417,7 +417,7 @@ var Events = { if(!$('#enemy').data('stunned')) { var toHit = scene.hit; - toHit *= Engine.hasPerk('evasive') ? 0.8 : 1; + toHit *= $SM.hasPerk('evasive') ? 0.8 : 1; var dmg = -1; if(Math.random() <= toHit) { dmg = scene.damage; @@ -646,7 +646,7 @@ var Events = { } else if(b.cost) { var disabled = false; for(var store in b.cost) { - var num = Engine.activeModule == World ? Path.outfit[store] : Engine.getStore(store); + var num = Engine.activeModule == World ? Path.outfit[store] : $SM.get('stores[\''+store+'\']', true); if(typeof num != 'number') num = 0; if(num < b.cost[store]) { // Too expensive @@ -665,7 +665,7 @@ var Events = { var costMod = {}; if(info.cost) { for(var store in info.cost) { - var num = Engine.activeModule == World ? Path.outfit[store] : Engine.getStore(store); + var num = Engine.activeModule == World ? Path.outfit[store] : $SM.get('stores[\''+store+'\']', true); if(typeof num != 'number') num = 0; if(num < info.cost[store]) { // Too expensive @@ -679,7 +679,7 @@ var Events = { } World.updateSupplies(); } else { - Engine.addStores(costMod); + $SM.addM('stores', costMod); } } @@ -689,7 +689,7 @@ var Events = { // Reward if(info.reward) { - Engine.addStores(info.reward); + $SM.addM('stores', info.reward); } Events.updateButtons(); @@ -803,5 +803,15 @@ var Events = { // Force refocus on the body. I hate you, IE. $('body').focus(); }); - } -}; \ No newline at end of file + }, + + handleStateUpdates: function(e){ + //updates to run on stores changes if an event is active + if(e.stateName.indexOf('stores') == 0 && Events.activeEvent() != null){ + Events.updateButtons(); + } + }, +}; + +//listener for StateManager update events +$(Events).on('stateUpdate', Events.handleStateUpdates); \ No newline at end of file diff --git a/script/events/global.js b/script/events/global.js index 7c623b0..85ca99a 100644 --- a/script/events/global.js +++ b/script/events/global.js @@ -33,8 +33,8 @@ Events.Global = [ ], onLoad: function() { $SM.set('game.thieves', 2); - Engine.removeIncome('thieves'); - Engine.addStores($SM.get('game.stolen')); + $SM.remove('income.thieves'); + $SM.addM('stores', $SM.get('game.stolen')); }, buttons: { 'leave': { @@ -50,8 +50,8 @@ Events.Global = [ ], onLoad: function() { $SM.set('game.thieves', 2); - Engine.removeIncome('thieves'); - Engine.addPerk('stealthy'); + $SM.remove('income.thieves'); + $SM.addPerk('stealthy'); }, buttons: { 'leave': { diff --git a/script/events/room.js b/script/events/room.js index 0350053..5d1742b 100644 --- a/script/events/room.js +++ b/script/events/room.js @@ -5,7 +5,7 @@ Events.Room = [ { /* The Nomad -- Merchant */ title: 'The Nomad', isAvailable: function() { - return Engine.activeModule == Room && Engine.getStore('fur') > 0; + return Engine.activeModule == Room && $SM.get('stores.fur', true) > 0; }, scenes: { 'start': { @@ -33,13 +33,13 @@ Events.Room = [ }, 'buyCompass': { available: function() { - return Engine.getStore('compass') < 1; + return $SM.get('stores.compass', true) < 1; }, text: 'buy compass', cost: { fur: 300, scales: 15, teeth: 5 }, reward: { 'compass': 1 }, notification: 'the old compass is dented and dusty, but it looks to work.', - onChoose: Engine.openPath + onChoose: Path.openPath }, 'goodbye': { text: 'say goodbye', @@ -51,7 +51,7 @@ Events.Room = [ }, { /* Noises Outside -- gain wood/fur */ title: 'Noises', isAvailable: function() { - return Engine.activeModule == Room && Engine.storeAvailable('wood'); + return Engine.activeModule == Room && $SM.get('stores.wood'); }, scenes: { 'start': { @@ -101,7 +101,7 @@ Events.Room = [ { /* Noises Inside -- trade wood for better good */ title: 'Noises', isAvailable: function() { - return Engine.activeModule == Room && Engine.storeAvailable('wood'); + return Engine.activeModule == Room && $SM.get('stores.wood'); }, scenes: { start: { @@ -127,12 +127,12 @@ Events.Room = [ 'the ground is littered with small scales' ], onLoad: function() { - var numWood = Engine.getStore('wood'); + var numWood = $SM.get('stores.wood', true); numWood = Math.floor(numWood * 0.1); if(numWood == 0) numWood = 1; var numScales = Math.floor(numWood / 5); if(numScales == 0) numScales = 1; - Engine.addStores({wood: -numWood, scales: numScales}); + $SM.addM('stores', {'wood': -numWood, 'scales': numScales}); }, buttons: { 'leave': { @@ -147,12 +147,12 @@ Events.Room = [ 'the ground is littered with small teeth' ], onLoad: function() { - var numWood = Engine.getStore('wood'); + var numWood = $SM.get('stores.wood', true); numWood = Math.floor(numWood * 0.1); if(numWood == 0) numWood = 1; var numTeeth = Math.floor(numWood / 5); if(numTeeth == 0) numTeeth = 1; - Engine.addStores({wood: -numWood, teeth: numTeeth}); + $SM.addM('stores', {'wood': -numWood, 'teeth': numTeeth}); }, buttons: { 'leave': { @@ -167,12 +167,12 @@ Events.Room = [ 'the ground is littered with scraps of cloth' ], onLoad: function() { - var numWood = Engine.getStore('wood'); + var numWood = $SM.get('stores.wood', true); numWood = Math.floor(numWood * 0.1); if(numWood == 0) numWood = 1; var numCloth = Math.floor(numWood / 5); if(numCloth == 0) numCloth = 1; - Engine.addStores({wood: -numWood, cloth: numCloth}); + $SM.addM('stores', {'wood': -numWood, 'cloth': numCloth}); }, buttons: { 'leave': { @@ -186,7 +186,7 @@ Events.Room = [ { /* The Beggar -- trade fur for better good */ title: 'The Beggar', isAvailable: function() { - return Engine.activeModule == Room && Engine.storeAvailable('fur'); + return Engine.activeModule == Room && $SM.get('stores.fur'); }, scenes: { start: { @@ -257,7 +257,7 @@ Events.Room = [ { /* Mysterious Wanderer -- wood gambling */ title: 'The Mysterious Wanderer', isAvailable: function() { - return Engine.activeModule == Room && Engine.storeAvailable('wood'); + return Engine.activeModule == Room && $SM.get('stores.wood'); }, scenes: { start: { @@ -290,7 +290,7 @@ Events.Room = [ onLoad: function() { if(Math.random() < 0.5) { setTimeout(function() { - Engine.addStore('wood', 300); + $SM.add('stores.wood', 300); Notifications.notify(Room, 'the mysterious wanderer returns, cart piled high with wood.'); }, 60 * 1000); } @@ -309,7 +309,7 @@ Events.Room = [ onLoad: function() { if(Math.random() < 0.3) { setTimeout(function() { - Engine.addStore('wood', 1500); + $SM.add('stores.wood', 1500); Notifications.notify(Room, 'the mysterious wanderer returns, cart piled high with wood.'); }, 60 * 1000); } @@ -327,7 +327,7 @@ Events.Room = [ { /* Mysterious Wanderer -- fur gambling */ title: 'The Mysterious Wanderer', isAvailable: function() { - return Engine.activeModule == Room && Engine.storeAvailable('fur'); + return Engine.activeModule == Room && $SM.get('stores.fur'); }, scenes: { start: { @@ -360,7 +360,7 @@ Events.Room = [ onLoad: function() { if(Math.random() < 0.5) { setTimeout(function() { - Engine.addStore('fur', 300); + $SM.add('stores.fur', 300); Notifications.notify(Room, 'the mysterious wanderer returns, cart piled high with furs.'); }, 60 * 1000); } @@ -379,7 +379,7 @@ Events.Room = [ onLoad: function() { if(Math.random() < 0.3) { setTimeout(function() { - Engine.addStore('fur', 1500); + $SM.add('stores.fur', 1500); Notifications.notify(Room, 'the mysterious wanderer returns, cart piled high with furs.'); }, 60 * 1000); } @@ -417,10 +417,10 @@ Events.Room = [ text: 'learn scouting', cost: { 'fur': 1000, 'scales': 50, 'teeth': 20 }, available: function() { - return !Engine.hasPerk('scout'); + return !$SM.hasPerk('scout'); }, onChoose: function() { - Engine.addPerk('scout'); + $SM.addPerk('scout'); } }, 'leave': { @@ -468,30 +468,30 @@ Events.Room = [ 'evasion': { text: 'evasion', available: function() { - return !Engine.hasPerk('evasive'); + return !$SM.hasPerk('evasive'); }, onChoose: function() { - Engine.addPerk('evasive'); + $SM.addPerk('evasive'); }, nextScene: 'end' }, 'precision': { text: 'precision', available: function() { - return !Engine.hasPerk('precise'); + return !$SM.hasPerk('precise'); }, onChoose: function() { - Engine.addPerk('precise'); + $SM.addPerk('precise'); }, nextScene: 'end' }, 'force': { text: 'force', available: function() { - return !Engine.hasPerk('barbarian'); + return !$SM.hasPerk('barbarian'); }, onChoose: function() { - Engine.addPerk('barbarian'); + $SM.addPerk('barbarian'); }, nextScene: 'end' }, @@ -536,7 +536,7 @@ Events.Room = [ 'some weird metal he picked up on his travels.' ], onLoad: function() { - Engine.addStore('alien alloy', 1); + $SM.add('stores[\'alien alloy\']', 1); }, buttons: { 'bye': { @@ -552,7 +552,7 @@ Events.Room = [ 'some weird glowing boxes he picked up on his travels.' ], onLoad: function() { - Engine.addStore('energy cell', 3); + $SM.add('stores[\'energy cell\']', 3); }, buttons: { 'bye': { @@ -568,7 +568,7 @@ Events.Room = [ 'all he has are some scales.' ], onLoad: function() { - Engine.addStore('scales', 5); + $SM.add('stores.scales', 5); }, buttons: { 'bye': { diff --git a/script/events/setpieces.js b/script/events/setpieces.js index 9e00e9f..1eaa283 100644 --- a/script/events/setpieces.js +++ b/script/events/setpieces.js @@ -74,7 +74,7 @@ Events.Setpieces = { 'his time here, now, is his penance.' ], onLoad: function() { - Engine.addPerk('gastronome'); + $SM.addPerk('gastronome'); World.markVisited(World.curPos[0], World.curPos[1]); }, buttons: { diff --git a/script/outside.js b/script/outside.js index c86c002..bee2027 100644 --- a/script/outside.js +++ b/script/outside.js @@ -432,7 +432,7 @@ var Outside = { for(var k in $SM.get('game.outside.buildings')) { if(k == 'trap') { var numTraps = $SM.get('game.outside.buildings[\''+k+'\']'); - var numBait = Engine.getStore('bait'); + var numBait = $SM.get('stores.bait', true); var traps = numTraps - numBait; traps = traps < 0 ? 0 : traps; Outside.updateVillageRow(k, traps, village); @@ -510,7 +510,7 @@ var Outside = { var tooltip = $('.tooltip', 'div#workers_row_' + worker.replace(' ', '-')); tooltip.empty(); var needsUpdate = false; - var curIncome = Engine.getIncome(worker); + var curIncome = $SM.getIncome(worker); for(var store in income.stores) { stores[store] = income.stores[store] * num; if(curIncome[store] != stores[store]) needsUpdate = true; @@ -520,7 +520,7 @@ var Outside = { row.appendTo(tooltip); } if(needsUpdate) { - Engine.setIncome(worker, { + $SM.setIncome(worker, { delay: income.delay, stores: stores }); @@ -588,14 +588,15 @@ var Outside = { gatherWood: function() { Notifications.notify(Outside, "dry brush and dead branches litter the forest floor") - Engine.setStore('wood', Engine.getStore('wood') + (Outside.numBuilding('cart') > 0 ? 50 : 10)); + var gatherAmt = Outside.numBuilding('cart') > 0 ? 50 : 10; + $SM.add('stores.wood', gatherAmt); }, checkTraps: function() { var drops = {}; var msg = []; var numTraps = Outside.numBuilding('trap'); - var numBait = Engine.getStore('bait'); + var numBait = $SM.get('stores.bait', true); var numDrops = numTraps + (numBait < numTraps ? numBait : numTraps); for(var i = 0; i < numDrops; i++) { var roll = Math.random(); @@ -626,6 +627,16 @@ var Outside = { drops['bait'] = -baitUsed; Notifications.notify(Outside, s); - Engine.addStores(drops); - } -} \ No newline at end of file + $SM.addM('stores', drops); + }, + + handleStateUpdates: function(e){ + //updates to run on stores changes + if(e.stateName.indexOf('stores') == 0){ + Outside.updateVillage(); + } + }, +}; + +//listener for StateManager update events +$(Outside).on('stateUpdate', Outside.handleStateUpdates); \ No newline at end of file diff --git a/script/path.js b/script/path.js index d880eb2..8153e64 100644 --- a/script/path.js +++ b/script/path.js @@ -51,6 +51,12 @@ var Path = { Engine.updateSlider(); }, + openPath: function() { + Path.init(); + Engine.event('progress', 'path'); + Notifications.notify(Room, 'the compass points ' + World.dir); + }, + getWeight: function(thing) { var w = Path.Weight[thing]; if(typeof w != 'number') w = 1; @@ -59,11 +65,11 @@ var Path = { }, getCapacity: function() { - if(Engine.getStore('convoy') > 0) { + if($SM.get('stores.convoy', true) > 0) { return Path.DEFAULT_BAG_SPACE + 60; - } else if(Engine.getStore('wagon') > 0) { + } else if($SM.get('stores.wagon', true) > 0) { return Path.DEFAULT_BAG_SPACE + 30; - } else if(Engine.getStore('rucksack') > 0) { + } else if($SM.get('stores.rucksack', true) > 0) { return Path.DEFAULT_BAG_SPACE + 10; } return Path.DEFAULT_BAG_SPACE; @@ -121,11 +127,11 @@ var Path = { // Add the armour row var armour = "none"; - if(Engine.getStore('s armour') > 0) + if($SM.get('stores[\'s armour\']', true) > 0) armour = "steel"; - else if(Engine.getStore('i armour') > 0) + else if($SM.get('stores[\'i armour\']', true) > 0) armour = "iron"; - else if(Engine.getStore('l armour') > 0) + else if($SM.get('stores[\'l armour']', true) > 0) armour = "leather"; var aRow = $('#armourRow'); if(aRow.length == 0) { @@ -169,7 +175,7 @@ var Path = { var have = $SM.get('stores[\''+k+'\']'); var num = Path.outfit[k]; num = typeof num == 'number' ? num : 0; - var numAvailable = Engine.getStore(k); + var numAvailable = $SM.get('stores[\''+k+'\']', true); var row = $('div#outfit_row_' + k.replace(' ', '-'), outfit); if((store.type == 'tool' || store.type == 'weapon') && have > 0) { total += num * Path.getWeight(k); @@ -238,7 +244,7 @@ var Path = { $('
').addClass('dnManyBtn').appendTo(val).click([10], Path.decreaseSupply); $('
').addClass('clear').appendTo(row); - var numAvailable = Engine.getStore(name); + var numAvailable = $SM.get('stores[\''+name+'\']', true); var tt = $('
').addClass('tooltip bottom right').appendTo(row); $('
').addClass('row_key').text('weight').appendTo(tt); $('
').addClass('row_val').text(Path.getWeight(name)).appendTo(tt); @@ -253,9 +259,9 @@ var Path = { Engine.log('increasing ' + supply + ' by up to ' + btn.data); var cur = Path.outfit[supply]; cur = typeof cur == 'number' ? cur : 0; - if(Path.getFreeSpace() >= Path.getWeight(supply) && cur < Engine.getStore(supply)) { + if(Path.getFreeSpace() >= Path.getWeight(supply) && cur < $SM.get('stores[\''+supply+'\']', true)) { var maxExtraByWeight = Math.floor(Path.getFreeSpace() / Path.getWeight(supply)); - var maxExtraByStore = Engine.getStore(supply) - cur; + var maxExtraByStore = $SM.get('stores[\''+supply+'\']', true) - cur; var maxExtraByBtn = btn.data; Path.outfit[supply] = cur + Math.min(maxExtraByBtn, Math.min(maxExtraByWeight, maxExtraByStore)); Path.updateOutfitting(); @@ -287,10 +293,19 @@ var Path = { embark: function() { for(var k in Path.outfit) { - Engine.addStore(k, -Path.outfit[k]); + $SM.add('stores[\''+k+'\']', -Path.outfit[k]); } World.onArrival(); $('#outerSlider').animate({left: '-700px'}, 300); Engine.activeModule = World; - } -} \ No newline at end of file + }, + + handleStateUpdates: function(e){ + if(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 diff --git a/script/room.js b/script/room.js index 3131269..cb89384 100644 --- a/script/room.js +++ b/script/room.js @@ -506,10 +506,10 @@ var Room = { if($SM.get('game.room.builder') >= 0 && $SM.get('game.room.builder') < 3) { Room._builderTimer = setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } - if($SM.get('game.room.builder') == 1 && Engine.getStore('wood') < 0) { + if($SM.get('game.room.builder') == 1 && $SM.get('stores.wood', true) < 0) { setTimeout(Room.unlockForest, Room._NEED_WOOD_DELAY); } - setTimeout(Engine.collectIncome, 1000); + setTimeout($SM.collectIncome, 1000); Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text')); Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text')); @@ -526,7 +526,7 @@ var Room = { } if($SM.get('game.room.builder') == 3) { $SM.add('game.room.builder', 1); - Engine.setIncome('builder', { + $SM.setIncome('builder', { delay: 10, stores: {'wood' : 2 } }); @@ -594,7 +594,7 @@ var Room = { } } - if(!Engine.storeAvailable('wood')) { + if(!$SM.get('stores.wood')) { light.addClass('free'); stoke.addClass('free'); } else { @@ -606,27 +606,27 @@ var Room = { _fireTimer: null, _tempTimer: null, lightFire: function() { - var wood = Engine.getStore('wood'); - if(Engine.storeAvailable('wood') && wood < 5) { + var wood = $SM.get('stores.wood', true); + if(wood < 5) { Notifications.notify(Room, "not enough wood to get the fire going"); Button.clearCooldown($('#lightButton.button')); return; } else if(wood > 4) { - Engine.setStore('wood', wood - 5); + $SM.set('stores.wood', wood - 5); } $SM.set('game.room.fire', Room.FireEnum.Burning); Room.onFireChange(); }, stokeFire: function() { - var wood = Engine.getStore('wood'); - if(Engine.storeAvailable('wood') && wood == 0) { + var wood = $SM.get('stores.wood', true); + if(wood === 0) { Notifications.notify(Room, "the wood has run out"); Button.clearCooldown($('#stokeButton.button')); return; } if(wood > 0) { - Engine.setStore('wood', wood - 1); + $SM.set('stores.wood', wood - 1); } if($SM.get('game.room.fire.value') < 4) { $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') + 1)); @@ -651,10 +651,11 @@ var Room = { }, coolFire: function() { + var wood = $SM.get('stores.wood'); if($SM.get('game.room.fire.value') <= Room.FireEnum.Flickering.value && - $SM.get('game.room.builder') > 3 && Engine.getStore('wood') > 0) { + $SM.get('game.room.builder') > 3 && wood > 0) { Notifications.notify(Room, "builder stokes the fire", true); - Engine.setStore('wood', Engine.getStore('wood') - 1); + $SM.set('stores.wood', wood - 1); $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') + 1)); } if($SM.get('game.room.fire.value') > 0) { @@ -681,7 +682,7 @@ var Room = { }, unlockForest: function() { - Engine.setStore('wood', 4); + $SM.set('stores.wood', 4); Room.updateButton(); Outside.init(); Room.updateStoresView(); @@ -848,7 +849,7 @@ var Room = { buy: function(buyBtn) { var thing = $(buyBtn).attr('buildThing'); var good = Room.TradeGoods[thing]; - var numThings = Engine.getStore(thing); + var numThings = $SM.get('stores[\''+thing+'\']', true); if(numThings < 0) numThings = 0; if(good.maximum <= numThings) { return; @@ -857,7 +858,7 @@ var Room = { var storeMod = {}; var cost = good.cost(); for(var k in cost) { - var have = Engine.getStore(k) + var have = $SM.get('stores[\''+k+'\']', true); if(have < cost[k]) { Notifications.notify(Room, "not enough " + k); return false; @@ -865,16 +866,16 @@ var Room = { storeMod[k] = have - cost[k]; } } - Engine.setStores(storeMod); + $SM.setM('stores', storeMod); Notifications.notify(Room, good.buildMsg); - Engine.addStore(thing, 1); + $SM.add('stores[\''+thing+'\']', 1); Room.updateBuildButtons(); if(thing == 'compass') { - Engine.openPath(); + Path.openPath(); } }, @@ -892,7 +893,7 @@ var Room = { case 'weapon': case 'tool': case 'upgrade': - numThings = Engine.getStore(thing); + numThings = $SM.get('stores[\''+thing+'\']', true); break; case 'building': numThings = Outside.numBuilding(thing); @@ -907,7 +908,7 @@ var Room = { var storeMod = {}; var cost = craftable.cost(); for(var k in cost) { - var have = Engine.getStore(k) + var have = $SM.get('stores[\''+k+'\']', true); if(have < cost[k]) { Notifications.notify(Room, "not enough " + k); return false; @@ -915,7 +916,7 @@ var Room = { storeMod[k] = have - cost[k]; } } - Engine.setStores(storeMod); + $SM.setM('stores', storeMod); Notifications.notify(Room, craftable.buildMsg); @@ -924,7 +925,7 @@ var Room = { case 'weapon': case 'upgrade': case 'tool': - Engine.addStore(thing, 1); + $SM.add('stores[\''+thing+'\']', 1); break; case 'building': Outside.addBuilding(thing, 1); @@ -951,11 +952,11 @@ var Room = { var cost = craftable.cost(); // Show buttons if we have at least 1/2 the wood, and all other components have been seen. - if(Engine.getStore('wood') < cost['wood'] * 0.5) { + if($SM.get('stores.wood', true) < cost['wood'] * 0.5) { return false; } for(var c in cost) { - if(!Engine.storeAvailable(c)) { + if(!$SM.get('stores[\''+c'\']')) { return false; } } @@ -971,7 +972,7 @@ var Room = { $SM.get('game.room.buttons[\''+thing+'\']')) { return true; } else if(Outside.numBuilding('trading post') > 0) { - if(thing == 'compass' || Engine.storeAvailable(thing)) { + if(thing == 'compass' || $SM.get('stores[\''+thing+'\']')) { // Allow the purchase of stuff once you've seen it return true; } @@ -1003,7 +1004,7 @@ var Room = { for(var k in Room.Craftables) { craftable = Room.Craftables[k]; - var max = Engine.num(k, craftable) + 1 > craftable.maximum; + var max = $SM.num(k, craftable) + 1 > craftable.maximum; if(craftable.button == null) { if(Room.craftUnlocked(k)) { var loc = Room.needsWorkshop(craftable.type) ? craftSection : buildSection; @@ -1038,7 +1039,7 @@ var Room = { for(var k in Room.TradeGoods) { good = Room.TradeGoods[k]; - var max = Engine.num(k, good) + 1 > good.maximum; + var max = $SM.num(k, good) + 1 > good.maximum; if(good.button == null) { if(Room.buyUnlocked(k)) { good.button = new Button.Button({ @@ -1078,5 +1079,18 @@ var Room = { if(bNeedsAppend && buildSection.children().length > 0) { buySection.appendTo('div#roomPanel').animate({opacity: 1}, 300, 'linear'); } - } -}; \ No newline at end of file + }, + + handleStateUpdates: function(e){ + //updates to run on stores changes + if(e.stateName.indexOf('stores') == 0){ + Room.updateStoresView(); + Room.updateBuildButtons(); + } else if(e.stateName.indexOf('income') == 0){ + Room.updateIncomeView(); + }; + }, +}; + +//listener for StateManager update events +$(Room).on('stateUpdate', Room.handleStateUpdates); \ No newline at end of file diff --git a/script/ship.js b/script/ship.js index 64dce98..202dde7 100644 --- a/script/ship.js +++ b/script/ship.js @@ -100,11 +100,11 @@ var Ship = { }, reinforceHull: function() { - if(Engine.getStore('alien alloy') < Ship.ALLOY_PER_HULL) { + if($SM.get('stores[\'alien alloy\']', true) < Ship.ALLOY_PER_HULL) { Notifications.notify(Ship, "not enough alien alloy"); return false; } - Engine.addStore('alien alloy', -Ship.ALLOY_PER_HULL); + $SM.add('stores[\'alien alloy\']', -Ship.ALLOY_PER_HULL); $SM.add('game.spaceShip.hull', 1); if($SM.get('game.spaceShip.hull') > 0) { Button.setDisabled($('#liftoffButton', Ship.panel), false); @@ -113,11 +113,11 @@ var Ship = { }, upgradeEngine: function() { - if(Engine.getStore('alien alloy') < Ship.ALLOY_PER_THRUSTER) { + if($SM.get('stores[\'alien alloy\']', true) < Ship.ALLOY_PER_THRUSTER) { Notifications.notify(Ship, "not enough alien alloy"); return false; } - Engine.addStore('alien alloy', -Ship.ALLOY_PER_THRUSTER); + $SM.add('stores[\'alien alloy\']', -Ship.ALLOY_PER_THRUSTER); $SM.add('game.spaceShip.thrusters', 1) $('#engineRow .row_val', Ship.panel).text($SM.get('game.spaceShip.thrusters')); }, @@ -164,5 +164,12 @@ var Ship = { $('#outerSlider').animate({top: '700px'}, 300); Space.onArrival(); Engine.activeModule = Space; - } -}; \ No newline at end of file + }, + + handleStateUpdates: function(e){ + + }, +}; + +//listener for StateManager update events +$(Ship).on('stateUpdate', Ship.handleStateUpdates); \ No newline at end of file diff --git a/script/space.js b/script/space.js index 16b8c64..9752340 100644 --- a/script/space.js +++ b/script/space.js @@ -445,5 +445,12 @@ var Space = { Engine.log('right off'); break; } - } -}; \ No newline at end of file + }, + + handleStateUpdates: function(e){ + + }, +}; + +//listener for StateManager update events +$(Space).on('stateUpdate', Space.handleStateUpdates); \ No newline at end of file diff --git a/script/state_manager.js b/script/state_manager.js index 5615bda..25c4b7d 100644 --- a/script/state_manager.js +++ b/script/state_manager.js @@ -55,6 +55,9 @@ var StateManager = { var lastOB = stateName.lastIndexOf('['); //make sure last bracket isn't just end of the line var lastCB = stateName.substr(0, stateName.length -1).lastIndexOf(']'); + //account for state[foo][bar] double bracket and state[foo].bar + if(lastCB == lastOB - 1) lastOB = -1; + if(lastCB == lastDot -1) lastDot = -1; //find last child or return if no more children var cutoff = Math.max(lastDot, lastOB, lastCB); if(cutoff <= 0) return; @@ -65,7 +68,7 @@ var StateManager = { try { eval('('+parentPath+') = {}'); } catch (e) { - //need to go up another level and make parent of whichParent + //need to go up another level and make parent of parent $SM.createParent(stateName.substr(0,cutoff)); //then it will definitely work if not, something is fubar eval('('+parentPath+') = {}'); @@ -121,11 +124,17 @@ var StateManager = { //shortcut for altering number values, return 1 if state wasn't a number add: function(stateName, value, noEvent) { var err = 0; - //0 if undefined, null (but not {}) should allow adding to new objects, helps avoid existence checks and NaN for stores - //could also add in a true = 1 thing, to have something go from existing (true) to be a count, but that might be unwanted behavior + //0 if undefined, null (but not {}) should allow adding to new objects + //could also add in a true = 1 thing, to have something go from existing (true) + //to be a count, but that might be unwanted behavior (add with loose eval probably will happen anyways) var old = $SM.get(stateName, true); - if(typeof old != 'number' || typeof value != 'number'){ + //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 + } else if(typeof old != 'number' || typeof value != 'number'){ Engine.log('WARNING: Can not do math with state:'+stateName+' or value:'+value+' because at least one is not a number.'); err = 1 } else { @@ -170,7 +179,7 @@ var StateManager = { else return whichState; }, - remove: function(stateName) { + remove: function(stateName, noEvent) { var whichState = $SM.buildPath(whichState); try{ delete eval(whichState); @@ -178,8 +187,10 @@ var StateManager = { //it didn't exist in the first place Engine.log('WARNING: Tried to remove non-existant state \''+stateName+'\'.'); } - Engine.saveGame(); - $SM.fireUpdate(stateName); + if(!noEvent){ + Engine.saveGame(); + $SM.fireUpdate(stateName); + }; }, //creates full reference from input @@ -200,6 +211,122 @@ var StateManager = { if(save) Engine.saveGame(); }, + //Use this function to make old save games compatible with new version + updateOldState: function(){ + var version = $SM.get('version'); + if(typeof version != 'number') version = 1.0; + if(version == 1.0) { + // v1.1 introduced the Lodge, so get rid of lodgeless hunters + $SM.remove('outside.workers.hunter', true); + $SM.remove('income.hunter', true); + Engine.log('upgraded save to v1.1'); + version = 1.1; + }; + if(version == 1.1) { + //v1.2 added the Swamp to the map, so add it to already generated maps + if($SM.get('world')) { + World.placeLandmark(15, World.RADIUS * 1.5, World.TILE.SWAMP, $SM.get('world.map')); + } + Engine.log('upgraded save to v1.2'); + version = 1.2; + }; + if(version == 1.2) { + //StateManager added, so move data to new locations + }; + }, + + /****************************************************************** + * Start of specific state functions + ******************************************************************/ + //PERKS + addPerk: function(name) { + $SM.set('character.perks[\''+name+'\']', true); + Notifications.notify(null, Engine.Perks[name].notify); + }, + + hasPerk: function(name) { + return $SM.get('character.perks[\''+name+'\']') == true; + }, + + //INCOME + setIncome: function(source, options) { + var existing = $SM.get('income[\''+source+'\']'); + if(typeof existing != 'undefined') { + options.timeLeft = existing.timeLeft; + } + $SM.set('income[\''+source+'\']', options); + }, + + getIncome: function(source) { + var existing = $SM.get('income[\''+source+'\']'); + if(typeof existing != 'undefined') { + return existing; + } + return {}; + }, + + collectIncome: function() { + if(typeof $SM.get('income') != 'undefined' && Engine.activeModule != Space) { + for(var source in $SM.get('income')) { + var income = $SM.get('income[\''+source+'\']'); + if(typeof income.timeLeft != 'number') + { + income.timeLeft = 0; + } + income.timeLeft--; + + if(income.timeLeft <= 0) { + Engine.log('collection income from ' + source); + if(source == 'thieves') $SM.addStolen(income.stores); + $SM.addM('stores', income.stores); + if(typeof income.delay == 'number') { + income.timeLeft = income.delay; + } + } + } + } + Engine._incomeTimeout = setTimeout($SM.collectIncome, 1000); + }, + + //Thieves + addStolen: function(stores) { + for(var k in stores) { + var old = $SM.get('stores[\''+k+'\']', true); + var short = old - stores[k]; + //if they would steal more than actually owned + if(short < 0){ + $SM.add('game.stolen[\''+k+'\']', (stores[k] * -1) + short); + } else { + $SM.add('game.stolen[\''+k+'\']', stores[k] * -1); + } + }; + }, + + startThieves: function() { + $SM.set('game.thieves', 1); + $SM.setIncome('thieves', { + delay: 10, + stores: { + 'wood': -10, + 'fur': -5, + 'meat': -5 + } + }); + }, + + //Misc + num: function(name, craftable) { + switch(craftable.type) { + case 'good': + case 'tool': + case 'weapon': + case 'upgrade': + return $SM.get('stores[\''+name+'\']', true); + case 'building': + return Outside.numBuilding(name); + } + }, + handleStateUpdates: function(e){ }, diff --git a/script/world.js b/script/world.js index c608aab..45e174f 100644 --- a/script/world.js +++ b/script/world.js @@ -266,7 +266,7 @@ var World = { // Update label var t = 'pockets'; - if(Engine.getStore('rucksack') > 0) { + if($SM.get('stores.rucksack', true) > 0) { t = 'rucksack'; } $('#backpackTitle').text(t); @@ -401,11 +401,11 @@ var World = { checkDanger: function() { World.danger = typeof World.danger == 'undefined' ? false: World.danger; if(!World.danger) { - if(!Engine.getStore('i armour') > 0 && World.getDistance() >= 8) { + if(!$SM.get('stores[\'i armour\']', true) > 0 && World.getDistance() >= 8) { World.danger = true; return true; } - if(!Engine.getStore('s armour') > 0 && World.getDistance() >= 18) { + if(!$SM.get('stores[\'s armour\']', true) > 0 && World.getDistance() >= 18) { World.danger = true; return true; } @@ -414,7 +414,7 @@ var World = { World.danger = false; return true; } - if(World.getDistance < 18 && Engine.getStore('i armour') > 0) { + if(World.getDistance < 18 && $SM.get('stores[\'i armour\']', true) > 0) { World.danger = false; return true; } @@ -427,7 +427,7 @@ var World = { World.waterMove++; // Food var movesPerFood = World.MOVES_PER_FOOD; - movesPerFood *= Engine.hasPerk('slow metabolism') ? 2 : 1; + movesPerFood *= $SM.hasPerk('slow metabolism') ? 2 : 1; if(World.foodMove >= movesPerFood) { World.foodMove = 0; var num = Path.outfit['cured meat']; @@ -443,8 +443,8 @@ var World = { } else { $SM.set('character.starved', $SM.get('character.starved', true)); $SM.add('character.starved', 1); - if($SM.get('character.starved') >= 10 && !Engine.hasPerk('slow metabolism')) { - Engine.addPerk('slow metabolism'); + if($SM.get('character.starved') >= 10 && !$SM.hasPerk('slow metabolism')) { + $SM.addPerk('slow metabolism'); } World.die(); return false; @@ -457,7 +457,7 @@ var World = { } // Water var movesPerWater = World.MOVES_PER_WATER; - movesPerWater *= Engine.hasPerk('desert rat') ? 2 : 1; + movesPerWater *= $SM.hasPerk('desert rat') ? 2 : 1; if(World.waterMove >= movesPerWater) { World.waterMove = 0; var water = World.water; @@ -472,8 +472,8 @@ var World = { } else { $SM.set('character.dehydrated', $SM.get('character.dehydrated', true)); $SM.add('character.dehydrated', 1); - if($SM.get('character.dehydrated') >= 10 && !Engine.hasPerk('desert rat')) { - Engine.addPerk('desert rat'); + if($SM.get('character.dehydrated') >= 10 && !$SM.hasPerk('desert rat')) { + $SM.addPerk('desert rat'); } World.die(); return false; @@ -488,7 +488,7 @@ var World = { }, meatHeal: function() { - return World.MEAT_HEAL * (Engine.hasPerk('gastronome') ? 2 : 1); + return World.MEAT_HEAL * ($SM.hasPerk('gastronome') ? 2 : 1); }, medsHeal: function() { @@ -500,7 +500,7 @@ var World = { World.fightMove++; if(World.fightMove > World.FIGHT_DELAY) { var chance = World.FIGHT_CHANCE; - chance *= Engine.hasPerk('stealthy') ? 0.5 : 1; + chance *= $SM.hasPerk('stealthy') ? 0.5 : 1; if(Math.random() < chance) { World.fightMove = 0; Events.triggerFight(); @@ -584,7 +584,7 @@ var World = { lightMap: function(x, y, mask) { var r = World.LIGHT_RADIUS; - r *= Engine.hasPerk('scout') ? 2 : 1; + r *= $SM.hasPerk('scout') ? 2 : 1; World.uncoverMap(x, y, r, mask); return mask; }, @@ -849,7 +849,7 @@ var World = { } for(var k in Path.outfit) { - Engine.addStore(k, Path.outfit[k]); + $SM.add('stores[\''+k+'\']', Path.outfit[k]); if(World.leaveItAtHome(k)) { Path.outfit[k] = 0; } @@ -866,29 +866,29 @@ var World = { }, getMaxHealth: function() { - if(Engine.getStore('s armour') > 0) { + if($SM.get('stores[\'s armour\']', true) > 0) { return World.BASE_HEALTH + 35; - } else if(Engine.getStore('i armour') > 0) { + } else if($SM.get('stores[\'i armour\']', true) > 0) { return World.BASE_HEALTH + 15; - } else if(Engine.getStore('l armour') > 0) { + } else if($SM.get('stores[\'l armour']', true) > 0) { return World.BASE_HEALTH + 5; } return World.BASE_HEALTH; }, getHitChance: function() { - if(Engine.hasPerk('precise')) { + if($SM.hasPerk('precise')) { return World.BASE_HIT_CHANCE + 0.1; } return World.BASE_HIT_CHANCE; }, getMaxWater: function() { - if(Engine.getStore('water tank') > 0) { + if($SM.get('stores[\'water tank\']', true) > 0) { return World.BASE_WATER + 50; - } else if(Engine.getStore('cask') > 0) { + } else if($SM.get('stores.cask', true) > 0) { return World.BASE_WATER + 20; - } else if(Engine.getStore('waterskin') > 0) { + } else if($SM.get('stores.waterskin', true) > 0) { return World.BASE_WATER + 10; } return World.BASE_WATER; @@ -936,5 +936,12 @@ var World = { copyPos: function(pos) { return [pos[0], pos[1]]; - } -}; \ No newline at end of file + }, + + handleStateUpdates: function(e){ + + }, +}; + +//listener for StateManager update events +$(World).on('stateUpdate', World.handleStateUpdates); \ No newline at end of file From 2018ca3ae89ccba206831dbcac29cd5c3b7e60ad Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Wed, 24 Jul 2013 18:27:04 -0600 Subject: [PATCH 03/13] create and configure callback handlers for state updates add $.Dispatch to handle object events add subscribe calls to files update SM fireUpdate to use new Dispatch There are some NaN issues right now, no time to bug hunt right now, it does kind of function though --- script/engine.js | 31 +++++++++++++++++++++++++---- script/events.js | 13 ++++++------ script/outside.js | 15 +++++++------- script/path.js | 14 ++++++------- script/room.js | 21 ++++++++++---------- script/ship.js | 12 +++++------ script/space.js | 10 +++++----- script/state_manager.js | 44 ++++++++++++++++++++++++++++------------- script/world.js | 14 ++++++------- 9 files changed, 105 insertions(+), 69 deletions(-) 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 From f4520bce91721fa4e962c872232b17b0c05a398b Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Thu, 25 Jul 2013 02:00:41 -0600 Subject: [PATCH 04/13] speed up and bug fix --- script/engine.js | 2 +- script/outside.js | 4 +--- script/state_manager.js | 53 +++++++++++------------------------------ 3 files changed, 16 insertions(+), 43 deletions(-) diff --git a/script/engine.js b/script/engine.js index db3be3a..8944227 100644 --- a/script/engine.js +++ b/script/engine.js @@ -172,7 +172,7 @@ var Engine = { } } catch(e) { State = {}; - $SM.set('verson', Engine.VERSION); + $SM.set('version', Engine.VERSION); Engine.event('progress', 'new game'); } }, diff --git a/script/outside.js b/script/outside.js index 31764ef..5201e93 100644 --- a/script/outside.js +++ b/script/outside.js @@ -163,9 +163,7 @@ var Outside = { }, numBuilding: function(bName) { - return $SM.get('features.location.outside') && - $SM.get('game.outside.buildings') && - $SM.get('game.outside.buildings[\''+bName+'\']', true); + return $SM.get('game.outside.buildings[\''+bName+'\']', true); }, addBuilding: function(bName, num) { diff --git a/script/state_manager.js b/script/state_manager.js index 3871ca9..ac358b9 100644 --- a/script/state_manager.js +++ b/script/state_manager.js @@ -34,7 +34,7 @@ var StateManager = { 'income', 'timers', 'game', //mostly location related: fire temp, workers, population, world map, etc - 'playStats', //anything play related: play time, loads, etc + 'playStats' //anything play related: play time, loads, etc ]; for(var which in cats) { @@ -45,37 +45,18 @@ var StateManager = { $.Dispatch('stateUpdate').subscribe($SM.handleStateUpdates); }, - //create the parent of a given state, recursive as needed - createParent: function(stateName) { - var err = 0; - - //parse path to find last child - var lastDot = stateName.lastIndexOf('.'); //if ends with a dot, there is a coding bug, not like ending in a bracket, so don't account for it - if(lastDot == stateName.length) { - Engine.log('ERROR: '+stateName+' is invalid. Cannot end in a dot.'); - return; - } - var lastOB = stateName.lastIndexOf('['); - //make sure last bracket isn't just end of the line - var lastCB = stateName.substr(0, stateName.length -1).lastIndexOf(']'); - //account for state[foo][bar] double bracket and state[foo].bar - if(lastCB == lastOB - 1) lastOB = -1; - if(lastCB == lastDot -1) lastDot = -1; - //find last child or return if no more children - var cutoff = Math.max(lastDot, lastOB, lastCB); - if(cutoff <= 0) return; - - var parentPath = $SM.buildPath(stateName.substr(0,cutoff)); - - //try creating the parent - try { - eval('('+parentPath+') = {}'); - } catch (e) { - //need to go up another level and make parent of parent - $SM.createParent(stateName.substr(0,cutoff)); - //then it will definitely work if not, something is fubar - eval('('+parentPath+') = {}'); + //create all parents and then set state + createState: function(stateName, value) { + var words = stateName.split(/[.\[\]']+/); + var obj = State; + var w = null; + for(var i=0, len=words.length-1;i Date: Thu, 25 Jul 2013 20:31:30 -0600 Subject: [PATCH 05/13] add $SM.setget, refactor Room to better use $SM game.room.builder >> game.builder.level setget is mainly for use in local copies of states, useful for keeping code cleaner and less redundant while maintaining set/get of states by the $SM ====functions refactored==== Room.unlockForext //remove update calls Room.buy //remove update calls Room.build //remove update calls Room.cooFire //added locals to reduce gets Room.adjustTemp //added locals to reduce gets Room.updateBuilderState //added local to reduce gets Room.craftUnlocked //Room unlock is always going to be true, don't need to check parents to avoid errors anymore Room.buyUnlocked //Room unlock is always going to be true, don't need to check parents to avoid errors anymore --- .project | 6 +++ script/room.js | 85 +++++++++++++++++++++-------------------- script/state_manager.js | 9 ++++- 3 files changed, 57 insertions(+), 43 deletions(-) diff --git a/.project b/.project index d6959e1..33ac207 100644 --- a/.project +++ b/.project @@ -5,7 +5,13 @@ + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + org.eclipse.wst.jsdt.core.jsNature diff --git a/script/room.js b/script/room.js index fc588bf..55746fc 100644 --- a/script/room.js +++ b/script/room.js @@ -9,6 +9,10 @@ var Room = { _STOKE_COOLDOWN: 10, // cooldown to stoke the fire _NEED_WOOD_DELAY: 15 * 1000, // from when the stranger shows up, to when you need wood + fire:null, + temperature:null, + buttons:{}, + Craftables: { 'trap': { button: null, @@ -445,14 +449,18 @@ var Room = { if(typeof $SM.get('features.location.room') == 'undefined') { $SM.set('features.location.room', true); + $SM.set('game.builder.level', -1); $SM.set('game.room', { temperature: this.TempEnum.Cold, fire: this.FireEnum.Dead, buttons: {}, - builder: -1 }); } + Room.temperature = this.TempEnum.Cold; + Room.fire = this.FireEnum.Dead; + + // Create the room tab this.tab = Header.addLocation("A Dark Room", "room", Room); @@ -506,10 +514,10 @@ var Room = { * 3 - Sleeping * 4 - Helping */ - if($SM.get('game.room.builder') >= 0 && $SM.get('game.room.builder') < 3) { + if($SM.get('game.builder.level') >= 0 && $SM.get('game.builder.level') < 3) { Room._builderTimer = setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } - if($SM.get('game.room.builder') == 1 && $SM.get('stores.wood', true) < 0) { + if($SM.get('game.builder.level') == 1 && $SM.get('stores.wood', true) < 0) { setTimeout(Room.unlockForest, Room._NEED_WOOD_DELAY); } setTimeout($SM.collectIncome, 1000); @@ -527,8 +535,8 @@ var Room = { Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text')); Room.changed = false; } - if($SM.get('game.room.builder') == 3) { - $SM.add('game.room.builder', 1); + if($SM.get('game.builder.level') == 3) { + $SM.add('game.builder.level', 1); $SM.setIncome('builder', { delay: 10, stores: {'wood' : 2 } @@ -642,8 +650,8 @@ var Room = { Room.changed = true; } Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text'), true); - if($SM.get('game.room.fire.value') > 1 && $SM.get('game.room.builder') < 0) { - $SM.set('game.room.builder', 0); + if($SM.get('game.room.fire.value') > 1 && $SM.get('game.builder.level') < 0) { + $SM.set('game.builder.level', 0); Notifications.notify(Room, "the light from the fire spills from the windows, out into the dark"); setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } @@ -655,30 +663,33 @@ var Room = { coolFire: function() { var wood = $SM.get('stores.wood'); - if($SM.get('game.room.fire.value') <= Room.FireEnum.Flickering.value && - $SM.get('game.room.builder') > 3 && wood > 0) { + var roomFire = $SM.get('game.room.fire'); + if(roomFire.value <= Room.FireEnum.Flickering.value && + $SM.get('game.builder.level') > 3 && wood > 0) { Notifications.notify(Room, "builder stokes the fire", true); $SM.set('stores.wood', wood - 1); - $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') + 1)); + roomFire = $SM.setget('game.room.fire', Room.FireEnum.fromInt(roomFire.value + 1)); } - if($SM.get('game.room.fire.value') > 0) { - $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') - 1)); + if(roomFire.value > 0) { + $SM.set('game.room.fire', Room.FireEnum.fromInt(roomFire.value - 1)); Room._fireTimer = setTimeout(Room.coolFire, Room._FIRE_COOL_DELAY); Room.onFireChange(); } }, adjustTemp: function() { - var old = $SM.get('game.room.temperature.value'); - if($SM.get('game.room.temperature.value') > 0 && $SM.get('game.room.temperature.value') > $SM.get('game.room.fire.value')) { - $SM.set('game.room.temperature', Room.TempEnum.fromInt($SM.get('game.room.temperature.value') - 1)); - Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text'), true); + var roomTemp = $SM.get('game.room.temperature'); + var roomFire = $SM.get('game.room.fire'); + var old = roomTemp.value; + if(roomTemp.value > 0 && roomTemp.value > roomFire.value) { + roomTemp = $SM.setget('game.room.temperature', Room.TempEnum.fromInt(roomTemp.value - 1)); + Notifications.notify(Room, "the room is " + roomTemp.text, true); } - if($SM.get('game.room.temperature.value') < 4 && $SM.get('game.room.temperature.value') < $SM.get('game.room.fire.value')) { - $SM.set('game.room.temperature', Room.TempEnum.fromInt($SM.get('game.room.temperature.value') + 1)); - Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text'), true); + if(roomTemp.value < 4 && roomTemp.value < roomFire.value) { + roomTemp = $SM.setget('game.room.temperature', Room.TempEnum.fromInt(roomTemp.value + 1)); + Notifications.notify(Room, "the room is " + roomTemp.text, true); } - if($SM.get('game.room.temperature.value') != old) { + if(roomTemp.value != old) { Room.changed = true; } Room._tempTimer = setTimeout(Room.adjustTemp, Room._ROOM_WARM_DELAY); @@ -686,23 +697,22 @@ var Room = { unlockForest: function() { $SM.set('stores.wood', 4); - Room.updateButton(); Outside.init(); - Room.updateStoresView(); Notifications.notify(Room, "the wind howls outside"); Notifications.notify(Room, "the wood is running out"); Engine.event('progress', 'outside'); }, updateBuilderState: function() { - if($SM.get('game.room.builder') == 0) { + var lBuilder = $SM.get('game.builder.level'); + if(lBuilder == 0) { Notifications.notify(Room, "a ragged stranger stumbles through the door and collapses in the corner"); - $SM.set('game.room.builder', 1); + lBuilder = $SM.setget('game.builder.level', 1); setTimeout(Room.unlockForest, Room._NEED_WOOD_DELAY); } - else if($SM.get('game.room.builder') < 3 && $SM.get('game.room.temperature.value') >= Room.TempEnum.Warm.value) { + else if(lBuilder < 3 && $SM.get('game.room.temperature.value') >= Room.TempEnum.Warm.value) { var msg; - switch($SM.get('game.room.builder')) { + switch(lBuilder) { case 1: msg = "the stranger shivers, and mumbles quietly. her words are unintelligible."; break; @@ -711,11 +721,11 @@ var Room = { break; } Notifications.notify(Room, msg); - if($SM.get('game.room.builder') < 3) { - $SM.add('game.room.builder', 1); + if(lBuilder < 3) { + lBuilder = $SM.setget('game.builder.level', lBuilder + 1); } } - if($SM.get('game.room.builder') < 3) { + if(lBuilder < 3) { setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); } Engine.saveGame(); @@ -875,8 +885,6 @@ var Room = { $SM.add('stores[\''+thing+'\']', 1); - Room.updateBuildButtons(); - if(thing == 'compass') { Path.openPath(); } @@ -933,10 +941,7 @@ var Room = { case 'building': Outside.addBuilding(thing, 1); break; - } - - Room.updateBuildButtons(); - + } }, needsWorkshop: function(type) { @@ -944,12 +949,10 @@ var Room = { }, craftUnlocked: function(thing) { - if(typeof $SM.get('features.location.room') != 'undefined' && - typeof $SM.get('game.room.buttons') != 'undefined' && - $SM.get('game.room.buttons[\''+thing+'\']')) { + if($SM.get('game.room.buttons[\''+thing+'\']')) { return true; } - if($SM.get('game.room.builder') < 4) return false; + if($SM.get('game.builder.level') < 4) return false; var craftable = Room.Craftables[thing]; if(Room.needsWorkshop(craftable.type) && Outside.numBuilding('workshop') == 0) return false; var cost = craftable.cost(); @@ -970,9 +973,7 @@ var Room = { }, buyUnlocked: function(thing) { - if(typeof $SM.get('features.location.room') != 'undefined' && - typeof $SM.get('game.room.buttons') != 'undefined' && - $SM.get('game.room.buttons[\''+thing+'\']')) { + if($SM.get('game.room.buttons[\''+thing+'\']')) { return true; } else if(Outside.numBuilding('trading post') > 0) { if(thing == 'compass' || $SM.get('stores[\''+thing+'\']')) { diff --git a/script/state_manager.js b/script/state_manager.js index ac358b9..5057b87 100644 --- a/script/state_manager.js +++ b/script/state_manager.js @@ -147,7 +147,7 @@ var StateManager = { //return state, undefined or 0 get: function(stateName, requestZero) { var whichState = null; - var fullPath = $SM.buildPath(stateName, name); + var fullPath = $SM.buildPath(stateName); //catch errors if parent of state doesn't exist try{ @@ -161,6 +161,13 @@ var StateManager = { else return whichState; }, + //mainly for local copy use, add(M) can fail so we can't shortcut them + //since set does not fail, we know state exists and can simply return the object + setget: function(stateName, value, noEvent){ + $SM.set(stateName, value, noEvent); + return eval('('+$SM.buildPath(stateName)+')'); + }, + remove: function(stateName, noEvent) { var whichState = $SM.buildPath(whichState); try{ From 99d57efdc16ba3f98a5165c3077d8614b60f9129 Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Thu, 25 Jul 2013 20:33:04 -0600 Subject: [PATCH 06/13] bug fix Outside.init > set features.location.outside to true --- script/outside.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/outside.js b/script/outside.js index 5201e93..6146243 100644 --- a/script/outside.js +++ b/script/outside.js @@ -139,7 +139,7 @@ var Outside = { $.Dispatch('stateUpdate').subscribe(Outside.handleStateUpdates); if(typeof $SM.get('features.location.outside') == 'undefined') { - $SM.set('features.location.outside'); + $SM.set('features.location.outside', true); $SM.setM('game.outside', { buildings: {}, population: 0, From f4d2e8deae5fe3d88bda318de57126eeb96e5d50 Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Thu, 25 Jul 2013 21:05:43 -0600 Subject: [PATCH 07/13] change to property Room.fire, Room.temperature, Room.buttons Changed these States into properties of room. They are only ever accessed by Room and there is no real reason to save them. By not saving the state each time, it also makes the the player start out in 'a dark room' on every load. Rather fitting I think, and gives the fire a little bit more purpose if you have to rewarm the builder. --- script/room.js | 64 ++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/script/room.js b/script/room.js index 55746fc..2f0f874 100644 --- a/script/room.js +++ b/script/room.js @@ -450,11 +450,6 @@ var Room = { if(typeof $SM.get('features.location.room') == 'undefined') { $SM.set('features.location.room', true); $SM.set('game.builder.level', -1); - $SM.set('game.room', { - temperature: this.TempEnum.Cold, - fire: this.FireEnum.Dead, - buttons: {}, - }); } Room.temperature = this.TempEnum.Cold; @@ -522,8 +517,8 @@ var Room = { } setTimeout($SM.collectIncome, 1000); - Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text')); - Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text')); + Notifications.notify(Room, "the room is " + Room.temperature.text); + Notifications.notify(Room, "the fire is " + Room.fire.text); }, options: {}, // Nothing for now @@ -531,8 +526,8 @@ var Room = { onArrival: function(transition_diff) { Room.setTitle(); if(Room.changed) { - Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text')); - Notifications.notify(Room, "the room is " + $SM.get('game.room.temperature.text')); + Notifications.notify(Room, "the fire is " + Room.fire.text); + Notifications.notify(Room, "the room is " + Room.temperature.text); Room.changed = false; } if($SM.get('game.builder.level') == 3) { @@ -581,7 +576,7 @@ var Room = { }, setTitle: function() { - var title = $SM.get('game.room.fire.value') < 2 ? "A Dark Room" : "A Firelit Room"; + var title = Room.fire.value < 2 ? "A Dark Room" : "A Firelit Room"; if(Engine.activeModule == this) { document.title = title; } @@ -591,7 +586,7 @@ var Room = { updateButton: function() { var light = $('#lightButton.button'); var stoke = $('#stokeButton.button'); - if($SM.get('game.room.fire.value') == Room.FireEnum.Dead.value && stoke.css('display') != 'none') { + if(Room.fire.value == Room.FireEnum.Dead.value && stoke.css('display') != 'none') { stoke.hide(); light.show(); if(stoke.hasClass('disabled')) { @@ -625,7 +620,7 @@ var Room = { } else if(wood > 4) { $SM.set('stores.wood', wood - 5); } - $SM.set('game.room.fire', Room.FireEnum.Burning); + Room.fire = Room.FireEnum.Burning; Room.onFireChange(); }, @@ -639,8 +634,8 @@ var Room = { if(wood > 0) { $SM.set('stores.wood', wood - 1); } - if($SM.get('game.room.fire.value') < 4) { - $SM.set('game.room.fire', Room.FireEnum.fromInt($SM.get('game.room.fire.value') + 1)); + if(Room.fire.value < 4) { + Room.fire = Room.FireEnum.fromInt(Room.fire.value + 1); } Room.onFireChange(); }, @@ -649,8 +644,8 @@ var Room = { if(Engine.activeModule != Room) { Room.changed = true; } - Notifications.notify(Room, "the fire is " + $SM.get('game.room.fire.text'), true); - if($SM.get('game.room.fire.value') > 1 && $SM.get('game.builder.level') < 0) { + Notifications.notify(Room, "the fire is " + Room.fire.text, true); + if(Room.fire.value > 1 && $SM.get('game.builder.level') < 0) { $SM.set('game.builder.level', 0); Notifications.notify(Room, "the light from the fire spills from the windows, out into the dark"); setTimeout(Room.updateBuilderState, Room._BUILDER_STATE_DELAY); @@ -663,33 +658,30 @@ var Room = { coolFire: function() { var wood = $SM.get('stores.wood'); - var roomFire = $SM.get('game.room.fire'); - if(roomFire.value <= Room.FireEnum.Flickering.value && + if(Room.fire.value <= Room.FireEnum.Flickering.value && $SM.get('game.builder.level') > 3 && wood > 0) { Notifications.notify(Room, "builder stokes the fire", true); $SM.set('stores.wood', wood - 1); - roomFire = $SM.setget('game.room.fire', Room.FireEnum.fromInt(roomFire.value + 1)); + Room.fire = Room.FireEnum.fromInt(Room.fire.value + 1); } - if(roomFire.value > 0) { - $SM.set('game.room.fire', Room.FireEnum.fromInt(roomFire.value - 1)); + if(Room.fire.value > 0) { + Room.fire = Room.FireEnum.fromInt(Room.fire.value - 1); Room._fireTimer = setTimeout(Room.coolFire, Room._FIRE_COOL_DELAY); Room.onFireChange(); } }, adjustTemp: function() { - var roomTemp = $SM.get('game.room.temperature'); - var roomFire = $SM.get('game.room.fire'); - var old = roomTemp.value; - if(roomTemp.value > 0 && roomTemp.value > roomFire.value) { - roomTemp = $SM.setget('game.room.temperature', Room.TempEnum.fromInt(roomTemp.value - 1)); - Notifications.notify(Room, "the room is " + roomTemp.text, true); + var old = Room.temperature.value; + if(Room.temperature.value > 0 && Room.temperature.value > Room.fire.value) { + Room.temperature = Room.TempEnum.fromInt(Room.temperature.value - 1); + Notifications.notify(Room, "the room is " + Room.temperature.text, true); } - if(roomTemp.value < 4 && roomTemp.value < roomFire.value) { - roomTemp = $SM.setget('game.room.temperature', Room.TempEnum.fromInt(roomTemp.value + 1)); - Notifications.notify(Room, "the room is " + roomTemp.text, true); + if(Room.temperature.value < 4 && Room.temperature.value < Room.fire.value) { + Room.temperature = Room.TempEnum.fromInt(Room.temperature.value + 1); + Notifications.notify(Room, "the room is " + Room.temperature.text, true); } - if(roomTemp.value != old) { + if(Room.temperature.value != old) { Room.changed = true; } Room._tempTimer = setTimeout(Room.adjustTemp, Room._ROOM_WARM_DELAY); @@ -710,7 +702,7 @@ var Room = { lBuilder = $SM.setget('game.builder.level', 1); setTimeout(Room.unlockForest, Room._NEED_WOOD_DELAY); } - else if(lBuilder < 3 && $SM.get('game.room.temperature.value') >= Room.TempEnum.Warm.value) { + else if(lBuilder < 3 && Room.temperature.value >= Room.TempEnum.Warm.value) { var msg; switch(lBuilder) { case 1: @@ -892,7 +884,7 @@ var Room = { build: function(buildBtn) { var thing = $(buildBtn).attr('buildThing'); - if($SM.get('game.room.temperature.value') <= Room.TempEnum.Cold.value) { + if(Room.temperature.value <= Room.TempEnum.Cold.value) { Notifications.notify(Room, "builder just shivers"); return false; } @@ -949,7 +941,7 @@ var Room = { }, craftUnlocked: function(thing) { - if($SM.get('game.room.buttons[\''+thing+'\']')) { + if(Room.buttons[thing]) { return true; } if($SM.get('game.builder.level') < 4) return false; @@ -967,13 +959,13 @@ var Room = { } } - $SM.set('game.room.buttons[\''+thing+'\']', true); + Room.buttons[thing] = true; Notifications.notify(Room, craftable.availableMsg); return true; }, buyUnlocked: function(thing) { - if($SM.get('game.room.buttons[\''+thing+'\']')) { + if(Room.buttons[thing]) { return true; } else if(Outside.numBuilding('trading post') > 0) { if(thing == 'compass' || $SM.get('stores[\''+thing+'\']')) { From 99800f1abd23b4b6e54c54ba7944cc8917d3d9ed Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Fri, 26 Jul 2013 19:21:12 -0600 Subject: [PATCH 08/13] refactor Outside to use $SM + Room bugfix, \' to " Refactoring of Outside.js to take better advantage of $SM and simplify the code. Includes a small bug fix to Room update handler Also changed instances of escaped single quote (\') to double (") for readability and simplicity. ====state changes==== //these were changed for the opposite reason the Room states were. These seem like states that other locations and events may very well want to interact with and possibly alter themselves game.outside.buildings >> game.buildings game.outside.population >> game.population game.outside.workders >> game.workers ====functions removed==== Outside.numBuilding // just a $SM.get, no shortcut really needed since Outside.numBuilding is a pretty long name Outside.getPopulation // same here Outside.addBuilding // just an add Outside.addBuildings // just addM, but wasn't even actually used ====functions refactored==== Outside.killVillagers //moved updates to handler Outside.updateWorkersView //added local to reduce gets Outside.increasePopulation //updates moved to handler Outside.increaseWorker // updates moved to handler Outside.decreaseWorkder // updates moved to handler --- script/events.js | 4 +- script/events/outside.js | 14 ++--- script/events/room.js | 4 +- script/outside.js | 132 ++++++++++++++------------------------- script/path.js | 20 +++--- script/room.js | 42 +++++++------ script/ship.js | 8 +-- script/state_manager.js | 28 ++++----- script/world.js | 28 ++++----- 9 files changed, 122 insertions(+), 158 deletions(-) diff --git a/script/events.js b/script/events.js index 7401ec6..b78d483 100644 --- a/script/events.js +++ b/script/events.js @@ -649,7 +649,7 @@ var Events = { } else if(b.cost) { var disabled = false; for(var store in b.cost) { - var num = Engine.activeModule == World ? Path.outfit[store] : $SM.get('stores[\''+store+'\']', true); + var num = Engine.activeModule == World ? Path.outfit[store] : $SM.get('stores["'+store+'"]', true); if(typeof num != 'number') num = 0; if(num < b.cost[store]) { // Too expensive @@ -668,7 +668,7 @@ var Events = { var costMod = {}; if(info.cost) { for(var store in info.cost) { - var num = Engine.activeModule == World ? Path.outfit[store] : $SM.get('stores[\''+store+'\']', true); + var num = Engine.activeModule == World ? Path.outfit[store] : $SM.get('stores["'+store+'"]', true); if(typeof num != 'number') num = 0; if(num < info.cost[store]) { // Too expensive diff --git a/script/events/outside.js b/script/events/outside.js index 109eb49..83cbefb 100644 --- a/script/events/outside.js +++ b/script/events/outside.js @@ -5,7 +5,7 @@ Events.Outside = [ { /* Ruined traps */ title: 'A Ruined Trap', isAvailable: function() { - return Engine.activeModule == Outside && Outside.numBuilding('trap') > 0; + return Engine.activeModule == Outside && $SM.get('game.buildings["trap"]', true) > 0; }, scenes: { 'start': { @@ -14,8 +14,8 @@ Events.Outside = [ 'large prints lead away, into the forest.' ], onLoad: function() { - var numWrecked = Math.floor(Math.random() * Outside.numBuilding('trap')) + 1; - Outside.addBuilding('trap', -numWrecked); + var numWrecked = Math.floor(Math.random() * $SM.get('game.buildings["trap"]', true)) + 1; + $SM.add('game.buildings["trap"]', -numWrecked); Outside.updateVillage(); Outside.updateTrapButton(); }, @@ -66,7 +66,7 @@ Events.Outside = [ { /* Sickness */ title: 'Sickness', isAvailable: function() { - return Engine.activeModule == Outside && Outside.getPopulation() > 10 && Outside.getPopulation() < 50; + return Engine.activeModule == Outside && $SM.get('game.population', true) > 10 && $SM.get('game.population', true) < 50; }, scenes: { 'start': { @@ -120,7 +120,7 @@ Events.Outside = [ { /* Plague */ title: 'Plague', isAvailable: function() { - return Engine.activeModule == Outside && Outside.getPopulation() > 50; + return Engine.activeModule == Outside && $SM.get('game.population', true) > 50; }, scenes: { 'start': { @@ -180,7 +180,7 @@ Events.Outside = [ { /* Beast attack */ title: 'A Beast Attack', isAvailable: function() { - return Engine.activeModule == Outside && Outside.getPopulation() > 0; + return Engine.activeModule == Outside && $SM.get('game.population', true) > 0; }, scenes: { 'start': { @@ -211,7 +211,7 @@ Events.Outside = [ { /* Soldier attack */ title: 'A Military Raid', isAvailable: function() { - return Engine.activeModule == Outside && Outside.getPopulation() > 0 && $SM.get('game.cityCleared');; + return Engine.activeModule == Outside && $SM.get('game.population', true) > 0 && $SM.get('game.cityCleared');; }, scenes: { 'start': { diff --git a/script/events/room.js b/script/events/room.js index 70e5ea9..fcd4beb 100644 --- a/script/events/room.js +++ b/script/events/room.js @@ -536,7 +536,7 @@ Events.Room = [ 'some weird metal he picked up on his travels.' ], onLoad: function() { - $SM.add('stores[\'alien alloy\']', 1); + $SM.add('stores["alien alloy"]', 1); }, buttons: { 'bye': { @@ -552,7 +552,7 @@ Events.Room = [ 'some weird glowing boxes he picked up on his travels.' ], onLoad: function() { - $SM.add('stores[\'energy cell\']', 3); + $SM.add('stores["energy cell"]', 3); }, buttons: { 'bye': { diff --git a/script/outside.js b/script/outside.js index 6146243..5903c20 100644 --- a/script/outside.js +++ b/script/outside.js @@ -140,11 +140,9 @@ var Outside = { if(typeof $SM.get('features.location.outside') == 'undefined') { $SM.set('features.location.outside', true); - $SM.setM('game.outside', { - buildings: {}, - population: 0, - workers: {} - }); + if(!$SM.get('game.buildings')) $SM.set('game.buildings', {}); + if(!$SM.get('game.population')) $SM.set('game.population', 0); + if(!$SM.get('game.workers')) $SM.set('game.workers', {}); } this.updateVillage(); @@ -162,44 +160,12 @@ var Outside = { }).appendTo('div#outsidePanel'); }, - numBuilding: function(bName) { - return $SM.get('game.outside.buildings[\''+bName+'\']', true); - }, - - addBuilding: function(bName, num) { - var cur = $SM.get('game.outside.buildings[\''+bName+'\']'); - if(typeof cur != 'number') cur = 0; - cur += num; - if(cur < 0) cur = 0; - $SM.set('game.outside.buildings[\''+bName+'\']', cur); - this.updateVillage(); - Engine.saveGame(); - }, - - addBuildings: function(list) { - for(k in list) { - var num = $SM.get('game.outside.buildings[\''+k+'\']'); - if(typeof num != 'number') num = 0; - num += list[k]; - $SM.set('game.outside.buildings[\''+k+'\']', num); - } - this.updateVillage(); - Engine.saveGame(); - }, - getMaxPopulation: function() { - return Outside.numBuilding('hut') * 4; - }, - - getPopulation: function() { - if($SM.get('features.location.outside') && $SM.get('game.outside.population')) { - return $SM.get('game.outside.population'); - } - return 0; + return $SM.get('game.buildings["hut"]', true) * 4; }, increasePopulation: function() { - var space = Outside.getMaxPopulation() - $SM.get('game.outside.population'); + var space = Outside.getMaxPopulation() - $SM.get('game.population'); if(space > 0) { var num = Math.floor(Math.random()*(space/2) + space/2); if(num == 0) num = 1; @@ -215,36 +181,30 @@ var Outside = { Notifications.notify(null, "the town's booming. word does get around."); } Engine.log('population increased by ' + num); - $SM.add('game.outside.population', num); - Outside.updateVillage(); - Outside.updateWorkersView(); - Outside.updateVillageIncome(); + $SM.add('game.population', num); } Outside.schedulePopIncrease(); }, killVillagers: function(num) { - $SM.add('game.outside.population', num * -1); - if($SM.get('game.outside.population') < 0) { - $SM.set('game.outside.population', 0); + $SM.add('game.population', num * -1); + if($SM.get('game.population') < 0) { + $SM.set('game.population', 0); } var remaining = Outside.getNumGatherers(); if(remaining < 0) { var gap = -remaining; - for(var k in $SM.get('game.outside.workers')) { - var num = $SM.get('game.outside.workers[\''+k+'\']'); + for(var k in $SM.get('game.workers')) { + var num = $SM.get('game.workers["'+k+'"]'); if(num < gap) { gap -= num; - $SM.set('game.outside.workers[\''+k+'\']', 0); + $SM.set('game.workers["'+k+'"]', 0); } else { - $SM.add('game.outside.workers[\''+k+'\']', gap * -1); + $SM.add('game.workers["'+k+'"]', gap * -1); break; } } } - Outside.updateVillage(); - Outside.updateWorkersView(); - Outside.updateVillageIncome(); }, schedulePopIncrease: function() { @@ -258,7 +218,7 @@ var Outside = { // If our population is 0 and we don't already have a workers view, // there's nothing to do here. - if(!workers.length && $SM.get('game.outside.population') == 0) return; + if(!workers.length && $SM.get('game.population') == 0) return; var needsAppend = false; if(workers.length == 0) { @@ -266,13 +226,14 @@ var Outside = { workers = $('
').attr('id', 'workers').css('opacity', 0); } - var numGatherers = $SM.get('game.outside.population'); + var numGatherers = $SM.get('game.population'); var gatherer = $('div#workers_row_gatherer', workers); - for(var k in $SM.get('game.outside.workers')) { + for(var k in $SM.get('game.workers')) { + var workerCount = $SM.get('game.workers["'+k+'"]'); var row = $('div#workers_row_' + k.replace(' ', '-'), workers); if(row.length == 0) { - row = Outside.makeWorkerRow(k, $SM.get('game.outside.workers[\''+k+'\']')); + row = Outside.makeWorkerRow(k, workerCount); var curPrev = null; workers.children().each(function(i) { @@ -297,10 +258,10 @@ var Outside = { } } else { - $('div#' + row.attr('id') + ' > div.row_val > span', workers).text($SM.get('game.outside.workers[\''+k+'\']')); + $('div#' + row.attr('id') + ' > div.row_val > span', workers).text(workerCount); } - numGatherers -= $SM.get('game.outside.workers[\''+k+'\']'); - if($SM.get('game.outside.workers[\''+k+'\']') == 0) { + numGatherers -= workerCount; + if(workerCount == 0) { $('.dnBtn', row).addClass('disabled'); $('.dnManyBtn', row).addClass('disabled'); } else { @@ -331,9 +292,9 @@ var Outside = { }, getNumGatherers: function() { - var num = $SM.get('game.outside.population'); - for(var k in $SM.get('game.outside.workers')) { - num -= $SM.get('game.outside.workers[\''+k+'\']'); + var num = $SM.get('game.population'); + for(var k in $SM.get('game.workers')) { + num -= $SM.get('game.workers["'+k+'"]'); } return num; }, @@ -373,20 +334,16 @@ var Outside = { if(Outside.getNumGatherers() > 0) { var increaseAmt = Math.min(Outside.getNumGatherers(), btn.data); Engine.log('increasing ' + worker + ' by ' + increaseAmt); - $SM.add('game.outside.workers[\''+worker+'\']', increaseAmt); - Outside.updateVillageIncome(); - Outside.updateWorkersView(); + $SM.add('game.workers["'+worker+'"]', increaseAmt); } }, decreaseWorker: function(btn) { var worker = $(this).closest('.workerRow').children('.row_key').text(); - if($SM.get('game.outside.workers[\''+worker+'\']') > 0) { - var decreaseAmt = Math.min($SM.get('game.outside.workers[\''+worker+'\']') || 0, btn.data); + if($SM.get('game.workers["'+worker+'"]') > 0) { + var decreaseAmt = Math.min($SM.get('game.workers["'+worker+'"]') || 0, btn.data); Engine.log('decreasing ' + worker + ' by ' + decreaseAmt); - $SM.add('game.outside.workers[\''+worker+'\']', decreaseAmt * -1); - Outside.updateVillageIncome(); - Outside.updateWorkersView(); + $SM.add('game.workers["'+worker+'"]', decreaseAmt * -1); } }, @@ -430,9 +387,9 @@ var Outside = { population = $('
').attr('id', 'population').appendTo(village); } - for(var k in $SM.get('game.outside.buildings')) { + for(var k in $SM.get('game.buildings')) { if(k == 'trap') { - var numTraps = $SM.get('game.outside.buildings[\''+k+'\']'); + var numTraps = $SM.get('game.buildings["'+k+'"]'); var numBait = $SM.get('stores.bait', true); var traps = numTraps - numBait; traps = traps < 0 ? 0 : traps; @@ -442,14 +399,14 @@ var Outside = { if(Outside.checkWorker(k)) { Outside.updateWorkersView(); } - Outside.updateVillageRow(k, $SM.get('game.outside.buildings[\''+k+'\']'), village); + Outside.updateVillageRow(k, $SM.get('game.buildings["'+k+'"]'), village); } } - population.text('pop ' + $SM.get('game.outside.population') + '/' + this.getMaxPopulation()); + population.text('pop ' + $SM.get('game.population') + '/' + this.getMaxPopulation()); var hasPeeps; - if(Outside.numBuilding('hut') == 0) { + if($SM.get('game.buildings["hut"]', true) == 0) { hasPeeps = false; village.addClass('noHuts'); } else { @@ -490,10 +447,10 @@ var Outside = { if(typeof jobs == 'object') { for(var i = 0, len = jobs.length; i < len; i++) { var job = jobs[i]; - if(typeof $SM.get('game.outside.buildings[\''+name+'\']') == 'number' && - typeof $SM.get('game.outside.workers[\''+job+'\']') != 'number') { + if(typeof $SM.get('game.buildings["'+name+'"]') == 'number' && + typeof $SM.get('game.workers["'+job+'"]') != 'number') { Engine.log('adding ' + job + ' to the workers list') - $SM.set('game.outside.workers[\''+job+'\']', 0); + $SM.set('game.workers["'+job+'"]', 0); added = true; } } @@ -504,7 +461,7 @@ var Outside = { updateVillageIncome: function() { for(var worker in Outside._INCOME) { var income = Outside._INCOME[worker]; - var num = worker == 'gatherer' ? Outside.getNumGatherers() : $SM.get('game.outside.workers[\''+worker+'\']'); + var num = worker == 'gatherer' ? Outside.getNumGatherers() : $SM.get('game.workers["'+worker+'"]'); if(typeof num == 'number') { var stores = {}; if(num < 0) num = 0; @@ -533,7 +490,7 @@ var Outside = { updateTrapButton: function() { var btn = $('div#trapsButton'); - if(Outside.numBuilding('trap') > 0) { + if($SM.get('game.buildings["trap"]', true) > 0) { if(btn.length == 0) { new Button.Button({ id: 'trapsButton', @@ -553,7 +510,7 @@ var Outside = { }, setTitle: function() { - var numHuts = this.numBuilding('hut'); + var numHuts = $SM.get('game.buildings["hut"]', true); var title; if(numHuts == 0) { title = "A Silent Forest"; @@ -589,14 +546,14 @@ var Outside = { gatherWood: function() { Notifications.notify(Outside, "dry brush and dead branches litter the forest floor") - var gatherAmt = Outside.numBuilding('cart') > 0 ? 50 : 10; + var gatherAmt = $SM.get('game.buildings["cart"]', true) > 0 ? 50 : 10; $SM.add('stores.wood', gatherAmt); }, checkTraps: function() { var drops = {}; var msg = []; - var numTraps = Outside.numBuilding('trap'); + var numTraps = $SM.get('game.buildings["trap"]', true); var numBait = $SM.get('stores.bait', true); var numDrops = numTraps + (numBait < numTraps ? numBait : numTraps); for(var i = 0; i < numDrops; i++) { @@ -634,6 +591,11 @@ var Outside = { handleStateUpdates: function(e){ if(e.category == 'stores'){ Outside.updateVillage(); - } + } else if(e.stateName.indexOf('game.workers') == 0 + || e.stateName.indexOf('game.population') == 0){ + Outside.updateVillage(); + Outside.updateWorkersView(); + Outside.updateVillageIncome(); + }; } }; \ No newline at end of file diff --git a/script/path.js b/script/path.js index 22dde15..efbf081 100644 --- a/script/path.js +++ b/script/path.js @@ -104,7 +104,7 @@ var Path = { for(var k in $SM.get('character.perks')) { var id = 'perk_' + k.replace(' ', '-'); var r = $('#' + id); - if($SM.get('character.perks[\''+k+'\']') && r.length == 0) { + if($SM.get('character.perks["'+k+'"]') && r.length == 0) { r = $('
').attr('id', id).addClass('perkRow').appendTo(perks); $('
').addClass('row_key').text(k).appendTo(r); $('
').addClass('tooltip bottom right').text(Engine.Perks[k].desc).appendTo(r); @@ -130,11 +130,11 @@ var Path = { // Add the armour row var armour = "none"; - if($SM.get('stores[\'s armour\']', true) > 0) + if($SM.get('stores["s armour"]', true) > 0) armour = "steel"; - else if($SM.get('stores[\'i armour\']', true) > 0) + 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) { @@ -175,10 +175,10 @@ var Path = { for(var k in carryable) { var store = carryable[k]; - var have = $SM.get('stores[\''+k+'\']'); + var have = $SM.get('stores["'+k+'"]'); var num = Path.outfit[k]; num = typeof num == 'number' ? num : 0; - var numAvailable = $SM.get('stores[\''+k+'\']', true); + var numAvailable = $SM.get('stores["'+k+'"]', true); var row = $('div#outfit_row_' + k.replace(' ', '-'), outfit); if((store.type == 'tool' || store.type == 'weapon') && have > 0) { total += num * Path.getWeight(k); @@ -247,7 +247,7 @@ var Path = { $('
').addClass('dnManyBtn').appendTo(val).click([10], Path.decreaseSupply); $('
').addClass('clear').appendTo(row); - var numAvailable = $SM.get('stores[\''+name+'\']', true); + var numAvailable = $SM.get('stores["'+name+'"]', true); var tt = $('
').addClass('tooltip bottom right').appendTo(row); $('
').addClass('row_key').text('weight').appendTo(tt); $('
').addClass('row_val').text(Path.getWeight(name)).appendTo(tt); @@ -262,9 +262,9 @@ var Path = { Engine.log('increasing ' + supply + ' by up to ' + btn.data); var cur = Path.outfit[supply]; cur = typeof cur == 'number' ? cur : 0; - if(Path.getFreeSpace() >= Path.getWeight(supply) && cur < $SM.get('stores[\''+supply+'\']', true)) { + if(Path.getFreeSpace() >= Path.getWeight(supply) && cur < $SM.get('stores["'+supply+'"]', true)) { var maxExtraByWeight = Math.floor(Path.getFreeSpace() / Path.getWeight(supply)); - var maxExtraByStore = $SM.get('stores[\''+supply+'\']', true) - cur; + var maxExtraByStore = $SM.get('stores["'+supply+'"]', true) - cur; var maxExtraByBtn = btn.data; Path.outfit[supply] = cur + Math.min(maxExtraByBtn, Math.min(maxExtraByWeight, maxExtraByStore)); Path.updateOutfitting(); @@ -296,7 +296,7 @@ var Path = { embark: function() { for(var k in Path.outfit) { - $SM.add('stores[\''+k+'\']', -Path.outfit[k]); + $SM.add('stores["'+k+'"]', -Path.outfit[k]); } World.onArrival(); $('#outerSlider').animate({left: '-700px'}, 300); diff --git a/script/room.js b/script/room.js index 2f0f874..778201a 100644 --- a/script/room.js +++ b/script/room.js @@ -22,7 +22,7 @@ var Room = { maxMsg: "more traps won't help now", type: 'building', cost: function() { - var n = Outside.numBuilding('trap'); + var n = $SM.get('game.buildings["trap"]', true); return { 'wood': 10 + (n*10) }; @@ -48,7 +48,7 @@ var Room = { maxMsg: 'no more room for huts.', type: 'building', cost: function() { - var n = Outside.numBuilding('hut'); + var n = $SM.get('game.buildings["hut"]', true); return { 'wood': 100 + (n*50) }; @@ -765,13 +765,13 @@ var Room = { var id = "row_" + k.replace(' ', '-'); var row = $('div#' + id, location); - var num = $SM.get('stores[\''+k+'\']'); + var num = $SM.get('stores["'+k+'"]'); if(typeof num != 'number' || isNaN(num)) { // No idea how counts get corrupted, but I have reason to believe that they occassionally do. // Build a little fence around it! num = 0; - $SM.set('stores[\''+k+'\']', 0); + $SM.set('stores["'+k+'"]', 0); } @@ -834,7 +834,7 @@ var Room = { var tt = $('
').addClass('tooltip bottom right'); var storeName = el.attr('id').substring(4).replace('-', ' '); for(var incomeSource in $SM.get('income')) { - var income = $SM.get('income[\''+incomeSource+'\']'); + var income = $SM.get('income["'+incomeSource+'"]'); for(var store in income.stores) { if(store == storeName && income.stores[store] != 0) { $('
').addClass('row_key').text(incomeSource).appendTo(tt); @@ -854,7 +854,7 @@ var Room = { buy: function(buyBtn) { var thing = $(buyBtn).attr('buildThing'); var good = Room.TradeGoods[thing]; - var numThings = $SM.get('stores[\''+thing+'\']', true); + var numThings = $SM.get('stores["'+thing+'"]', true); if(numThings < 0) numThings = 0; if(good.maximum <= numThings) { return; @@ -863,7 +863,7 @@ var Room = { var storeMod = {}; var cost = good.cost(); for(var k in cost) { - var have = $SM.get('stores[\''+k+'\']', true); + var have = $SM.get('stores["'+k+'"]', true); if(have < cost[k]) { Notifications.notify(Room, "not enough " + k); return false; @@ -875,7 +875,7 @@ var Room = { Notifications.notify(Room, good.buildMsg); - $SM.add('stores[\''+thing+'\']', 1); + $SM.add('stores["'+thing+'"]', 1); if(thing == 'compass') { Path.openPath(); @@ -896,10 +896,10 @@ var Room = { case 'weapon': case 'tool': case 'upgrade': - numThings = $SM.get('stores[\''+thing+'\']', true); + numThings = $SM.get('stores["'+thing+'"]', true); break; case 'building': - numThings = Outside.numBuilding(thing); + numThings = $SM.get('game.buildings["'+thing+'"]', true); break; } @@ -911,7 +911,7 @@ var Room = { var storeMod = {}; var cost = craftable.cost(); for(var k in cost) { - var have = $SM.get('stores[\''+k+'\']', true); + var have = $SM.get('stores["'+k+'"]', true); if(have < cost[k]) { Notifications.notify(Room, "not enough " + k); return false; @@ -928,10 +928,10 @@ var Room = { case 'weapon': case 'upgrade': case 'tool': - $SM.add('stores[\''+thing+'\']', 1); + $SM.add('stores["'+thing+'"]', 1); break; case 'building': - Outside.addBuilding(thing, 1); + $SM.add('game.buildings["'+thing+'"]', 1); break; } }, @@ -946,7 +946,7 @@ var Room = { } if($SM.get('game.builder.level') < 4) return false; var craftable = Room.Craftables[thing]; - if(Room.needsWorkshop(craftable.type) && Outside.numBuilding('workshop') == 0) return false; + if(Room.needsWorkshop(craftable.type) && $SM.get('game.buildings["workshop"]', true) == 0) return false; var cost = craftable.cost(); // Show buttons if we have at least 1/2 the wood, and all other components have been seen. @@ -954,7 +954,7 @@ var Room = { return false; } for(var c in cost) { - if(!$SM.get('stores[\''+c+'\']')) { + if(!$SM.get('stores["'+c+'"]')) { return false; } } @@ -967,8 +967,8 @@ var Room = { buyUnlocked: function(thing) { if(Room.buttons[thing]) { return true; - } else if(Outside.numBuilding('trading post') > 0) { - if(thing == 'compass' || $SM.get('stores[\''+thing+'\']')) { + } else if($SM.get('game.buildings["trading post"]', true) > 0) { + if(thing == 'compass' || $SM.get('stores["'+thing+'"]')) { // Allow the purchase of stuff once you've seen it return true; } @@ -986,14 +986,14 @@ var Room = { var craftSection = $('#craftBtns'); var cNeedsAppend = false; - if(craftSection.length == 0 && Outside.numBuilding('workshop') > 0) { + if(craftSection.length == 0 && $SM.get('game.buildings["workshop"]', true) > 0) { craftSection = $('
').attr('id', 'craftBtns').css('opacity', 0); cNeedsAppend = true; } var buySection = $('#buyBtns'); var bNeedsAppend = false; - if(buySection.length == 0 && Outside.numBuilding('trading post') > 0) { + if(buySection.length == 0 && $SM.get('game.buildings["trading post"]', true) > 0) { buySection = $('
').attr('id', 'buyBtns').css('opacity', 0); bNeedsAppend = true; } @@ -1083,6 +1083,8 @@ var Room = { Room.updateBuildButtons(); } else if(e.category == 'income'){ Room.updateIncomeView(); - }; + } else if(e.stateName.indexOf('game.buildings') == 0){ + Room.updateBuildButtons(); + } } }; \ No newline at end of file diff --git a/script/ship.js b/script/ship.js index 00b1a4e..53639ed 100644 --- a/script/ship.js +++ b/script/ship.js @@ -103,11 +103,11 @@ var Ship = { }, reinforceHull: function() { - if($SM.get('stores[\'alien alloy\']', true) < Ship.ALLOY_PER_HULL) { + if($SM.get('stores["alien alloy"]', true) < Ship.ALLOY_PER_HULL) { Notifications.notify(Ship, "not enough alien alloy"); return false; } - $SM.add('stores[\'alien alloy\']', -Ship.ALLOY_PER_HULL); + $SM.add('stores["alien alloy"]', -Ship.ALLOY_PER_HULL); $SM.add('game.spaceShip.hull', 1); if($SM.get('game.spaceShip.hull') > 0) { Button.setDisabled($('#liftoffButton', Ship.panel), false); @@ -116,11 +116,11 @@ var Ship = { }, upgradeEngine: function() { - if($SM.get('stores[\'alien alloy\']', true) < Ship.ALLOY_PER_THRUSTER) { + if($SM.get('stores["alien alloy"]', true) < Ship.ALLOY_PER_THRUSTER) { Notifications.notify(Ship, "not enough alien alloy"); return false; } - $SM.add('stores[\'alien alloy\']', -Ship.ALLOY_PER_THRUSTER); + $SM.add('stores["alien alloy"]', -Ship.ALLOY_PER_THRUSTER); $SM.add('game.spaceShip.thrusters', 1) $('#engineRow .row_val', Ship.panel).text($SM.get('game.spaceShip.thrusters')); }, diff --git a/script/state_manager.js b/script/state_manager.js index 5057b87..bcd3d1d 100644 --- a/script/state_manager.js +++ b/script/state_manager.js @@ -47,7 +47,7 @@ var StateManager = { //create all parents and then set state createState: function(stateName, value) { - var words = stateName.split(/[.\[\]']+/); + var words = stateName.split(/[.\[\]'"]+/); var obj = State; var w = null; for(var i=0, len=words.length-1;i 0 && World.getDistance() >= 8) { + if(!$SM.get('stores["i armour"]', true) > 0 && World.getDistance() >= 8) { World.danger = true; return true; } - if(!$SM.get('stores[\'s armour\']', true) > 0 && World.getDistance() >= 18) { + if(!$SM.get('stores["s armour"]', true) > 0 && World.getDistance() >= 18) { World.danger = true; return true; } @@ -417,7 +417,7 @@ var World = { World.danger = false; return true; } - if(World.getDistance < 18 && $SM.get('stores[\'i armour\']', true) > 0) { + if(World.getDistance < 18 && $SM.get('stores["i armour"]', true) > 0) { World.danger = false; return true; } @@ -827,16 +827,16 @@ var World = { goHome: function() { // Home safe! Commit the changes. $SM.setM('game.world', World.state); - if(World.state.sulphurmine && Outside.numBuilding('sulphur mine') == 0) { - Outside.addBuilding('sulphur mine', 1); + if(World.state.sulphurmine && $SM.get('game.buildings["sulphur mine"]', true) == 0) { + $SM.add('game.buildings["sulphur mine"]', 1); Engine.event('progress', 'sulphur mine'); } - if(World.state.ironmine && Outside.numBuilding('iron mine') == 0) { - Outside.addBuilding('iron mine', 1); + if(World.state.ironmine && $SM.get('game.buildings["iron mine"]', true) == 0) { + $SM.add('game.buildings["iron mine"]', 1); Engine.event('progress', 'iron mine'); } - if(World.state.coalmine && Outside.numBuilding('coal mine') == 0) { - Outside.addBuilding('coal mine', 1); + if(World.state.coalmine && $SM.get('game.buildings["coal mine"]', true) == 0) { + $SM.add('game.buildings["coal mine"]', 1); Engine.event('progress', 'coal mine'); } if(World.state.ship && !$SM.get('features.location.spaceShip')) { @@ -852,7 +852,7 @@ var World = { } for(var k in Path.outfit) { - $SM.add('stores[\''+k+'\']', Path.outfit[k]); + $SM.add('stores["'+k+'"]', Path.outfit[k]); if(World.leaveItAtHome(k)) { Path.outfit[k] = 0; } @@ -869,11 +869,11 @@ var World = { }, getMaxHealth: function() { - if($SM.get('stores[\'s armour\']', true) > 0) { + if($SM.get('stores["s armour"]', true) > 0) { return World.BASE_HEALTH + 35; - } else if($SM.get('stores[\'i armour\']', true) > 0) { + } 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; @@ -887,7 +887,7 @@ var World = { }, getMaxWater: function() { - if($SM.get('stores[\'water tank\']', true) > 0) { + if($SM.get('stores["water tank"]', true) > 0) { return World.BASE_WATER + 50; } else if($SM.get('stores.cask', true) > 0) { return World.BASE_WATER + 20; From a8c6790d84876c007d958b4f5af853d02a64a211 Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Sat, 27 Jul 2013 12:25:15 -0600 Subject: [PATCH 09/13] bugfix set ship,world location to true on init --- script/ship.js | 3 +-- script/world.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/script/ship.js b/script/ship.js index 53639ed..3a1885f 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'); + $SM.set('features.location.spaceShip', true); $SM.setM('game.spaceShip', { hull: Ship.BASE_HULL, thrusters: Ship.BASE_THRUSTERS @@ -90,7 +90,6 @@ var Ship = { if(!$SM.get('game.spaceShip.seenShip')) { Notifications.notify(Ship, 'somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.'); $SM.set('game.spaceShip.seenShip', true); - Engine.saveGame(); } Engine.moveStoresView(null, transition_diff); diff --git a/script/world.js b/script/world.js index f165d78..6c95f6e 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'); + $SM.set('features.location.world', true); $SM.setM('game.world', { map: World.generateMap(), mask: World.newMask() From 36011b5b15baef8ec4b302a29f0ef68fcabfb9cd Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Sat, 27 Jul 2013 12:49:03 -0600 Subject: [PATCH 10/13] set version to 1.3, add code to update State from 1.2 to 1.3 --- script/engine.js | 2 +- script/state_manager.js | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/script/engine.js b/script/engine.js index 8944227..da24ec6 100644 --- a/script/engine.js +++ b/script/engine.js @@ -7,7 +7,7 @@ var Engine = { * That would be so elegant and awesome. */ SITE_URL: encodeURIComponent("http://adarkroom.doublespeakgames.com"), - VERSION: 1.2, + VERSION: 1.3, MAX_STORE: 99999999999999, SAVE_DISPLAY: 30 * 1000, diff --git a/script/state_manager.js b/script/state_manager.js index bcd3d1d..1befab2 100644 --- a/script/state_manager.js +++ b/script/state_manager.js @@ -233,6 +233,61 @@ var StateManager = { }; if(version == 1.2) { //StateManager added, so move data to new locations + $SM.remove('room.fire'); + $SM.remove('room.temperature'); + $SM.remove('room.buttons'); + if($SM.get('room')){ + $SM.set('features.location.room', true); + $SM.set('game.builder.level', $SM.get('room.builder')); + $SM.remove('room'); + }; + if($SM.get('outside')){ + $SM.set('features.location.outside', true); + $SM.set('game.population', $SM.get('outside.population')); + $SM.set('game.buildings', $SM.get('outside.buildings')); + $SM.set('game.workers', $SM.get('outside.workers')); + $SM.set('game.outside.seenForest', $SM.get('outside.seenForest')); + $SM.remove('outside'); + }; + if($SM.get('world')){ + $SM.set('features.location.world', true); + $SM.set('game.world.map', $SM.get('world.map')); + $SM.set('game.world.mask', $SM.get('world.mask')); + $SM.set('starved', $SM.get('character.starved', true)); + $SM.set('dehydrated', $SM.get('character.dehydrated', true)); + $SM.remove('world'); + $SM.remove('starved'); + $SM.remove('dehydrated'); + }; + if($SM.get('ship')){ + $SM.set('features.location.spaceShip', true); + $SM.set('game.spaceShip.hull', $SM.get('ship.hull', true)); + $SM.set('game.spaceShip.thrusters', $SM.get('ship.thrusters', true)); + $SM.set('game.spaceShip.seenWarning', $SM.get('ship.seenWarning')); + $SM.set('game.spaceShip.seenShip', $SM.get('ship.seenShip')); + $SM.remove('ship'); + }; + if($SM.get('punches')){ + $SM.set('character.punches', $SM.get('punches')); + $SM.remove('punches'); + }; + if($SM.get('perks')){ + $SM.set('character.perks', $SM.get('perks')); + $SM.remove('perks'); + }; + if($SM.get('thieves')){ + $SM.set('game.thieves', $SM.get('thieves')); + $SM.remove('thieves'); + }; + if($SM.get('stolen')){ + $SM.set('game.stolen', $SM.get('stolen')); + $SM.remove('stolen'); + }; + if($SM.get('cityCleared')){ + $SM.set('character.cityCleared', $SM.get('cityCleared')); + $SM.remove('cityCleared'); + }; + $SM.set('version', 1.3); }; }, From 6561e88f9f9d0066e296b223dfb6207d61e692fb Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Sat, 27 Jul 2013 17:21:30 -0600 Subject: [PATCH 11/13] lots of bugfixes - bugfix Engine.startThieves call changed to $SM call - bugfix $SM.remove not deleting state - bugfix workaround for empty string when creating states For some reason splitting "state.sub.sub2["sub3"]" will result in empty strings whereas "state.sub.sub2[\'sub3\']" didn't. Maybe a javascript regex quirk? Had to add a loop to remove '' from the split string array. - modified collectIncome so that only one update event fires for the whole function, no event if no income was added. - modified updateBuildButtons so that buttons would show up if the building had already been built. changed check to be wood != undefined Also changed room to display store values of 0 instead of removing the row. It was distracting to have the values shift up and down when tightly managing a resource. If you haven't seen a resource yet, it still doesn't show up. --- script/engine.js | 2 +- script/room.js | 16 +++++++++++----- script/state_manager.js | 20 ++++++++++++++++---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/script/engine.js b/script/engine.js index da24ec6..f28270b 100644 --- a/script/engine.js +++ b/script/engine.js @@ -279,7 +279,7 @@ var Engine = { var diff = Math.abs(panelIndex - currentIndex); slider.animate({left: -(panelIndex * 700) + 'px'}, 300 * diff); - if($SM.get('stores.wood')) { + if($SM.get('stores.wood') != undefined) { // FIXME Why does this work if there's an animation queue...? stores.animate({right: -(panelIndex * 700) + 'px'}, 300 * diff); } diff --git a/script/room.js b/script/room.js index 778201a..3bbe2ed 100644 --- a/script/room.js +++ b/script/room.js @@ -777,7 +777,7 @@ var Room = { // thieves? if(typeof $SM.get('game.thieves') == 'undefined' && num > 5000 && $SM.get('features.location.world')) { - Engine.startThieves(); + $SM.startThieves(); } if(row.length == 0 && num > 0) { @@ -799,10 +799,8 @@ var Room = { row.insertAfter(location.find('#row_' + curPrev.replace(' ', '-'))); } newRow = true; - } else if(num> 0){ + } else if(num>= 0){ $('div#' + row.attr('id') + ' > div.row_val', location).text(Math.floor(num)); - } else if(num == 0) { - row.remove(); } } @@ -949,6 +947,11 @@ var Room = { if(Room.needsWorkshop(craftable.type) && $SM.get('game.buildings["workshop"]', true) == 0) return false; var cost = craftable.cost(); + //show button if one has already been built + if($SM.get('game.buildings["'+thing+'"]') > 0){ + Room.buttons[thing] = true; + return true; + } // Show buttons if we have at least 1/2 the wood, and all other components have been seen. if($SM.get('stores.wood', true) < cost['wood'] * 0.5) { return false; @@ -960,7 +963,10 @@ var Room = { } Room.buttons[thing] = true; - Notifications.notify(Room, craftable.availableMsg); + //don't notify if it has already been built before + if(!$SM.get('game.buildings["'+thing+'"]')){ + Notifications.notify(Room, craftable.availableMsg); + } return true; }, diff --git a/script/state_manager.js b/script/state_manager.js index 1befab2..0495e19 100644 --- a/script/state_manager.js +++ b/script/state_manager.js @@ -48,6 +48,13 @@ var StateManager = { //create all parents and then set state createState: function(stateName, value) { var words = stateName.split(/[.\[\]'"]+/); + //for some reason there are sometimes empty strings + for (var i = 0; i < words.length; i++) { + if (words[i] == '') { + words.splice(i, 1); + i--; + } + }; var obj = State; var w = null; for(var i=0, len=words.length-1;i Date: Sat, 27 Jul 2013 17:22:25 -0600 Subject: [PATCH 12/13] turned off debug --- script/engine.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/engine.js b/script/engine.js index f28270b..2c6d3b1 100644 --- a/script/engine.js +++ b/script/engine.js @@ -63,8 +63,8 @@ var Engine = { options: { state: null, - debug: true, - log: true + debug: false, + log: false }, init: function(options) { From bb84eafca64ffb219fac342b6030fc0d8cfad721 Mon Sep 17 00:00:00 2001 From: LucidCrux Date: Sat, 27 Jul 2013 18:12:00 -0600 Subject: [PATCH 13/13] re-enable jQuery from google --- index.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index e1fe8cc..719d16b 100644 --- a/index.html +++ b/index.html @@ -15,9 +15,8 @@ - - + +