Client-side support for beating picoCTF levels

This commit is contained in:
Nick Winter 2016-03-03 17:18:17 -08:00
parent e1e5b66d7f
commit 59e8c42ddb
6 changed files with 16 additions and 7 deletions

View file

@ -210,6 +210,9 @@ module.exports = class World
@loadSystemsFromLevel level
@loadThangsFromLevel level, willSimulate
@showsCountdown = @levelID in COUNTDOWN_LEVELS or _.any(@thangs, (t) -> (t.programmableProperties and 'findFlags' in t.programmableProperties) or t.inventory?.flag)
@picoCTFProblem = level.picoCTFProblem if level.picoCTFProblem
if @picoCTFProblem?.instances and not @picoCTFProblem.flag_sha1
@picoCTFProblem = _.merge @picoCTFProblem, @picoCTFProblem.instances[0]
system.start @thangs for system in @systems
loadSystemsFromLevel: (level) ->
@ -362,7 +365,7 @@ module.exports = class World
#console.log "... world serializing frames from", startFrame, "to", endFrame, "of", @totalFrames
[transferableObjects, nontransferableObjects] = [0, 0]
delete flag.processed for flag in @flagHistory
o = {totalFrames: @totalFrames, maxTotalFrames: @maxTotalFrames, frameRate: @frameRate, dt: @dt, victory: @victory, userCodeMap: {}, trackedProperties: {}, flagHistory: @flagHistory, difficulty: @difficulty, scores: @getScores(), randomSeed: @randomSeed}
o = {totalFrames: @totalFrames, maxTotalFrames: @maxTotalFrames, frameRate: @frameRate, dt: @dt, victory: @victory, userCodeMap: {}, trackedProperties: {}, flagHistory: @flagHistory, difficulty: @difficulty, scores: @getScores(), randomSeed: @randomSeed, picoCTFFlag: @picoCTFFlag}
o.trackedProperties[prop] = @[prop] for prop in @trackedProperties or []
for thangID, methods of @userCodeMap
@ -469,7 +472,7 @@ module.exports = class World
w.userCodeMap[thangID][methodName][aetherStateKey] = serializedAether[aetherStateKey]
else
w = new World o.userCodeMap, classMap
[w.totalFrames, w.maxTotalFrames, w.frameRate, w.dt, w.scriptNotes, w.victory, w.flagHistory, w.difficulty, w.scores, w.randomSeed] = [o.totalFrames, o.maxTotalFrames, o.frameRate, o.dt, o.scriptNotes ? [], o.victory, o.flagHistory, o.difficulty, o.scores, o.randomSeed]
[w.totalFrames, w.maxTotalFrames, w.frameRate, w.dt, w.scriptNotes, w.victory, w.flagHistory, w.difficulty, w.scores, w.randomSeed, w.picoCTFFlag] = [o.totalFrames, o.maxTotalFrames, o.frameRate, o.dt, o.scriptNotes ? [], o.victory, o.flagHistory, o.difficulty, o.scores, o.randomSeed, o.picoCTFFlag]
w[prop] = val for prop, val of o.trackedProperties
perf.t1 = now()

View file

@ -38,6 +38,8 @@ module.exports = class Level extends CocoModel
@sortThangComponents o.thangTypes, o.levelComponents, 'ThangType'
@fillInDefaultComponentConfiguration o.thangTypes, o.levelComponents
o.picoCTFProblem = @picoCTFProblem if @picoCTFProblem
o
cachedLevelComponents: null

View file

@ -277,13 +277,14 @@ module.exports = class CampaignView extends RootView
#level.locked = false if level.slug is 'robot-ragnarok'
if window.serverConfig.picoCTF
if problem = _.find(@picoCTFProblems or [], pid: level.picoCTFProblem)
level.locked = false if problem.unlocked
level.locked = false if problem.unlocked or level.slug is 'digital-graffiti'
#level.locked = false # Testing to see all levels
level.description = """
### #{problem.name}
#{level.description or problem.description}
#{problem.category} - #{problem.score} points
""" # Skipping #{problem.hints}
"""
level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete']
level.disabled = false if me.isInGodMode()
level.color = 'rgb(255, 80, 60)'

View file

@ -533,7 +533,7 @@ module.exports = class PlayLevelView extends RootView
showVictory: ->
return if @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
@endHighlight()
options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning, courseID: @courseID, courseInstanceID: @courseInstanceID}
options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning, courseID: @courseID, courseInstanceID: @courseInstanceID, world: @world}
ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then HeroVictoryModal else VictoryModal
ModalClass = CourseVictoryModal if @courseID and @courseInstanceID
ModalClass = PicoCTFVictoryModal if window.serverConfig.picoCTF

View file

@ -10,7 +10,10 @@ module.exports = class PicoCTFVictoryModal extends ModalView
@session = options.session
@level = options.level
# TODO: submit to picoCTF server
console.log 'damn we got dat flag', options.world.picoCTFFlag
@supermodel.addRequestResource(url: '/picoctf/submit', method: 'POST', data: {flag: options.world.picoCTFFlag}, success: (response) =>
console.log 'submitted the flag and got response', response
).load()
@playSound 'victory'

View file

@ -94,7 +94,7 @@ module.exports = class Spell
else @originalSource
addPicoCTFProblem: ->
return unless problem = @level.picoCTFProblem
return @originalSource unless problem = @level.picoCTFProblem
description = """
-- #{problem.name} --
#{problem.description}