From 903b537fda44c3e0d4b0089e2b7362a5a243fdd6 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sat, 5 Jan 2013 22:07:50 -0800 Subject: [PATCH] levels starting --- build/bundle.js | 179 ++++++++++++++++++++++++--- src/index.html | 2 +- src/js/level/arbiter.js | 63 ++++++++++ src/js/level/index.js | 13 +- src/js/views/gitDemonstrationView.js | 12 ++ src/js/views/index.js | 2 +- src/levels/intro/1.js | 7 ++ src/levels/intro/2.js | 7 ++ src/levels/rebase/1.js | 7 ++ src/levels/rebase/2.js | 7 ++ 10 files changed, 270 insertions(+), 29 deletions(-) create mode 100644 src/js/views/gitDemonstrationView.js create mode 100644 src/levels/intro/1.js create mode 100644 src/levels/intro/2.js create mode 100644 src/levels/rebase/1.js create mode 100644 src/levels/rebase/2.js diff --git a/build/bundle.js b/build/bundle.js index 53efafe5..9cb6a4b1 100644 --- a/build/bundle.js +++ b/build/bundle.js @@ -6423,15 +6423,15 @@ var Level = Sandbox.extend({ }, initName: function(options) { - this.levelName = options.levelName; - this.levelID = options.levelID; - if (!this.levelName || !this.levelID) { - this.levelName = 'Rebase Classic'; + this.name = options.name; + this.id = options.id; + if (!this.name || !this.id) { + this.name = 'Rebase Classic'; console.warn('REALLY BAD FORM need ids and names'); } this.levelToolbar = new LevelToolbar({ - levelName: this.levelName + name: this.name }); }, @@ -6469,9 +6469,6 @@ var Level = Sandbox.extend({ }, initVisualization: function(options) { - if (!options.level.startTree) { - console.warn('No start tree specified for this level!!! using default...'); - } this.mainVis = new Visualization({ el: options.el || this.getDefaultVisEl(), treeString: options.level.startTree @@ -9807,7 +9804,7 @@ var LevelToolbar = BaseView.extend({ initialize: function(options) { options = options || {}; this.JSON = { - levelName: options.levelName || 'Some level! (unknown name)' + name: options.name || 'Some level! (unknown name)' }; this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]); @@ -15454,6 +15451,46 @@ require.define("/src/js/util/mock.js",function(require,module,exports,__dirname, }; +}); + +require.define("/src/levels/intro/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); + +require.define("/src/levels/intro/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); + +require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); + +require.define("/src/levels/rebase/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + }); require.define("/src/js/git/headless.js",function(require,module,exports,__dirname,__filename,process,global){var _ = require('underscore'); @@ -17849,7 +17886,70 @@ exports.TreeCompare = TreeCompare; }); require("/src/js/git/treeCompare.js"); -require.define("/src/js/level/arbiter.js",function(require,module,exports,__dirname,__filename,process,global){ +require.define("/src/js/level/arbiter.js",function(require,module,exports,__dirname,__filename,process,global){var _ = require('underscore'); +var Backbone = require('backbone'); + +// Each level is part of a "sequence;" levels within +// a sequence proceed in order. + +var levelSequences = { + intro: [ + require('../../levels/intro/1'), + require('../../levels/intro/2') + ], + rebase: [ + require('../../levels/rebase/1'), + require('../../levels/rebase/2') + ] +}; + +function LevelArbiter() { + this.levelMap = {}; + this.init(); +} + +LevelArbiter.prototype.init = function() { + + var previousLevelID; + _.each(levelSequences, function(levels, levelSequenceName) { + // for this particular sequence... + _.each(levels, function(level) { + this.validateLevel(level); + this.levelMap[level.id] = level; + + // build up the chaining between levels + if (previousLevelID) { + this.levelMap[previousLevelID]['nextLevelID'] = level.id; + } + previousLevelID = level.id; + }, this); + }, this); +}; + +LevelArbiter.prototype.validateLevel = function(level) { + level = level || {}; + var requiredFields = [ + 'id', + 'name', + 'goalTree', + 'solutionCommand' + ]; + + var optionalFields = [ + 'hint', + 'disabledMap' + ]; + + _.each(requiredFields, function(field) { + if (level[field] === undefined) { + throw new Error('I need this field for a level: ' + field); + } + }) +}; + +exports.LevelArbiter = LevelArbiter; + + }); require("/src/js/level/arbiter.js"); @@ -17972,15 +18072,15 @@ var Level = Sandbox.extend({ }, initName: function(options) { - this.levelName = options.levelName; - this.levelID = options.levelID; - if (!this.levelName || !this.levelID) { - this.levelName = 'Rebase Classic'; + this.name = options.name; + this.id = options.id; + if (!this.name || !this.id) { + this.name = 'Rebase Classic'; console.warn('REALLY BAD FORM need ids and names'); } this.levelToolbar = new LevelToolbar({ - levelName: this.levelName + name: this.name }); }, @@ -18018,9 +18118,6 @@ var Level = Sandbox.extend({ }, initVisualization: function(options) { - if (!options.level.startTree) { - console.warn('No start tree specified for this level!!! using default...'); - } this.mainVis = new Visualization({ el: options.el || this.getDefaultVisEl(), treeString: options.level.startTree @@ -20140,7 +20237,7 @@ var LevelToolbar = BaseView.extend({ initialize: function(options) { options = options || {}; this.JSON = { - levelName: options.levelName || 'Some level! (unknown name)' + name: options.name || 'Some level! (unknown name)' }; this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]); @@ -23000,4 +23097,48 @@ exports.Visualization = Visualization; }); require("/src/js/visuals/visualization.js"); +require.define("/src/levels/intro/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); +require("/src/levels/intro/1.js"); + +require.define("/src/levels/intro/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); +require("/src/levels/intro/2.js"); + +require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); +require("/src/levels/rebase/1.js"); + +require.define("/src/levels/rebase/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; + +}); +require("/src/levels/rebase/2.js"); + })(); diff --git a/src/index.html b/src/index.html index 12e4775b..4fb38aa6 100644 --- a/src/index.html +++ b/src/index.html @@ -96,7 +96,7 @@ Level - <%= levelName %> + <%= name %> diff --git a/src/js/level/arbiter.js b/src/js/level/arbiter.js index e69de29b..7924f544 100644 --- a/src/js/level/arbiter.js +++ b/src/js/level/arbiter.js @@ -0,0 +1,63 @@ +var _ = require('underscore'); +var Backbone = require('backbone'); + +// Each level is part of a "sequence;" levels within +// a sequence proceed in order. + +var levelSequences = { + intro: [ + require('../../levels/intro/1'), + require('../../levels/intro/2') + ], + rebase: [ + require('../../levels/rebase/1'), + require('../../levels/rebase/2') + ] +}; + +function LevelArbiter() { + this.levelMap = {}; + this.init(); +} + +LevelArbiter.prototype.init = function() { + + var previousLevelID; + _.each(levelSequences, function(levels, levelSequenceName) { + // for this particular sequence... + _.each(levels, function(level) { + this.validateLevel(level); + this.levelMap[level.id] = level; + + // build up the chaining between levels + if (previousLevelID) { + this.levelMap[previousLevelID]['nextLevelID'] = level.id; + } + previousLevelID = level.id; + }, this); + }, this); +}; + +LevelArbiter.prototype.validateLevel = function(level) { + level = level || {}; + var requiredFields = [ + 'id', + 'name', + 'goalTree', + 'solutionCommand' + ]; + + var optionalFields = [ + 'hint', + 'disabledMap' + ]; + + _.each(requiredFields, function(field) { + if (level[field] === undefined) { + throw new Error('I need this field for a level: ' + field); + } + }) +}; + +exports.LevelArbiter = LevelArbiter; + diff --git a/src/js/level/index.js b/src/js/level/index.js index 34bbe2d5..f81c4721 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -43,15 +43,15 @@ var Level = Sandbox.extend({ }, initName: function(options) { - this.levelName = options.levelName; - this.levelID = options.levelID; - if (!this.levelName || !this.levelID) { - this.levelName = 'Rebase Classic'; + this.name = options.name; + this.id = options.id; + if (!this.name || !this.id) { + this.name = 'Rebase Classic'; console.warn('REALLY BAD FORM need ids and names'); } this.levelToolbar = new LevelToolbar({ - levelName: this.levelName + name: this.name }); }, @@ -89,9 +89,6 @@ var Level = Sandbox.extend({ }, initVisualization: function(options) { - if (!options.level.startTree) { - console.warn('No start tree specified for this level!!! using default...'); - } this.mainVis = new Visualization({ el: options.el || this.getDefaultVisEl(), treeString: options.level.startTree diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js new file mode 100644 index 00000000..ff0de9ae --- /dev/null +++ b/src/js/views/gitDemonstrationView.js @@ -0,0 +1,12 @@ +var _ = require('underscore'); +var Q = require('q'); +// horrible hack to get localStorage Backbone plugin +var Backbone = (!require('../util').isBrowser()) ? require('backbone') : window.Backbone; + +var ModalTerminal = require('../views').ModalTerminal; +var ContainedBase = require('../views').ContainedBase; +var ConfirmCancelView = require('../views').ConfirmCancelView; +var LeftRightView = require('../views').LeftRightView; +var ModalAlert = require('../views').ModalAlert; +var KeyboardListener = require('../util/keyboard').KeyboardListener; + diff --git a/src/js/views/index.js b/src/js/views/index.js index 309f3af0..3e467f44 100644 --- a/src/js/views/index.js +++ b/src/js/views/index.js @@ -348,7 +348,7 @@ var LevelToolbar = BaseView.extend({ initialize: function(options) { options = options || {}; this.JSON = { - levelName: options.levelName || 'Some level! (unknown name)' + name: options.name || 'Some level! (unknown name)' }; this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]); diff --git a/src/levels/intro/1.js b/src/levels/intro/1.js new file mode 100644 index 00000000..1024f222 --- /dev/null +++ b/src/levels/intro/1.js @@ -0,0 +1,7 @@ +exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; diff --git a/src/levels/intro/2.js b/src/levels/intro/2.js new file mode 100644 index 00000000..1024f222 --- /dev/null +++ b/src/levels/intro/2.js @@ -0,0 +1,7 @@ +exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; diff --git a/src/levels/rebase/1.js b/src/levels/rebase/1.js new file mode 100644 index 00000000..1024f222 --- /dev/null +++ b/src/levels/rebase/1.js @@ -0,0 +1,7 @@ +exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +}; diff --git a/src/levels/rebase/2.js b/src/levels/rebase/2.js new file mode 100644 index 00000000..1024f222 --- /dev/null +++ b/src/levels/rebase/2.js @@ -0,0 +1,7 @@ +exports = { + id: 'intro1', + name: 'Introduction #1', + goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', + solutionCommand: 'git checkout -b win; git commit', + hint: 'Try checking out a branch named after Charlie Sheen' +};