diff --git a/app/lib/AudioPlayer.coffee b/app/lib/AudioPlayer.coffee index 773a72d35..9d7143192 100644 --- a/app/lib/AudioPlayer.coffee +++ b/app/lib/AudioPlayer.coffee @@ -111,9 +111,6 @@ class AudioPlayer extends CocoClass @soundsToPlayWhenLoaded[name] = audioOptions.volume audioOptions = @applyPanning audioOptions, pos if @camera and not @camera.destroyed and pos instance = createjs.Sound.play name, audioOptions - # For some reason, individual sound volume control doesn't work any more. - # I tried updating to SoundJS NEXT on 2014-09-10, but couldn't get any sounds to play with that one. - #console.log 'got instance with volume', instance.volume, instance._volume, instance.gainNode?.gain.value instance hasLoadedSound: (filename, name) -> diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee index b39d7f0e4..d3a280be5 100644 --- a/app/lib/simulator/Simulator.coffee +++ b/app/lib/simulator/Simulator.coffee @@ -10,7 +10,7 @@ module.exports = class Simulator extends CocoClass @options ?= {} _.extend @, Backbone.Events @trigger 'statusUpdate', 'Starting simulation!' - @retryDelayInSeconds = 10 + @retryDelayInSeconds = 2 @taskURL = '/queue/scoring' @simulatedByYou = 0 @god = new God maxAngels: 1, workerCode: @options.workerCode, headless: true # Start loading worker. @@ -85,7 +85,11 @@ module.exports = class Simulator extends CocoClass processSingleGameResults: (simulationResults) -> return console.error "Weird, we destroyed the Simulator before it processed results?" if @destroyed - taskResults = @formTaskResultsObject simulationResults + try + taskResults = @formTaskResultsObject simulationResults + catch error + console.log "Failed to form task results:", error + return @cleanupAndSimulateAnotherTask() console.log 'Processing results:', taskResults humanSessionRank = taskResults.sessions[0].metrics.rank ogreSessionRank = taskResults.sessions[1].metrics.rank @@ -237,7 +241,11 @@ module.exports = class Simulator extends CocoClass processResults: (simulationResults) -> return console.error "Weird, we destroyed the Simulator before it processed results?" if @destroyed - taskResults = @formTaskResultsObject simulationResults + try + taskResults = @formTaskResultsObject simulationResults + catch error + console.log "Failed to form task results:", error + return @cleanupAndSimulateAnotherTask() unless taskResults.taskID console.error "*** Error: taskResults has no taskID ***\ntaskResults:", taskResults @cleanupAndSimulateAnotherTask() diff --git a/app/lib/surface/MusicPlayer.coffee b/app/lib/surface/MusicPlayer.coffee index 383f7f79b..b218ea05b 100644 --- a/app/lib/surface/MusicPlayer.coffee +++ b/app/lib/surface/MusicPlayer.coffee @@ -27,7 +27,7 @@ module.exports = class MusicPlayer extends CocoClass onPlayMusic: (e) -> return if application.isIPadApp # Hard to measure, but just guessing this will save memory. src = e.file - src = "/file#{e.file}#{AudioPlayer.ext}" + src = "/file#{src}#{AudioPlayer.ext}" if (not e.file) or src is @currentMusic?.src if e.play then @restartCurrentMusic() else @fadeOutCurrentMusic() return diff --git a/app/models/User.coffee b/app/models/User.coffee index 09157abd1..a3d6e3aeb 100644 --- a/app/models/User.coffee +++ b/app/models/User.coffee @@ -144,7 +144,7 @@ module.exports = class User extends CocoModel @subscribeCopyGroup = switch group when 0, 1, 2 then 'original' when 3, 4, 5 then 'new' - if /^en/.test(@get('preferredLanguage')) and not me.isAdmin() + if (not @get('preferredLanguage') or /^en/.test(@get('preferredLanguage'))) and not me.isAdmin() application.tracker.identify subscribeCopyGroup: @subscribeCopyGroup else @subscribeCopyGroup = 'original' diff --git a/app/styles/play/world-map-view.sass b/app/styles/play/world-map-view.sass index 64a8eec6b..d96b8dda6 100644 --- a/app/styles/play/world-map-view.sass +++ b/app/styles/play/world-map-view.sass @@ -96,6 +96,7 @@ $gameControlMargin: 30px .map-background width: 100% height: 100% + @include user-select(none) .level, .level-shadow position: absolute diff --git a/app/templates/teachers.jade b/app/templates/teachers.jade index 1ab5e7608..90fdf247f 100644 --- a/app/templates/teachers.jade +++ b/app/templates/teachers.jade @@ -48,7 +48,7 @@ block content strong Variables | - adds the skill of referencing values that change over time. - p Students may continue past level 12, depending on their speed and interest, to learn two additional concepts in later levels: + p Students may continue past level 20, depending on their speed and interest, to learn two additional concepts in later levels: ol li strong Conditional logic diff --git a/app/views/core/CocoView.coffee b/app/views/core/CocoView.coffee index 0273cb245..593c79e07 100644 --- a/app/views/core/CocoView.coffee +++ b/app/views/core/CocoView.coffee @@ -161,7 +161,7 @@ module.exports = class CocoView extends Backbone.View else @warnConnectionError() return _.delay (=> r.load()), 3000 - + @$el.find('.loading-container .errors').append(loadingErrorTemplate({ status: r.jqxhr?.status name: r.name @@ -173,7 +173,7 @@ module.exports = class CocoView extends Backbone.View warnConnectionError: -> msg = $.i18n.t 'loading_error.connection_failure', defaultValue: 'Connection failed.' noty text: msg, layout: 'center', type: 'error', killer: true, timeout: 3000 - + onRetryResource: (e) -> res = @supermodel.getResource($(e.target).data('resource-index')) # different views may respond to this call, and not all have the resource to reload @@ -425,6 +425,9 @@ module.exports = class CocoView extends Backbone.View isIPadBrowser: -> navigator?.userAgent?.indexOf('iPad') isnt -1 + isFirefox: -> + navigator.userAgent.toLowerCase().indexOf('firefox') isnt -1 + initSlider: ($el, startValue, changeCallback) -> slider = $el.slider({animate: 'fast'}) slider.slider('value', startValue) diff --git a/app/views/ladder/SimulateTabView.coffee b/app/views/ladder/SimulateTabView.coffee index 509f76eda..79076af06 100644 --- a/app/views/ladder/SimulateTabView.coffee +++ b/app/views/ladder/SimulateTabView.coffee @@ -27,6 +27,8 @@ module.exports = class SimulateTabView extends CocoView onLoaded: -> super() @render() + if document.location.hash is '#simulate' and not @simulator + @startSimulating() getRenderData: -> ctx = super() @@ -43,9 +45,18 @@ module.exports = class SimulateTabView extends CocoView onSimulateButtonClick: (e) -> application.tracker?.trackEvent 'Simulate Button Click', {} + @startSimulating + + startSimulating: -> + @simulationPageRefreshTimeout = _.delay @refreshAndContinueSimulating, 20 * 60 * 1000 + @simulateNextGame() $('#simulate-button').prop 'disabled', true $('#simulate-button').text 'Simulating...' - @simulateNextGame() + + refreshAndContinueSimulating: => + # We refresh the page every now and again to make sure simulations haven't gotten derailed by bogus games, and that simulators don't hang on to old, stale code or data. + document.location.hash = '#simulate' + document.location.reload() simulateNextGame: -> unless @simulator @@ -101,7 +112,7 @@ module.exports = class SimulateTabView extends CocoView console.log jqxhr.responseText destroy: -> - clearInterval @refreshInterval + clearTimeout @simulationPageRefreshTimeout @simulator?.destroy() super()