Present 'Play Classroom Version' before playing a campaign level when appropriate

This commit is contained in:
Nick Winter 2015-12-01 11:24:16 -08:00
parent d0f3aeec91
commit ae6eca583a
5 changed files with 52 additions and 0 deletions

View file

@ -79,6 +79,7 @@
subscription_required: "Subscription Required"
anonymous: "Anonymous Player"
level_difficulty: "Difficulty: "
play_classroom_version: "Play Classroom Version" # Choose a level in campaign version that you also can play in one of your courses
campaign_beginner: "Beginner Campaign"
awaiting_levels_adventurer_prefix: "We release new levels every week."
awaiting_levels_adventurer: "Sign up as an Adventurer"

View file

@ -292,6 +292,9 @@ $gameControlMargin: 30px
.view-solutions
margin: 10px 5px 0 0
.course-version
text-align: center
.campaign-switch
color: purple
position: absolute

View file

@ -55,6 +55,13 @@ if campaign
button.btn.btn-warning.btn.btn-lg.btn-illustrated.view-solutions(data-level-slug=level.slug)
span(data-i18n="leaderboard.scores")
button.btn.btn-success.btn.btn-lg.btn-illustrated.start-level(data-i18n="common.play") Play
if me.get('courseInstances') && me.get('courseInstances').length
.course-version.hidden(data-level-original=level.original)
em(data-i18n="general.or")
| ...
br
button.btn.btn-primary.btn.btn-lg.btn-illustrated
span(data-i18n="play.play_classroom_version") Play Classroom Version
else if level.unlocksHero && !level.purchasedHero
img.hero-portrait(src="/file/db/thang.type/#{level.unlocksHero}/portrait.png", style="left: #{level.position.x}%; bottom: #{level.position.y}%;")

View file

@ -21,6 +21,7 @@ UserPollsRecord = require 'models/UserPollsRecord'
Poll = require 'models/Poll'
PollModal = require 'views/play/modal/PollModal'
storage = require 'core/storage'
CourseInstance = require 'models/CourseInstance'
trackedHourOfCode = false
@ -50,6 +51,7 @@ module.exports = class CampaignView extends RootView
'dblclick .level a': 'onDoubleClickLevel'
'click .level-info-container .start-level': 'onClickStartLevel'
'click .level-info-container .view-solutions': 'onClickViewSolutions'
'click .level-info-container .course-version button': 'onClickCourseVersion'
'click #volume-button': 'onToggleVolume'
'click #back-button': 'onClickBack'
'click #clear-storage-button': 'onClickClearStorage'
@ -459,6 +461,7 @@ module.exports = class CampaignView extends RootView
if @editorMode
return @trigger 'level-clicked', levelOriginal
@$levelInfo = @$el.find(".level-info-container[data-level-slug=#{levelSlug}]").show()
@checkForCourseOption levelOriginal
@adjustLevelInfoPosition e
@endHighlight()
@preloadLevel levelSlug
@ -484,6 +487,13 @@ module.exports = class CampaignView extends RootView
@startLevel levelElement
window.tracker?.trackEvent 'Clicked Start Level', category: 'World Map', levelID: levelSlug
onClickCourseVersion: (e) ->
levelSlug = $(e.target).parents('.level-info-container').data 'level-slug'
courseID = $(e.target).parents('.course-version').data 'course-id'
courseInstanceID = $(e.target).parents('.course-version').data 'course-instance-id'
url = "/play/level/#{levelSlug}?course=#{courseID}&course-instance=#{courseInstanceID}"
Backbone.Mediator.publish 'router:navigate', route: url
startLevel: (levelElement) ->
@setupManager?.destroy()
levelSlug = levelElement.data 'level-slug'
@ -555,6 +565,19 @@ module.exports = class CampaignView extends RootView
Backbone.Mediator.publish 'music-player:play-music', play: true, file: musicFile
storage.save("loaded-menu-music", true) unless @probablyCachedMusic
checkForCourseOption: (levelOriginal) ->
return unless me.get('courseInstances')?.length
@courseOptionsChecked ?= {}
return if @courseOptionsChecked[levelOriginal]
@courseOptionsChecked[levelOriginal] = true
courseInstances = new CocoCollection [], url: "/db/course_instance/-/find_by_level/#{levelOriginal}", model: CourseInstance
courseInstances.comparator = (ci) -> return -(ci.get('members') ? []).length
@supermodel.loadCollection courseInstances, 'course_instances'
@listenToOnce courseInstances, 'sync', =>
return if @destroyed
return unless courseInstance = courseInstances.models[0]
@$el.find(".course-version[data-level-original='#{levelOriginal}']").removeClass('hidden').data('course-id': courseInstance.get('courseID'), 'course-instance-id': courseInstance.id)
preloadTopHeroes: ->
for heroID in ['captain', 'knight']
url = "/db/thang.type/#{ThangType.heroes[heroID]}/version"

View file

@ -38,6 +38,7 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
return @getMembersAPI(req, res, args[0]) if args[1] is 'members'
return @inviteStudents(req, res, args[0]) if relationship is 'invite_students'
return @redeemPrepaidCodeAPI(req, res) if args[1] is 'redeem_prepaid'
return @findByLevel(req, res, args[2]) if args[1] is 'find_by_level'
super arguments...
createHOCAPI: (req, res) ->
@ -206,6 +207,23 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
return @sendDatabaseError(res, err) if err
@sendSuccess(res, courseInstances)
findByLevel: (req, res, levelOriginal) ->
# Find all CourseInstances that req.user is a part of that match the given level.
CourseInstance.find {_id: {$in: req.user.get('courseInstances')}}, (err, courseInstances) =>
return @sendDatabaseError res, err if err
return @sendSuccess res, [] unless courseInstances.length
courseIDs = _.uniq (ci.get('courseID') for ci in courseInstances)
Course.find {_id: {$in: courseIDs}}, {name: 1, campaignID: 1}, (err, courses) =>
return @sendDatabaseError res, err if err
return @sendSuccess res, [] unless courses.length
campaignIDs = _.uniq (c.get('campaignID') for c in courses)
Campaign.find {_id: {$in: campaignIDs}, "levels.#{levelOriginal}": {$exists: true}}, {_id: 1}, (err, campaigns) =>
return @sendDatabaseError res, err if err
return @sendSuccess res, [] unless campaigns.length
courses = _.filter courses, (course) -> _.find campaigns, (campaign) -> campaign.get('_id').toString() is course.get('campaignID').toString()
courseInstances = _.filter courseInstances, (courseInstance) -> _.find courses, (course) -> course.get('_id').toString() is courseInstance.get('courseID').toString()
return @sendSuccess res, courseInstances
get: (req, res) ->
if ownerID = req.query.ownerID
return @sendForbiddenError(res) unless req.user and (req.user.isAdmin() or ownerID is req.user.id)