Merge branch 'master' into production
This commit is contained in:
commit
a262dc781d
8 changed files with 22 additions and 8 deletions
app
lib
views/play/level
server/levels
|
@ -34,7 +34,7 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
@sessionless = options.sessionless
|
@sessionless = options.sessionless
|
||||||
@spectateMode = options.spectateMode ? false
|
@spectateMode = options.spectateMode ? false
|
||||||
@observing = options.observing
|
@observing = options.observing
|
||||||
@isCourse = options.courseID?
|
@courseID = options.courseID
|
||||||
|
|
||||||
@worldNecessities = []
|
@worldNecessities = []
|
||||||
@listenTo @supermodel, 'resource-loaded', @onWorldNecessityLoaded
|
@listenTo @supermodel, 'resource-loaded', @onWorldNecessityLoaded
|
||||||
|
@ -57,7 +57,7 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
@listenToOnce @level, 'sync', @onLevelLoaded
|
@listenToOnce @level, 'sync', @onLevelLoaded
|
||||||
|
|
||||||
onLevelLoaded: ->
|
onLevelLoaded: ->
|
||||||
if @isCourse and @level.get('type', true) not in ['course', 'course-ladder']
|
if @courseID and @level.get('type', true) not in ['course', 'course-ladder']
|
||||||
# Because we now use original hero levels for both hero and course levels, we fake being a course level in this context.
|
# Because we now use original hero levels for both hero and course levels, we fake being a course level in this context.
|
||||||
originalGet = @level.get
|
originalGet = @level.get
|
||||||
@level.get = ->
|
@level.get = ->
|
||||||
|
@ -77,6 +77,7 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
else
|
else
|
||||||
url = "/db/level/#{@levelID}/session"
|
url = "/db/level/#{@levelID}/session"
|
||||||
url += "?team=#{@team}" if @team
|
url += "?team=#{@team}" if @team
|
||||||
|
url += "?course=#{@courseID}" if @courseID
|
||||||
|
|
||||||
session = new LevelSession().setURL url
|
session = new LevelSession().setURL url
|
||||||
session.project = ['creator', 'team', 'heroConfig', 'codeLanguage', 'submittedCodeLanguage', 'state'] if @headless
|
session.project = ['creator', 'team', 'heroConfig', 'codeLanguage', 'submittedCodeLanguage', 'state'] if @headless
|
||||||
|
|
|
@ -36,6 +36,7 @@ module.exports = class LevelSetupManager extends CocoClass
|
||||||
loadSession: ->
|
loadSession: ->
|
||||||
sessionURL = "/db/level/#{@options.levelID}/session"
|
sessionURL = "/db/level/#{@options.levelID}/session"
|
||||||
#sessionURL += "?team=#{@team}" if @options.team # TODO: figure out how to get the teams for multiplayer PVP hero style
|
#sessionURL += "?team=#{@team}" if @options.team # TODO: figure out how to get the teams for multiplayer PVP hero style
|
||||||
|
sessionURL += "?course=#{@options.courseID}" if @options.courseID
|
||||||
@session = new LevelSession().setURL sessionURL
|
@session = new LevelSession().setURL sessionURL
|
||||||
onSessionSync = ->
|
onSessionSync = ->
|
||||||
return if @destroyed
|
return if @destroyed
|
||||||
|
|
|
@ -112,7 +112,7 @@ module.exports = class ControlBarView extends CocoView
|
||||||
@openModalView gameMenuModal
|
@openModalView gameMenuModal
|
||||||
@listenToOnce gameMenuModal, 'change-hero', ->
|
@listenToOnce gameMenuModal, 'change-hero', ->
|
||||||
@setupManager?.destroy()
|
@setupManager?.destroy()
|
||||||
@setupManager = new LevelSetupManager({supermodel: @supermodel, level: @level, levelID: @levelID, parent: @, session: @session})
|
@setupManager = new LevelSetupManager({supermodel: @supermodel, level: @level, levelID: @levelID, parent: @, session: @session, courseID: @courseID, courseInstanceID: @courseInstanceID})
|
||||||
@setupManager.open()
|
@setupManager.open()
|
||||||
|
|
||||||
onClickHome: (e) ->
|
onClickHome: (e) ->
|
||||||
|
|
|
@ -240,7 +240,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
@god.setGoalManager @goalManager
|
@god.setGoalManager @goalManager
|
||||||
|
|
||||||
insertSubviews: ->
|
insertSubviews: ->
|
||||||
@insertSubView @tome = new TomeView levelID: @levelID, session: @session, otherSession: @otherSession, thangs: @world.thangs, supermodel: @supermodel, level: @level, observing: @observing
|
@insertSubView @tome = new TomeView levelID: @levelID, session: @session, otherSession: @otherSession, thangs: @world.thangs, supermodel: @supermodel, level: @level, observing: @observing, courseID: @courseID, courseInstanceID: @courseInstanceID
|
||||||
@insertSubView new LevelPlaybackView session: @session, level: @level
|
@insertSubView new LevelPlaybackView session: @session, level: @level
|
||||||
@insertSubView new GoalsView {}
|
@insertSubView new GoalsView {}
|
||||||
@insertSubView new LevelFlagsView levelID: @levelID, world: @world if @$el.hasClass 'flags'
|
@insertSubView new LevelFlagsView levelID: @levelID, world: @world if @$el.hasClass 'flags'
|
||||||
|
@ -285,7 +285,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
e.session.set 'heroConfig', {"thangType":goliath,"inventory":{"eyes":"53eb99f41a100989a40ce46e","neck":"54693274a2b1f53ce79443c9","wrists":"54693797a2b1f53ce79443e9","feet":"546d4d8e9df4a17d0d449acd","minion":"54eb5bf649fa2d5c905ddf4a","programming-book":"557871261ff17fef5abee3ee"}}
|
e.session.set 'heroConfig', {"thangType":goliath,"inventory":{"eyes":"53eb99f41a100989a40ce46e","neck":"54693274a2b1f53ce79443c9","wrists":"54693797a2b1f53ce79443e9","feet":"546d4d8e9df4a17d0d449acd","minion":"54eb5bf649fa2d5c905ddf4a","programming-book":"557871261ff17fef5abee3ee"}}
|
||||||
else if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {}
|
else if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {}
|
||||||
@setupManager?.destroy()
|
@setupManager?.destroy()
|
||||||
@setupManager = new LevelSetupManager({supermodel: @supermodel, level: @level, levelID: @levelID, parent: @, session: @session})
|
@setupManager = new LevelSetupManager({supermodel: @supermodel, level: @level, levelID: @levelID, parent: @, session: @session, courseID: @courseID, courseInstanceID: @courseInstanceID})
|
||||||
@setupManager.open()
|
@setupManager.open()
|
||||||
|
|
||||||
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder', 'course-ladder']
|
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder', 'course-ladder']
|
||||||
|
|
|
@ -63,6 +63,7 @@ module.exports = class Spell
|
||||||
setLanguage: (@language) ->
|
setLanguage: (@language) ->
|
||||||
#console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
|
#console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
|
||||||
@originalSource = @languages[@language] ? @languages.javascript
|
@originalSource = @languages[@language] ? @languages.javascript
|
||||||
|
|
||||||
# Translate comments chosen spoken language.
|
# Translate comments chosen spoken language.
|
||||||
return unless @commentContext
|
return unless @commentContext
|
||||||
context = $.extend true, {}, @commentContext
|
context = $.extend true, {}, @commentContext
|
||||||
|
@ -79,6 +80,17 @@ module.exports = class Spell
|
||||||
catch e
|
catch e
|
||||||
console.error "Couldn't create example code template of", @originalSource, "\nwith context", context, "\nError:", e
|
console.error "Couldn't create example code template of", @originalSource, "\nwith context", context, "\nError:", e
|
||||||
|
|
||||||
|
if /loop/.test(@originalSource) and @levelType in ['course', 'course-ladder']
|
||||||
|
# Temporary hackery to make it look like we meant while True: in our sample code until we can update everything
|
||||||
|
@originalSource = switch @language
|
||||||
|
when 'python' then @originalSource.replace /loop:/, 'while True:'
|
||||||
|
when 'javascript' then @originalSource.replace /loop {/, 'while (true) {'
|
||||||
|
when 'clojure' then @originalSource.replace /dotimes \[n 1000\]/, '(while true'
|
||||||
|
when 'lua' then @originalSource.replace /loop\n/, 'while true then\n'
|
||||||
|
when 'coffeescript' then @originalSource
|
||||||
|
when 'io' then @originalSource.replace /loop\n/, 'while true,\n'
|
||||||
|
else @originalSource
|
||||||
|
|
||||||
addThang: (thang) ->
|
addThang: (thang) ->
|
||||||
if @thangs[thang.id]
|
if @thangs[thang.id]
|
||||||
@thangs[thang.id].thang = thang
|
@thangs[thang.id].thang = thang
|
||||||
|
|
|
@ -324,7 +324,7 @@ module.exports = class SpellPaletteView extends CocoView
|
||||||
@openModalView gameMenuModal
|
@openModalView gameMenuModal
|
||||||
@listenToOnce gameMenuModal, 'change-hero', ->
|
@listenToOnce gameMenuModal, 'change-hero', ->
|
||||||
@setupManager?.destroy()
|
@setupManager?.destroy()
|
||||||
@setupManager = new LevelSetupManager({supermodel: @supermodel, level: @level, levelID: @level.get('slug'), parent: @, session: @session})
|
@setupManager = new LevelSetupManager({supermodel: @supermodel, level: @level, levelID: @level.get('slug'), parent: @, session: @session, courseID: @options.courseID, courseInstanceID: @options.courseInstanceID})
|
||||||
@setupManager.open()
|
@setupManager.open()
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
|
|
|
@ -217,7 +217,7 @@ module.exports = class TomeView extends CocoView
|
||||||
|
|
||||||
updateSpellPalette: (thang, spell) ->
|
updateSpellPalette: (thang, spell) ->
|
||||||
return unless thang and @spellPaletteView?.thang isnt thang and thang.programmableProperties or thang.apiProperties
|
return unless thang and @spellPaletteView?.thang isnt thang and thang.programmableProperties or thang.apiProperties
|
||||||
@spellPaletteView = @insertSubView new SpellPaletteView thang: thang, supermodel: @supermodel, programmable: spell?.canRead(), language: spell?.language ? @options.session.get('codeLanguage'), session: @options.session, level: @options.level
|
@spellPaletteView = @insertSubView new SpellPaletteView thang: thang, supermodel: @supermodel, programmable: spell?.canRead(), language: spell?.language ? @options.session.get('codeLanguage'), session: @options.session, level: @options.level, courseID: @options.courseID, courseInstanceID: @options.courseInstanceID
|
||||||
@spellPaletteView.toggleControls {}, spell.view.controlsEnabled if spell?.view # TODO: know when palette should have been disabled but didn't exist
|
@spellPaletteView.toggleControls {}, spell.view.controlsEnabled if spell?.view # TODO: know when palette should have been disabled but didn't exist
|
||||||
|
|
||||||
spellFor: (thang, spellName) ->
|
spellFor: (thang, spellName) ->
|
||||||
|
|
|
@ -108,7 +108,7 @@ LevelHandler = class LevelHandler extends Handler
|
||||||
Session.findOne(sessionQuery).exec (err, doc) =>
|
Session.findOne(sessionQuery).exec (err, doc) =>
|
||||||
return @sendDatabaseError(res, err) if err
|
return @sendDatabaseError(res, err) if err
|
||||||
return @sendSuccess(res, doc) if doc?
|
return @sendSuccess(res, doc) if doc?
|
||||||
if level.get('type') is 'course'
|
if level.get('type') is 'course' or req.query.course?
|
||||||
return @makeOrRejectCourseLevelSession(req, res, level, sessionQuery)
|
return @makeOrRejectCourseLevelSession(req, res, level, sessionQuery)
|
||||||
requiresSubscription = level.get('requiresSubscription') or (req.user.isOnPremiumServer() and level.get('campaign') and not (level.slug in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'forgetful-gemsmith', 'signs-and-portents', 'true-names']))
|
requiresSubscription = level.get('requiresSubscription') or (req.user.isOnPremiumServer() and level.get('campaign') and not (level.slug in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'forgetful-gemsmith', 'signs-and-portents', 'true-names']))
|
||||||
canPlayAnyway = req.user.isPremium() or level.get 'adventurer'
|
canPlayAnyway = req.user.isPremium() or level.get 'adventurer'
|
||||||
|
|
Reference in a new issue