diff --git a/src/js/app/index.js b/src/js/app/index.js index cc135596..96326f49 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -13,7 +13,6 @@ var events = _.clone(Backbone.Events); var commandUI; var sandbox; var eventBaton; -var levelArbiter; var levelDropdown; /////////////////////////////////////////////////////////////////////// @@ -30,13 +29,11 @@ var init = function() { **/ var Sandbox = require('../sandbox/').Sandbox; var EventBaton = require('../util/eventBaton').EventBaton; - var LevelArbiter = require('../level/arbiter').LevelArbiter; var LevelDropdownView = require('../views/levelDropdownView').LevelDropdownView; eventBaton = new EventBaton(); commandUI = new CommandUI(); sandbox = new Sandbox(); - levelArbiter = new LevelArbiter(); levelDropdown = new LevelDropdownView({ wait: true }); @@ -304,10 +301,6 @@ exports.getCommandUI = function() { return commandUI; }; -exports.getLevelArbiter = function() { - return levelArbiter; -}; - exports.getLevelDropdown = function() { return levelDropdown; }; diff --git a/src/js/level/arbiter.js b/src/js/level/arbiter.js deleted file mode 100644 index aee13875..00000000 --- a/src/js/level/arbiter.js +++ /dev/null @@ -1,163 +0,0 @@ -var _ = require('underscore'); -var Backbone = require('backbone'); - -// Each level is part of a "sequence;" levels within -// a sequence proceed in order. -var levelSequences = require('../../levels').levelSequences; -var sequenceInfo = require('../../levels').sequenceInfo; - -var Main = require('../app'); - -function LevelArbiter() { - this.levelMap = {}; - this.levelSequences = levelSequences; - this.sequences = []; - this.init(); - - var solvedMap; - try { - solvedMap = JSON.parse(localStorage.getItem('solvedMap') || '{}'); - } catch (e) { - console.warn('local storage failed', e); - // throw e; - } - this.solvedMap = solvedMap || {}; - - Main.getEvents().on('levelSolved', this.levelSolved, this); -} - -LevelArbiter.prototype.init = function() { - _.each(this.levelSequences, function(levels, levelSequenceName) { - this.sequences.push(levelSequenceName); - if (!levels || !levels.length) { - throw new Error('no empty sequences allowed'); - } - - // for this particular sequence... - _.each(levels, function(level, index) { - this.validateLevel(level); - - var id = levelSequenceName + String(index + 1); - var compiledLevel = _.extend( - {}, - level, - { - index: index, - id: id, - sequenceName: levelSequenceName - } - ); - - // update our internal data - this.levelMap[id] = compiledLevel; - this.levelSequences[levelSequenceName][index] = compiledLevel; - }, this); - }, this); -}; - -LevelArbiter.prototype.isLevelSolved = function(id) { - if (!this.levelMap[id]) { - throw new Error('that level doesnt exist!'); - } - return Boolean(this.solvedMap[id]); -}; - -LevelArbiter.prototype.levelSolved = function(id) { - // called without an id when we reset solved status - if (!id) { return; } - - this.solvedMap[id] = true; - this.syncToStorage(); -}; - -LevelArbiter.prototype.resetSolvedMap = function() { - this.solvedMap = {}; - this.syncToStorage(); - Main.getEvents().trigger('levelSolved'); -}; - -LevelArbiter.prototype.syncToStorage = function() { - try { - localStorage.setItem('solvedMap', JSON.stringify(this.solvedMap)); - } catch (e) { - console.warn('local storage fialed on set', e); - } -}; - -LevelArbiter.prototype.validateLevel = function(level) { - level = level || {}; - var requiredFields = [ - 'name', - 'goalTreeString', - //'description', - 'solutionCommand' - ]; - - var optionalFields = [ - 'hint', - 'disabledMap', - 'startTree' - ]; - - _.each(requiredFields, function(field) { - if (level[field] === undefined) { - console.log(level); - throw new Error('I need this field for a level: ' + field); - } - }); -}; - -LevelArbiter.prototype.getSequenceToLevels = function() { - return this.levelSequences; -}; - -LevelArbiter.prototype.getSequences = function() { - return _.keys(this.levelSequences); -}; - -LevelArbiter.prototype.getLevelsInSequence = function(sequenceName) { - if (!this.levelSequences[sequenceName]) { - throw new Error('that sequecne name ' + sequenceName + 'does not exist'); - } - return this.levelSequences[sequenceName]; -}; - -LevelArbiter.prototype.getSequenceInfo = function(sequenceName) { - return sequenceInfo[sequenceName]; -}; - -LevelArbiter.prototype.getLevel = function(id) { - return this.levelMap[id]; -}; - -LevelArbiter.prototype.getNextLevel = function(id) { - if (!this.levelMap[id]) { - console.warn('that level doesnt exist!!!'); - return null; - } - - // meh, this method could be better. It's a tradeoff between - // having the sequence structure be really simple JSON - // and having no connectivity information between levels, which means - // you have to build that up yourself on every query - var level = this.levelMap[id]; - var sequenceName = level.sequenceName; - var sequence = this.levelSequences[sequenceName]; - - var nextIndex = level.index + 1; - if (nextIndex < sequence.length) { - return sequence[nextIndex]; - } - - var nextSequenceIndex = this.sequences.indexOf(sequenceName) + 1; - if (nextSequenceIndex < this.sequences.length) { - var nextSequenceName = this.sequences[nextSequenceIndex]; - return this.levelSequences[nextSequenceName][0]; - } - - // they finished the last level! - return null; -}; - -exports.LevelArbiter = LevelArbiter; - diff --git a/src/js/level/builder.js b/src/js/level/builder.js index febb847d..cc2698db 100644 --- a/src/js/level/builder.js +++ b/src/js/level/builder.js @@ -11,6 +11,7 @@ var Visualization = require('../visuals/visualization').Visualization; var ParseWaterfall = require('../level/parseWaterfall').ParseWaterfall; var Level = require('../level').Level; var LocaleStore = require('../stores/LocaleStore'); +var LevelStore = require('../stores/LevelStore'); var Command = require('../models/commandModel').Command; var GitShim = require('../git/gitShim').GitShim; @@ -54,7 +55,7 @@ var LevelBuilder = Level.extend({ // if we are editing a level our behavior is a bit different var editLevelJSON; if (options.editLevel) { - editLevelJSON = Main.getLevelArbiter().getLevel(options.editLevel); + LevelStore.getLevel(options.editLevel); options.level = editLevelJSON; } diff --git a/src/js/level/index.js b/src/js/level/index.js index b90d8515..0ad35029 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -10,6 +10,7 @@ var Errors = require('../util/errors'); var Sandbox = require('../sandbox/').Sandbox; var GlobalStateActions = require('../actions/GlobalStateActions'); var LevelActions = require('../actions/LevelActions'); +var LevelStore = require('../stores/LevelStore'); var Visualization = require('../visuals/visualization').Visualization; var DisabledMap = require('../level/disabledMap').DisabledMap; var GitShim = require('../git/gitShim').GitShim; @@ -414,14 +415,13 @@ var Level = Sandbox.extend({ levelSolved: function(defer) { this.solved = true; if (!this.isShowingSolution) { - Main.getEvents().trigger('levelSolved', this.level.id); LevelActions.setLevelSolved(this.level.id); log.levelSolved(this.getEnglishName()); } this.hideGoal(); - var nextLevel = Main.getLevelArbiter().getNextLevel(this.level.id); + var nextLevel = LevelStore.getNextLevel(this.level.id); var numCommands = this.gitCommandsIssued.length; var best = this.getNumSolutionCommands(); diff --git a/src/js/sandbox/index.js b/src/js/sandbox/index.js index e484c443..3b798ae3 100644 --- a/src/js/sandbox/index.js +++ b/src/js/sandbox/index.js @@ -13,6 +13,8 @@ var ParseWaterfall = require('../level/parseWaterfall').ParseWaterfall; var DisabledMap = require('../level/disabledMap').DisabledMap; var Command = require('../models/commandModel').Command; var GitShim = require('../git/gitShim').GitShim; +var LevelActions = require('../actions/LevelActions'); +var LevelStore = require('../stores/LevelStore'); var Views = require('../views'); var ModalTerminal = Views.ModalTerminal; @@ -152,7 +154,7 @@ var Sandbox = Backbone.View.extend({ startLevel: function(command, deferred) { var regexResults = command.get('regexResults') || []; var desiredID = regexResults[1] || ''; - var levelJSON = Main.getLevelArbiter().getLevel(desiredID); + var levelJSON = LevelStore.getLevel(desiredID); // handle the case where that level is not found... if (!levelJSON) { @@ -224,7 +226,7 @@ var Sandbox = Backbone.View.extend({ }, resetSolved: function(command, deferred) { - Main.getLevelArbiter().resetSolvedMap(); + LevelActions.resetLevelsSolved(); command.addWarning( intl.str('solved-map-reset') ); diff --git a/src/js/util/debug.js b/src/js/util/debug.js index a87e564c..15e614db 100644 --- a/src/js/util/debug.js +++ b/src/js/util/debug.js @@ -31,7 +31,6 @@ var toGlobalize = { Markdown: require('markdown'), LevelDropdownView: require('../views/levelDropdownView'), BuilderViews: require('../views/builderViews'), - LevelArbiter: require('../level/arbiter'), Util: require('../util/index'), Intl: require('../intl') }; diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index 2b7354fc..e852cfb4 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -9,6 +9,7 @@ var intl = require('../intl'); var log = require('../log'); var KeyboardListener = require('../util/keyboard').KeyboardListener; var Main = require('../app'); +var LevelStore = require('../stores/LevelStore'); var ModalTerminal = require('../views').ModalTerminal; var ContainedBase = require('../views').ContainedBase; @@ -62,8 +63,8 @@ var LevelDropdownView = ContainedBase.extend({ wait: true }); - this.sequences = Main.getLevelArbiter().getSequences(); - this.sequenceToLevels = Main.getLevelArbiter().getSequenceToLevels(); + this.sequences = LevelStore.getSequences(); + this.sequenceToLevels = LevelStore.getSequenceToLevels(); this.container = new ModalTerminal({ title: intl.str('select-a-level') @@ -76,9 +77,10 @@ var LevelDropdownView = ContainedBase.extend({ LocaleStore.subscribe(function() { that.render.apply(that); }); + LevelStore.subscribe(function() { + that.render(); + }); this.render(); - - Main.getEvents().on('resetMapSolved', this.render, this); if (!options.wait) { this.show(); } @@ -246,7 +248,7 @@ var LevelDropdownView = ContainedBase.extend({ }, getIndexForID: function(id) { - return Main.getLevelArbiter().getLevel(id).index; + return LevelStore.getLevel(id).index; }, selectFirst: function() { @@ -322,7 +324,7 @@ var LevelDropdownView = ContainedBase.extend({ 'commandSubmitted', 'level ' + id ); - var level = Main.getLevelArbiter().getLevel(id); + var level = LevelStore.getLevel(id); var name = level.name.en_US; log.levelSelected(name); } @@ -360,8 +362,8 @@ var SeriesView = BaseView.extend({ initialize: function(options) { this.name = options.name || 'intro'; this.navEvents = options.navEvents; - this.info = Main.getLevelArbiter().getSequenceInfo(this.name); - this.levels = Main.getLevelArbiter().getLevelsInSequence(this.name); + this.info = LevelStore.getSequenceInfo(this.name); + this.levels = LevelStore.getLevelsInSequence(this.name); this.levelIDs = []; _.each(this.levels, function(level) { @@ -386,7 +388,7 @@ var SeriesView = BaseView.extend({ // property changing but it's the 11th hour... var toLoop = this.$('div.levelIcon').each(function(index, el) { var id = $(el).attr('data-id'); - $(el).toggleClass('solved', Main.getLevelArbiter().isLevelSolved(id)); + $(el).toggleClass('solved', LevelStore.isLevelSolved(id)); }); }, @@ -410,7 +412,7 @@ var SeriesView = BaseView.extend({ }, updateAboutForLevelID: function(id) { - var level = Main.getLevelArbiter().getLevel(id); + var level = LevelStore.getLevel(id); this.setAbout(intl.getName(level)); },