mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-27 06:23:41 -04:00
Present 'Play Classroom Version' before playing a campaign level when appropriate
This commit is contained in:
parent
d0f3aeec91
commit
ae6eca583a
5 changed files with 52 additions and 0 deletions
app
locale
styles/play
templates/play
views/play
server/courses
|
@ -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"
|
||||
|
|
|
@ -292,6 +292,9 @@ $gameControlMargin: 30px
|
|||
.view-solutions
|
||||
margin: 10px 5px 0 0
|
||||
|
||||
.course-version
|
||||
text-align: center
|
||||
|
||||
.campaign-switch
|
||||
color: purple
|
||||
position: absolute
|
||||
|
|
|
@ -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}%;")
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue