mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-14 07:00:01 -04:00
Client-side support for beating picoCTF levels
This commit is contained in:
parent
e1e5b66d7f
commit
59e8c42ddb
6 changed files with 16 additions and 7 deletions
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Reference in a new issue