diff --git a/app/assets/images/pages/game-menu/slot-icons.png b/app/assets/images/pages/game-menu/slot-icons.png index efffc74f9..590e8d09c 100644 Binary files a/app/assets/images/pages/game-menu/slot-icons.png and b/app/assets/images/pages/game-menu/slot-icons.png differ diff --git a/app/assets/javascripts/workers/worker_world.js b/app/assets/javascripts/workers/worker_world.js index eb99b8c6a..40af1eeae 100644 --- a/app/assets/javascripts/workers/worker_world.js +++ b/app/assets/javascripts/workers/worker_world.js @@ -290,6 +290,8 @@ self.setupDebugWorldToRunUntilFrame = function (args) { try { self.debugWorld = new World(args.userCodeMap); self.debugWorld.levelSessionIDs = args.levelSessionIDs; + self.debugWorld.submissionCount = args.submissionCount; + self.debugWorld.flagHistory = args.flagHistory; if (args.level) self.debugWorld.loadFromLevel(args.level, true); self.debugWorld.debugging = true; @@ -347,6 +349,8 @@ self.runWorld = function runWorld(args) { try { self.world = new World(args.userCodeMap); self.world.levelSessionIDs = args.levelSessionIDs; + self.world.submissionCount = args.submissionCount; + self.world.flagHistory = args.flagHistory || []; if(args.level) self.world.loadFromLevel(args.level, true); self.world.preloading = args.preload; diff --git a/app/assets/main.html b/app/assets/main.html index 74737fd6b..cdb9a3a89 100644 --- a/app/assets/main.html +++ b/app/assets/main.html @@ -37,18 +37,14 @@ <script src="/javascripts/aether.js"></script> <script src="/javascripts/app.js"></script> <!-- it's all Backbone! --> - <script> - window.linkedInAsyncInit = function() { - console.log("Linkedin Async Init!"); - Backbone.Mediator.publish('linkedin-loaded'); - }; - + <!-- Can move to lib/services/linkedin.coffee instead somehow? Or just get rid of LinkedIn... </script> <script type="text/javascript" async src="http://platform.linkedin.com/in.js"> api_key: 75v8mv4ictvmx6 onLoad: linkedInAsyncInit authorize: true </script> + --> <script> window.userObject = "userObjectTag"; diff --git a/app/initialize.coffee b/app/initialize.coffee index db1f2f862..2b724cbe5 100644 --- a/app/initialize.coffee +++ b/app/initialize.coffee @@ -78,7 +78,6 @@ initializeUtilityServices = -> services = [ './lib/services/filepicker' './lib/services/segmentio' - './lib/services/olark' ] for service in services diff --git a/app/lib/God.coffee b/app/lib/God.coffee index cf1631689..c6b9deb01 100644 --- a/app/lib/God.coffee +++ b/app/lib/God.coffee @@ -54,9 +54,11 @@ module.exports = class God extends CocoClass setWorldClassMap: (worldClassMap) -> @angelsShare.worldClassMap = worldClassMap onTomeCast: (e) -> + @lastSubmissionCount = e.submissionCount + @lastFlagHistory = e.flagHistory @createWorld e.spells, e.preload, e.realTime - createWorld: (spells, preload=false, realTime=false) -> + createWorld: (spells, preload, realTime) -> console.log "#{@nick}: Let there be light upon #{@level.name}! (preload: #{preload})" userCodeMap = @getUserCodeMap spells @@ -81,6 +83,8 @@ module.exports = class God extends CocoClass userCodeMap: userCodeMap level: @level levelSessionIDs: @levelSessionIDs + submissionCount: @lastSubmissionCount + flagHistory: @lastFlagHistory goals: @angelsShare.goalManager?.getGoals() headless: @angelsShare.headless preload: preload @@ -110,6 +114,8 @@ module.exports = class God extends CocoClass userCodeMap: @currentUserCodeMap level: @level levelSessionIDs: @levelSessionIDs + submissionCount: @lastSubmissionCount + flagHistory: @lastFlagHistory goals: @goalManager?.getGoals() frame: args.frame currentThangID: args.thangID diff --git a/app/lib/LevelBus.coffee b/app/lib/LevelBus.coffee index 11e2232aa..11f1f447e 100644 --- a/app/lib/LevelBus.coffee +++ b/app/lib/LevelBus.coffee @@ -23,8 +23,10 @@ module.exports = class LevelBus extends Bus 'level:show-victory': 'onVictory' 'tome:spell-changed': 'onSpellChanged' 'tome:spell-created': 'onSpellCreated' + 'tome:cast-spells': 'onCastSpells' 'application:idle-changed': 'onIdleChanged' 'goal-manager:new-goal-states': 'onNewGoalStates' + 'god:new-world-created': 'onNewWorldCreated' constructor: -> super(arguments...) @@ -126,6 +128,22 @@ module.exports = class LevelBus extends Bus # https://github.com/codecombat/codecombat/issues/81 @onSpellChanged e # Save the new spell to the session, too. + onCastSpells: (e) -> + return unless @onPoint() and e.realTime + # We have incremented state.submissionCount and reset state.flagHistory. + @changedSessionProperties.state = true + @saveSession() + + onNewWorldCreated: (e) -> + return unless @onPoint() + # Record the flag history. + state = @session.get('state') + return if _.isEqual state.flagHistory, e.world.flagHistory + state.flagHistory = e.world.flagHistory + @changedSessionProperties.state = true + @session.set('state', state) + @saveSession() + onScriptStateChanged: (e) -> return unless @onPoint() @fireScriptsRef?.update(e) diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee index 3bd7c64b3..fcd824fe9 100644 --- a/app/lib/LevelLoader.coffee +++ b/app/lib/LevelLoader.coffee @@ -61,7 +61,6 @@ module.exports = class LevelLoader extends CocoClass # Session Loading loadSession: -> - return if @headless if @sessionID url = "/db/level.session/#{@sessionID}" else @@ -71,6 +70,11 @@ module.exports = class LevelLoader extends CocoClass session = new LevelSession().setURL url @sessionResource = @supermodel.loadModel(session, 'level_session', {cache: false}) @session = @sessionResource.model + if @opponentSessionID + opponentSession = new LevelSession().setURL "/db/level.session/#{@opponentSessionID}" + @opponentSessionResource = @supermodel.loadModel(opponentSession, 'opponent_session') + @opponentSession = @opponentSessionResource.model + if @session.loaded @session.setURL '/db/level.session/' + @session.id @loadDependenciesForSession @session @@ -78,11 +82,7 @@ module.exports = class LevelLoader extends CocoClass @listenToOnce @session, 'sync', -> @session.setURL '/db/level.session/' + @session.id @loadDependenciesForSession @session - - if @opponentSessionID - opponentSession = new LevelSession().setURL "/db/level.session/#{@opponentSessionID}" - @opponentSessionResource = @supermodel.loadModel(opponentSession, 'opponent_session') - @opponentSession = @opponentSessionResource.model + if @opponentSession if @opponentSession.loaded @loadDependenciesForSession @opponentSession else @@ -91,9 +91,13 @@ module.exports = class LevelLoader extends CocoClass loadDependenciesForSession: (session) -> if session is @session Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session - return unless @level.get('type', true) is 'hero' + @consolidateFlagHistory() if @opponentSession?.loaded + else if session is @opponentSession + @consolidateFlagHistory() if @session.loaded + return unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] + @sessionDependenciesRegistered ?= {} heroConfig = session.get('heroConfig') - heroConfig ?= me.get('heroConfig') + heroConfig ?= me.get('heroConfig') if session is @session and not @headless heroConfig ?= {inventory: {}, thangType: '529ffbf1cf1818f2be000001'} # If all else fails, assign Tharin as the hero. session.set 'heroConfig', heroConfig unless _.isEqual heroConfig, session.get('heroConfig') url = "/db/thang.type/#{heroConfig.thangType}/version" @@ -105,13 +109,23 @@ module.exports = class LevelLoader extends CocoClass @loadThangsRequiredByThangType heroThangType for itemThangType in _.values(heroConfig.inventory) - url = "/db/thang.type/#{itemThangType}/version?project=name,components,original,rasterIcon" + url = "/db/thang.type/#{itemThangType}/version?project=name,components,original,rasterIcon,kind" if itemResource = @maybeLoadURL(url, ThangType, 'thang') @worldNecessities.push itemResource else itemThangType = @supermodel.getModel url @loadDefaultComponentsForThangType itemThangType @loadThangsRequiredByThangType itemThangType + @sessionDependenciesRegistered[session.id] = true + if _.size(@sessionDependenciesRegistered) is 2 and not (r for r in @worldNecessities when r?).length + @onWorldNecessitiesLoaded() + + consolidateFlagHistory: -> + state = @session.get('state') ? {} + myFlagHistory = _.filter state.flagHistory ? [], team: @session.get('team') + opponentFlagHistory = _.filter @opponentSession.get('state')?.flagHistory ? [], team: @opponentSession.get('team') + state.flagHistory = myFlagHistory.concat opponentFlagHistory + @session.set 'state', state # Grabbing the rest of the required data for the level @@ -162,7 +176,7 @@ module.exports = class LevelLoader extends CocoClass url = "/db/level/#{obj.original}/version/#{obj.majorVersion}" @maybeLoadURL url, Level, 'level' - unless @headless + unless @headless or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] wizard = ThangType.loadUniversalWizard() @supermodel.loadModel wizard, 'thang' @@ -183,7 +197,7 @@ module.exports = class LevelLoader extends CocoClass else if component.config.requiredThangTypes requiredThangTypes = requiredThangTypes.concat component.config.requiredThangTypes for thangType in requiredThangTypes - url = "/db/thang.type/#{thangType}/version?project=name,components,original,rasterIcon" + url = "/db/thang.type/#{thangType}/version?project=name,components,original,rasterIcon,kind" @worldNecessities.push @maybeLoadURL(url, ThangType, 'thang') onThangNamesLoaded: (thangNames) -> @@ -206,9 +220,10 @@ module.exports = class LevelLoader extends CocoClass return unless index >= 0 @worldNecessities.splice(index, 1) @worldNecessities = (r for r in @worldNecessities when r?) - @onWorldNecessitiesLoaded() if @worldNecessities.length is 0 + if @worldNecessities.length is 0 and (not @sessionDependenciesRegistered or @sessionDependenciesRegistered[@session.id] and (not @opponentSession or @sessionDependenciesRegistered[@opponentSession.id])) + @onWorldNecessitiesLoaded() - onWorldNecessitiesLoaded: => + onWorldNecessitiesLoaded: -> @initWorld() @supermodel.clearMaxProgress() @trigger 'world-necessities-loaded' @@ -240,7 +255,6 @@ module.exports = class LevelLoader extends CocoClass console.log 'SuperModel for Level loaded in', new Date().getTime() - @t0, 'ms' @loadLevelSounds() @denormalizeSession() - app.tracker.updatePlayState(@level, @session) unless @headless buildLoop: => someLeft = false @@ -334,7 +348,9 @@ module.exports = class LevelLoader extends CocoClass @initialized = true @world = new World() @world.levelSessionIDs = if @opponentSessionID then [@sessionID, @opponentSessionID] else [@sessionID] - serializedLevel = @level.serialize(@supermodel, @session) + @world.submissionCount = @session?.get('state')?.submissionCount ? 0 + @world.flagHistory = @session?.get('state')?.flagHistory ? [] + serializedLevel = @level.serialize(@supermodel, @session, @opponentSession) @world.loadFromLevel serializedLevel, false console.log 'World has been initialized from level loader.' diff --git a/app/lib/Tracker.coffee b/app/lib/Tracker.coffee index fd51ecead..3b3af4d69 100644 --- a/app/lib/Tracker.coffee +++ b/app/lib/Tracker.coffee @@ -9,7 +9,6 @@ module.exports = class Tracker window.tracker = @ @isProduction = document.location.href.search('codecombat.com') isnt -1 @identify() - @updateOlark() identify: (traits) -> console.log 'Would identify', traits if debugAnalytics @@ -20,24 +19,6 @@ module.exports = class Tracker traits[userTrait] ?= me.get(userTrait) analytics.identify me.id, traits - updateOlark: -> - return unless me and olark? - olark 'api.chat.updateVisitorStatus', snippet: ["User ID: #{me.id}"] - return if me.get('anonymous') - olark 'api.visitor.updateEmailAddress', emailAddress: me.get('email') if me.get('email') - olark 'api.chat.updateVisitorNickname', snippet: me.displayName() - - updatePlayState: (level, session) -> - return unless olark? - link = "codecombat.com/play/level/#{level.get('slug') or level.id}?session=#{session.id}" - snippet = [ - "#{link}" - "User ID: #{me.id}" - "Session ID: #{session.id}" - "Level: #{level.get('name')}" - ] - olark 'api.chat.updateVisitorStatus', snippet: snippet - trackPageView: -> return unless @isProduction and analytics? url = Backbone.history.getFragment() diff --git a/app/lib/services/olark.coffee b/app/lib/services/olark.coffee deleted file mode 100644 index c91f3a89f..000000000 --- a/app/lib/services/olark.coffee +++ /dev/null @@ -1,115 +0,0 @@ -module.exports = initializeOlark = -> - window.olark or ((c) -> #<![CDATA[ - f = window - d = document - l = (if f.location.protocol is 'https:' then 'https:' else 'http:') - z = c.name - r = 'load' - nt = -> - s = -> - a.P r - f[z] r - return - f[z] = -> - (a.s = a.s or []).push arguments - return - - a = f[z]._ = {} - q = c.methods.length - while q-- - ((n) -> - f[z][n] = -> - f[z] 'call', n, arguments - return - - return - ) c.methods[q] - a.l = c.loader - a.i = nt - a.p = 0: +new Date - a.P = (u) -> - a.p[u] = new Date - a.p[0] - return - - (if f.addEventListener then f.addEventListener(r, s, false) else f.attachEvent('on' + r, s)) - ld = -> - p = (hd) -> - hd = 'head' - [ - '<' - hd - '></' - hd - '><' - i - ' onl' + 'oad=\"var d=' - g - ";d.getElementsByTagName('head')[0]." - j - '(d.' - h - "('script'))." - k - "='" - l - '//' - a.l - "'" - '\"' - '></' - i - '>' - ].join '' - i = 'body' - m = d[i] - return setTimeout(ld, 100) unless m - a.P 1 - j = 'appendChild' - h = 'createElement' - k = 'src' - n = d[h]('div') - v = n[j](d[h](z)) - b = d[h]('iframe') - g = 'document' - e = 'domain' - o = undefined - n.style.display = 'none' - m.insertBefore(n, m.firstChild).id = z - b.frameBorder = '0' - b.id = z + '-loader' - b.src = 'javascript:false' if /MSIE[ ]+6/.test(navigator.userAgent) - b.allowTransparency = 'true' - v[j] b - try - b.contentWindow[g].open() - catch w - c[e] = d[e] - o = 'javascript:var d=' + g + ".open();d.domain='" + d.domain + "';" - b[k] = o + 'void(0);' - try - t = b.contentWindow[g] - t.write p() - t.close() - catch x - b[k] = o + 'd.write(\"' + p().replace(/"/g, String.fromCharCode(92) + '\"') + '\");d.close();' - a.P 2 - return - - ld() - return - - nt() - return - )( - loader: 'static.olark.com/jsclient/loader0.js' - name: 'olark' - methods: [ - 'configure' - 'extend' - 'declare' - 'identify' - ] - ) - - # custom configuration goes here (www.olark.com/documentation) - olark.identify '1451-787-10-5544' #]]> diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee index 01cff2057..0ca70cb89 100644 --- a/app/lib/simulator/Simulator.coffee +++ b/app/lib/simulator/Simulator.coffee @@ -45,7 +45,7 @@ module.exports = class Simulator extends CocoClass @supermodel ?= new SuperModel() @supermodel.resetProgress() @stopListening @supermodel, 'loaded-all' - @levelLoader = new LevelLoader supermodel: @supermodel, levelID: @task.getLevelName(), sessionID: @task.getFirstSessionID(), headless: true + @levelLoader = new LevelLoader supermodel: @supermodel, levelID: @task.getLevelName(), sessionID: @task.getFirstSessionID(), opponentSessionID: @task.getSecondSessionID(), headless: true if @supermodel.finished() @simulateSingleGame() @@ -165,7 +165,7 @@ module.exports = class Simulator extends CocoClass @supermodel ?= new SuperModel() @supermodel.resetProgress() @stopListening @supermodel, 'loaded-all' - @levelLoader = new LevelLoader supermodel: @supermodel, levelID: levelID, sessionID: @task.getFirstSessionID(), headless: true + @levelLoader = new LevelLoader supermodel: @supermodel, levelID: levelID, sessionID: @task.getFirstSessionID(), opponentSessionID: @task.getSecondSessionID(), headless: true if @supermodel.finished() @simulateGame() else @@ -189,11 +189,13 @@ module.exports = class Simulator extends CocoClass @world = @levelLoader.world @task.setWorld(@world) @level = @levelLoader.level + @session = @levelLoader.session + @otherSession = @levelLoader.opponentSession @levelLoader.destroy() @levelLoader = null setupGod: -> - @god.setLevel @level.serialize @supermodel + @god.setLevel @level.serialize(@supermodel, @session, @otherSession) @god.setLevelSessionIDs (session.sessionID for session in @task.getSessions()) @god.setWorldClassMap @world.classMap @god.setGoalManager new GoalManager(@world, @level.get 'goals') @@ -424,6 +426,8 @@ class SimulationTask getFirstSessionID: -> @rawData.sessions[0].sessionID + getSecondSessionID: -> @rawData.sessions[1].sessionID + getTaskID: -> @rawData.taskID getReceiptHandle: -> @rawData.receiptHandle diff --git a/app/lib/surface/LayerAdapter.coffee b/app/lib/surface/LayerAdapter.coffee index c4baacdac..3b074034f 100644 --- a/app/lib/surface/LayerAdapter.coffee +++ b/app/lib/surface/LayerAdapter.coffee @@ -500,8 +500,8 @@ module.exports = LayerAdapter = class LayerAdapter extends CocoClass renderGroupingKey: (thangType, grouping, colorConfig) -> key = thangType.get('slug') - if colorConfig?.team - key += "(#{colorConfig.team.hue},#{colorConfig.team.saturation},#{colorConfig.team.lightness})" + for colorKey, colorValue of colorConfig ? {} + key += "(#{colorKey}:#{colorValue.hue},#{colorValue.saturation},#{colorValue.lightness})" key += '.'+grouping if grouping key diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee index 617dbd279..727cab71a 100644 --- a/app/lib/surface/Surface.coffee +++ b/app/lib/surface/Surface.coffee @@ -522,7 +522,7 @@ module.exports = Surface = class Surface extends CocoClass newWidth = 0.55 * pageWidth newHeight = newWidth / aspectRatio return unless newWidth > 0 and newHeight > 0 - return if newWidth is oldWidth and newHeight is oldHeight + return if newWidth is oldWidth and newHeight is oldHeight and not @options.spectateGame #scaleFactor = if application.isIPadApp then 2 else 1 # Retina scaleFactor = 1 @normalCanvas.add(@webGLCanvas).attr width: newWidth * scaleFactor, height: newHeight * scaleFactor @@ -533,12 +533,16 @@ module.exports = Surface = class Surface extends CocoClass @normalStage.scaleX *= newWidth / oldWidth @normalStage.scaleY *= newHeight / oldHeight @camera.onResize newWidth, newHeight - + if @options.spectateGame + # Since normalCanvas is absolutely positioned, it needs help aligning with webGLCanvas. But not further than +149px (1920px screen). + @normalCanvas.css 'left', Math.min 149, @webGLCanvas.offset().left #- Camera focus on hero focusOnHero: -> @heroLank = @lankBoss.lankFor 'Hero Placeholder' - + if me.team is 'ogres' + # TODO: do this for real + @heroLank = @lankBoss.lankFor 'Hero Placeholder 1' #- Real-time playback diff --git a/app/lib/world/GoalManager.coffee b/app/lib/world/GoalManager.coffee index 8f629989e..d037811bd 100644 --- a/app/lib/world/GoalManager.coffee +++ b/app/lib/world/GoalManager.coffee @@ -44,7 +44,8 @@ module.exports = class GoalManager extends CocoClass 'world:thang-touched-goal': 'onThangTouchedGoal' 'world:thang-left-map': 'onThangLeftMap' 'world:thang-collected-item': 'onThangCollectedItem' - 'world:ended': 'onWorldEnded' + 'world:user-code-problem': 'onUserCodeProblem' + 'world:lines-of-code-counted': 'onLinesOfCodeCounted' onLevelRestarted: -> @goals = [] @@ -62,7 +63,9 @@ module.exports = class GoalManager extends CocoClass # gets these goals and code, and is told to be all ears during world gen setGoals: (@goals) -> setCode: (@userCodeMap) -> @updateCodeGoalStates() - worldGenerationWillBegin: -> @initGoalStates() + worldGenerationWillBegin: -> + @initGoalStates() + @checkForInitialUserCodeProblems() # World generator feeds world events to the goal manager to keep track submitWorldGenerationEvent: (channel, event, frameNumber) -> @@ -115,10 +118,12 @@ module.exports = class GoalManager extends CocoClass checkOverallStatus: (ignoreIncomplete=false) -> overallStatus = null goals = if @goalStates then _.values @goalStates else [] + goals = (g for g in goals when not g.optional) goals = (g for g in goals when g.team in [undefined, @team]) if @team statuses = if @goalStates then (goal.status for goal in goals) else [] overallStatus = 'success' if statuses.length > 0 and _.every(statuses, (s) -> s is 'success' or (ignoreIncomplete and s is null)) overallStatus = 'failure' if statuses.length > 0 and 'failure' in statuses + #console.log 'got overallStatus', overallStatus, 'from goals', goals, 'goalStates', @goalStates, 'statuses', statuses overallStatus # WORLD GOAL TRACKING @@ -131,6 +136,7 @@ module.exports = class GoalManager extends CocoClass status: null # should eventually be either 'success', 'failure', or 'incomplete' keyFrame: 0 # when it became a 'success' or 'failure' team: goal.team + optional: goal.optional } @initGoalState(state, [goal.killThangs, goal.saveThangs], 'killed') for getTo in goal.getAllToLocations ? [] @@ -140,8 +146,16 @@ module.exports = class GoalManager extends CocoClass @initGoalState(state, [goal.getToLocations?.who, goal.keepFromLocations?.who], 'arrived') @initGoalState(state, [goal.leaveOffSides?.who, goal.keepFromLeavingOffSides?.who], 'left') @initGoalState(state, [goal.collectThangs?.targets, goal.keepFromCollectingThangs?.targets], 'collected') + @initGoalState(state, [goal.codeProblems], 'problems') + @initGoalState(state, [_.keys(goal.linesOfCode ? {})], 'lines') @goalStates[goal.id] = state + checkForInitialUserCodeProblems: -> + # There might have been some user code problems reported before the goal manager started listening. + for thang in @world.thangs when thang.isProgrammable + for message, problem of thang.publishedUserCodeProblems + @onUserCodeProblem {thang: thang, problem: problem}, 0 + onThangDied: (e, frameNumber) -> for goal in @goals ? [] @checkKillThangs(goal.id, goal.killThangs, e.thang, frameNumber) if goal.killThangs? @@ -187,6 +201,22 @@ module.exports = class GoalManager extends CocoClass return unless thang.id in who or thang.team in who @updateGoalState(goalID, itemID, 'collected', frameNumber) + onUserCodeProblem: (e, frameNumber) -> + for goal in @goals ? [] when goal.codeProblems + @checkCodeProblem goal.id, goal.codeProblems, e.thang, frameNumber + + checkCodeProblem: (goalID, who, thang, frameNumber) -> + return unless thang.id in who or thang.team in who + @updateGoalState goalID, thang.id, 'problems', frameNumber + + onLinesOfCodeCounted: (e, frameNumber) -> + for goal in @goals ? [] when goal.linesOfCode + @checkLinesOfCode goal.id, goal.linesOfCode, e.thang, e.linesUsed, frameNumber + + checkLinesOfCode: (goalID, who, thang, linesUsed, frameNumber) -> + return unless linesAllowed = who[thang.id] ? who[thang.team] + @updateGoalState goalID, thang.id, 'lines', frameNumber if linesUsed > linesAllowed + wrapUpGoalStates: (finalFrame) -> for goalID, state of @goalStates if state.status is null @@ -247,7 +277,7 @@ module.exports = class GoalManager extends CocoClass # saveThangs: by default we would want to save all the Thangs, which means that we would want none of them to be 'done' numNeeded = _.size(stateThangs) - Math.max((goal.howMany ? 1), _.size stateThangs) + 1 numDone = _.filter(stateThangs).length - #console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs + #console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs, 'for', goalID, thangID, 'on frame', frameNumber return unless numDone >= numNeeded return if state.status and not success # already failed it; don't wipe keyframe state.status = if success then 'success' else 'failure' @@ -278,6 +308,8 @@ module.exports = class GoalManager extends CocoClass keepFromLeavingOffSides: 0 collectThangs: 1 keepFromCollectingThangs: 0 + linesOfCode: 0 + codeProblems: 0 updateCodeGoalStates: -> # TODO diff --git a/app/lib/world/world.coffee b/app/lib/world/world.coffee index 523f706e4..eed0f7cc9 100644 --- a/app/lib/world/world.coffee +++ b/app/lib/world/world.coffee @@ -39,7 +39,6 @@ module.exports = class World @systems = [] @systemMap = {} @scriptNotes = [] - @flagHistory = [] @rand = new Rand 0 # Existence System may change this seed @frames = [new WorldFrame(@, 0)] @@ -202,9 +201,9 @@ module.exports = class World @levelID = level.slug @levelComponents = level.levelComponents @thangTypes = level.thangTypes + @loadScriptsFromLevel level @loadSystemsFromLevel level @loadThangsFromLevel level, willSimulate - @loadScriptsFromLevel level system.start @thangs for system in @systems loadSystemsFromLevel: (level) -> @@ -308,7 +307,7 @@ module.exports = class World publishNote: (channel, event) -> event ?= {} channel = 'world:' + channel - for script in @scripts + for script in @scripts ? [] continue if script.channel isnt channel scriptNote = new WorldScriptNote script, event continue if scriptNote.invalid @@ -349,7 +348,8 @@ module.exports = class World endFrame = @frames.length #console.log "... world serializing frames from", startFrame, "to", endFrame, "of", @totalFrames [transferableObjects, nontransferableObjects] = [0, 0] - o = {totalFrames: @totalFrames, maxTotalFrames: @maxTotalFrames, frameRate: @frameRate, dt: @dt, victory: @victory, userCodeMap: {}, trackedProperties: {}} + delete flag.processed for flag in @flagHistory + o = {totalFrames: @totalFrames, maxTotalFrames: @maxTotalFrames, frameRate: @frameRate, dt: @dt, victory: @victory, userCodeMap: {}, trackedProperties: {}, flagHistory: @flagHistory} o.trackedProperties[prop] = @[prop] for prop in @trackedProperties or [] for thangID, methods of @userCodeMap @@ -455,7 +455,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] = [o.totalFrames, o.maxTotalFrames, o.frameRate, o.dt, o.scriptNotes ? [], o.victory] + [w.totalFrames, w.maxTotalFrames, w.frameRate, w.dt, w.scriptNotes, w.victory, w.flagHistory] = [o.totalFrames, o.maxTotalFrames, o.frameRate, o.dt, o.scriptNotes ? [], o.victory, o.flagHistory] w[prop] = val for prop, val of o.trackedProperties perf.t1 = now() diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee index 45f2b1605..91e87b156 100644 --- a/app/locale/ar.coffee +++ b/app/locale/ar.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi adventurer_forum: "منتدى المغامر" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... فيها تتعلم سحر البرمجة." + campaign_old_beginner_description: "... فيها تتعلم سحر البرمجة." campaign_dev: "مستويات أصعب عشوائية" campaign_dev_description: "... فيها تتعلم واجهة بينما تفعل شيئا أصعب قليلا." campaign_multiplayer: "ساحات متعددة اللاّعبين" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee index 3824c4923..2ee7384a4 100644 --- a/app/locale/bg.coffee +++ b/app/locale/bg.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "български език", englishDescri # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "български език", englishDescri # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "български език", englishDescri # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee index 114622cdc..de79233fd 100644 --- a/app/locale/ca.coffee +++ b/app/locale/ca.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr adventurer_forum: "El fòrum de l'aventurer" adventurer_suffix: "." campaign_old_beginner: "Antiga campanya del principiant" - campaign_beginner_description: "... on aprens la bruixeria de la programació." + campaign_old_beginner_description: "... on aprens la bruixeria de la programació." campaign_dev: "Nivells difícils aleatoris" campaign_dev_description: "... on aprens a interactuar amb la interfície tot fent coses un pèl més difícils." campaign_multiplayer: "Arenes Multijugador" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr armor: "Armadura" hands: "Mans" accessories: "Accessoris" - books: "Llibres" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jugar el següent nivell" # Only in old-style levels. victory_play_continue: "Continuar" +# victory_saving_progress: "Saving Progress" victory_go_home: "Tornar a l'inici" # Only in old-style levels. victory_review: "Diguens més!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee index 696cfe40e..5c6a23be7 100644 --- a/app/locale/cs.coffee +++ b/app/locale/cs.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr adventurer_forum: "fóru Dobrodruhů" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "...ve které se naučíte kouzla programování." + campaign_old_beginner_description: "...ve které se naučíte kouzla programování." campaign_dev: "Náhodné težší úrovně" campaign_dev_description: "...ve kterých se dozvíte více o prostředí při plnění těžších úkolů." campaign_multiplayer: "Multiplayer Aréna" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Hrát další úroveň" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Přejít domů" # Only in old-style levels. victory_review: "Připomínky!" # Only in old-style levels. victory_hour_of_code_done: "Skončili jste?" diff --git a/app/locale/da.coffee b/app/locale/da.coffee index 4f7cad262..302712571 100644 --- a/app/locale/da.coffee +++ b/app/locale/da.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans adventurer_forum: "Eventyrer-forummet" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... hvor du lærer programmeringens kunst." + campaign_old_beginner_description: "... hvor du lærer programmeringens kunst." campaign_dev: "Tilfældige Sværere Niveauer" campaign_dev_description: "... hvor du lærer grænsefladen imens du udfører lidt sværere opgaver." campaign_multiplayer: "Multiplayer Arenaer" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spil næste bane" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Gå hjem" # Only in old-style levels. victory_review: "Fortæl os mere!" # Only in old-style levels. victory_hour_of_code_done: "Er du færdig?" diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee index 22bad597b..e0020b744 100644 --- a/app/locale/de-AT.coffee +++ b/app/locale/de-AT.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: adventurer_forum: "im Abenteurerforum" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... in der Du die Zauberei der Programmierung lernst." + campaign_old_beginner_description: "... in der Du die Zauberei der Programmierung lernst." campaign_dev: "Beliebiges schwierigeres Level" campaign_dev_description: "... in welchem Du die Bedienung erlernst, indem Du etwas schwierigeres machst." campaign_multiplayer: "Multiplayerarena" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: armor: "Rüstung" hands: "Hände" accessories: "Zubehör" - books: "Bücher" minions: "Minions" misc: "Sonstiges" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription: victory_return_to_ladder: "Zurück zur Rangliste" victory_play_next_level: "Spiel das nächste Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Geh auf die Startseite" # Only in old-style levels. victory_review: "Erzähl uns davon!" # Only in old-style levels. victory_hour_of_code_done: "Bist Du fertig?" diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee index eb6af2dce..3c1b41dec 100644 --- a/app/locale/de-CH.coffee +++ b/app/locale/de-CH.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge adventurer_forum: "Abentürer-Forum" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... i dere du d Zauberkunst vom Programmiere lernsch." + campaign_old_beginner_description: "... i dere du d Zauberkunst vom Programmiere lernsch." campaign_dev: "Zuefälligi schwierigeri Level" campaign_dev_description: "... i dene du s Interface kenne lernsch, während du öppis chli Schwierigers machsch." campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge victory_return_to_ladder: "Zrugg zum letzte Level" victory_play_next_level: "Spiel s nögste Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. victory_review: "Verzell üs meh!" # Only in old-style levels. victory_hour_of_code_done: "Bisch fertig?" diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee index 603b5439b..9eed5d516 100644 --- a/app/locale/de-DE.coffee +++ b/app/locale/de-DE.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: adventurer_forum: "im Abenteurerforum" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... in der Du die Zauberei der Programmierung lernst." + campaign_old_beginner_description: "... in der Du die Zauberei der Programmierung lernst." campaign_dev: "Beliebiges schwierigeres Level" campaign_dev_description: "... in welchem Du die Bedienung erlernst, indem Du etwas schwierigeres machst." campaign_multiplayer: "Multiplayerarena" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: armor: "Rüstung" hands: "Hände" accessories: "Zubehör" - books: "Bücher" minions: "Minions" misc: "Sonstiges" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: victory_return_to_ladder: "Zurück zur Rangliste" victory_play_next_level: "Spiel das nächste Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Geh auf die Startseite" # Only in old-style levels. victory_review: "Erzähl uns davon!" # Only in old-style levels. victory_hour_of_code_done: "Bist Du fertig?" diff --git a/app/locale/el.coffee b/app/locale/el.coffee index 9ffbeb92d..98c51dcf1 100644 --- a/app/locale/el.coffee +++ b/app/locale/el.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre adventurer_forum: "Φόρουμ του Adventurer" adventurer_suffix: "." campaign_old_beginner: "Παλαιότερη Εκστρατεία Αρχαρίων" - campaign_beginner_description: "... στην οποία μαθαίνετε τη μαγεία του προγραμματισμού." + campaign_old_beginner_description: "... στην οποία μαθαίνετε τη μαγεία του προγραμματισμού." campaign_dev: "Τυχαία Δυσκολότερα Επίπεδα" campaign_dev_description: "... στα οποία μπορείτε να μάθετε το περιβάλλον, ενώ κάνετε κάτι λίγο δυσκολότερο." campaign_multiplayer: "Αρένες Πολλαπλών Παικτών" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre armor: "Πανοπλία" hands: "Χέρια" accessories: "Εξαρτήματα" - books: "Βιβλία" minions: "Minions" misc: "Διάφορα" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Παίξε το επόμενο επίπεδο" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Πηγαίνετε στην Αρχική" # Only in old-style levels. victory_review: "Πείτε μας περισσότερα!" # Only in old-style levels. victory_hour_of_code_done: "Τελείωσες;" diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee index 909a24e8d..c6dc7371d 100644 --- a/app/locale/en-AU.coffee +++ b/app/locale/en-AU.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee index 023abda26..9520b5200 100644 --- a/app/locale/en-GB.coffee +++ b/app/locale/en-GB.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee index 0f2920ee0..3b3fe7a47 100644 --- a/app/locale/en-US.coffee +++ b/app/locale/en-US.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/en.coffee b/app/locale/en.coffee index f2c9f83a7..ad2a61431 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -73,7 +73,7 @@ adventurer_forum: "the Adventurer forum" adventurer_suffix: "." campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... in which you learn the wizardry of programming." + campaign_old_beginner_description: "... in which you learn the wizardry of programming." campaign_dev: "Random Harder Levels" campaign_dev_description: "... in which you learn the interface while doing something a little harder." campaign_multiplayer: "Multiplayer Arenas" diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee index 5669aa6ac..861f38017 100644 --- a/app/locale/es-419.coffee +++ b/app/locale/es-419.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip adventurer_forum: "el foro del aventurero" adventurer_suffix: "." campaign_old_beginner: "Campaña anterior de principiante" - campaign_beginner_description: "... en la que aprendes la hechicería de la programación." + campaign_old_beginner_description: "... en la que aprendes la hechicería de la programación." campaign_dev: "Niveles aleatorios más difíciles" campaign_dev_description: "... en los que aprendes sobre la interfaz mientras haces algo un poco más difícil." campaign_multiplayer: "Arenas Multijugador" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip armor: "Armadura" hands: "Manos" accessories: "Accesorios" - books: "Libros" minions: "Seguidores" misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip victory_return_to_ladder: "Volver a la escalera" victory_play_next_level: "Jugar Próximo Nivel" # Only in old-style levels. victory_play_continue: "Continuar" +# victory_saving_progress: "Saving Progress" victory_go_home: "Ir al Inicio" # Only in old-style levels. victory_review: "¡Cuéntanos más!" # Only in old-style levels. victory_hour_of_code_done: "¿Has acabado?" diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee index a2d08c635..e70fe83c1 100644 --- a/app/locale/es-ES.coffee +++ b/app/locale/es-ES.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis adventurer_forum: "el foro del aventurero " adventurer_suffix: "sobre ello." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... en la que aprenderás la magia de la programación." + campaign_old_beginner_description: "... en la que aprenderás la magia de la programación." campaign_dev: "Niveles aleatorios más dificiles" campaign_dev_description: "... en los que aprenderás sobre la interfaz mientras haces algo más difícil." campaign_multiplayer: "Arenas Multijugador" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis victory_return_to_ladder: "Volver a Clasificación" victory_play_next_level: "Jugar el siguiente nivel" # Only in old-style levels. victory_play_continue: "Continuar" +# victory_saving_progress: "Saving Progress" victory_go_home: "Ir a Inicio" # Only in old-style levels. victory_review: "¡Cuéntanos más!" # Only in old-style levels. victory_hour_of_code_done: "¿Ya terminaste?" diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee index c5b63805a..8682128a4 100644 --- a/app/locale/fa.coffee +++ b/app/locale/fa.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", adventurer_forum: "انجمن ماجراجو ها" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: ".که شما در آن می توانید جادوگری به وسیله برنامه نویسی را یادبگیرید..." + campaign_old_beginner_description: ".که شما در آن می توانید جادوگری به وسیله برنامه نویسی را یادبگیرید..." campaign_dev: "مراحل سخت تصادفی" campaign_dev_description: "... جایی که میتونید طراحی ظاهر رو یاد بگیرید درحالی که فعالیت سخت تری انجام میدید" campaign_multiplayer: "مسابقات چند نفره" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian", # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee index 252a572d7..6ea8016e0 100644 --- a/app/locale/fi.coffee +++ b/app/locale/fi.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee index 4b264e527..b3ba5175d 100644 --- a/app/locale/fr.coffee +++ b/app/locale/fr.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t adventurer_forum: "le forum de l'Aventurier" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... dans laquelle vous apprendrez la magie de la programmation." + campaign_old_beginner_description: "... dans laquelle vous apprendrez la magie de la programmation." campaign_dev: "Niveaux aléatoires plus difficiles" campaign_dev_description: "... dans lesquels vous apprendrez à utiliser l'interface en faisant quelque chose d'un petit peu plus dur." campaign_multiplayer: "Campagne multi-joueurs" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Jouer au prochain niveau" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Retourner à l'accueil" # Only in old-style levels. victory_review: "Dites-nous en plus!" # Only in old-style levels. victory_hour_of_code_done: "Déjà fini ?" diff --git a/app/locale/he.coffee b/app/locale/he.coffee index 51cdc3551..946e6f80f 100644 --- a/app/locale/he.coffee +++ b/app/locale/he.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", adventurer_forum: "פורום ההרפתקנים" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "...שבו תלמד את קסם התכנות." + campaign_old_beginner_description: "...שבו תלמד את קסם התכנות." campaign_dev: "שלבים אקראים קשים יותר" campaign_dev_description: "...שבהם תלמד על הממשק בזמן שתעשה משהו קצת קשה יותר." campaign_multiplayer: "זירות רב-המשתתפים" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew", # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee index bb69699dd..c77631423 100644 --- a/app/locale/hi.coffee +++ b/app/locale/hi.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee index bee46a6ca..299106b2f 100644 --- a/app/locale/hu.coffee +++ b/app/locale/hu.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t adventurer_forum: "a Kalandozók Fórumán" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... amelyben megtanulhatod a programozás varázslatait." + campaign_old_beginner_description: "... amelyben megtanulhatod a programozás varázslatait." campaign_dev: "Véletlenszerű Nehezebb Pályák" campaign_dev_description: "... amelyekben kicsit nehezebb dolgokkal nézhetsz szembe." campaign_multiplayer: "Multiplayer Arénák" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Következő pálya" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Vissza a kezdőoldalra" # Only in old-style levels. victory_review: "Mondd el a véleményedet!" # Only in old-style levels. victory_hour_of_code_done: "Készen vagy?" diff --git a/app/locale/id.coffee b/app/locale/id.coffee index e0f299366..c7c399d0b 100644 --- a/app/locale/id.coffee +++ b/app/locale/id.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/it.coffee b/app/locale/it.coffee index f85233a5a..2cf126cfd 100644 --- a/app/locale/it.coffee +++ b/app/locale/it.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t adventurer_forum: "forum degli Avventurieri" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... nelle quali imparerai i trucchi della programmazione." + campaign_old_beginner_description: "... nelle quali imparerai i trucchi della programmazione." campaign_dev: "Livelli difficili casuali" campaign_dev_description: "... nei quali imparerai a usare l'interfaccia facendo qualcosa di un po' più difficile." campaign_multiplayer: "Arene multigiocatore" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Gioca il prossimo livello" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Torna alla pagina iniziale" # Only in old-style levels. victory_review: "Dicci di più!" # Only in old-style levels. victory_hour_of_code_done: "Finito?" diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee index 9a4175e50..88fa14564 100644 --- a/app/locale/ja.coffee +++ b/app/locale/ja.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", adventurer_forum: "冒険者の掲示板" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "プログラミングの魔法を学びましょう" + campaign_old_beginner_description: "プログラミングの魔法を学びましょう" campaign_dev: "いろんな難しいレベル" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." campaign_multiplayer: "マルチプレイ・アリーナ" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "次のレベル" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "ホームに戻る" # Only in old-style levels. victory_review: "フィードバック" # Only in old-style levels. victory_hour_of_code_done: "完了してよろしいですか?" diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee index 534b77bd8..1f65c4454 100644 --- a/app/locale/ko.coffee +++ b/app/locale/ko.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t adventurer_forum: "모험가들의 포럼" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... 이곳에서 당신은 프로그래밍의 마법을 배우게 될 것입니다." + campaign_old_beginner_description: "... 이곳에서 당신은 프로그래밍의 마법을 배우게 될 것입니다." campaign_dev: "상급 레벨 랜덤 선택" campaign_dev_description: "... 이곳에서 당신은 조금 더 어려운 레벨에 도전할때 필요한 조작 방법을 배울 것입니다." campaign_multiplayer: "멀티 플레이어 전투장" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t victory_return_to_ladder: "레더로 돌아가기" victory_play_next_level: "다음 레벨 플레이 하기" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "홈으로" # Only in old-style levels. victory_review: "리뷰를 남겨주세요" # Only in old-style levels. victory_hour_of_code_done: "정말 종료합니까?" diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee index 23cbe5ae7..185c802d8 100644 --- a/app/locale/lt.coffee +++ b/app/locale/lt.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee index 4f89c5e2b..7d0797d6e 100644 --- a/app/locale/ms.coffee +++ b/app/locale/ms.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee index cd7f540e0..0d6e09675 100644 --- a/app/locale/nb.coffee +++ b/app/locale/nb.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg adventurer_forum: "Adventurer forumet" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... hvor du lærer trolldommen bak programmering." + campaign_old_beginner_description: "... hvor du lærer trolldommen bak programmering." campaign_dev: "Tilfeldig Vanskeligere Nivåer" campaign_dev_description: "... hvor du lærer grensesnittet mens du stadig gjør mer vanskeligere utfordringer." campaign_multiplayer: "Multispiller Arenaer" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spill Neste Nivå" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Gå Hjem" # Only in old-style levels. victory_review: "Fortell oss mer!" # Only in old-style levels. victory_hour_of_code_done: "Er du ferdig?" diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee index 83bee04e7..356244785 100644 --- a/app/locale/nl-BE.coffee +++ b/app/locale/nl-BE.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: adventurer_forum: "het Avonturiersforum" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... waarin je de toverkunst van het programmeren leert." + campaign_old_beginner_description: "... waarin je de toverkunst van het programmeren leert." campaign_dev: "Willekeurige moeilijkere levels" campaign_dev_description: "... waarin je de interface leert kennen terwijl je wat moeilijkers doet." campaign_multiplayer: "Multiplayer Arena's" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription: victory_return_to_ladder: "Keer terug naar de ladder" victory_play_next_level: "Speel Volgend Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Ga naar Home" # Only in old-style levels. victory_review: "Vertel ons meer!" # Only in old-style levels. victory_hour_of_code_done: "Ben Je Klaar?" diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee index ba1429f28..c541c1424 100644 --- a/app/locale/nl-NL.coffee +++ b/app/locale/nl-NL.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription adventurer_forum: "het Avonturiersforum" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... waarin je de toverkunst van het programmeren leert." + campaign_old_beginner_description: "... waarin je de toverkunst van het programmeren leert." campaign_dev: "Willekeurige moeilijkere levels" campaign_dev_description: "... waarin je de interface leert kennen terwijl je wat moeilijkers doet." campaign_multiplayer: "Multiplayer Arena's" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription victory_return_to_ladder: "Keer terug naar de ladder" victory_play_next_level: "Speel Volgend Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Ga naar Home" # Only in old-style levels. victory_review: "Vertel ons meer!" # Only in old-style levels. victory_hour_of_code_done: "Ben Je Klaar?" diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee index 88b810783..4c40d8a1b 100644 --- a/app/locale/nn.coffee +++ b/app/locale/nn.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/no.coffee b/app/locale/no.coffee index e2af61cbe..93ed924cc 100644 --- a/app/locale/no.coffee +++ b/app/locale/no.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr adventurer_forum: "Eventyrerforumet" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... hvor du lærer trolldommen bak programmering." + campaign_old_beginner_description: "... hvor du lærer trolldommen bak programmering." campaign_dev: "Vanskeligere brett (tilfeldige)" campaign_dev_description: "... hvor du lærer hvordan du bruker skjermbildene mens du stadig løser mer vanskelige utfordringer." campaign_multiplayer: "Flerspiller brett (arenaer)" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Spill neste nivå" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Gå til Hovedsiden" # Only in old-style levels. victory_review: "Fortell oss mer!" # Only in old-style levels. victory_hour_of_code_done: "Er du ferdig?" diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee index 33aebc652..ee27aaf04 100644 --- a/app/locale/pl.coffee +++ b/app/locale/pl.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish adventurer_forum: "forum Podróżników" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... w której nauczysz się magii programowania" + campaign_old_beginner_description: "... w której nauczysz się magii programowania" campaign_dev: "Losowe trudniejsze poziomy" campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego." campaign_multiplayer: "Pola walki dla wielu graczy" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish victory_return_to_ladder: "Powrót do drabinki" victory_play_next_level: "Przejdź na następny poziom" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Powrót do strony głównej" # Only in old-style levels. victory_review: "Powiedz nam coś więcej!" # Only in old-style levels. victory_hour_of_code_done: "Skończyłeś już?" diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 407e13abf..dc020e36d 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: adventurer_forum: "Fórum do Aventureiro" adventurer_suffix: "." campaign_old_beginner: "Campanha antiga para Iniciantes" - campaign_beginner_description: "... na qual você aprenderá a magia da programação." + campaign_old_beginner_description: "... na qual você aprenderá a magia da programação." campaign_dev: "Fases Difíceis Aleatórias" campaign_dev_description: "... nas quais você aprenderá a interface enquanto faz algo um pouco mais difícil." campaign_multiplayer: "Arenas Multijogador" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: armor: "Armadura" hands: "Mãos" accessories: "Accessórios" - books: "Livross" minions: "Minions" misc: "Diversos" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: victory_return_to_ladder: "Retornar para a Ladder" victory_play_next_level: "Jogar o próximo estágio" # Only in old-style levels. victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Ir à página inicial" # Only in old-style levels. victory_review: "Diga-nos mais!" # Only in old-style levels. victory_hour_of_code_done: "Terminou?" @@ -216,13 +216,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: tome_cast_button_castable: "Lançar" # Temporary, if tome_cast_button_run isn't translated. tome_cast_button_casting: "Conjurando" # Temporary, if tome_cast_button_running isn't translated. tome_cast_button_cast: "Feitiço" # Temporary, if tome_cast_button_ran isn't translated. -# tome_cast_button_run: "Run" -# tome_cast_button_running: "Running" -# tome_cast_button_ran: "Ran" + tome_cast_button_run: "Rodar" + tome_cast_button_running: "Rodando" + tome_cast_button_ran: "Encerrado" tome_submit_button: "Enviar" -# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button. + tome_reload_method: "Recarregar o código original para este método" # Title text for individual method reload button. tome_select_method: "Selecione um Método" -# tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos). + tome_see_all_methods: "Visualizar todos os métodos que você pode editar" # Title text for method list selector (shown when there are multiple programmable methdos). tome_select_a_thang: "Selecione alguém para " tome_available_spells: "Feitiços Disponíveis" tome_your_skills: "Suas habilidades" @@ -236,37 +236,37 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: time_total: "Máximo:" time_goto: "Ir para:" infinite_loop_try_again: "Tentar novamente" -# infinite_loop_reset_level: "Reset Level" -# infinite_loop_comment_out: "Comment Out My Code" -# tip_toggle_play: "Toggle play/paused with Ctrl+P." -# tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward." -# tip_guide_exists: "Click the guide at the top of the page for useful info." -# tip_open_source: "CodeCombat is 100% open source!" -# tip_beta_launch: "CodeCombat launched its beta in October, 2013." -# tip_think_solution: "Think of the solution, not the problem." -# tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra" -# tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis" -# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra" -# tip_forums: "Head over to the forums and tell us what you think!" -# tip_baby_coders: "In the future, even babies will be Archmages." -# tip_morale_improves: "Loading will continue until morale improves." -# tip_all_species: "We believe in equal opportunities to learn programming for all species." -# tip_reticulating: "Reticulating spines." -# tip_harry: "Yer a Wizard, " -# tip_great_responsibility: "With great coding skill comes great debug responsibility." -# tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep." -# tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't." -# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" -# tip_no_try: "Do. Or do not. There is no try. - Yoda" -# tip_patience: "Patience you must have, young Padawan. - Yoda" -# tip_documented_bug: "A documented bug is not a bug; it is a feature." -# tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" -# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" -# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" -# tip_hardware_problem: "Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem." -# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law." -# tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth" -# tip_brute_force: "When in doubt, use brute force. - Ken Thompson" + infinite_loop_reset_level: "Resetar nível" + infinite_loop_comment_out: "Comentar Meu Código" + tip_toggle_play: "Alterne entre rodando/pausado com Ctrl+P." + tip_scrub_shortcut: "Ctrl+[ e Ctrl+] rebobina e avança." + tip_guide_exists: "Clique no guia no topo da página para informações úteis." + tip_open_source: "CodeCombat é 100% código aberto!" + tip_beta_launch: "CodeCombat lançou sua versão beta em outubro de 2013." + tip_think_solution: "Pense na solução, não no problema." + tip_theory_practice: "Na teoria, não existe diferença entre teoria e prática. Mas, na prática, há. - Yogi Berra" + tip_error_free: "Existem duas formas de escrever programas sem erros; apenas a terceira funciona. - Alan Perlis" + tip_debugging_program: "Se depurar é o processo de remover erros, então programar deve ser o processo de adicioná-los. - Edsger W. Dijkstra" + tip_forums: "Vá aos fóruns e diga-nos o que você pensa!" + tip_baby_coders: "No futuro, até bebês serão Arquimagos." + tip_morale_improves: "O carregamento continuará até que a ânimo melhore." + tip_all_species: "Nós acreditamos em oportunidades iguais para todas as espécies aprenderem a programar." + tip_reticulating: "Reticulando espinhas." + tip_harry: "Você é um Feiticeiro, " + tip_great_responsibility: "Com grandes poderes de programacão vêm grandes responsabilidades de debug." + tip_munchkin: "Se você não comer legumes e verduras, um ogro virá te buscar equanto você estiver dormindo." + tip_binary: "Existem apenas 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem." + tip_commitment_yoda: "Um programador deve possuir um compromisso profundo, uma mente séria. ~ Yoda" + tip_no_try: "Faça. Ou não faça. Não existe tentar. - Yoda" + tip_patience: "Paciência você deve ter, jovem Padawan. - Yoda" + tip_documented_bug: "Um bug documentado não é um bug; é uma funcionalidade." + tip_impossible: "Sempre parece impossível, até ser feito. - Nelson Mandela" + tip_talk_is_cheap: "Falar é fácil. Mostre-me o código. - Linus Torvalds" + tip_first_language: "A coisa mais desastrosa que você pode aprender é a sua primeira linguagem de programação. - Alan Kay" + tip_hardware_problem: "P: Quantos programadores são necessários para se trocar uma lâmpada? R: Nenhum, é um problema de hardware." + tip_hofstadters_law: "Lei de Hofstadter: Sempre demora mais do que você espera, mesmo quando você leva em consideração a Lei de Hofstadter." + tip_premature_optimization: "Uma otimização permatura é a raíz de todos os males. - Donald Knuth" + tip_brute_force: "Na dúvida, utilize força bruta. - Ken Thompson" customize_wizard: "Personalize o feiticeiro" game_menu: @@ -277,14 +277,14 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: guide_tab: "Guia" multiplayer_tab: "Multijogador" inventory_caption: "Equipar seu herói" -# choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" -# options_caption: "Configure settings" + choose_hero_caption: "Escolha seu herói, linguagem" + save_load_caption: "... e visualizar o histórico" + options_caption: "Configurar preferências" guide_caption: "Documentos e dicas" -# multiplayer_caption: "Play with friends!" + multiplayer_caption: "Jogue com seus amigos!" -# inventory: -# choose_inventory: "Equip Items" + inventory: + choose_inventory: "Equipar itens" choose_hero: choose_hero: "Escolha seu Herói" @@ -300,23 +300,23 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: granularity_change_history: "Histórico" options: -# general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level + general_options: "Opções Gerais" # Check out the Options tab in the Game Menu while playing a level volume_label: "Volume" music_label: "Música" -# music_description: "Turn background music on/off." -# autorun_label: "Autorun" -# autorun_description: "Control automatic code execution." + music_description: "Ligar/desligar música de fundo." + autorun_label: "Rodar automaticamente" + autorun_description: "Controlar execução automática do código." editor_config: "Editor de Configurações" editor_config_title: "Editor de Configurações" -# editor_config_level_language_label: "Language for This Level" -# editor_config_level_language_description: "Define the programming language for this particular level." -# editor_config_default_language_label: "Default Programming Language" -# editor_config_default_language_description: "Define the programming language you want to code in when starting new levels." + editor_config_level_language_label: "Linguagem para este nível" + editor_config_level_language_description: "Definir linguagem para esse nível específico." + editor_config_default_language_label: "Linguagem de programação padrão" + editor_config_default_language_description: "Define a linguagem de programação que você quer utilizar quando iniciar novos níveis." editor_config_keybindings_label: "Teclas de Atalho" editor_config_keybindings_default: "Padrão (Ace)" editor_config_keybindings_description: "Adicionar atalhos conhecidos de editores comuns." -# editor_config_livecompletion_label: "Live Autocompletion" -# editor_config_livecompletion_description: "Displays autocomplete suggestions while typing." + editor_config_livecompletion_label: "Autocompletar durante a escrita" + editor_config_livecompletion_description: "Mostra opções de autocompletar enquanto estiver escrevendo." editor_config_invisibles_label: "Mostrar Invisíveis" editor_config_invisibles_description: "Mostrar invisíveis como espaços e tabs." editor_config_indentguides_label: "Mostrar Linhas de Identação" @@ -339,14 +339,14 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: press_paragraph_1_suffix: ". Todas as logomarcas e imagens podem ser usadas sem nos contactar previamente." team: "Time" george_title: "CEO" - george_blurb: "Administrador" # Businesser + george_blurb: "Administrador" scott_title: "Programador" scott_blurb: "O Sensato" nick_title: "Programador" nick_blurb: "Guru Motivacional" michael_title: "Programador" michael_blurb: "Administrador de Sistemas" - matt_title: "PProgramador" + matt_title: "Programador" matt_blurb: "O Ciclista" versions: @@ -367,8 +367,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: forum_page: "nosso fórum" forum_suffix: " ao invés disso." send: "Enviar opinião" -# contact_candidate: "Contact Candidate" # Deprecated -# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated + contact_candidate: "Contactar Candidato" # Deprecated + recruitment_reminder: "Utilize esse formulário para entrar em contato com candidatos que você esteja interessado em entrevistar. Lembre-se que o CodeCombat cobra 15% do salário do primeiro ano. A taxa de contratação é cobrada quando da contratação do empregado e é reembolsável por 90 dias, se o empregado não permanece no emprego. Empregados de meio-turno, remotos ou com contrato serão gratuitos como estagiários." # Deprecated account_settings: title: "Configurações da Conta" @@ -387,8 +387,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: email_announcements: "Notícias" email_announcements_description: "Receba emails com as últimas notícias e desenvolvimentos do CodeCombat." email_notifications: "Notificações" -# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity." -# email_any_notes: "Any Notifications" + email_notifications_summary: "Controles para notificações por email, automáticas e personalizadas, relacionadas a sua atividade no CodeCombat." + email_any_notes: "Quaisquer Notificações" email_any_notes_description: "Desabilitar todas as atividades de notificação por email." email_news: "Notícias" email_recruit_notes: "Oportunidades de emprego" @@ -403,8 +403,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: password_mismatch: "As senhas não estão iguais" password_repeat: "Por favor repita sua senha." job_profile: "Perfil de trabalho" # Rest of this section (the job profile stuff and wizard stuff) is deprecated -# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." -# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." + job_profile_approved: "Seu perfil de trabalho foi aprovado pelo CodeCombat. Empregadores poderão vê-lo até que você o marque como inativo ou caso não seja alterado por quatro semanas." + job_profile_explanation: "Olá! Preencha tudo e iremos entrar em contato sobre encontrar um trabalho como desenvolvedor de software." sample_profile: "Veja um perfil de exemplo" view_profile: "Visualizar seu perfil" wizard_tab: "Feiticeiro" @@ -416,37 +416,37 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: enter: "Enter" escape: "Esc" shift: "Shift" -# cast_spell: "Cast current spell." -# run_real_time: "Run in real time." -# continue_script: "Continue past current script." -# skip_scripts: "Skip past all skippable scripts." -# toggle_playback: "Toggle play/pause." -# scrub_playback: "Scrub back and forward through time." -# single_scrub_playback: "Scrub back and forward through time by a single frame." -# scrub_execution: "Scrub through current spell execution." -# toggle_debug: "Toggle debug display." -# toggle_grid: "Toggle grid overlay." -# toggle_pathfinding: "Toggle pathfinding overlay." -# beautify: "Beautify your code by standardizing its formatting." -# maximize_editor: "Maximize/minimize code editor." -# move_wizard: "Move your Wizard around the level." + cast_spell: "Lançar feitiço atual." + run_real_time: "Rodar em tempo real." + continue_script: "Pular script atual." + skip_scripts: "Pular todos os scripts puláveis." + toggle_playback: "Alternar play/pause." + scrub_playback: "Rolar para frente e para trás no tempo." + single_scrub_playback: "Rolar para frente e para trás no tempo, quadro a quadro." + scrub_execution: "Rolar através da execução do feitiço atual." + toggle_debug: "Ligar/desligar informações de debug." + toggle_grid: "Ligar/desligar exibição da grade." + toggle_pathfinding: "Ligar/desligar exibição do pathfinding (caminho)." + beautify: "Embeleze seu código a partir da padronização de formatação." + maximize_editor: "Maximizar/minimizar editor de código." + move_wizard: "Mova o Wizard pelo nível." community: main_title: "Comunidade CodeCombat" -# introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!" + introduction: "Verifique abaixo de que maneires você pode se envolver e decida qual lhe parece mais divertida. Esperamos trabalhar com você em breve!" level_editor_prefix: "Use o CodeCombat" -# level_editor_suffix: "to create and edit levels. Users have created levels for their classes, friends, hackathons, students, and siblings. If create a new level sounds intimidating you can start by forking one of ours!" -# thang_editor_prefix: "We call units within the game 'thangs'. Use the" -# thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites." -# article_editor_prefix: "See a mistake in some of our docs? Want to make some instructions for your own creations? Check out the" -# article_editor_suffix: "and help CodeCombat players get the most out of their playtime." -# find_us: "Find us on these sites" -# social_blog: "Read the CodeCombat blog on Sett" -# social_discource: "Join the discussion on our Discourse forum" + level_editor_suffix: "para criar e editar níveis. Usuários criaram níveis para suas classes, amigos, hackathons, estudantes e parentes. Se criar um novo nível soa intimidador, você pode iniciar fazendo um fork de um dos nossos." + thang_editor_prefix: "Nós chamamos as unidades do jogo de 'thangs'. Utilize o" + thang_editor_suffix: "para modificar o fonte das artes. Permita que lancem projéteis, modifique a direção das animações, modifique os pontos de vida da unidade ou envie seu próprio vetor de sprites." + article_editor_prefix: "Encontrou algo errado na nossa documentação? Gostaria de criar algumas instruções para suas próprias criações? Dê uma olhada em" + article_editor_suffix: "e ajude os jogadores do CodeCombat a aproveitar o máximo de seu jogo." + find_us: "Encontre-nos nestes sites" + social_blog: "Leia o blog do CodeCombat no Sett" + social_discource: "Entre na discussão no nosso Fórum" social_facebook: "Curta o CodeCombat no Facebook" social_twitter: "Siga o CodeCombat no Twitter" -# social_gplus: "Join CodeCombat on Google+" -# social_hipchat: "Chat with us in the public CodeCombat HipChat room" + social_gplus: "Ingresse no CodeCombat no Google+" + social_hipchat: "Converse conosco na sala pública do CodeCombat no HipChat" contribute_to_the_project: "Contribuir para o projeto" classes: @@ -468,19 +468,19 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: article_title: "Editor de Artigo" thang_title: "Editor de Thang" level_title: "Editor de Nível" -# achievement_title: "Achievement Editor" + achievement_title: "Editor de Conquistas" back: "Voltar" revert: "Reverter" revert_models: "Reverter Modelos" pick_a_terrain: "Escolha um Terreno" small: "Pequeno" -# grassy: "Grassy" -# fork_title: "Fork New Version" -# fork_creating: "Creating Fork..." -# generate_terrain: "Generate Terrain" + grassy: "Gramado" + fork_title: "Realizar um Novo Fork" + fork_creating: "Criando Fork..." + generate_terrain: "Gerando Terreno" more: "Mais" wiki: "Wiki" -# live_chat: "Live Chat" + live_chat: "Chat Ao Vivo" level_some_options: "Algumas Opções?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -489,7 +489,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: level_tab_systems: "Sistemas" level_tab_docs: "Documentação" level_tab_thangs_title: "Thangs Atuais" -# level_tab_thangs_all: "All" + level_tab_thangs_all: "Tudo" level_tab_thangs_conditions: "Condições de Início" level_tab_thangs_add: "Adicionar Thangs" delete: "Excluir" @@ -512,20 +512,20 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: new_article_title: "Criar um Novo Artigo" new_thang_title: "Criar um Novo Tipo de Thang" new_level_title: "Criar um Novo Nível" -# new_article_title_login: "Log In to Create a New Article" + new_article_title_login: "Faça login para Criar um Novo Artigo" # new_thang_title_login: "Log In to Create a New Thang Type" -# new_level_title_login: "Log In to Create a New Level" -# new_achievement_title: "Create a New Achievement" -# new_achievement_title_login: "Log In to Create a New Achievement" + new_level_title_login: "Faça login para Criar um Novo Nível" + new_achievement_title: "Criar Nova Conquista" + new_achievement_title_login: "Faça login para Criar uma Nova Conquista" article_search_title: "Procurar Artigos Aqui" thang_search_title: "Procurar Tipos de Thang Aqui" level_search_title: "Procurar Níveis Aqui" -# achievement_search_title: "Search Achievements" -# read_only_warning2: "Note: you can't save any edits here, because you're not logged in." -# no_achievements: "No achievements have been added for this level yet." + achievement_search_title: "Buscar Conquistas" + read_only_warning2: "Nota: você não pode salvar suas edições aqui pois não está logado." + no_achievements: "Nenhuma conquista foi adicionada para esse nível ainda." # achievement_query_misc: "Key achievement off of miscellanea" # achievement_query_goals: "Key achievement off of level goals" -# level_completion: "Level Completion" + level_completion: "Conclusão do Nível" article: edit_btn_preview: "Prever" @@ -541,7 +541,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: introduction_desc_ending: "Nós esperamos que você se junte a nossa festa!" introduction_desc_signature: "- Nick, George, Scott, Michael, Jeremy and Matt" alert_account_message_intro: "Ei!" -# alert_account_message: "To subscribe for class emails, you'll need to be logged in first." + alert_account_message: "Para assinar os emails de classe, você precisa estar logado." archmage_summary: "Interessado em trabalhar em gráficos do jogo, design de interface de usuário, banco de dados e organização de servidores, networking multijogador, física, som ou desempenho do motor de jogo? Quer ajudar a construir um jogo para ajudar outras pessoas a aprender o que você é bom? Temos muito a fazer e se você é um programador experiente e quer desenvolver para o CodeCombat, esta classe é para você. Gostaríamos muito de sua ajuda a construir o melhor jogo de programação da história." archmage_introduction: "Uma das melhores partes sobre a construção de jogos é que eles sintetizam diversas coisas diferentes. Gráficos, som, interação em tempo real, redes sociais, e, claro, muitos dos aspectos mais comuns da programação, desde a gestão em baixo nível de banco de dados, e administração do servidor até interação com o usuário e desenvolvimento da interface. Há muito a fazer, e se você é um programador experiente com um desejo ardente de realmente mergulhar no âmago da questão do CodeCombat, esta classe pode ser para você. Nós gostaríamos de ter sua ajuda para construir o melhor jogo de programação de todos os tempos." class_attributes: "Atributos da Classe" @@ -623,11 +623,11 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: simulation_explanation: "Por simular partidas você pode classificar seu jogo mais rápido!" simulate_games: "Simular Partidas!" simulate_all: "RESETAR E SIMULAR PARTIDAS" -# games_simulated_by: "Games simulated by you:" -# games_simulated_for: "Games simulated for you:" -# games_simulated: "Games simulated" -# games_played: "Games played" -# ratio: "Ratio" + games_simulated_by: "Partidas simuladas por você:" + games_simulated_for: "Partidas simuladas para você:" + games_simulated: "Partidas simuladas" + games_played: "Partidas jogadas" + ratio: "Taxa" leaderboard: "Tabela de Classificação" battle_as: "Lutar como " summary_your: "Seus " @@ -640,13 +640,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: rank_submitted: "Submetendo para a Classificação" rank_failed: "Falha ao Classificar" rank_being_ranked: "Jogo sendo Classificado" -# rank_last_submitted: "submitted " -# help_simulate: "Help simulate games?" + rank_last_submitted: "enviado " + help_simulate: "Ajuda simulando partidas?" code_being_simulated: "Seu novo código está sendo simulado por outros jogadores para ser classificado. Isto atualizará automaticamente assim que novas partidas entrarem." no_ranked_matches_pre: "Sem partidas classificadas para o " no_ranked_matches_post: " time! Jogue contra alguns competidores e então volte aqui para ter seu jogo classificado." choose_opponent: "Escolha um Oponente" -# select_your_language: "Select your language!" + select_your_language: "Selecione sua linguagem!" tutorial_play: "Jogue o Tutorial" tutorial_recommended: "Recomendado se você nunca jogou antes" tutorial_skip: "Pular Tutorial" @@ -654,21 +654,21 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: tutorial_play_first: "Jogue o Tutorial primeiro." simple_ai: "IA Simples" warmup: "Aquecimento" -# friends_playing: "Friends Playing" -# log_in_for_friends: "Log in to play with your friends!" -# social_connect_blurb: "Connect and play against your friends!" -# invite_friends_to_battle: "Invite your friends to join you in battle!" -# fight: "Fight!" -# watch_victory: "Watch your victory" -# defeat_the: "Defeat the" -# tournament_ends: "Tournament ends" -# tournament_ended: "Tournament ended" -# tournament_rules: "Tournament Rules" -# tournament_blurb: "Write code, collect gold, build armies, crush foes, win prizes, and upgrade your career in our $40,000 Greed tournament! Check out the details" -# tournament_blurb_criss_cross: "Win bids, construct paths, outwit opponents, grab gems, and upgrade your career in our Criss-Cross tournament! Check out the details" -# tournament_blurb_blog: "on our blog" -# rules: "Rules" -# winners: "Winners" + friends_playing: "Amigos Jogando" + log_in_for_friends: "Faça loginp ara jogar com seus amigos!" + social_connect_blurb: "Conecte-se e jogue contra seus amigos!" + invite_friends_to_battle: "Convide seus amigos para juntarem-se à sua batalha!" + fight: "Lutem!" + watch_victory: "Assista sua vitória" + defeat_the: "Derrote" + tournament_ends: "Fim do torneio" + tournament_ended: "Torneio encerrado" + tournament_rules: "Regras do Torneio" + tournament_blurb: "Escreva códigos, colete ouro, construa exércitos, esmague inimigos, ganhe prêmios e aprimore sua carreira no nosso Torneio da Cobiça de $40,000! Veja os detalhes" + tournament_blurb_criss_cross: "Ganhe leilões, construa caminhos, despiste oponentes, agarre joias e aprimore sua carreira no nosso Torneio de Cruzadas! Veja os detalhes" + tournament_blurb_blog: "no nosso blog" + rules: "Regras" + winners: "Vencedores" user: stats: "Estatísticas" @@ -687,8 +687,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: achievements: last_earned: "Últimos Ganhos" -# amount_achieved: "Amount" -# achievement: "Achievement" + amount_achieved: "Montante" + achievement: "Conquista" category_contributor: "Cotribuidor" category_miscellaneous: "Diversos" category_levels: "Níveis" @@ -696,95 +696,95 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: current_xp_prefix: "" current_xp_postfix: " no total" new_xp_prefix: "" -# new_xp_postfix: " earned" + new_xp_postfix: " adquirido" left_xp_prefix: "" -# left_xp_infix: " until level " + left_xp_infix: " até o nível " left_xp_postfix: "" account: recently_played: "Jogos Recentes" no_recent_games: "Não foram feitos jogos durante duas semanas." -# loading_error: -# could_not_load: "Error loading from server" -# connection_failure: "Connection failed." -# unauthorized: "You need to be signed in. Do you have cookies disabled?" -# forbidden: "You do not have the permissions." -# not_found: "Not found." -# not_allowed: "Method not allowed." -# timeout: "Server timeout." -# conflict: "Resource conflict." -# bad_input: "Bad input." -# server_error: "Server error." -# unknown: "Unknown error." + loading_error: + could_not_load: "Erro ao carregar do servidor" + connection_failure: "Conexão falhou." + unauthorized: "Você precisa estar autenticado. Você desativou os cookies?" + forbidden: "Você não possui permissão." + not_found: "Não encontrado." + not_allowed: "Método não permitodo." + timeout: "Tempo de requisição esgotado." + conflict: "Conflito de recurso." + bad_input: "Problema de entrada (bad input)." + server_error: "Erro do servidor." + unknown: "Erro desconhecido." -# resources: -# sessions: "Sessions" -# your_sessions: "Your Sessions" -# level: "Level" -# social_network_apis: "Social Network APIs" -# facebook_status: "Facebook Status" -# facebook_friends: "Facebook Friends" -# facebook_friend_sessions: "Facebook Friend Sessions" -# gplus_friends: "G+ Friends" -# gplus_friend_sessions: "G+ Friend Sessions" -# leaderboard: "Leaderboard" -# user_schema: "User Schema" -# user_profile: "User Profile" -# patches: "Patches" -# patched_model: "Source Document" -# model: "Model" -# system: "System" -# systems: "Systems" -# component: "Component" -# components: "Components" -# thang: "Thang" -# thangs: "Thangs" -# level_session: "Your Session" -# opponent_session: "Opponent Session" -# article: "Article" -# user_names: "User Names" -# thang_names: "Thang Names" -# files: "Files" -# top_simulators: "Top Simulators" -# source_document: "Source Document" -# document: "Document" -# sprite_sheet: "Sprite Sheet" -# employers: "Employers" -# candidates: "Candidates" -# candidate_sessions: "Candidate Sessions" -# user_remark: "User Remark" -# user_remarks: "User Remarks" -# versions: "Versions" -# items: "Items" -# heroes: "Heroes" -# wizard: "Wizard" -# achievement: "Achievement" -# clas: "CLAs" -# play_counts: "Play Counts" -# feedback: "Feedback" + resources: + sessions: "Sessão" + your_sessions: "Sua sessão" + level: "Nível" + social_network_apis: "APIs das Redes Sociais" + facebook_status: "Status do Facebook" + facebook_friends: "Amigos do Facebook" + facebook_friend_sessions: "Sessões de Amigos do Facebook" + gplus_friends: "Amigos do G+" + gplus_friend_sessions: "Sessões de Amigos do G+" + leaderboard: "Tabela de Classificação" + user_schema: "Esquema do Usuário" + user_profile: "Perfil do Usuário" + patches: "Patches" + patched_model: "Documento da Fonte" + model: "Modelo" + system: "Sistema" + systems: "Sistemas" + component: "Componente" + components: "Componentes" + thang: "Thang" + thangs: "Thangs" + level_session: "Sua Sessão" + opponent_session: "Sessão do Oponente" + article: "Artigo" + user_names: "Nomes de Usuários" + thang_names: "Nome do Thang" + files: "Arquivos" + top_simulators: "Top Simuladores" + source_document: "Documento da Fonte" + document: "Documento" + sprite_sheet: "Folha de Sprites" + employers: "Empregadores" + candidates: "Candidatos" + candidate_sessions: "Sessão do Candidato" + user_remark: "Observação do Usuário" + user_remarks: "Observações do Usuário" + versions: "Versões" + items: "Itens" + heroes: "Heróis" + wizard: "Assistente" + achievement: "Conquista" + clas: "CLAs" + play_counts: "Contagem de Jogos" + feedback: "Comentários" delta: -# added: "Added" -# modified: "Modified" -# deleted: "Deleted" -# moved_index: "Moved Index" -# text_diff: "Text Diff" -# merge_conflict_with: "MERGE CONFLICT WITH" + added: "Adicionado" + modified: "Modificado" + deleted: "Removido" + moved_index: "Índice Movido" + text_diff: "Diff do Texto" + merge_conflict_with: "MERGE DO CONFLITO COM" no_changes: "Sem Alterações" # guide: # temp: "Temp" multiplayer: - multiplayer_title: "Configurações do Multijogador" # We'll be changing this around significantly soon. Until then, it's not important to translate. -# multiplayer_toggle: "Enable multiplayer" -# multiplayer_toggle_description: "Allow others to join your game." + multiplayer_title: "Configurações de Multijogador" # We'll be changing this around significantly soon. Until then, it's not important to translate. + multiplayer_toggle: "Habilitar multijogador" + multiplayer_toggle_description: "Permitir que outros entrem no seu jogo." multiplayer_link_description: "Passe este link para quem você quiser que se una à partida." multiplayer_hint_label: "Dica:" multiplayer_hint: " Clique no link para selecionar tudo, então dê Ctrl+C ou ⌘+C para copiar o link. " multiplayer_coming_soon: "Mais novidades no multijogador estão chegando!" -# multiplayer_sign_in_leaderboard: "Sign in or create an account and get your solution on the leaderboard." + multiplayer_sign_in_leaderboard: "Autentique-se ou crie uma conta para enviar sua solução para a tabela de classificação." legal: page_title: "Jurídico" @@ -847,25 +847,25 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: nutshell_description: "Todos os recursos que oferecemos no Editor de Níveis é livre para usar como quiser para a criação de níveis. Mas nós nos reservamos o direito de restringir a distribuição dos próprios níveis (que são criados em codecombat.com) para que possam ser cobrados no futuro, se é que isso precise acontecer." canonical: "A versão em inglês deste documento é a versão canônica definitiva. Se houver discrepâncias entre traduções, o documento em inglês tem precedência." -# ladder_prizes: -# title: "Tournament Prizes" # This section was for an old tournament and doesn't need new translations now. -# blurb_1: "These prizes will be awarded according to" -# blurb_2: "the tournament rules" -# blurb_3: "to the top human and ogre players." -# blurb_4: "Two teams means double the prizes!" -# blurb_5: "(There will be two first place winners, two second-place winners, etc.)" -# rank: "Rank" -# prizes: "Prizes" -# total_value: "Total Value" + ladder_prizes: + title: "Prêmios do Torneio" # This section was for an old tournament and doesn't need new translations now. + blurb_1: "Esses prêmios serão entregues de acordo com" + blurb_2: "as regras do torneio" + blurb_3: "para os melhores jogadores humano e ogro." + blurb_4: "Dois times significa o dobro de prêmios!" + blurb_5: "(Haverá dois vencedores em primeiro lugar, dois vencedores em segundo lugar etc.)" + rank: "Classificação" + prizes: "Prêmios" + total_value: "Valor Total" # in_cash: "in cash" -# custom_wizard: "Custom CodeCombat Wizard" -# custom_avatar: "Custom CodeCombat avatar" -# heap: "for six months of \"Startup\" access" -# credits: "credits" -# one_month_coupon: "coupon: choose either Rails or HTML" -# one_month_discount: "discount, 30% off: choose either Rails or HTML" -# license: "license" -# oreilly: "ebook of your choice" + custom_wizard: "Assistente Personalizado do CodeCombat" + custom_avatar: "Avatar Personalizado do CodeCombat" + heap: "para seis meses de acesso \"Startup\"" + credits: "créditos" + one_month_coupon: "cupom: escolha Rails ou HTML" + one_month_discount: "desconto de 30%: escolha Rails ou HTML" + license: "licença" + oreilly: "ebook de sua escolha" wizard_settings: title: "Configurações do Feiticeiro" @@ -889,110 +889,110 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: done_editing: "Edição Feita" profile_for_prefix: "Perfil de " profile_for_suffix: "" -# featured: "Featured" -# not_featured: "Not Featured" -# looking_for: "Looking for:" + featured: "Disponível" + not_featured: "Não disponível" + looking_for: "Procurando por:" last_updated: "Última atualização:" contact: "Contato" -# active: "Looking for interview offers now" -# inactive: "Not looking for offers right now" + active: "Procurando por entrevistas de emprego no momento" + inactive: "Não está procurando por oportunidades no momento" complete: "Completo" next: "Próximo" next_city: "Cidade?" -# next_country: "pick your country." + next_country: "escolha seu país." next_name: "Nome?" -# next_short_description: "write a short description." -# next_long_description: "describe your desired position." -# next_skills: "list at least five skills." -# next_work: "chronicle your work history." -# next_education: "recount your educational ordeals." -# next_projects: "show off up to three projects you've worked on." -# next_links: "add any personal or social links." -# next_photo: "add an optional professional photo." -# next_active: "mark yourself open to offers to show up in searches." + next_short_description: "escreva uma breve descrição." + next_long_description: "descreva o tipo de vaga ou cargo desejados." + next_skills: "relacione pelo menos cinco habilidades." + next_work: "descreva seu histórico de trabalho." + next_education: "descreva seu percurso acadêmico." + next_projects: "mostre até três projetos nos quais você trabalhou." + next_links: "adicione links pessoais ou sociais." + next_photo: "adicione uma foto profissional (opcional)." + next_active: "marque-se como \"aberto a oportunidades\"." example_blog: "Blog" example_personal_site: "Site Pessoal" -# links_header: "Personal Links" -# links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog." -# links_name: "Link Name" -# links_name_help: "What are you linking to?" -# links_link_blurb: "Link URL" -# basics_header: "Update basic info" - basics_active: "Aberto para Ofertas" -# basics_active_help: "Want interview offers right now?" -# basics_job_title: "Desired Job Title" -# basics_job_title_help: "What role are you looking for?" + links_header: "Links Pessoais" + links_blurb: "Adicione links para sites ou perfis que você gostaria de destacar, como seu GitHub, LinkedIn ou seu blog." + links_name: "Nome do Link" + links_name_help: "Para onde você está linkando?" + links_link_blurb: "URL do Link" + basics_header: "Atualizar informações básicas" + basics_active: "Aberto para Oportunidades" + basics_active_help: "Está procurando oportunidades de entrevista agora?" + basics_job_title: "Título do Trabalho Desejado" + basics_job_title_help: "Qual cargo você está procurando?" basics_city: "Cidade" -# basics_city_help: "City you want to work in (or live in now)." + basics_city_help: "Cidade que você quer trabalhar (ou morar)." basics_country: "País" -# basics_country_help: "Country you want to work in (or live in now)." -# basics_visa: "US Work Status" -# basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)" -# basics_looking_for: "Looking For" -# basics_looking_for_full_time: "Full-time" -# basics_looking_for_part_time: "Part-time" -# basics_looking_for_remote: "Remote" -# basics_looking_for_contracting: "Contracting" -# basics_looking_for_internship: "Internship" -# basics_looking_for_help: "What kind of developer position do you want?" -# name_header: "Fill in your name" -# name_anonymous: "Anonymous Developer" -# name_help: "Name you want employers to see, like 'Nick Winter'." -# short_description_header: "Write a short description of yourself" -# short_description_blurb: "Add a tagline to help an employer quickly learn more about you." -# short_description: "Tagline" -# short_description_help: "Who are you, and what are you looking for? 140 characters max." -# skills_header: "Skills" -# skills_help: "Tag relevant developer skills in order of proficiency." -# long_description_header: "Describe your desired position" -# long_description_blurb: "Tell employers how awesome you are and what role you want." -# long_description: "Self Description" -# long_description_help: "Describe yourself to potential employers. Keep it short and to the point. We recommend outlining the position that would most interest you. Tasteful markdown okay; 600 characters max." -# work_experience: "Work Experience" -# work_header: "Chronicle your work history" -# work_years: "Years of Experience" -# work_years_help: "How many years of professional experience (getting paid) developing software do you have?" -# work_blurb: "List your relevant work experience, most recent first." -# work_employer: "Employer" -# work_employer_help: "Name of your employer." -# work_role: "Job Title" -# work_role_help: "What was your job title or role?" + basics_country_help: "País que você quer trabalhar (ou morar)." + basics_visa: "Status de Trabalho nos EUA" + basics_visa_help: "Você está autorizado a trabalhar nos EUA ou você precisa de patrocínio para o VISA? (Se você mora no Canadá ou na Austrália, marque como autorizado.)" + basics_looking_for: "Procurando por" + basics_looking_for_full_time: "Tempo integral" + basics_looking_for_part_time: "Meio-turno" + basics_looking_for_remote: "Remoto" + basics_looking_for_contracting: "Contratando" + basics_looking_for_internship: "Estágio" + basics_looking_for_help: "Que tipo de cargo de desenvolvendor você procura?" + name_header: "Preencha seu nome" + name_anonymous: "Desenvolvedor Anônimo" + name_help: "Nome que você quer que os empregadores vejam, por exemplo 'Nick Winter'." + short_description_header: "Escreva uma breve descrição de si mesmo" + short_description_blurb: "Adicione um slogan (frase) que ajudará o empregador a lhe conhecer rapidamente." + short_description: "Slogan" + short_description_help: "Quem é você e o que você está procurando? Máximo de 140 caracteres." + skills_header: "Habilidades" + skills_help: "Marque habilidades de desenvolvimento relevantes em ordem de proficiência." + long_description_header: "Descreva o cargo desejado" + long_description_blurb: "Diga aos empregadores o quão incrível você é e qual cargo você deseja." + long_description: "Autodescrição" + long_description_help: "Descreva a si mesmo para seu potencial empregador. Mantenha curto e direto. Recomendamos esboçar o cargo que mais lhe interessa. Máximo de 600 caracteres." + work_experience: "Experiência de Trabalho" + work_header: "Descreva seu histórico de trabalho" + work_years: "Anos de Experiência" + work_years_help: "Quantos anos de experiência profissional (sendo pago) de desenvolvimento de software você tem?" + work_blurb: "Liste experiências relevantes de trabalho. As mais recentes primeiro." + work_employer: "Empregador" + work_employer_help: "Nome do empregador." + work_role: "Título do Emprego" + work_role_help: "Qual era a sua função ou cargo no emprego?" work_duration: "Duração" -# work_duration_help: "When did you hold this gig?" + work_duration_help: "Por quanto tempo?" work_description: "Descrição" -# work_description_help: "What did you do there? (140 chars; optional)" + work_description_help: "O que você fez lá? (140 carac.; opcional)" education: "Educação" -# education_header: "Recount your academic ordeals" -# education_blurb: "List your academic ordeals." + education_header: "Descreva seu percurso acadêmico" + education_blurb: "Liste seu percurso acadêmico." education_school: "Escola" education_school_help: "Nome da sua escola." education_degree: "Grau" -# education_degree_help: "What was your degree and field of study?" + education_degree_help: "Qual é o seu grau e área de estudo?" education_duration: "Datas" education_duration_help: "Quando?" education_description: "Descrição" -# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)" + education_description_help: "Destaque qualquer coisa sobre essa experiência acadêmica. (140 carac.; opcional)" our_notes: "Nossas notas" -# remarks: "Remarks" + remarks: "Observações" projects: "Projetos" projects_header: "Adicione 3 projetos" projects_header_2: "Projetos (Top 3)" projects_blurb: "Destaque seus projetos para impressionar os empregadores." project_name: "Nome do Projeto" -# project_name_help: "What was the project called?" + project_name_help: "Como o projeto se chama?" project_description: "Descrição" -# project_description_help: "Briefly describe the project." + project_description_help: "Descreva o projeto brevemente." project_picture: "Imagem" -# project_picture_help: "Upload a 230x115px or larger image showing off the project." + project_picture_help: "Envie uma imagem com 230x115px ou maior mostrando o projeto." project_link: "Link" project_link_help: "Link para o projeto." -# player_code: "Player Code" + player_code: "Código do Jogador" -# employers: -# deprecation_warning_title: "Sorry, CodeCombat is not recruiting right now." -# deprecation_warning: "We are focusing on beginner levels instead of finding expert developers for the time being." -# hire_developers_not_credentials: "Hire developers, not credentials." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section. -# get_started: "Get Started" + employers: + deprecation_warning_title: "Desculpe, o CodeCombat não está recrutando no momento." + deprecation_warning: "Estamos nos concentrando em níveis iniciante, em vez de encontrar desenvolvedores especializados no momento." + hire_developers_not_credentials: "Contrate desenvolvedores, não referências." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section. + get_started: "Comece" # already_screened: "We've already technically screened all our candidates" # filter_further: ", but you can also filter further:" # filter_visa: "Visa" @@ -1035,19 +1035,19 @@ module.exports = nativeDescription: "português do Brasil", englishDescription: # inactive_developers: "Inactive Developers" admin: -# av_espionage: "Espionage" # Really not important to translate /admin controls. -# av_espionage_placeholder: "Email or username" -# av_usersearch: "User Search" -# av_usersearch_placeholder: "Email, username, name, whatever" -# av_usersearch_search: "Search" + av_espionage: "Espionagem" # Really not important to translate /admin controls. + av_espionage_placeholder: "Email ou username" + av_usersearch: "Busca de Usuário" + av_usersearch_placeholder: "Email, username, nome, qualquer coisa" + av_usersearch_search: "Buscar" av_title: "Visualização de Administrador" av_entities_sub_title: "Entidades" av_entities_users_url: "Usuários" av_entities_active_instances_url: "Instâncias Ativas" -# av_entities_employer_list_url: "Employer List" -# av_entities_candidates_list_url: "Candidate List" + av_entities_employer_list_url: "Lista de Empregadores" + av_entities_candidates_list_url: "Lista de Candidatos" av_other_sub_title: "Outro" av_other_debug_base_url: "Base (para debugar base.jade)" u_title: "Lista de Usuários" lg_title: "Últimos Jogos" -# clas: "CLAs" + clas: "CLAs" diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee index 66ec658ff..961cc1b38 100644 --- a/app/locale/pt-PT.coffee +++ b/app/locale/pt-PT.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: adventurer_forum: "fórum do Aventureiro" adventurer_suffix: "." campaign_old_beginner: "Campanha para Iniciantes Antiga" - campaign_beginner_description: "... onde aprendes a magia da programação." + campaign_old_beginner_description: "... onde aprendes a magia da programação." campaign_dev: "Níveis mais Difíceis Aleatórios" campaign_dev_description: "... onde aprendes a interface enquanto fazes coisas um bocadinho mais difíceis." campaign_multiplayer: "Arenas Multijogador" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: armor: "Armadura" hands: "Mãos" accessories: "Acessórios" - books: "Livros" minions: "Minions" misc: "Vários" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription: victory_return_to_ladder: "Voltar à Classificação" victory_play_next_level: "Jogar Próximo Nível" # Only in old-style levels. victory_play_continue: "Continuar" + victory_saving_progress: "A Guardar o Progresso" victory_go_home: "Ir para o Início" # Only in old-style levels. victory_review: "Conta-nos mais!" # Only in old-style levels. victory_hour_of_code_done: "Terminaste?" diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee index ca16adcae..e5f4d64ec 100644 --- a/app/locale/ro.coffee +++ b/app/locale/ro.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman adventurer_forum: "forumul Aventurierului" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... în care se învață tainele programării." + campaign_old_beginner_description: "... în care se învață tainele programării." campaign_dev: "Nivele aleatoare mai grele" campaign_dev_description: "... în care se învață interfața, cu o dificultate puțin mai mare." campaign_multiplayer: "Arene Multiplayer" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman victory_return_to_ladder: "Înapoi la jocurile de clasament" victory_play_next_level: "Joacă nivelul următor" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Acasă" # Only in old-style levels. victory_review: "Spune-ne mai multe!" # Only in old-style levels. victory_hour_of_code_done: "Ai terminat?" diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee index 0a1a33e3a..002f0952d 100644 --- a/app/locale/ru.coffee +++ b/app/locale/ru.coffee @@ -56,14 +56,14 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi spectate: "Наблюдать" # Ladder page players: "игроки" # Hover over a level on /play hours_played: "часов сыграно" # Hover over a level on /play -# items: "Items" # Tooltip on item shop button from /play + items: "Предметы" # Tooltip on item shop button from /play heroes: "Герои" # Tooltip on hero shop button from /play achievements: "Достижения" # Tooltip on achievement list button from /play account: "Аккаунт" # Tooltip on account button from /play settings: "Настройки" # Tooltip on settings button from /play next: "Следующий" # Go from choose hero to choose inventory before playing a level change_hero: "Выбрать героя" # Go back from choose inventory to choose hero -# choose_inventory: "Equip Items" + choose_inventory: "Выбрать предметы" older_campaigns: "Старые компании" anonymous: "Неизвестный игрок" level_difficulty: "Сложность: " @@ -73,7 +73,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi adventurer_forum: "форуме Искателей приключений" adventurer_suffix: "." campaign_old_beginner: "Старые компании для новичков" - campaign_beginner_description: "... в которой вы познакомитесь с магией программирования." + campaign_old_beginner_description: "... в которой вы познакомитесь с магией программирования." campaign_dev: "Случайные уровни потруднее" campaign_dev_description: "... в которых вы изучите интерфейс и научитесь делать кое-что посложнее." campaign_multiplayer: "Арены для мультиплеера" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi armor: "Броня" hands: "Руки" accessories: "Аксессуары" - books: "Книги" # minions: "Minions" misc: "Разное" @@ -135,7 +134,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi general: and: "и" name: "Имя" -# date: "Date" + date: "Дата" body: "Содержание" version: "Версия" commit_msg: "Сопроводительное сообщение" @@ -204,7 +203,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi victory_rate_the_level: "Оцените уровень:" # Only in old-style levels. victory_return_to_ladder: "Вернуться к ладдеру" victory_play_next_level: "Следующий уровень" # Only in old-style levels. -# victory_play_continue: "Continue" + victory_play_continue: "Продолжить" +# victory_saving_progress: "Saving Progress" victory_go_home: "На главную" # Only in old-style levels. victory_review: "Расскажите нам больше!" # Only in old-style levels. victory_hour_of_code_done: "Вы закончили?" @@ -225,13 +225,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi # tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos). tome_select_a_thang: "Выбрать кого-нибудь для " tome_available_spells: "Доступные заклинания" -# tome_your_skills: "Your Skills" + tome_your_skills: "Ваши навыки" hud_continue: "Продолжить (Shift+Пробел)" spell_saved: "Заклинание сохранено" skip_tutorial: "Пропуск (Esc)" keyboard_shortcuts: "Горячие клавиши" loading_ready: "Готово!" -# loading_start: "Start Level" + loading_start: "Начать уровень" time_current: "Текущее:" time_total: "Максимальное:" time_goto: "Перейти на:" @@ -265,7 +265,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi tip_first_language: "Наиболее катастрофическая вещь, которую вы можете выучить - ваш первый язык программирования. - Alan Kay" tip_hardware_problem: "В: Сколько программистов нужно, чтобы вкрутить лампочку? О: Нисколько, это проблемы с железом." # tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law." -# tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth" + tip_premature_optimization: "Поспешная оптимизация - корень всех зол. - Donald Knuth" # tip_brute_force: "When in doubt, use brute force. - Ken Thompson" customize_wizard: "Настройки волшебника" @@ -274,9 +274,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi choose_hero_tab: "Перезапустить уровень" save_load_tab: "Сохранить/Загрузить" options_tab: "Настройки" -# guide_tab: "Guide" + guide_tab: "Руководство" multiplayer_tab: "Мультиплеер" -# inventory_caption: "Equip your hero" + inventory_caption: "Оденьте своего героя" choose_hero_caption: "Выбор героя, языка" # save_load_caption: "... and view history" # options_caption: "Configure settings" @@ -305,7 +305,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi music_label: "Музыка" music_description: "Фоновая музыка вкл/выкл" autorun_label: "Автозапуск" -# autorun_description: "Control automatic code execution." + autorun_description: "Настройка автоматического выполнения кода." editor_config: "Настройки редактора" editor_config_title: "Настройки редактора" editor_config_level_language_label: "Язык для этого уровня" @@ -417,7 +417,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi escape: "Escape" # shift: "Shift" cast_spell: "Произнести текущее заклинание." -# run_real_time: "Run in real time." + run_real_time: "Запустить в реальном времени." continue_script: "Продолжить текущий скрипт." skip_scripts: "Пропустить все возможные скрипты." toggle_playback: "Переключить проигрывание/паузу." @@ -428,7 +428,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi toggle_grid: "Включить наложение сетки." toggle_pathfinding: "Включить путевой оверлей.." beautify: "Приукрасьте свой код стандартизацией его форматирования." -# maximize_editor: "Maximize/minimize code editor." + maximize_editor: "Развернуть/свернуть редактор кода." move_wizard: "Перемещайте своего Волшебника по уровню." community: @@ -477,7 +477,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi grassy: "Травянистый" fork_title: "Форк новой версии" fork_creating: "Создание форка..." -# generate_terrain: "Generate Terrain" + generate_terrain: "Создать ландшафт" more: "Ещё" wiki: "Вики" live_chat: "Онлайн-чат" @@ -487,7 +487,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi level_tab_settings: "Настройки" level_tab_components: "Компоненты" level_tab_systems: "Системы" -# level_tab_docs: "Documentation" + level_tab_docs: "Документация" level_tab_thangs_title: "Текущие объекты" level_tab_thangs_all: "Все" level_tab_thangs_conditions: "Начальные условия" @@ -522,7 +522,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi level_search_title: "Искать уровни" achievement_search_title: "Искать достижения" read_only_warning2: "Примечание: вы не можете сохранять любые правки здесь, потому что вы не авторизованы." -# no_achievements: "No achievements have been added for this level yet." + no_achievements: "Для этого уровня еще не были добавлены достижения." # achievement_query_misc: "Key achievement off of miscellanea" # achievement_query_goals: "Key achievement off of level goals" # level_completion: "Level Completion" @@ -719,7 +719,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi unknown: "Неизвестная ошибка." resources: -# sessions: "Sessions" + sessions: "Сессии" your_sessions: "Ваши сессии" level: "Уровень" social_network_apis: "API социальных сетей" @@ -735,7 +735,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi patched_model: "Исходный документ" model: "Модель" system: "Система" -# systems: "Systems" + systems: "Системы" component: "Компонент" components: "Компоненты" # thang: "Thang" @@ -756,13 +756,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi user_remark: "Пользовательские поправки" # user_remarks: "User Remarks" versions: "Версии" -# items: "Items" -# heroes: "Heroes" -# wizard: "Wizard" -# achievement: "Achievement" + items: "Предметы" + heroes: "Герои" + wizard: "Волшебник" + achievement: "Достижение" # clas: "CLAs" # play_counts: "Play Counts" -# feedback: "Feedback" + feedback: "Отзыв" delta: added: "Добавлено" diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee index 2d36d1aee..a1d761310 100644 --- a/app/locale/sk.coffee +++ b/app/locale/sk.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", adventurer_forum: "fóre pre dobrodruhov" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... v ktorom sa naučíš mágiu programovania." + campaign_old_beginner_description: "... v ktorom sa naučíš mágiu programovania." campaign_dev: "Náhodné ťažšie úrovne" campaign_dev_description: "... v ktorych sa naučíš používať rozhranie a čeliť väčším výzvam." campaign_multiplayer: "Aréna pre viacerých hráčov" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak", # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee index c8bc34f58..8d58ccce4 100644 --- a/app/locale/sl.coffee +++ b/app/locale/sl.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee index c19a5e80b..e05088c3e 100644 --- a/app/locale/sr.coffee +++ b/app/locale/sr.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian adventurer_forum: "форуму Авантуриста" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... у којој учиш магију програмирања." + campaign_old_beginner_description: "... у којој учиш магију програмирања." campaign_dev: "Насумични тежи нивои" campaign_dev_description: "... у којима учиш о интерфејсу док радиш нешто теже." campaign_multiplayer: "Арене за више играча" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "Играј следећи ниво" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Иди на почетну" # Only in old-style levels. victory_review: "Реци нам више!" # Only in old-style levels. victory_hour_of_code_done: "Јеси ли завршио?" diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee index 8aa5fb51e..a725e344d 100644 --- a/app/locale/sv.coffee +++ b/app/locale/sv.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr adventurer_forum: "Äventyrarforumet" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... i vilken du lär dig programmerandets magi." + campaign_old_beginner_description: "... i vilken du lär dig programmerandets magi." campaign_dev: "Slumpad svårare nivå" campaign_dev_description: "... där du lär dig att hantera gränssnittet medan du gör något lite svårare." campaign_multiplayer: "Flerspelararenor" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr victory_return_to_ladder: "Gå tillbaka till stegen" victory_play_next_level: "Spela nästa nivå" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "Gå hem" # Only in old-style levels. victory_review: "Berätta mer!" # Only in old-style levels. victory_hour_of_code_done: "Är du klar?" diff --git a/app/locale/th.coffee b/app/locale/th.coffee index aec3df531..f06b7a39e 100644 --- a/app/locale/th.coffee +++ b/app/locale/th.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "เล่นด่านถัดไป" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "ไปหน้าแรก" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. victory_hour_of_code_done: "เสร็จหรือยัง?" diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee index 7149938c3..0ed4ce9fd 100644 --- a/app/locale/tr.coffee +++ b/app/locale/tr.coffee @@ -6,27 +6,27 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t play: "Oyna" # The big play button that just starts playing a level old_browser: "Olamaz, Tarayıcınız CodeCombat'ı çalıştırmak için çok eski. Üzgünüz!" # Warning that shows up on really old Firefox/Chrome/Safari old_browser_suffix: "Deneyebilirsiniz, ama muhtemelen oyun çalışmayacaktır." - campaign: "Senaryo Modu" + campaign: "Senaryo Kipi" for_beginners: "Yeni Başlayanlar için" - multiplayer: "Çoklu-oyuncu Modu" # Not currently shown on home page + multiplayer: "Çoklu-oyuncu Kipi" # Not currently shown on home page for_developers: "Geliştiriciler için" # Not currently shown on home page. -# javascript_blurb: "The language of the web. Great for writing websites, web apps, HTML5 games, and servers." # Not currently shown on home page -# python_blurb: "Simple yet powerful, Python is a great general purpose programming language." # Not currently shown on home page -# coffeescript_blurb: "Nicer JavaScript syntax." # Not currently shown on home page -# clojure_blurb: "A modern Lisp." # Not currently shown on home page -# lua_blurb: "Game scripting language." # Not currently shown on home page -# io_blurb: "Simple but obscure." # Not currently shown on home page + javascript_blurb: "Web'in dili. web siteleri, web uygulamaları, HTML5 oyunları ve sunucular yazmak için mükemmeldir." # Not currently shown on home page + python_blurb: "Basit ancak güçlü. Python mükemmel bir genel amaçlı dildir." # Not currently shown on home page + coffeescript_blurb: "Daha iyi JavaScript sözdizimi." # Not currently shown on home page + clojure_blurb: "Modern bir Lisp." # Not currently shown on home page + lua_blurb: "Oyun betik dili." # Not currently shown on home page + io_blurb: "Basit fakat anlaşılması güç." # Not currently shown on home page nav: play: "Oyna" # The top nav bar entry where players choose which levels to play -# community: "Community" + community: "Topluluk" editor: "Düzenleyici" blog: "Blog" forum: "Forum" -# account: "Account" -# profile: "Profile" -# stats: "Stats" -# code: "Code" + account: "Hesap" + profile: "Profil" + stats: "İstatistikler" + code: "Kod" admin: "Yönetici" # Only shows up when you are an admin home: "Anasayfa" contribute: "Katkıda bulun" @@ -34,7 +34,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t about: "Hakkında" contact: "İletişim" twitter_follow: "Takip et" -# teachers: "Teachers" + teachers: "Öğretmenler" modal: close: "Kapat" @@ -54,41 +54,41 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t play: play_as: "Olarak Oyna" # Ladder page spectate: "İzleyici olarak katıl" # Ladder page -# players: "players" # Hover over a level on /play -# hours_played: "hours played" # Hover over a level on /play -# items: "Items" # Tooltip on item shop button from /play -# heroes: "Heroes" # Tooltip on hero shop button from /play -# achievements: "Achievements" # Tooltip on achievement list button from /play -# account: "Account" # Tooltip on account button from /play -# settings: "Settings" # Tooltip on settings button from /play -# next: "Next" # Go from choose hero to choose inventory before playing a level -# change_hero: "Change Hero" # Go back from choose inventory to choose hero -# choose_inventory: "Equip Items" -# older_campaigns: "Older Campaigns" -# anonymous: "Anonymous Player" + players: "oyuncu" # Hover over a level on /play + hours_played: "saat oynandı" # Hover over a level on /play + items: "Ögeler" # Tooltip on item shop button from /play + heroes: "Kahramanlar" # Tooltip on hero shop button from /play + achievements: "Başarımlar" # Tooltip on achievement list button from /play + account: "Hesap" # Tooltip on account button from /play + settings: "Ayarlar" # Tooltip on settings button from /play + next: "İleri" # Go from choose hero to choose inventory before playing a level + change_hero: "Kahramanı Değiştir" # Go back from choose inventory to choose hero + choose_inventory: "Ögeleri Giy" + older_campaigns: "Daha Eski Görevler" + anonymous: "Anonim Oyuncu" level_difficulty: "Zorluk: " campaign_beginner: "Acemi Seferi" choose_your_level: "Seviye Seçimi" # The rest of this section is the old play view at /play-old and isn't very important. adventurer_prefix: "Aşağıdaki seviyelerden birini doğrudan oynayabilirsiniz, veya seviye ile ilgili " adventurer_forum: "Maceracı forumunda" adventurer_suffix: " tartışabilirsiniz." -# campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "Programlama büyüsünü öğrenmek için..." + campaign_old_beginner: "Eski Yeni Başlayan Görevi" + campaign_old_beginner_description: "Programlama büyüsünü öğrenmek için..." campaign_dev: "Rastgele Daha Zor Seviyeler" campaign_dev_description: "Biraz daha zor işlerle uğraşırken arayüzü öğrenmek için..." campaign_multiplayer: "Çok Oyunculu Meydanlar" campaign_multiplayer_description: "Diğer oyuncularla kafa kafaya verip kodlamak için..." campaign_player_created: "Oyuncuların Oluşturdukları" campaign_player_created_description: "<a href=\"/contribute#artisan\">Zanaatkâr Büyücüler</a>in yaratıcılıklarına karşı mücadele etmek için..." -# campaign_classic_algorithms: "Classic Algorithms" -# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science." + campaign_classic_algorithms: "Klasik Algoritmalar" + campaign_classic_algorithms_description: "... Bilgisayar Bilimleri'nde öğrendiğiniz en yaygın algoritmalar." login: - sign_up: "Kaydol" + sign_up: "Hesap Oluştur" log_in: "Giriş Yap" logging_in: "Giriş Yapılıyor" log_out: "Çıkış Yap" - recover: "şifrenizi sıfırlayabilirsiniz." + recover: "hesabı kurtar." signup: create_account_title: "İlerlemenizi Kaydetmek için Hesap Oluşturun" @@ -99,43 +99,42 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t creating: "Hesap oluşturuluyor..." sign_up: "Kaydol" log_in: "buradan giriş yapabilirsiniz." -# social_signup: "Or, you can sign up through Facebook or G+:" -# required: "You need to log in before you can go that way." + social_signup: "veya Facebook ya da G+ ile oturum açabilirsiniz:" + required: "Buraya gidebilmeniz için oturum açmanız gerekli." recover: recover_account_title: "Hesabı Kurtar" send_password: "Kurtarma Parolası Gönder" -# recovery_sent: "Recovery email sent." + recovery_sent: "Kurtarma e-postası gönderildi." -# items: -# armor: "Armor" -# hands: "Hands" -# accessories: "Accessories" -# books: "Books" -# minions: "Minions" -# misc: "Misc" + items: + armor: "Zırh" + hands: "Eller" + accessories: "Aksesuarlar" + minions: "Köleler" + misc: "Çeşitli" common: loading: "Yükleniyor..." saving: "Kaydediliyor..." sending: "Gönderiliyor..." -# send: "Send" + send: "Gönder" cancel: "İptal" save: "Kaydet" -# publish: "Publish" + publish: "Yayınla" create: "Oluştur" manual: "El ile" fork: "Çatalla" play: "Oyna" # When used as an action verb, like "Play next level" retry: "Yeniden Dene" -# watch: "Watch" -# unwatch: "Unwatch" -# submit_patch: "Submit Patch" + watch: "İzle" + unwatch: "İzlemeyi Bırak" + submit_patch: "Yama Gönder" general: and: "ve" name: "İsim" -# date: "Date" + date: "Tarih" body: "Gövde" version: "Sürüm" commit_msg: "Gönderme İletisi" @@ -145,12 +144,12 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t results: "Sonuçlar" description: "Açıklama" or: "veya" -# subject: "Subject" + subject: "Konu" email: "E-posta" password: "Şifre" message: "İleti" code: "Kod" -# ladder: "Ladder" + ladder: "Merdiven" when: "iken" opponent: "Rakip" rank: "Sıra" @@ -161,7 +160,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t easy: "Kolay" medium: "Normal" hard: "Zor" -# player: "Player" + player: "Oyuncu" units: second: "saniye" @@ -170,28 +169,28 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t minutes: "dakika" hour: "saat" hours: "saat" -# day: "day" -# days: "days" -# week: "week" -# weeks: "weeks" -# month: "month" -# months: "months" -# year: "year" -# years: "years" + day: "gün" + days: "gün" + week: "hafta" + weeks: "hafta" + month: "ay" + months: "ay" + year: "yıl" + years: "yıl" play_level: done: "Tamamdır" home: "Anasayfa" -# skip: "Skip" -# game_menu: "Game Menu" + skip: "Atla" + game_menu: "Oyun Menüsü" guide: "Rehber" restart: "Yeniden başlat" goals: "Hedefler" -# goal: "Goal" -# success: "Success!" -# incomplete: "Incomplete" -# timed_out: "Ran out of time" -# failing: "Failing" + goal: "Amaç" + success: "Başarılı!" + incomplete: "Tamamlanmamış" + timed_out: "Süre bitti" + failing: "Başarısız" action_timeline: "Eylem Çizelgesi" click_to_select: "Birimi seçmek için üzerine tıklayın." reload_title: "Tüm kod yeniden yüklensin mi?" @@ -199,39 +198,40 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t reload_confirm: "Tümünü Yeniden Yükle" victory_title_prefix: "" victory_title_suffix: "Tamamlandı " - victory_sign_up: " Güncellemelere Abone Ol" - victory_sign_up_poke: "Son haberleri e-postanızda görmek ister misiniz? Ücretsiz bir hesap oluşturmanız durumunda sizi bilgilendirebiliriz." + victory_sign_up: "İlerlemeyi Kaydetmek için Kaydolun" + victory_sign_up_poke: "Kodu kaydetmek ister misiniz? Ücretsiz bir hesap oluşturun!" victory_rate_the_level: "Seviyeyi oyla:" # Only in old-style levels. -# victory_return_to_ladder: "Return to Ladder" + victory_return_to_ladder: "Merdivene Dön" victory_play_next_level: "Sonraki Seviyeyi Oyna: " # Only in old-style levels. -# victory_play_continue: "Continue" + victory_play_continue: "Devam Et" + victory_saving_progress: "İlerlemeyi Kaydediliyor" victory_go_home: "Anasayfaya Git" # Only in old-style levels. - victory_review: "Daha detaylı bilgi verebilirsiniz!" # Only in old-style levels. + victory_review: "Daha fazla söyleyin!" # Only in old-style levels. victory_hour_of_code_done: "Bitirdiniz mi?" victory_hour_of_code_done_yes: "Evet, Kod Saatimi (Hour of Code) bitirdim!" guide_title: "Rehber" tome_minion_spells: "Minyonlarınızın Büyüleri" # Only in old-style levels. tome_read_only_spells: "Salt Okunur Büyüler" # Only in old-style levels. tome_other_units: "Diğer Birimler" # Only in old-style levels. - tome_cast_button_castable: "Fırlatılabilir" # Temporary, if tome_cast_button_run isn't translated. - tome_cast_button_casting: "Fırlatılıyor" # Temporary, if tome_cast_button_running isn't translated. - tome_cast_button_cast: "Fırlat" # Temporary, if tome_cast_button_ran isn't translated. -# tome_cast_button_run: "Run" -# tome_cast_button_running: "Running" -# tome_cast_button_ran: "Ran" -# tome_submit_button: "Submit" -# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button. -# tome_select_method: "Select a Method" -# tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos). + tome_cast_button_castable: "Başlatılabilir" # Temporary, if tome_cast_button_run isn't translated. + tome_cast_button_casting: "Başlatılıyor" # Temporary, if tome_cast_button_running isn't translated. + tome_cast_button_cast: "Başlat" # Temporary, if tome_cast_button_ran isn't translated. + tome_cast_button_run: "Çalıştır" + tome_cast_button_running: "Çalıştırılıyor" + tome_cast_button_ran: "Çalıştırıldı" + tome_submit_button: "Gönder" + tome_reload_method: "Bu yöntem için özgün kodu yeniden yükle" # Title text for individual method reload button. + tome_select_method: "Bir Yöntem Seçin" + tome_see_all_methods: "Düzenleyebileceğiniz tüm yöntemleri görün" # Title text for method list selector (shown when there are multiple programmable methdos). tome_select_a_thang: "Birini seç..." tome_available_spells: "Kullanılabilir Büyüler" -# tome_your_skills: "Your Skills" + tome_your_skills: "Yetenekleriniz" hud_continue: "Devam (ÜstKarakter+Boşluk)" spell_saved: "Büyü Kaydedildi" skip_tutorial: "Atla (esc)" -# keyboard_shortcuts: "Key Shortcuts" + keyboard_shortcuts: "Klavye Kısayolları" loading_ready: "Hazır!" -# loading_start: "Start Level" + loading_start: "Seviyeyi Başlat" time_current: "Şimdi:" time_total: "Max:" time_goto: "Git:" @@ -270,30 +270,30 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t customize_wizard: "Sihirbazı Düzenle" game_menu: -# inventory_tab: "Inventory" -# choose_hero_tab: "Restart Level" -# save_load_tab: "Save/Load" -# options_tab: "Options" -# guide_tab: "Guide" + inventory_tab: "Envanter" + choose_hero_tab: "Seviyeyi Yeniden Başlat" + save_load_tab: "Kaydet/Yükle" + options_tab: "Seçenekler" + guide_tab: "Rehber" multiplayer_tab: "Çoklu-oyuncu" -# inventory_caption: "Equip your hero" -# choose_hero_caption: "Choose hero, language" -# save_load_caption: "... and view history" -# options_caption: "Configure settings" -# guide_caption: "Docs and tips" -# multiplayer_caption: "Play with friends!" + inventory_caption: "Kahramanınızı donatın" + choose_hero_caption: "Kahraman, dil seçin" + save_load_caption: "... ve geçmişe bak" + options_caption: "Ayarları yapılandır" + guide_caption: "Belgeler ve ipuçları" + multiplayer_caption: "Arkadaşlarla oyna!" -# inventory: -# choose_inventory: "Equip Items" + inventory: + choose_inventory: "Ögeleri Donan" -# choose_hero: -# choose_hero: "Choose Your Hero" -# programming_language: "Programming Language" -# programming_language_description: "Which programming language do you want to use?" -# status: "Status" -# weapons: "Weapons" -# health: "Health" -# speed: "Speed" + choose_hero: + choose_hero: "Kahramanınızı Seçin" + programming_language: "Programlama Dili" + programming_language_description: "Hangi programlama dilini kullanmak istiyorsunuz?" + status: "Durum" + weapons: "Silahlar" + health: "Sağlık" + speed: "Hız" # save_load: # granularity_saved_games: "Saved" @@ -376,14 +376,14 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t autosave: "Değişiklikler Kendiliğinden Kaydedilir" me_tab: "Ben" picture_tab: "Resim" -# upload_picture: "Upload a picture" + upload_picture: "Bir Resim Yükle" password_tab: "Şifre" emails_tab: "E-postalar" admin: "Yönetici" new_password: "Yeni Şifre" new_password_verify: "Teyit Et" email_subscriptions: "E-posta Abonelikleri" -# email_subscriptions_none: "No Email Subscriptions." + email_subscriptions_none: "E-posta aboneliği yok." email_announcements: "Duyurular" email_announcements_description: "CodeCombat ile ilgili son haberlere ve gelişmelere ulaşın." email_notifications: "Bilgilendirme" @@ -401,7 +401,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t error_saving: "Kayıt Esnasında Hata" saved: "Değişiklikler Kaydedildi" password_mismatch: "Şifreler Uyuşmuyor" -# password_repeat: "Please repeat your password." + password_repeat: "Lütfen şifrenizi yenileyin." # job_profile: "Job Profile" # Rest of this section (the job profile stuff and wizard stuff) is deprecated # job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." # job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." @@ -410,14 +410,14 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t wizard_tab: "Sihirbaz" wizard_color: "Sihirbaz Kıyafeti Rengi" -# keyboard_shortcuts: -# keyboard_shortcuts: "Keyboard Shortcuts" -# space: "Space" -# enter: "Enter" -# escape: "Escape" -# shift: "Shift" -# cast_spell: "Cast current spell." -# run_real_time: "Run in real time." + keyboard_shortcuts: + keyboard_shortcuts: "Klavye Kısayolları" + space: "Boşluk" + enter: "Enter" + escape: "Escape" + shift: "ÜstKarakter" + cast_spell: "Geçerli büyüyü çalıştır." + run_real_time: "Eşzamanlı çalış." # continue_script: "Continue past current script." # skip_scripts: "Skip past all skippable scripts." # toggle_playback: "Toggle play/pause." @@ -468,32 +468,32 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t article_title: "Makale Düzenleyici" thang_title: "Nesne Düzenleyici" level_title: "Bölüm Düzenleyici" -# achievement_title: "Achievement Editor" -# back: "Back" + achievement_title: "Başarı Düzenleyici" + back: "Geri" revert: "Geri al" revert_models: "Önceki Modeller" -# pick_a_terrain: "Pick A Terrain" -# small: "Small" -# grassy: "Grassy" -# fork_title: "Fork New Version" -# fork_creating: "Creating Fork..." -# generate_terrain: "Generate Terrain" -# more: "More" -# wiki: "Wiki" -# live_chat: "Live Chat" + pick_a_terrain: "Bir Arazi Seçin" + small: "Küçük" + grassy: "Çimli" + fork_title: "Yeni Sürüm Çatalla" + fork_creating: "Çatal Oluşturuluyor..." + generate_terrain: "Arazi Oluştur" + more: "Daha Fazla" + wiki: "Viki" + live_chat: "Canlı Sohbet" level_some_options: "Bazı Seçenekler?" level_tab_thangs: "Nesneler" level_tab_scripts: "Betikler" level_tab_settings: "Ayarlar" level_tab_components: "Bileşenler" level_tab_systems: "Sistemler" -# level_tab_docs: "Documentation" + level_tab_docs: "Belgelendirme" level_tab_thangs_title: "Geçerli Şartlar" -# level_tab_thangs_all: "All" + level_tab_thangs_all: "Tüm" level_tab_thangs_conditions: "Başlama Şartları" level_tab_thangs_add: "Nesne Ekle" -# delete: "Delete" -# duplicate: "Duplicate" + delete: "Sil" + duplicate: "Kopyala" level_settings_title: "Ayarlar" level_component_tab_title: "Geçerli Bileşenler" level_component_btn_new: "Yeni Bileşen Oluştur" diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee index 90bf0fc54..a19f6dccd 100644 --- a/app/locale/uk.coffee +++ b/app/locale/uk.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "українська мова", englishDesc adventurer_forum: "форумі Шукачів пригод" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "... у якій ви навчитеся магії програмування." + campaign_old_beginner_description: "... у якій ви навчитеся магії програмування." campaign_dev: "Випадкові складніші рівні" campaign_dev_description: "... в яких ви вивчите інтерфейс, одночасно роблячи щось складніше." campaign_multiplayer: "Арени для мультиплеєра" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "українська мова", englishDesc # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "українська мова", englishDesc victory_return_to_ladder: "Повернутись до таблиці рівнів" victory_play_next_level: "Наступний рівень" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "На головну" # Only in old-style levels. victory_review: "Розкажіть нам більше!" # Only in old-style levels. victory_hour_of_code_done: "Ви закінчили?" diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee index ce3904144..67f2749e5 100644 --- a/app/locale/ur.coffee +++ b/app/locale/ur.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu", # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee index 54c9c0b2b..17d5c0e86 100644 --- a/app/locale/vi.coffee +++ b/app/locale/vi.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn adventurer_forum: "diễn đàn Adventurer" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." campaign_dev: "Các cấp độ khó hơn ngẫu nhiên" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." campaign_multiplayer: "Khu vực đa người chơi" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee index 44a5fcc9a..c03974f5a 100644 --- a/app/locale/zh-HANS.coffee +++ b/app/locale/zh-HANS.coffee @@ -34,7 +34,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese about: "关于" contact: "联系我们" twitter_follow: "关注" -# teachers: "Teachers" + teachers: "教师" modal: close: "关闭" @@ -52,16 +52,16 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese subscribe_as_diplomat: "提交翻译人员申请" play: - play_as: "Play As" # Ladder page +# play_as: "Play As" # Ladder page spectate: "旁观他人的游戏" # Ladder page # players: "players" # Hover over a level on /play # hours_played: "hours played" # Hover over a level on /play -# items: "Items" # Tooltip on item shop button from /play -# heroes: "Heroes" # Tooltip on hero shop button from /play + items: "道具" # Tooltip on item shop button from /play + heroes: "英雄" # Tooltip on hero shop button from /play achievements: "成就" # Tooltip on achievement list button from /play account: "账户" # Tooltip on account button from /play settings: "设置" # Tooltip on settings button from /play -# next: "Next" # Go from choose hero to choose inventory before playing a level + next: "下一步" # Go from choose hero to choose inventory before playing a level change_hero: "重新选择英雄" # Go back from choose inventory to choose hero choose_inventory: "装备道具" older_campaigns: "旧的战役" @@ -73,7 +73,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese adventurer_forum: "冒险者论坛" adventurer_suffix: "。" campaign_old_beginner: "旧的新手战役" - campaign_beginner_description: "……在这里你可以学习到编程技巧。" + campaign_old_beginner_description: "……在这里你可以学习到编程技巧。" campaign_dev: "随机困难关卡" campaign_dev_description: "……在这里你可以学到做一些复杂功能的接口。" campaign_multiplayer: "多人竞技场" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese armor: "盔甲" hands: "手持" accessories: "配饰" - books: "图书" minions: "部下" misc: "辅助道具" @@ -204,7 +203,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese victory_rate_the_level: "评估关卡:" # Only in old-style levels. victory_return_to_ladder: "返回" victory_play_next_level: "下一关" # Only in old-style levels. -# victory_play_continue: "Continue" + victory_play_continue: "继续" +# victory_saving_progress: "Saving Progress" victory_go_home: "返回主页" # Only in old-style levels. victory_review: "给我们反馈!" # Only in old-style levels. victory_hour_of_code_done: "你完成了吗?" @@ -283,8 +283,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # guide_caption: "Docs and tips" # multiplayer_caption: "Play with friends!" -# inventory: -# choose_inventory: "Equip Items" + inventory: + choose_inventory: "装备道具" choose_hero: choose_hero: "请选择您的英雄" @@ -334,9 +334,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese why_paragraph_2_suffix: "这就是为什么 CodeCombat 是个多人游戏,而不是一个游戏化的编程课。你不停,我们就不停——但这次这是件好事。" why_paragraph_3: "如果你一定要对游戏上瘾,那就对这个游戏上瘾,然后成为科技时代的法师吧。" press_title: "博客/媒体" -# press_paragraph_1_prefix: "Want to write about us? Feel free to download and use all of the resources included in our" -# press_paragraph_1_link: "press packet" -# press_paragraph_1_suffix: ". All logos and images may be used without contacting us directly." + press_paragraph_1_prefix: "想要报道我们? 您可以自由下载和使用" + press_paragraph_1_link: "成套宣传包" + press_paragraph_1_suffix: "里的所有材料. 所有商标和图像的使用都不必事先联系我们。" team: "团队" # george_title: "CEO" # george_blurb: "Businesser" @@ -541,7 +541,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese introduction_desc_ending: "我们希望你也能一起加入进来!" introduction_desc_signature: "- Nick, George, Scott, Michael, Jeremy 以及 Matt" alert_account_message_intro: "你好!" -# alert_account_message: "To subscribe for class emails, you'll need to be logged in first." + alert_account_message: "想要订阅邮件? 您必须先登录" archmage_summary: "你对游戏图像、界面设计、数据库和服务器运营、多人在线、物理、声音、游戏引擎性能感兴趣吗?想做一个教别人编程的游戏吗?如果你有编程经验,想要开发 CodeCombat ,那就选择这个职业吧。我们会非常高兴在制作史上最棒编程游戏的过程中得到你的帮助。" archmage_introduction: "制作游戏时,最令人激动的事莫过于整合诸多东西。图像、音响、实时网络交流、社交网络,从底层数据库管理到服务器运维,再到用户界面的设计和实现。制作游戏有很多事情要做,所以如果你有编程经验, 那么你应该选择这个职业。我们会很高兴在制作史上最好编程游戏的路上有你的陪伴." class_attributes: "职业说明" @@ -670,25 +670,25 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # rules: "Rules" # winners: "Winners" -# user: -# stats: "Stats" -# singleplayer_title: "Singleplayer Levels" -# multiplayer_title: "Multiplayer Levels" -# achievements_title: "Achievements" -# last_played: "Last Played" -# status: "Status" -# status_completed: "Completed" -# status_unfinished: "Unfinished" -# no_singleplayer: "No Singleplayer games played yet." -# no_multiplayer: "No Multiplayer games played yet." -# no_achievements: "No Achievements earned yet." -# favorite_prefix: "Favorite language is " -# favorite_postfix: "." + user: + stats: "成就" + singleplayer_title: "单人关卡" + multiplayer_title: "多人关卡" + achievements_title: "成就" + last_played: "最近玩的时间" + status: "状态" + status_completed: "完成" + status_unfinished: "未完成" + no_singleplayer: "还未玩过任何单人关卡。" + no_multiplayer: "还未玩过任何多人关卡。" + no_achievements: "还未得到任何成就" + favorite_prefix: "最喜爱的语言是 " + favorite_postfix: "." -# achievements: -# last_earned: "Last Earned" -# amount_achieved: "Amount" -# achievement: "Achievement" + achievements: + last_earned: "最近取得的时间" + amount_achieved: "数量" + achievement: "成就" # category_contributor: "Contributor" # category_miscellaneous: "Miscellaneous" # category_levels: "Levels" @@ -701,9 +701,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # left_xp_infix: " until level " # left_xp_postfix: "" -# account: -# recently_played: "Recently Played" -# no_recent_games: "No games played during the past two weeks." + account: + recently_played: "最近玩过的关卡" + no_recent_games: "最近两个星期没有玩过游戏。" loading_error: could_not_load: "载入失败" @@ -730,7 +730,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese # gplus_friend_sessions: "G+ Friend Sessions" leaderboard: "排行榜" user_schema: "用户模式" - user_profile: "User Profile" + user_profile: "用户信息" patches: "补丁" # patched_model: "Source Document" # model: "Model" diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee index e23b33394..5204e1cdd 100644 --- a/app/locale/zh-HANT.coffee +++ b/app/locale/zh-HANT.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese adventurer_forum: "冒險家論壇" adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "...在這裡可以學到編程技巧。" + campaign_old_beginner_description: "...在這裡可以學到編程技巧。" campaign_dev: "隨機關卡" campaign_dev_description: "...在這裡你可以學到做一些較複雜的程式技巧。" campaign_multiplayer: "多人競技場" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese # victory_return_to_ladder: "Return to Ladder" victory_play_next_level: "下一關" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "返回首頁" # Only in old-style levels. victory_review: "給我們回饋!" # Only in old-style levels. victory_hour_of_code_done: "你完成了嗎?" diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee index d26ade695..9b5dc793a 100644 --- a/app/locale/zh-WUU-HANS.coffee +++ b/app/locale/zh-WUU-HANS.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # adventurer_forum: "the Adventurer forum" # adventurer_suffix: "." # campaign_old_beginner: "Old Beginner Campaign" -# campaign_beginner_description: "... in which you learn the wizardry of programming." +# campaign_old_beginner_description: "... in which you learn the wizardry of programming." # campaign_dev: "Random Harder Levels" # campaign_dev_description: "... in which you learn the interface while doing something a little harder." # campaign_multiplayer: "Multiplayer Arenas" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi # victory_return_to_ladder: "Return to Ladder" # victory_play_next_level: "Play Next Level" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" # victory_go_home: "Go Home" # Only in old-style levels. # victory_review: "Tell us more!" # Only in old-style levels. # victory_hour_of_code_done: "Are You Done?" diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee index e3a721444..685337b5e 100644 --- a/app/locale/zh-WUU-HANT.coffee +++ b/app/locale/zh-WUU-HANT.coffee @@ -73,7 +73,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio adventurer_forum: "冒險者論壇" adventurer_suffix: "。" # campaign_old_beginner: "Old Beginner Campaign" - campaign_beginner_description: "……徠箇裏爾學得到編程手法。" + campaign_old_beginner_description: "……徠箇裏爾學得到編程手法。" campaign_dev: "照摸難關" campaign_dev_description: "……徠箇搭爾學得到做一許囉唆功能個接口。" campaign_multiplayer: "多人競賽場" @@ -111,7 +111,6 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio # armor: "Armor" # hands: "Hands" # accessories: "Accessories" -# books: "Books" # minions: "Minions" # misc: "Misc" @@ -205,6 +204,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio victory_return_to_ladder: "走轉" victory_play_next_level: "下關" # Only in old-style levels. # victory_play_continue: "Continue" +# victory_saving_progress: "Saving Progress" victory_go_home: "轉到主頁" # Only in old-style levels. victory_review: "搭我裏反應!" # Only in old-style levels. victory_hour_of_code_done: "爾妝下落爻噃?" diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 4b7fcbb09..c7a1c0679 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -78,7 +78,8 @@ class CocoModel extends Backbone.Model thisTV4.addSchema('metaschema', require('schemas/metaschema')) TreemaNode.utils.populateDefaults(clone, @schema(), thisTV4) @attributesWithDefaults = clone - console.debug "Populated defaults for #{@attributes.name or @type()} in #{new Date() - t0}ms" + duration = new Date() - t0 + console.debug "Populated defaults for #{@attributes.name or @type()} in #{duration}ms" if duration > 10 loadFromBackup: -> return unless @saveBackups diff --git a/app/models/Level.coffee b/app/models/Level.coffee index 1851bfbe1..2e72342f2 100644 --- a/app/models/Level.coffee +++ b/app/models/Level.coffee @@ -8,8 +8,8 @@ module.exports = class Level extends CocoModel @schema: require 'schemas/models/level' urlRoot: '/db/level' - serialize: (supermodel, session, cached=false) -> - o = @denormalize supermodel, session # hot spot to optimize + serialize: (supermodel, session, otherSession, cached=false) -> + o = @denormalize supermodel, session, otherSession # hot spot to optimize # Figure out Components o.levelComponents = if cached then @getCachedLevelComponents(supermodel) else $.extend true, [], (lc.attributes for lc in supermodel.getModels LevelComponent) @@ -44,17 +44,24 @@ module.exports = class Level extends CocoModel newLevelComponents.push(@cachedLevelComponents[levelComponent.id]) newLevelComponents - denormalize: (supermodel, session) -> + denormalize: (supermodel, session, otherSession) -> o = $.extend true, {}, @attributes - if o.thangs and @get('type', true) is 'hero' - # TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization. + if o.thangs and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] for levelThang in o.thangs - @denormalizeThang(levelThang, supermodel, session) + @denormalizeThang(levelThang, supermodel, session, otherSession) o - denormalizeThang: (levelThang, supermodel, session) -> + denormalizeThang: (levelThang, supermodel, session, otherSession) -> levelThang.components ?= [] - isHero = levelThang.id is 'Hero Placeholder' + isHero = /Hero Placeholder/.test levelThang.id + if isHero and otherSession + # If it's a hero and there's another session, find the right session for it. + # If there is no other session (playing against default code, or on single player), clone all placeholders. + # TODO: actually look at the teams on these Thangs to determine which session should go with which placeholder. + if levelThang.id is 'Hero Placeholder 1' and session.get('team') is 'humans' + session = otherSession + else if levelThang.id is 'Hero Placeholder' and session.get('team') is 'ogres' + session = otherSession # Empty out placeholder Components and store their values if we're the hero placeholder. if isHero @@ -129,6 +136,7 @@ module.exports = class Level extends CocoModel # Example: Programmable must come last, since it has to override any Component-provided methods that any other Component might have created. Can't enumerate all soft dependencies. # Example: Plans needs to come after everything except Programmable, since other Components that add plannable methods need to have done so by the time Plans is attached. # Example: Collides doesn't depend on Allied, but if both exist, Collides must come after Allied. Soft dependency example. Can't just figure out a proper priority to take care of it. + # Example: Moves doesn't depend on Acts, but if both exist, Moves must come after Acts. Another soft dependency example. # Decision? Just special case the sort logic in here until we have more examples than these two and decide how best to handle most of the cases then, since we don't really know the whole of the problem yet. # TODO: anything that depends on Programmable will break right now. @@ -158,10 +166,13 @@ module.exports = class Level extends CocoModel console.error parentType, thang.id or thang.name, 'does not have dependent Component', dependent, 'from', lc.name visit c2 if c2 if lc.name is 'Collides' - allied = _.find levelComponents, {name: 'Allied'} - if allied - collides = _.find(thang.components, {original: allied.original}) - visit collides if collides + if allied = _.find levelComponents, {name: 'Allied'} + allied = _.find(thang.components, {original: allied.original}) + visit allied if allied + if lc.name is 'Moves' + if acts = _.find levelComponents, {name: 'Acts'} + acts = _.find(thang.components, {original: acts.original}) + visit acts if acts #console.log thang.id, 'sorted comps adding', lc.name sorted.push c for comp in thang.components diff --git a/app/models/SuperModel.coffee b/app/models/SuperModel.coffee index 7f43c03a9..dbff4d2d3 100644 --- a/app/models/SuperModel.coffee +++ b/app/models/SuperModel.coffee @@ -121,7 +121,7 @@ module.exports = class SuperModel extends Backbone.Model if cachedModel clone = $.extend true, {}, model.attributes cachedModel.set(clone, {silent: true, fromMerge: true}) - console.debug "Updated cached model <#{cachedModel.get('name') or cachedModel.getURL()}> with new data" + #console.debug "Updated cached model <#{cachedModel.get('name') or cachedModel.getURL()}> with new data" else @registerModel(model) collection diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee index 2042d5545..37c9ac648 100644 --- a/app/models/ThangType.coffee +++ b/app/models/ThangType.coffee @@ -43,7 +43,7 @@ module.exports = class ThangType extends CocoModel isFullyLoaded: -> # TODO: Come up with a better way to identify when the model doesn't have everything needed to build the sprite. ie when it's a projection without all the required data. return @get('actions') or @get('raster') # needs one of these two things - + loadRasterImage: -> return if @loadingRaster or @loadedRaster return unless raster = @get('raster') @@ -57,7 +57,7 @@ module.exports = class ThangType extends CocoModel @loadingRaster = false @trigger('raster-image-load-errored', @) ) - + getActions: -> return {} unless @isFullyLoaded() return @actions or @buildActions() @@ -72,11 +72,6 @@ module.exports = class ThangType extends CocoModel @actions[relatedAction.name] = relatedAction @actions - getSpriteSheet: (options) -> - options = @fillOptions options - key = @spriteSheetKey(options) - return @spriteSheets[key] or @buildSpriteSheet(options) - fillOptions: (options) -> options ?= {} options = _.clone options @@ -240,6 +235,7 @@ module.exports = class ThangType extends CocoModel return if _.isString spriteSheet return unless spriteSheet canvas = $("<canvas width='#{size}' height='#{size}'></canvas>") + console.log 'made canvas', canvas, 'with size', size unless canvas[0] stage = new createjs.Stage(canvas[0]) sprite = new createjs.Sprite(spriteSheet) pt = @actions.portrait?.positions?.registration diff --git a/app/schemas/models/level.coffee b/app/schemas/models/level.coffee index d5d431d8f..2a9037fab 100644 --- a/app/schemas/models/level.coffee +++ b/app/schemas/models/level.coffee @@ -31,6 +31,7 @@ GoalSchema = c.object {title: 'Goal', description: 'A goal that the player can a worldEndsAfter: {title: 'World Ends After', description: 'When included, ends the world this many seconds after this goal succeeds or fails.', type: 'number', minimum: 0, exclusiveMinimum: true, maximum: 300, default: 3} howMany: {title: 'How Many', description: 'When included, require only this many of the listed goal targets instead of all of them.', type: 'integer', minimum: 1} hiddenGoal: {title: 'Hidden', description: 'Hidden goals don\'t show up in the goals area for the player until they\'re failed. (Usually they\'re obvious, like "don\'t die".)', 'type': 'boolean' } + optional: {title: 'Optional', description: 'Optional goals do not need to be completed for overallStatus to be success.', type: 'boolean'} team: c.shortString(title: 'Team', description: 'Name of the team this goal is for, if it is not for all of the playable teams.') killThangs: c.array {title: 'Kill Thangs', description: 'A list of Thang IDs the player should kill, or team names.', uniqueItems: true, minItems: 1, 'default': ['ogres']}, thang saveThangs: c.array {title: 'Save Thangs', description: 'A list of Thang IDs the player should save, or team names', uniqueItems: true, minItems: 1, 'default': ['humans']}, thang @@ -62,6 +63,8 @@ GoalSchema = c.object {title: 'Goal', description: 'A goal that the player can a keepFromCollectingThangs: c.object {title: 'Keep From Collecting', description: 'Thangs that the player must prevent other Thangs from collecting.', required: ['who', 'targets']}, who: c.array {title: 'Who', description: 'The Thangs which must not collect the target items.', minItems: 1}, thang targets: c.array {title: 'Targets', description: 'The target items which the Thangs must not collect.', minItems: 1}, thang + codeProblems: c.array {title: 'Code Problems', description: 'A list of Thang IDs that should not have any code problems, or team names.', uniqueItems: true, minItems: 1, 'default': ['humans']}, thang + linesOfCode: {title: 'Lines of Code', description: 'A mapping of Thang IDs or teams to how many many lines of code should be allowed (well, statements).', type: 'object', default: {humans: 10}, additionalProperties: {type: 'integer', description: 'How many lines to allow for this Thang.'}} ResponseSchema = c.object {title: 'Dialogue Button', description: 'A button to be shown to the user with the dialogue.', required: ['text']}, text: {title: 'Title', description: 'The text that will be on the button', 'default': 'Okay', type: 'string', maxLength: 30} @@ -244,7 +247,7 @@ _.extend LevelSchema.properties, icon: {type: 'string', format: 'image-file', title: 'Icon'} banner: {type: 'string', format: 'image-file', title: 'Banner'} goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema - type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero']) + type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop']) terrain: c.terrainString showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always']) diff --git a/app/schemas/models/level_session.coffee b/app/schemas/models/level_session.coffee index 3545c3a1f..980a1e5e6 100644 --- a/app/schemas/models/level_session.coffee +++ b/app/schemas/models/level_session.coffee @@ -110,6 +110,22 @@ _.extend LevelSessionSchema.properties, type: 'object' properties: status: enum: ['failure', 'incomplete', 'success'] + submissionCount: + description: 'How many times the session has been submitted for real-time playback (can affect the random seed).' + type: 'integer' + minimum: 0 + flagHistory: + description: 'The history of flag events during the last real-time playback submission.' + type: 'array' + items: c.object {required: ['player', 'color', 'time', 'active']}, + player: {type: 'string'} + team: {type: 'string'} + color: {type: 'string', enum: ['green', 'black', 'violet']} + time: {type: 'number', minimum: 0} + active: {type: 'boolean'} + pos: c.object {required: ['x', 'y']}, + x: {type: 'number'} + y: {type: 'number'} code: type: 'object' diff --git a/app/schemas/subscriptions/tome.coffee b/app/schemas/subscriptions/tome.coffee index 573cd5dd3..ad5d0ac42 100644 --- a/app/schemas/subscriptions/tome.coffee +++ b/app/schemas/subscriptions/tome.coffee @@ -7,10 +7,12 @@ module.exports = preload: {type: 'boolean'} realTime: {type: 'boolean'} - 'tome:cast-spells': c.object {title: 'Cast Spells', description: 'Published when spells are cast', required: ['spells', 'preload', 'realTime']}, + 'tome:cast-spells': c.object {title: 'Cast Spells', description: 'Published when spells are cast', required: ['spells', 'preload', 'realTime', 'submissionCount', 'flagHistory']}, spells: [type: 'object'] preload: [type: 'boolean'] realTime: [type: 'boolean'] + submissionCount: [type: 'integer'] + flagHistory: [type: 'array'] 'tome:manual-cast': c.object {title: 'Manually Cast Spells', description: 'Published when you wish to manually recast all spells', required: []}, realTime: {type: 'boolean'} diff --git a/app/schemas/subscriptions/world.coffee b/app/schemas/subscriptions/world.coffee index 2e38a32b2..80d97647d 100644 --- a/app/schemas/subscriptions/world.coffee +++ b/app/schemas/subscriptions/world.coffee @@ -30,3 +30,16 @@ module.exports = thang: {type: 'object'} 'world:custom-script-trigger': {type: 'object'} + + 'world:user-code-problem': c.object {required: ['thang', 'problem']}, + thang: {type: 'object'} + problem: c.object {required: ['message', 'level', 'type']}, #, 'userInfo', 'error']}, + userInfo: {type: 'object'} + message: {type: 'string'} + level: {type: 'string', enum: ['info', 'warning', 'error']} + type: {type: 'string'} + error: {type: 'object'} + + 'world:lines-of-code-counted': c.object {required: ['thang', 'linesUsed']}, + thang: {type: 'object'} + linesUsed: {type: 'integer'} diff --git a/app/styles/mixins.sass b/app/styles/mixins.sass index 18f695aac..c3ca386c1 100644 --- a/app/styles/mixins.sass +++ b/app/styles/mixins.sass @@ -86,6 +86,12 @@ -ms-flex-pack: justify justify-content: space-between +@mixin flex-justify-center() + -webkit-box-pack: center + -webkit-justify-content: center + -ms-flex-pack: center + justify-content: center + @mixin flex-align-content-start() -webkit-align-content: flex-start -ms-flex-align-content: flex-start diff --git a/app/styles/play/level/modal/hero-victory-modal.sass b/app/styles/play/level/modal/hero-victory-modal.sass index 62b31642e..e3429b0b7 100644 --- a/app/styles/play/level/modal/hero-victory-modal.sass +++ b/app/styles/play/level/modal/hero-victory-modal.sass @@ -1,18 +1,32 @@ +@import "app/styles/mixins" +@import "app/styles/bootstrap/variables" + #hero-victory-modal + //- Top-level modal container + .modal-dialog + margin-top: 15px + padding-top: 0 //- Header .background-wrapper - background: url("/images/pages/play/level/modal/victory_modal_background.png") - height: 650px + //background: url("/images/pages/play/level/modal/victory_modal_background.png") width: 550px - + border-width: 25px + border-image: url("/images/pages/play/level/modal/victory_modal_background.png") 25 fill round + border-radius: 10px + #victory-header display: block - margin: 40px auto 0 + margin: 15px auto 0 + // http://easings.net/#easeOutBack plus tweaked a bit: http://cubic-bezier.com/#.18,.68,.75,2 + @include transition(0.5s cubic-bezier(0.18, 0.68, 0.75, 2)) + + &.out + @include scale(0) .modal-header - height: 110px + height: 85px border: none @@ -20,6 +34,7 @@ .modal-body padding: 0 20px + min-height: 30px .achievement-panel background: url("/images/pages/play/level/modal/achievement_plate.png") @@ -28,15 +43,12 @@ margin: 5px auto position: relative - -webkit-transition-duration: 1s - -moz-transition-duration: 1s - -o-transition-duration: 1s - transition-duration: 1s + @include transition-duration(1s) - -webkit-filter: grayscale(100%) - -moz-filter: grayscale(100%) - -o-filter: grayscale(100%) - filter: grayscale(100%) + -webkit-filter: grayscale(100%) brightness(75%) + -moz-filter: grayscale(100%) brightness(75%) + -o-filter: grayscale(100%) brightness(75%) + filter: grayscale(100%) brightness(75%) &.earned -webkit-filter: none @@ -44,7 +56,11 @@ -o-filter: none filter: none + .achievement-description + @include opacity(1) + .achievement-description + @include opacity(0.75) position: absolute text-align: center left: 95px @@ -54,25 +70,36 @@ white-space: nowrap overflow: hidden text-overflow: ellipsis - + .achievement-rewards position: absolute left: 25px right: 23px top: 41px bottom: 18px - + @include flexbox() + @include flex-justify-center() //- Reward panels .reward-panel - background: url("/images/pages/play/level/modal/reward_plate.png") background: url("/images/pages/play/level/modal/reward_plate.png") width: 77px height: 85px float: left margin: 0 1.8px position: relative + z-index: 1 + @include transition(0.25s ease) + + &.animating + @include scale(1.5) + z-index: 2 + + &.numerical &.animating .reward-text + font-size: 18px + overflow: visible + bottom: 9px .reward-image-container top: 8px @@ -81,39 +108,27 @@ width: 56px position: relative - -webkit-transform: scale(0, 0) - -moz-transform: scale(0, 0) - -o-transform: scale(0, 0) - transform: scale(0, 0) - - -webkit-transition-duration: 0.5s - -moz-transition-duration: 0.5s - -o-transition-duration: 0.5s - transition-duration: 0.5s + @include scale(0) + @include transition-duration(0.5s) &.show - -webkit-transform: scale(1, 1) - -moz-transform: scale(1, 1) - -o-transform: scale(1, 1) - transform: scale(1, 1) + @include scale(1) + &.pending-reward-image + img + -webkit-filter: brightness(2000%) contrast(25%) + -moz-filter: brightness(2000%) contrast(25%) + -o-filter: brightness(2000%) contrast(25%) + filter: brightness(2000%) contrast(25%) + img margin: 0 position: absolute top: 50% left: 50% margin-right: -50% - - -webkit-transition-duration: 0.5s - -moz-transition-duration: 0.5s - -o-transition-duration: 0.5s - transition-duration: 0.5s - - -webkit-transform: translate(-50%, -50%) - -moz-transform: translate(-50%, -50%) - -o-transform: translate(-50%, -50%) - transform: translate(-50%, -50%) - + @include transition-duration(0.5s) + @include translate(-50%, -50%) max-width: 56px max-height: 55px @@ -130,59 +145,79 @@ white-space: nowrap overflow: hidden text-overflow: ellipsis - //- Pulse effect - @-webkit-keyframes pulse + +keyframes(rewardPulse) from - -webkit-transform: translate(-50%, -50%) scale(1.0) + max-width: 56px + max-height: 55px 50% - -webkit-transform: translate(-50%, -50%) scale(1.3) + width: 66px + max-width: 66px + max-height: 66px to - -webkit-transform: translate(-50%, -50%) scale(1.0) + max-width: 56px + max-height: 55px - @-moz-keyframes pulse - from - -moz-transform: translate(-50%, -50%) scale(1.0) - 50% - -moz-transform: translate(-50%, -50%) scale(1.3) - to - -moz-transform: translate(-50%, -50%) scale(1.0) + .xp .pulse + @include animation(rewardPulse 0.15s infinite) - @-o-keyframes pulse - from - -o-transform: translate(-50%, -50%) scale(1.0) - 50% - -o-transform: translate(-50%, -50%) scale(1.3) - to - -o-transform: translate(-50%, -50%) scale(1.0) - - @keyframes pulse - from - transform: translate(-50%, -50%) scale(1.0) - 50% - transform: translate(-50%, -50%) scale(1.3) - to - transform: translate(-50%, -50%) scale(1.0) - - .pulse - -webkit-animation: pulse 0.5s infinite - -moz-animation: pulse 0.5s infinite - -o-animation: pulse 0.5s infinite - animation: pulse 0.5s infinite - + .gems .pulse + @include animation(rewardPulse 0.25s infinite) //- Footer .modal-content - height: 650px // so the footer appears at the bottom - + padding-bottom: 50px // so the footer appears at the bottom + + &.with-sign-up .modal-content + padding-bottom: 100px // need more space for signup poke + .modal-footer position: absolute - bottom: 20px + bottom: -20px left: 20px right: 20px #totals - color: white \ No newline at end of file + color: white + + p.sign-up-poke + position: absolute + bottom: 60px + right: 20px + color: white + + .sign-up-button + float: right + margin-left: 10px + + .ladder-submission-view + display: inline-block + color: white + + .rank-button.btn-block + display: inline-block + width: initial + padding-left: 19px + padding-right: 19px + + .last-submitted + float: none + + +html.no-borderimage + #hero-victory-modal + .background-wrapper + background: url("/images/pages/play/level/modal/victory_modal_background.png") + height: 650px + #victory-header + margin-top: 40px + .modal-header + height: 110px + .modal-content + height: 650px + padding-bottom: 0 + .modal-footer + bottom: 20px diff --git a/app/styles/play/level/tome/problem_alert.sass b/app/styles/play/level/tome/problem_alert.sass index 8b0a623ea..2ffb62181 100644 --- a/app/styles/play/level/tome/problem_alert.sass +++ b/app/styles/play/level/tome/problem_alert.sass @@ -9,7 +9,7 @@ left: 10px right: 10px background: transparent - border: 0 + border: 1px solid transparent padding: 0 text-shadow: none color: white @@ -31,14 +31,14 @@ &:hover, &:focus @include opacity(1) - .problem-hint + .problem-subtitle font-size: 80% - + //&.alert-error &.alert-warning border-image-source: url(/images/level/code_editor_warning_background.png) - + &.alert-info border-image-source: url(/images/level/code_editor_info_background.png) diff --git a/app/styles/play/spectate.sass b/app/styles/play/spectate.sass index 0d48f27a9..a0f7343fa 100644 --- a/app/styles/play/spectate.sass +++ b/app/styles/play/spectate.sass @@ -42,12 +42,18 @@ position: relative margin: 0 auto - canvas#surface - background-color: #333 + canvas#webgl-surface, canvas#normal-surface display: block z-index: 1 margin: 0 auto + canvas#webgl-surface + background-color: #333 + + canvas#normal-surface + position: absolute + top: 0 + pointer-events: none min-width: 1024px position: relative diff --git a/app/styles/play/world-map-view.sass b/app/styles/play/world-map-view.sass index 9da4c8e1e..36a3de10f 100644 --- a/app/styles/play/world-map-view.sass +++ b/app/styles/play/world-map-view.sass @@ -287,3 +287,7 @@ $gameControlMargin: 30px &.vol-down .glyphicon.glyphicon-volume-down display: inline-block + +body:not(.ipad) #world-map-view + .level-info-container + pointer-events: none diff --git a/app/templates/game-menu/choose-hero-view.jade b/app/templates/game-menu/choose-hero-view.jade index 131023084..e9f86a36a 100644 --- a/app/templates/game-menu/choose-hero-view.jade +++ b/app/templates/game-menu/choose-hero-view.jade @@ -43,11 +43,11 @@ .form .form-group.select-group + span.help-block(data-i18n="choose_hero.programming_language_description") Which programming language do you want to use? label.control-label(for="option-code-language", data-i18n="choose_hero.programming_language") Programming Language select#option-code-language(name="code-language") for option in codeLanguages option(value=option.id, selected=codeLanguage === option.id)= option.name - span.help-block(data-i18n="choose_hero.programming_language_description") Which programming language do you want to use? if level .form-group.select-group diff --git a/app/templates/modal/versions.jade b/app/templates/modal/versions.jade index f99f9402c..827230ad2 100755 --- a/app/templates/modal/versions.jade +++ b/app/templates/modal/versions.jade @@ -5,6 +5,11 @@ block modal-header-content h3 span(data-i18n="general.version_history_for") Version History for: |"#{dataList[0].name}" + p + |Select two changes below to see the difference. + + div.delta-container + div.delta-view block modal-body-content if dataList @@ -25,7 +30,4 @@ block modal-body-content td= data.creator td #{data.commitMessage} - div.delta-container - div.delta-view - block modal-footer-content \ No newline at end of file diff --git a/app/templates/play/level/level_loading.jade b/app/templates/play/level/level_loading.jade index 31ffd34fb..9deddc448 100644 --- a/app/templates/play/level/level_loading.jade +++ b/app/templates/play/level/level_loading.jade @@ -9,7 +9,6 @@ .progress-bar.progress-bar-success #tip-wrapper - strong.tip(data-i18n='play_level.tip_insert_positions') Shift+Click a point on the map to insert it into the spell editor. strong.tip(data-i18n='play_level.tip_toggle_play') Toggle play/paused with Ctrl+P. strong.tip(data-i18n='play_level.tip_scrub_shortcut') Ctrl+[ and Ctrl+] rewind and fast-forward. strong.tip(data-i18n='play_level.tip_guide_exists') Click the guide at the top of the page for useful info. diff --git a/app/templates/play/level/modal/hero-victory-modal.jade b/app/templates/play/level/modal/hero-victory-modal.jade index dd0d78d22..4be673ed1 100644 --- a/app/templates/play/level/modal/hero-victory-modal.jade +++ b/app/templates/play/level/modal/hero-victory-modal.jade @@ -1,6 +1,6 @@ extends /templates/modal/modal_base block modal-header-content - img(src="/images/pages/play/level/modal/victory_word.png")#victory-header + img(src="/images/pages/play/level/modal/victory_word.png")#victory-header.out block modal-body-content @@ -14,32 +14,32 @@ block modal-body-content div.achievement-rewards - var worth = achievement.get('worth', true); if worth - .reward-panel.numerical(data-number=worth, data-number-unit='xp') - .reward-image-container(class=animate?'':'show') + .reward-panel.numerical.xp(data-number=worth, data-number-unit='xp') + .reward-image-container(class=animate ? 'pending-reward-image' : 'show') img(src="/images/pages/play/level/modal/reward_icon_xp.png") - .reward-text= animate ? 'x0' : '+'+worth + .reward-text= animate ? '+0' : '+'+worth if rewards.gems - .reward-panel.numerical(data-number=rewards.gems, data-number-unit='gem') - .reward-image-container(class=animate?'':'show') + .reward-panel.numerical.gems(data-number=rewards.gems, data-number-unit='gem') + .reward-image-container(class=animate ? 'pending-reward-image' : 'show') img(src="/images/pages/play/level/modal/reward_icon_gems.png") - .reward-text= animate ? 'x0' : '+'+rewards.gems + .reward-text= animate ? '+0' : '+'+rewards.gems if rewards.heroes for hero in rewards.heroes - var hero = thangTypes[hero]; - .reward-panel - .reward-image-container(class=animate?'':'show') + .reward-panel.hero(data-hero-thang-type=hero.get('original')) + .reward-image-container(class=animate ? 'pending-reward-image' : 'show') img(src=hero.getPortraitURL()) - .reward-text= hero.get('name') + .reward-text= animate ? 'New Hero' : hero.get('name') if rewards.items for item in rewards.items - var item = thangTypes[item]; - .reward-panel - .reward-image-container(class=animate?'':'show') + .reward-panel.item(data-item-thang-type=item.get('original')) + .reward-image-container(class=animate ? 'pending-reward-image' : 'show') img(src=item.getPortraitURL()) - .reward-text= item.get('name') + .reward-text= animate ? 'New Item' : item.get('name') block modal-footer-content @@ -51,4 +51,16 @@ block modal-footer-content span#gem-total +0 button.btn.btn-warning.hide#saving-progress-label(disabled, data-i18n="play_level.victory_saving_progress") Saving Progress - a.btn.btn-success.world-map-button.hide#continue-button(href="/play-hero", data-dismiss="modal", data-i18n="play_level.victory_play_continue") Continue + + if readyToRank + .ladder-submission-view + else if level.get('type') === 'hero-ladder' + a.btn.btn-primary(href="/play/ladder/#{level.get('slug')}#my-matches", data-dismiss="modal", data-i18n="play_level.victory_return_to_ladder") Return to Ladder + else + a.btn.btn-success.world-map-button.hide#continue-button(href="/play-hero", data-dismiss="modal", data-i18n="play_level.victory_play_continue") Continue + + if me.get('anonymous') + p.sign-up-poke.hide + button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/SignupModal", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress + span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account! + diff --git a/app/templates/play/level/tome/cast_button.jade b/app/templates/play/level/tome/cast_button.jade index bde30b02b..02facd457 100644 --- a/app/templates/play/level/tome/cast_button.jade +++ b/app/templates/play/level/tome/cast_button.jade @@ -1,3 +1,3 @@ button.btn.btn-lg.btn-inverse.banner.cast-button(title=castVerbose, data-i18n="play_level.tome_run_button_ran") Ran -button.btn.btn-lg.btn-success.banner.submit-button(title=castRealTimeVerbose) Submit +button.btn.btn-lg.btn-success.banner.submit-button(title=castRealTimeVerbose, data-i18n="play_level.tome_submit_button") Submit diff --git a/app/templates/play/level/tome/problem_alert.jade b/app/templates/play/level/tome/problem_alert.jade index e9cedca64..25df2198a 100644 --- a/app/templates/play/level/tome/problem_alert.jade +++ b/app/templates/play/level/tome/problem_alert.jade @@ -1,5 +1,7 @@ button.close(type="button", data-dismiss="alert") × -span.problem-message!= message if hint + span.problem-title!= hint br - span.problem-hint!= hint \ No newline at end of file + span.problem-subtitle!= message +else + span.problem-title!= message diff --git a/app/templates/play/spectate.jade b/app/templates/play/spectate.jade index 7867ba9a6..80ed5c35d 100644 --- a/app/templates/play/spectate.jade +++ b/app/templates/play/spectate.jade @@ -3,7 +3,8 @@ .level-content #control-bar-view #canvas-wrapper - canvas(width=924, height=589)#surface + canvas(width=924, height=589)#webgl-surface + canvas(width=924, height=589)#normal-surface #canvas-left-gradient.gradient #canvas-top-gradient.gradient #gold-view.secret.expanded diff --git a/app/templates/user/achievements.jade b/app/templates/user/achievements.jade index 33833d6f3..ca44144cb 100644 --- a/app/templates/user/achievements.jade +++ b/app/templates/user/achievements.jade @@ -36,15 +36,17 @@ block append content th XP each earnedAchievement in earnedAchievements.models - var achievement = earnedAchievement.get('achievement'); - tr - td= achievement.i18nName() - td= achievement.i18nDescription() - td= moment().format("MMMM Do YYYY", earnedAchievement.get('changed')) - if achievement.isRepeatable() - td= earnedAchievement.get('achievedAmount') - else - td - td= earnedAchievement.get('earnedPoints') + if achievement.get('category') + // No level-specific achievements in here. + tr + td= achievement.i18nName() + td= achievement.i18nDescription() + td= moment().format("MMMM Do YYYY", earnedAchievement.get('changed')) + if achievement.isRepeatable() + td= earnedAchievement.get('achievedAmount') + else + td + td= earnedAchievement.get('earnedPoints') else .panel#no-achievements .panel-body(data-i18n="user.no_achievements") No achievements earned yet. diff --git a/app/views/editor/DeltaView.coffee b/app/views/editor/DeltaView.coffee index 76208c76f..c55aed360 100644 --- a/app/views/editor/DeltaView.coffee +++ b/app/views/editor/DeltaView.coffee @@ -94,11 +94,17 @@ module.exports = class DeltaView extends CocoView if _.isObject(deltaData.left) and leftEl = deltaEl.find('.old-value') options = _.defaults {data: deltaData.left}, treemaOptions - TreemaNode.make(leftEl, options).build() + try + TreemaNode.make(leftEl, options).build() + catch error + console.error "Couldn't show left details Treema for", deltaData.left, treemaOptions if _.isObject(deltaData.right) and rightEl = deltaEl.find('.new-value') options = _.defaults {data: deltaData.right}, treemaOptions - TreemaNode.make(rightEl, options).build() + try + TreemaNode.make(rightEl, options).build() + catch error + console.error "Couldn't show right details Treema for", deltaData.right, treemaOptions if deltaData.action is 'text-diff' return console.error "Couldn't show diff for left: #{deltaData.left}, right: #{deltaData.right} of delta:", deltaData unless deltaData.left? and deltaData.right? diff --git a/app/views/editor/component/ThangComponentConfigView.coffee b/app/views/editor/component/ThangComponentConfigView.coffee index 343a75017..b89f96db3 100644 --- a/app/views/editor/component/ThangComponentConfigView.coffee +++ b/app/views/editor/component/ThangComponentConfigView.coffee @@ -52,7 +52,7 @@ module.exports = class ThangComponentConfigView extends CocoView schema.default ?= {} _.merge schema.default, @additionalDefaults if @additionalDefaults - if @level?.get('type', true) is 'hero' + if @level?.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] schema.required = [] treemaOptions = supermodel: @supermodel diff --git a/app/views/editor/level/modals/SaveLevelModal.coffee b/app/views/editor/level/modals/SaveLevelModal.coffee index 3913257a4..7d90d1e74 100644 --- a/app/views/editor/level/modals/SaveLevelModal.coffee +++ b/app/views/editor/level/modals/SaveLevelModal.coffee @@ -52,6 +52,7 @@ module.exports = class SaveLevelModal extends SaveVersionModal console.log "Should we save", m.get('system'), m.get('name'), m, "? localChanges:", m.hasLocalChanges(), "version:", m.get('version'), 'isPublished:', m.isPublished(), 'collection:', m.collection return false return true if m.hasLocalChanges() + console.error "Trying to check major version of #{m.type()} #{m.get('name')}, but it doesn't have a version:", m unless m.get('version') return true if (m.get('version').major is 0 and m.get('version').minor is 0) or not m.isPublished() and not m.collection # Sometimes we have two versions: one in a search collection and one with a URL. We only save changes to the latter. false diff --git a/app/views/editor/level/thangs/LevelThangEditView.coffee b/app/views/editor/level/thangs/LevelThangEditView.coffee index d5debf33b..b909acb25 100644 --- a/app/views/editor/level/thangs/LevelThangEditView.coffee +++ b/app/views/editor/level/thangs/LevelThangEditView.coffee @@ -46,7 +46,7 @@ module.exports = class LevelThangEditView extends CocoView level: @level world: @world - if @level.get('type', true) is 'hero' then options.thangType = thangType + if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then options.thangType = thangType @thangComponentEditView = new ThangComponentsEditView options @listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index 292c02d2f..2e77e732c 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -484,7 +484,8 @@ module.exports = class ThangsTabView extends CocoView folderForThang: (thang) -> thangType = @supermodel.getModelByOriginal ThangType, thang.thangType - [thangType.get('kind'), thangType.get('name')] + console.error 'uhh, we had kind', thangType.get('kind', true), 'for', thangType unless thangType.get('kind', true) + [thangType.get('kind', true), thangType.get('name', true)] pathForThang: (thang) -> folder = @folderForThang(thang) @@ -520,7 +521,7 @@ module.exports = class ThangsTabView extends CocoView @level.set 'thangs', thangs return if @editThangView - serializedLevel = @level.serialize @supermodel, null, true + serializedLevel = @level.serialize @supermodel, null, null, true try @world.loadFromLevel serializedLevel, false catch error @@ -552,14 +553,14 @@ module.exports = class ThangsTabView extends CocoView if batchInsert if thangType.get('name') is 'Hero Placeholder' thangID = 'Hero Placeholder' - return if @level.get('type', true) isnt 'hero' or @getThangByID(thangID) + return if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or @getThangByID(thangID) else thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}" else thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID) if @cloneSourceThang components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components - else if @level.get('type', true) is 'hero' + else if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] components = [] # Load them all from default ThangType Components else components = _.cloneDeep thangType.get('components') ? [] diff --git a/app/views/editor/thang/ThangTypeEditView.coffee b/app/views/editor/thang/ThangTypeEditView.coffee index 91d3f47d3..5ee5c35d7 100644 --- a/app/views/editor/thang/ThangTypeEditView.coffee +++ b/app/views/editor/thang/ThangTypeEditView.coffee @@ -77,7 +77,7 @@ module.exports = class ThangTypeEditView extends RootView context getAnimationNames: -> _.keys(@thangType.get('actions') or {}) - + afterRender: -> super() return unless @supermodel.finished() @@ -119,7 +119,7 @@ module.exports = class ThangTypeEditView extends RootView @stage = new createjs.Stage(canvas[0]) @layerAdapter = new LayerAdapter({name:'Default', webGL: true}) @topLayer = new createjs.Container() - + @layerAdapter.container.x = @topLayer.x = CENTER.x @layerAdapter.container.y = @topLayer.y = CENTER.y @stage.addChild(@layerAdapter.container, @topLayer) @@ -135,7 +135,7 @@ module.exports = class ThangTypeEditView extends RootView @updateGrid() _.defer @refreshAnimation @toggleDots(false) - + createjs.Ticker.setFPS(30) createjs.Ticker.addEventListener('tick', @stage) @@ -244,7 +244,7 @@ module.exports = class ThangTypeEditView extends RootView lank = new Lank(@thangType, @getLankOptions()) @showLank(lank) @updateScale() - + onNewSpriteSheet: -> $('#spritesheets').empty() for image in @layerAdapter.spriteSheet._images @@ -260,7 +260,7 @@ module.exports = class ThangTypeEditView extends RootView @showAction(animationName) @updateRotation() @updateScale() # must happen after update rotation, because updateRotation calls the sprite update() method. - + showMovieClip: (animationName) -> vectorParser = new SpriteBuilder(@thangType) movieClip = vectorParser.buildMovieClip(animationName) @@ -289,7 +289,7 @@ module.exports = class ThangTypeEditView extends RootView portrait?.attr('id', 'portrait').addClass('img-thumbnail') portrait.addClass 'img-thumbnail' $('#portrait').replaceWith(portrait) - + showLank: (lank) -> @clearDisplayObject() @clearLank() @@ -306,7 +306,7 @@ module.exports = class ThangTypeEditView extends RootView clearDisplayObject: -> @topLayer.removeChild(@currentObject) if @currentObject? - + clearLank: -> @layerAdapter.removeLank(@currentLank) if @currentLank @currentLank?.destroy() @@ -365,7 +365,8 @@ module.exports = class ThangTypeEditView extends RootView url = "/editor/thang/#{newThangType.get('slug') or newThangType.id}" portraitSource = null if @thangType.get('raster') - image = @currentLank.sprite.image + #image = @currentLank.sprite.image # Doesn't work? + image = @currentLank.sprite.spriteSheet._images[0] portraitSource = imageToPortrait image # bit of a hacky way to get that portrait success = => @@ -429,7 +430,7 @@ module.exports = class ThangTypeEditView extends RootView obj = vectorParser.buildMovieClip(key) if type is 'animations' obj = vectorParser.buildContainerFromStore(key) if type is 'containers' obj = vectorParser.buildShapeFromStore(key) if type is 'shapes' - + bounds = obj?.bounds or obj?.nominalBounds if bounds @boundsBox = new createjs.Shape() @@ -437,7 +438,7 @@ module.exports = class ThangTypeEditView extends RootView @topLayer.addChild(@boundsBox) obj.regX = @boundsBox.regX = bounds.x + bounds.width / 2 obj.regY = @boundsBox.regY = bounds.y + bounds.height / 2 - + @showSprite(obj) if obj @showingSelectedNode = true @currentLank?.destroy() diff --git a/app/views/game-menu/GameMenuModal.coffee b/app/views/game-menu/GameMenuModal.coffee index 1b4d63092..04df7322e 100644 --- a/app/views/game-menu/GameMenuModal.coffee +++ b/app/views/game-menu/GameMenuModal.coffee @@ -21,7 +21,7 @@ module.exports = class GameMenuModal extends ModalView constructor: (options) -> super options @options.showDevBits = me.isAdmin() or /https?:\/\/localhost/.test(window.location.href) - @options.showInventory = @options.level.get('type', true) is 'hero' + @options.showInventory = @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] @options.levelID = @options.level.get('slug') @options.startingSessionHeroConfig = $.extend {}, true, (@options.session.get('heroConfig') ? {}) diff --git a/app/views/game-menu/MultiplayerView.coffee b/app/views/game-menu/MultiplayerView.coffee index 9d95345bd..e1a3b56b4 100644 --- a/app/views/game-menu/MultiplayerView.coffee +++ b/app/views/game-menu/MultiplayerView.coffee @@ -40,7 +40,7 @@ module.exports = class MultiplayerView extends CocoView c.team = @session.get 'team' c.levelSlug = @level?.get 'slug' # For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet. - if @level?.get('type') is 'ladder' + if @level?.get('type') in ['ladder', 'hero-ladder'] c.ladderGame = true c.readyToRank = @session?.readyToRank() @@ -68,7 +68,7 @@ module.exports = class MultiplayerView extends CocoView updateLinkSection: -> multiplayer = @$el.find('#multiplayer').prop('checked') la = @$el.find('#link-area') - la.toggle if @level?.get('type') is 'ladder' then false else Boolean(multiplayer) + la.toggle if @level?.get('type') in ['ladder', 'hero-ladder'] then false else Boolean(multiplayer) true onHidden: -> diff --git a/app/views/play/MainPlayView.coffee b/app/views/play/MainPlayView.coffee index 98e886dca..0c2301a86 100644 --- a/app/views/play/MainPlayView.coffee +++ b/app/views/play/MainPlayView.coffee @@ -325,6 +325,6 @@ campaigns = [ {id: 'old_beginner', name: 'Old Beginner Campaign', description: '... in which you learn the wizardry of programming.', levels: tutorials} {id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: arenas} {id: 'dev', name: 'Random Harder Levels', description: '... in which you learn the interface while doing something a little harder.', levels: experienced} - {id: 'classic' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms} + {id: 'classic_algorithms' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms} {id: 'player_created', name: 'Player-Created', description: '... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>.', levels: playerCreated} ] diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee index 0468e227d..095ee4be9 100644 --- a/app/views/play/SpectateView.coffee +++ b/app/views/play/SpectateView.coffee @@ -68,7 +68,7 @@ module.exports = class SpectateLevelView extends RootView @load() setLevel: (@level, @supermodel) -> - serializedLevel = @level.serialize @supermodel, @session + serializedLevel = @level.serialize @supermodel, @session, @otherSession @god?.setLevel serializedLevel if @world @world.loadFromLevel serializedLevel, false @@ -105,7 +105,7 @@ module.exports = class SpectateLevelView extends RootView #at this point, all requisite data is loaded, and sessions are not denormalized team = @world.teamForPlayer(0) @loadOpponentTeam(team) - @god.setLevel @level.serialize @supermodel, @session + @god.setLevel @level.serialize @supermodel, @session, @otherSession @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id] @god.setWorldClassMap @world.classMap @setTeam team @@ -119,7 +119,7 @@ module.exports = class SpectateLevelView extends RootView @register() @controlBar.setBus(@bus) @surface.showLevel() - if @level.get('type', true) isnt 'hero' + if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) if me.id isnt @session.get 'creator' @surface.createOpponentWizard id: @session.get('creator') @@ -205,8 +205,9 @@ module.exports = class SpectateLevelView extends RootView # initialization initSurface: -> - surfaceCanvas = $('canvas#surface', @$el) - @surface = new Surface(@world, surfaceCanvas, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, wizards: @level.get('type', true) isnt 'hero') + webGLSurface = $('canvas#webgl-surface', @$el) + normalSurface = $('canvas#normal-surface', @$el) + @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, wizards: @level.get('type', true) isnt 'hero') worldBounds = @world.getBounds() bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}] @surface.camera.setBounds(bounds) diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee index 0bcb43334..e1588fe0c 100644 --- a/app/views/play/WorldMapView.coffee +++ b/app/views/play/WorldMapView.coffee @@ -97,7 +97,7 @@ module.exports = class WorldMapView extends RootView @$el.find('.level').tooltip() @$el.addClass _.string.slugify @terrain @updateVolume() - @highlightElement '.level.next', delay: 8000, duration: 20000, rotation: 0, sides: ['top'] + @highlightElement '.level.next', delay: 2000, duration: 60000, rotation: 0, sides: ['top'] onSessionsLoaded: (e) -> for session in @sessions.models @@ -718,6 +718,17 @@ hero = [ x: 95.31 y: 88.26 } + { + name: 'Dueling Grounds' + type: 'hero-ladder' + difficulty: 1 + id: 'dueling-grounds' + original: '5442ba0e1e835500007eb1c7' + description: 'Battle head-to-head against another hero in this basic beginner combat arena.' + disabled: not me.isAdmin() + x: 17.54 + y: 78.39 + } #{ # name: '' # type: 'hero' @@ -770,7 +781,7 @@ campaigns = [ #{id: 'beginner', name: 'Beginner Campaign', description: '... in which you learn the wizardry of programming.', levels: tutorials, color: "rgb(255, 80, 60)"} #{id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: arenas, color: "rgb(80, 5, 60)"} #{id: 'dev', name: 'Random Harder Levels', description: '... in which you learn the interface while doing something a little harder.', levels: experienced, color: "rgb(80, 60, 255)"} - #{id: 'classic' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms, color: "rgb(110, 80, 120)"} + #{id: 'classic_algorithms' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms, color: "rgb(110, 80, 120)"} #{id: 'player_created', name: 'Player-Created', description: '... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>.', levels: playerCreated, color: "rgb(160, 160, 180)"} {id: 'beginner', name: 'Beginner Campaign', levels: hero, color: 'rgb(255, 80, 60)'} ] diff --git a/app/views/play/ladder/SimulateTabView.coffee b/app/views/play/ladder/SimulateTabView.coffee index 5993c2f22..616410d69 100644 --- a/app/views/play/ladder/SimulateTabView.coffee +++ b/app/views/play/ladder/SimulateTabView.coffee @@ -49,6 +49,7 @@ module.exports = class SimulateTabView extends CocoView fetchAndSimulateTaskOriginal = @simulator.fetchAndSimulateTask @simulator.fetchAndSimulateTask = => if @simulator.simulatedByYou >= 5 + console.log '------------------- Destroying Simulator and making a new one -----------------' @simulator.destroy() @simulator = null @simulateNextGame() diff --git a/app/views/play/ladder/utils.coffee b/app/views/play/ladder/utils.coffee index ffa340ac3..182777b37 100644 --- a/app/views/play/ladder/utils.coffee +++ b/app/views/play/ladder/utils.coffee @@ -1,7 +1,7 @@ {hslToHex} = require 'lib/utils' module.exports.teamDataFromLevel = (level) -> - alliedSystem = _.find level.get('systems'), (value) -> value.config?.teams? + alliedSystem = _.find level.get('systems', true), (value) -> value.config?.teams? teamNames = (teamName for teamName, teamConfig of alliedSystem.config.teams when teamConfig.playable) teamConfigs = alliedSystem.config.teams diff --git a/app/views/play/level/ControlBarView.coffee b/app/views/play/level/ControlBarView.coffee index f5a779e94..722dec599 100644 --- a/app/views/play/level/ControlBarView.coffee +++ b/app/views/play/level/ControlBarView.coffee @@ -51,15 +51,15 @@ module.exports = class ControlBarView extends CocoView super c c.worldName = @worldName c.multiplayerEnabled = @session.get('multiplayer') - c.ladderGame = @level.get('type') is 'ladder' + c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder'] c.spectateGame = @spectateGame @homeViewArgs = [{supermodel: @supermodel}] - if @level.get('type', true) in ['ladder', 'ladder-tutorial'] + if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder'] levelID = @level.get('slug').replace /\-tutorial$/, '' @homeLink = c.homeLink = '/play/ladder/' + levelID @homeViewClass = require 'views/play/ladder/LadderView' @homeViewArgs.push levelID - else if @level.get('type', true) is 'hero' + else if @level.get('type', true) in ['hero', 'hero-coop'] @homeLink = c.homeLink = '/play' @homeViewClass = require 'views/play/WorldMapView' else diff --git a/app/views/play/level/LevelHUDView.coffee b/app/views/play/level/LevelHUDView.coffee index f315920a1..87691450e 100644 --- a/app/views/play/level/LevelHUDView.coffee +++ b/app/views/play/level/LevelHUDView.coffee @@ -85,7 +85,7 @@ module.exports = class LevelHUDView extends CocoView clearTimeout @hintNextSelectionTimeout @$el.find('.no-selection-message').hide() if not @thang - unless @options.level.get('type', true) is 'hero' + unless @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] @hintNextSelectionTimeout = _.delay((=> @$el.find('.no-selection-message').slideDown('slow')), 10000) return @createAvatar thangType, @thang diff --git a/app/views/play/level/LevelPlaybackView.coffee b/app/views/play/level/LevelPlaybackView.coffee index b01b7081c..ed4a4b822 100644 --- a/app/views/play/level/LevelPlaybackView.coffee +++ b/app/views/play/level/LevelPlaybackView.coffee @@ -167,7 +167,7 @@ module.exports = class LevelPlaybackView extends CocoView @togglePlaybackControls false Backbone.Mediator.publish 'playback:real-time-playback-started', {} Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'real-time-playback-start', volume: 1 - Backbone.Mediator.publish 'level:set-letterbox', on: true + Backbone.Mediator.publish 'level:set-letterbox', on: true if @options.level.get('type', true) is ['hero'] # not with flags...? onRealTimeMultiplayerCast: (e) -> @realTime = true diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee index 27b54efbb..167fd6be0 100644 --- a/app/views/play/level/PlayLevelView.coffee +++ b/app/views/play/level/PlayLevelView.coffee @@ -118,7 +118,7 @@ module.exports = class PlayLevelView extends RootView @supermodel.collections = givenSupermodel.collections @supermodel.shouldSaveBackups = givenSupermodel.shouldSaveBackups - serializedLevel = @level.serialize @supermodel, @session + serializedLevel = @level.serialize @supermodel, @session, @otherSession @god?.setLevel serializedLevel if @world @world.loadFromLevel serializedLevel, false @@ -215,8 +215,8 @@ module.exports = class PlayLevelView extends RootView @session = @levelLoader.session @world = @levelLoader.world @level = @levelLoader.level - @$el.addClass 'hero' if @level.get('type', true) is 'hero' - @$el.addClass 'flags' if @level.get('slug') is 'sky-span' # TODO: figure out when the player has flags. + @$el.addClass 'hero' if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] + @$el.addClass 'flags' if @level.get('slug') is 'sky-span' or (@level.get('type', true) in ['hero-ladder', 'hero-coop']) # TODO: figure out when the player has flags. @otherSession = @levelLoader.opponentSession @worldLoadFakeResources = [] # first element (0) is 1%, last (100) is 100% for percent in [1 .. 100] @@ -251,7 +251,7 @@ module.exports = class PlayLevelView extends RootView @session.set 'multiplayer', false setupGod: -> - @god.setLevel @level.serialize @supermodel, @session + @god.setLevel @level.serialize @supermodel, @session, @otherSession @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id] @god.setWorldClassMap @world.classMap @@ -268,9 +268,9 @@ module.exports = class PlayLevelView extends RootView insertSubviews: -> @insertSubView @tome = new TomeView levelID: @levelID, session: @session, otherSession: @otherSession, thangs: @world.thangs, supermodel: @supermodel, level: @level - @insertSubView new LevelPlaybackView session: @session, levelID: @levelID + @insertSubView new LevelPlaybackView session: @session, levelID: @levelID, level: @level @insertSubView new GoalsView {} - @insertSubView new LevelFlagsView world: @world if @levelID is 'sky-span' # TODO: figure out when flags are available + @insertSubView new LevelFlagsView world: @world if @levelID is 'sky-span' or @level.get('type', true) in ['hero-ladder', 'hero-coop'] # TODO: figure out when flags are available @insertSubView new GoldView {} @insertSubView new HUDView {level: @level} @insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session @@ -297,11 +297,11 @@ module.exports = class PlayLevelView extends RootView onLevelLoaded: (e) -> # Just the level has been loaded by the level loader - @showWizardSettingsModal() if not me.get('name') and not @isIPadApp() and e.level.get('type', true) isnt 'hero' + @showWizardSettingsModal() if not me.get('name') and not @isIPadApp() and not (e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) onSessionLoaded: (e) -> # Just the level and session have been loaded by the level loader - if e.level.get('type', true) is 'hero' and not _.size e.session.get('heroConfig')?.inventory ? {} + if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {} @openModalView new GameMenuModal level: e.level, session: e.session onLoaded: -> @@ -331,7 +331,7 @@ module.exports = class PlayLevelView extends RootView initSurface: -> webGLSurface = $('canvas#webgl-surface', @$el) normalSurface = $('canvas#normal-surface', @$el) - @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, wizards: @level.get('type', true) isnt 'hero') + @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, wizards: not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'])) worldBounds = @world.getBounds() bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}] @surface.camera.setBounds(bounds) @@ -346,7 +346,7 @@ module.exports = class PlayLevelView extends RootView if window.currentModal and not window.currentModal.destroyed and window.currentModal.constructor isnt VictoryModal return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @ @surface.showLevel() - if @otherSession and @level.get('type', true) isnt 'hero' + if @otherSession and not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) # TODO: colorize name and cloud by team, colorize wizard by user's color config @surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team'), levelSlug: @level.get('slug'), codeLanguage: @otherSession.get('submittedCodeLanguage') if @isEditorPreview @@ -377,7 +377,7 @@ module.exports = class PlayLevelView extends RootView return if @alreadyLoadedState @alreadyLoadedState = true state = @originalSessionState - if @level.get('type', true) is 'hero' + if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: true Backbone.Mediator.publish 'tome:select-primary-sprite', {} Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false @@ -443,7 +443,7 @@ module.exports = class PlayLevelView extends RootView onDonePressed: -> @showVictory() onShowVictory: (e) -> - $('#level-done-button').show() unless @level.get('type', true) is 'hero' + $('#level-done-button').show() unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] @showVictory() if e.showModal setTimeout(@preloadNextLevel, 3000) return if @victorySeen @@ -455,7 +455,7 @@ module.exports = class PlayLevelView extends RootView showVictory: -> options = {level: @level, supermodel: @supermodel, session: @session} - ModalClass = if @level.get('type', true) is 'hero' then HeroVictoryModal else VictoryModal + ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then HeroVictoryModal else VictoryModal victoryModal = new ModalClass(options) @openModalView(victoryModal) if me.get('anonymous') diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee index 5f4fe7d83..448f67562 100644 --- a/app/views/play/level/modal/HeroVictoryModal.coffee +++ b/app/views/play/level/modal/HeroVictoryModal.coffee @@ -6,6 +6,8 @@ CocoCollection = require 'collections/CocoCollection' LocalMongo = require 'lib/LocalMongo' utils = require 'lib/utils' ThangType = require 'models/ThangType' +LadderSubmissionView = require 'views/play/common/LadderSubmissionView' +AudioPlayer = require 'lib/AudioPlayer' module.exports = class HeroVictoryModal extends ModalView id: 'hero-victory-modal' @@ -13,6 +15,9 @@ module.exports = class HeroVictoryModal extends ModalView closeButton: false closesOnClickOutside: false + subscriptions: + 'ladder:game-submitted': 'onGameSubmitted' + constructor: (options) -> super(options) @session = options.session @@ -25,6 +30,7 @@ module.exports = class HeroVictoryModal extends ModalView @achievements = @supermodel.loadCollection(achievements, 'achievements').model @listenToOnce @achievements, 'sync', @onAchievementsLoaded @readyToContinue = false + Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory' onAchievementsLoaded: -> thangTypeOriginals = [] @@ -40,7 +46,7 @@ module.exports = class HeroVictoryModal extends ModalView for thangTypeOriginal in thangTypeOriginals thangType = new ThangType() thangType.url = "/db/thang.type/#{thangTypeOriginal}/version" - thangType.project = ['original', 'rasterIcon', 'name'] + thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers'] @thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model if achievementIDs.length @@ -74,69 +80,133 @@ module.exports = class HeroVictoryModal extends ModalView c.achievements = @achievements.models # for testing the three states -# if c.achievements.length -# c.achievements = [c.achievements[0].clone(), c.achievements[0].clone(), c.achievements[0].clone()] -# for achievement, index in c.achievements -# achievement.completed = index > 0 -# achievement.completedAWhileAgo = index > 1 + #if c.achievements.length + # c.achievements = [c.achievements[0].clone(), c.achievements[0].clone(), c.achievements[0].clone()] + #for achievement, index in c.achievements + ## achievement.completed = index > 0 + ## achievement.completedAWhileAgo = index > 1 + # achievement.completed = true + # achievement.completedAWhileAgo = false + # achievement.attributes.worth = (index + 1) * achievement.get('worth', true) + # rewards = achievement.get('rewards') + # rewards.gems *= (index + 1) c.thangTypes = @thangTypes + c.me = me + c.readyToRank = @level.get('type', true) is 'hero-ladder' and @session.readyToRank() + c.level = @level return c afterRender: -> super() return unless @supermodel.finished() + @playSelectionSound hero, true for original, hero of @thangTypes # Preload them + @$el.addClass 'with-sign-up' if me.get('anonymous') @updateSavingProgressStatus() - complete = _.once(_.bind(@beginAnimateNumbers, @)) + @$el.find('#victory-header').delay(250).queue(-> + $(@).removeClass('out').dequeue() + Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory-title-appear' # TODO: actually add this + ) + complete = _.once(_.bind(@beginSequentialAnimations, @)) @animatedPanels = $() panels = @$el.find('.achievement-panel') for panel in panels panel = $(panel) continue unless panel.data('animate') @animatedPanels = @animatedPanels.add(panel) - panel.delay(500) + panel.delay(500) # Waiting for victory header to show up and fall panel.queue(-> - $(this).addClass('earned') # animate out the grayscale - $(this).dequeue() + $(@).addClass('earned') # animate out the grayscale + $(@).dequeue() ) panel.delay(500) panel.queue(-> - $(this).find('.reward-image-container').addClass('show') - $(this).dequeue() + $(@).find('.reward-image-container').addClass('show') + $(@).dequeue() ) panel.delay(500) panel.queue(-> complete()) @animationComplete = not @animatedPanels.length + if @level.get('type', true) is 'hero-ladder' + @ladderSubmissionView = new LadderSubmissionView session: @session, level: @level + @insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view') - beginAnimateNumbers: -> - @numericalItemPanels = _.map(@animatedPanels.find('.numerical'), (panel) -> { + beginSequentialAnimations: -> + @sequentialAnimatedPanels = _.map(@animatedPanels.find('.reward-panel'), (panel) -> { number: $(panel).data('number') textEl: $(panel).find('.reward-text') rootEl: $(panel) unit: $(panel).data('number-unit') + hero: $(panel).data('hero-thang-type') + item: $(panel).data('item-thang-type') }) - # TODO: mess with this more later. Doesn't seem to work, often times will pulse background red rather than animate -# itemPanel.rootEl.find('.reward-image-container img').addClass('pulse') for itemPanel in @numericalItemPanels - @numberAnimationStart = new Date() @totalXP = 0 - @totalXP += panel.number for panel in @numericalItemPanels when panel.unit is 'xp' + @totalXP += panel.number for panel in @sequentialAnimatedPanels when panel.unit is 'xp' @totalGems = 0 - @totalGems += panel.number for panel in @numericalItemPanels when panel.unit is 'gem' + @totalGems += panel.number for panel in @sequentialAnimatedPanels when panel.unit is 'gem' @gemEl = $('#gem-total') @XPEl = $('#xp-total') - @numberAnimationInterval = setInterval(@tickNumberAnimation, 15 / 1000) + @totalXPAnimated = @totalGemsAnimated = @lastTotalXP = @lastTotalGems = 0 + @sequentialAnimationStart = new Date() + @sequentialAnimationInterval = setInterval(@tickSequentialAnimation, 1000 / 60) - tickNumberAnimation: => - pct = Math.min(1, (new Date() - @numberAnimationStart) / 1500) - panel.textEl.text('+'+parseInt(panel.number*pct)) for panel in @numericalItemPanels - @XPEl.text('+'+parseInt(@totalXP * pct)) - @gemEl.text('+'+parseInt(@totalGems * pct)) - @endAnimateNumbers() if pct is 1 + tickSequentialAnimation: => + # TODO: make sure the animation pulses happen when the numbers go up and sounds play (up to a max speed) + return @endSequentialAnimations() unless panel = @sequentialAnimatedPanels[0] + if panel.number + duration = Math.log(panel.number + 1) / Math.LN10 * 1000 # Math.log10 is ES6 + else + duration = 1000 + ratio = @getEaseRatio (new Date() - @sequentialAnimationStart), duration + if panel.unit is 'xp' + newXP = Math.floor(ratio * panel.number) + totalXP = @totalXPAnimated + newXP + if totalXP isnt @lastTotalXP + panel.textEl.text('+' + newXP) + @XPEl.text('+' + totalXP) + xpTrigger = 'xp-' + (totalXP % 6) # 6 xp sounds + Backbone.Mediator.publish 'audio-player:play-sound', trigger: xpTrigger, volume: 0.5 + ratio / 2 + @lastTotalXP = totalXP + else if panel.unit is 'gem' + newGems = Math.floor(ratio * panel.number) + totalGems = @totalGemsAnimated + newGems + if totalGems isnt @lastTotalGems + panel.textEl.text('+' + newGems) + @gemEl.text('+' + totalGems) + gemTrigger = 'gem-' + (parseInt(panel.number * ratio) % 4) # 4 gem sounds + Backbone.Mediator.publish 'audio-player:play-sound', trigger: gemTrigger, volume: 0.5 + ratio / 2 + @lastTotalGems = totalGems + else if panel.item + thangType = @thangTypes[panel.item] + panel.textEl.text(thangType.get('name')) + Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'item-unlocked', volume: 1 if 0.5 < ratio < 0.6 + else if panel.hero + thangType = @thangTypes[panel.hero] + panel.textEl.text(thangType.get('name')) + @playSelectionSound hero if 0.5 < ratio < 0.6 + if ratio is 1 + panel.rootEl.removeClass('animating').find('.reward-image-container img').removeClass('pulse') + @sequentialAnimationStart = new Date() + if panel.unit is 'xp' + @totalXPAnimated += panel.number + else if panel.unit is 'gem' + @totalGemsAnimated += panel.number + @sequentialAnimatedPanels.shift() + return + panel.rootEl.addClass('animating').find('.reward-image-container').removeClass('pending-reward-image').find('img').addClass('pulse') - endAnimateNumbers: -> - @$el.find('.pulse').removeClass('pulse') - clearInterval(@numberAnimationInterval) + getEaseRatio: (timeSinceStart, duration) -> + # Ease in/out quadratic - http://gizma.com/easing/ + timeSinceStart = Math.min timeSinceStart, duration + t = 2 * timeSinceStart / duration + if t < 1 + return 0.5 * t * t + --t + -0.5 * (t * (t - 2) - 1) + + endSequentialAnimations: -> + clearInterval @sequentialAnimationInterval @animationComplete = true @updateSavingProgressStatus() @@ -144,3 +214,23 @@ module.exports = class HeroVictoryModal extends ModalView return unless @animationComplete @$el.find('#saving-progress-label').toggleClass('hide', @readyToContinue) @$el.find('#continue-button').toggleClass('hide', not @readyToContinue) + @$el.find('.sign-up-poke').toggleClass('hide', not @readyToContinue) + + onGameSubmitted: (e) -> + ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches" + Backbone.Mediator.publish 'router:navigate', route: ladderURL + + playSelectionSound: (hero, preload=false) -> + return unless sounds = hero.get('soundTriggers')?.selected + return unless sound = sounds[Math.floor Math.random() * sounds.length] + name = AudioPlayer.nameForSoundReference sound + if preload + AudioPlayer.preloadSoundReference sound + else + AudioPlayer.playSound name, 1 + + # TODO: award heroes/items and play an awesome sound when you get one + + destroy: -> + clearInterval @sequentialAnimationInterval + super() diff --git a/app/views/play/level/modal/VictoryModal.coffee b/app/views/play/level/modal/VictoryModal.coffee index d2afe6a1c..741ce558b 100644 --- a/app/views/play/level/modal/VictoryModal.coffee +++ b/app/views/play/level/modal/VictoryModal.coffee @@ -29,16 +29,13 @@ module.exports = class VictoryModal extends ModalView constructor: (options) -> application.router.initializeSocialMediaServices() - victory = options.level.get('victory') + victory = options.level.get('victory', true) body = utils.i18n(victory, 'body') or 'Sorry, this level has no victory message yet.' @body = marked(body) @level = options.level @session = options.session @saveReviewEventually = _.debounce(@saveReviewEventually, 2000) @loadExistingFeedback() - if @level.get('type', true) is 'hero' - @closeButton = false - @closesOnClickOutside = false super options loadExistingFeedback: -> @@ -82,7 +79,7 @@ module.exports = class VictoryModal extends ModalView c.hasNextLevel = _.isObject(@level.get('nextLevel')) c.levelName = utils.i18n @level.attributes, 'name' c.level = @level - if c.level.get('type') is 'ladder' + if c.level.get('type') in ['ladder', 'hero-ladder'] c.readyToRank = @session.readyToRank() if me.get 'hourOfCode' # Show the Hour of Code "I'm Done" tracking pixel after they played for 30 minutes diff --git a/app/views/play/level/tome/DocFormatter.coffee b/app/views/play/level/tome/DocFormatter.coffee index 3784139a6..220989f09 100644 --- a/app/views/play/level/tome/DocFormatter.coffee +++ b/app/views/play/level/tome/DocFormatter.coffee @@ -83,9 +83,11 @@ module.exports = class DocFormatter @doc.title = if @options.shortenize then @doc.shorterName else @doc.shortName # Grab the language-specific documentation for some sub-properties, if we have it. - toTranslate = [{obj: @doc, prop: 'description'}, {obj: @doc, prop: 'example'}, {obj: @doc, prop: 'returns'}] + toTranslate = [{obj: @doc, prop: 'description'}, {obj: @doc, prop: 'example'}] for arg in (@doc.args ? []) toTranslate.push {obj: arg, prop: 'example'}, {obj: arg, prop: 'description'} + if @doc.returns + toTranslate.push {obj: @doc.returns, prop: 'example'}, {obj: @doc.returns, prop: 'description'} for {obj, prop} in toTranslate if val = obj[prop]?[@options.language] obj[prop] = val diff --git a/app/views/play/level/tome/Problem.coffee b/app/views/play/level/tome/Problem.coffee index 2ac28e0fe..5c8e3d2e1 100644 --- a/app/views/play/level/tome/Problem.coffee +++ b/app/views/play/level/tome/Problem.coffee @@ -1,6 +1,5 @@ ProblemAlertView = require './ProblemAlertView' Range = ace.require('ace/range').Range -UserCodeProblem = require 'models/UserCodeProblem' module.exports = class Problem annotation: null @@ -11,7 +10,6 @@ module.exports = class Problem @buildAlertView() if withAlert @buildMarkerRange() if isCast Backbone.Mediator.publish("problem:problem-created", line:@annotation.row, text: @annotation.text) if application.isIPadApp - @saveUserCodeProblem() if isCast destroy: -> unless @alertView?.destroyed @@ -50,21 +48,3 @@ module.exports = class Problem @ace.getSession().removeMarker @markerRange.id @markerRange.start.detach() @markerRange.end.detach() - - saveUserCodeProblem: () -> - @userCodeProblem = new UserCodeProblem() - @userCodeProblem.set 'code', @aether.raw - if @aetherProblem.range - rawLines = @aether.raw.split '\n' - errorLines = rawLines.slice @aetherProblem.range[0].row, @aetherProblem.range[1].row + 1 - @userCodeProblem.set 'codeSnippet', errorLines.join '\n' - @userCodeProblem.set 'errHint', @aetherProblem.hint if @aetherProblem.hint - @userCodeProblem.set 'errId', @aetherProblem.id if @aetherProblem.id - @userCodeProblem.set 'errLevel', @aetherProblem.level if @aetherProblem.level - @userCodeProblem.set 'errMessage', @aetherProblem.message if @aetherProblem.message - @userCodeProblem.set 'errRange', @aetherProblem.range if @aetherProblem.range - @userCodeProblem.set 'errType', @aetherProblem.type if @aetherProblem.type - @userCodeProblem.set 'language', @aether.language.id if @aether.language?.id - @userCodeProblem.set 'levelID', @levelID if @levelID - @userCodeProblem.save() - null \ No newline at end of file diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee index 1abf57c29..0c0e50e8d 100644 --- a/app/views/play/level/tome/Spell.coffee +++ b/app/views/play/level/tome/Spell.coffee @@ -40,6 +40,8 @@ module.exports = class Spell if @permissions.readwrite.length and sessionSource = @session.getSourceFor(@spellKey) if sessionSource isnt '// Should fill in some default source\n' # TODO: figure out why session is getting this default source in there and stop it @source = sessionSource + if p.aiSource and not @otherSession and not @canWrite() + @source = @originalSource = p.aiSource @thangs = {} if @canRead() # We can avoid creating these views if we'll never use them. @view = new SpellView {spell: @, level: options.level, session: @session, worker: @worker} @@ -133,7 +135,7 @@ module.exports = class Spell writable = @permissions.readwrite.length > 0 skipProtectAPI = @skipProtectAPI or not writable problemContext = @createProblemContext thang - aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: @levelType is 'hero', problemContext: problemContext + aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: @levelType in ['hero', 'hero-ladder', 'hero-coop'], problemContext: problemContext aether = new Aether aetherOptions if @worker workerMessage = diff --git a/app/views/play/level/tome/SpellPaletteView.coffee b/app/views/play/level/tome/SpellPaletteView.coffee index 621cabb69..e94734028 100644 --- a/app/views/play/level/tome/SpellPaletteView.coffee +++ b/app/views/play/level/tome/SpellPaletteView.coffee @@ -59,7 +59,7 @@ module.exports = class SpellPaletteView extends CocoView itemGroup.append entry.el entry.render() # Render after appending so that we can access parent container for popover @$el.addClass 'hero' - @updateMaxHeight() + @updateMaxHeight() unless application.isIPadApp afterInsert: -> super() @@ -121,7 +121,7 @@ module.exports = class SpellPaletteView extends CocoView else propStorage = 'this': ['apiProperties', 'apiMethods'] - if @options.level.get('type', true) isnt 'hero' or not @options.programmable + if not (@options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or not @options.programmable @organizePalette propStorage, allDocs, excludedDocs else @organizePaletteHero propStorage, allDocs, excludedDocs @@ -162,7 +162,7 @@ module.exports = class SpellPaletteView extends CocoView if tabbify and _.find @entries, ((entry) -> entry.doc.owner isnt 'this') @entryGroups = _.groupBy @entries, groupForEntry else - i18nKey = if @options.level.get('type', true) is 'hero' then 'play_level.tome_your_skills' else 'play_level.tome_available_spells' + i18nKey = if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then 'play_level.tome_your_skills' else 'play_level.tome_available_spells' defaultGroup = $.i18n.t i18nKey @entryGroups = {} @entryGroups[defaultGroup] = @entries @@ -218,7 +218,7 @@ module.exports = class SpellPaletteView extends CocoView return true if doc.owner is owner return (owner is 'this' or owner is 'more') and (not doc.owner? or doc.owner is 'this') if not doc and not excludedDocs['__' + prop] - console.log 'could not find doc for', prop, 'from', allDocs['__' + prop], 'for', owner, 'of', propGroups, 'with item', item + console.log 'could not find doc for', prop, 'from', allDocs['__' + prop], 'for', owner, 'of', propsByItem, 'with item', item doc ?= prop if doc @entries.push @addEntry(doc, shortenize, false, owner is 'snippets', item, propIndex > 0) diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee index 48334248b..e77f689ab 100644 --- a/app/views/play/level/tome/SpellView.coffee +++ b/app/views/play/level/tome/SpellView.coffee @@ -8,6 +8,7 @@ Problem = require './Problem' SpellDebugView = require './SpellDebugView' SpellToolbarView = require './SpellToolbarView' LevelComponent = require 'models/LevelComponent' +UserCodeProblem = require 'models/UserCodeProblem' module.exports = class SpellView extends CocoView id: 'spell-view' @@ -63,6 +64,7 @@ module.exports = class SpellView extends CocoView @listenTo(@session, 'change:multiplayer', @onMultiplayerChanged) @spell = options.spell @problems = [] + @savedProblems = {} # Cache saved user code problems to prevent duplicates @writable = false unless me.team in @spell.permissions.readwrite # TODO: make this do anything @highlightCurrentLine = _.throttle @highlightCurrentLine, 100 $(window).on 'resize', @onWindowResize @@ -486,6 +488,7 @@ module.exports = class SpellView extends CocoView continue if key = aetherProblem.userInfo?.key and key of seenProblemKeys seenProblemKeys[key] = true if key @problems.push problem = new Problem aether, aetherProblem, @ace, isCast and problemIndex is 0, isCast, @spell.levelID + @saveUserCodeProblem(aether, aetherProblem) if isCast annotations.push problem.annotation if problem.annotation @aceSession.setAnnotations annotations @highlightCurrentLine aether.flow unless _.isEmpty aether.flow @@ -498,6 +501,29 @@ module.exports = class SpellView extends CocoView Backbone.Mediator.publish 'tome:problems-updated', spell: @spell, problems: @problems, isCast: isCast @ace.resize() + saveUserCodeProblem: (aether, aetherProblem) -> + # Skip duplicate problems + hashValue = aether.raw + aetherProblem.message + return if hashValue of @savedProblems + @savedProblems[hashValue] = true + # Save new problem + @userCodeProblem = new UserCodeProblem() + @userCodeProblem.set 'code', aether.raw + if aetherProblem.range + rawLines = aether.raw.split '\n' + errorLines = rawLines.slice aetherProblem.range[0].row, aetherProblem.range[1].row + 1 + @userCodeProblem.set 'codeSnippet', errorLines.join '\n' + @userCodeProblem.set 'errHint', aetherProblem.hint if aetherProblem.hint + @userCodeProblem.set 'errId', aetherProblem.id if aetherProblem.id + @userCodeProblem.set 'errLevel', aetherProblem.level if aetherProblem.level + @userCodeProblem.set 'errMessage', aetherProblem.message if aetherProblem.message + @userCodeProblem.set 'errRange', aetherProblem.range if aetherProblem.range + @userCodeProblem.set 'errType', aetherProblem.type if aetherProblem.type + @userCodeProblem.set 'language', aether.language.id if aether.language?.id + @userCodeProblem.set 'levelID', @spell.levelID if @spell.levelID + @userCodeProblem.save() + null + # Autocast: # Goes immediately if the code is a) changed and b) complete/valid and c) the cursor is at beginning or end of a line # We originally thought it would: diff --git a/app/views/play/level/tome/TomeView.coffee b/app/views/play/level/tome/TomeView.coffee index 9d6e961fa..d8335993b 100644 --- a/app/views/play/level/tome/TomeView.coffee +++ b/app/views/play/level/tome/TomeView.coffee @@ -157,11 +157,15 @@ module.exports = class TomeView extends CocoView onCastSpell: (e) -> # A single spell is cast. - # Hmm; do we need to make sure other spells are all cast here? @cast e?.preload, e?.realTime cast: (preload=false, realTime=false) -> - Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime + sessionState = @options.session.get('state') ? {} + if realTime + sessionState.submissionCount = (sessionState.submissionCount ? 0) + 1 + sessionState.flagHistory = _.filter sessionState.flagHistory ? [], (event) => event.team isnt @options.session.get('team') + @options.session.set 'state', sessionState + Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime, submissionCount: sessionState.submissionCount ? 0, flagHistory: sessionState.flagHistory ? [] onToggleSpellList: (e) -> @spellList.rerenderEntries() @@ -186,7 +190,7 @@ module.exports = class TomeView extends CocoView @thangList?.$el.show() onSpriteSelected: (e) -> - return if @spellView and @options.level.get('type', true) is 'hero' # Never deselect the hero in the Tome. + return if @spellView and @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] # Never deselect the hero in the Tome. thang = e.thang spellName = e.spellName @spellList?.$el.hide() @@ -230,7 +234,7 @@ module.exports = class TomeView extends CocoView reloadAllCode: -> spell.view.reloadCode false for spellKey, spell of @spells when spell.view and (spell.team is me.team or (spell.team in ['common', 'neutral', null])) - Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: false, realTime: false + @cast false, false updateLanguageForAllSpells: (e) -> spell.updateLanguageAether e.language for spellKey, spell of @spells when spell.canWrite() diff --git a/app/views/user/AchievementsView.coffee b/app/views/user/AchievementsView.coffee index c5a7f32bb..41517c062 100644 --- a/app/views/user/AchievementsView.coffee +++ b/app/views/user/AchievementsView.coffee @@ -48,9 +48,8 @@ module.exports = class AchievementsView extends UserView # After user is loaded if @user and not @user.isAnonymous() context.earnedAchievements = @earnedAchievements - context.achievements = @achievements context.achievementsByCategory = {} - for achievement in @achievements.models + for achievement in @achievements.models when achievement.get('category') context.achievementsByCategory[achievement.get('category')] ?= [] context.achievementsByCategory[achievement.get('category')].push achievement context diff --git a/config.coffee b/config.coffee index f6ebd484e..ff02150a1 100644 --- a/config.coffee +++ b/config.coffee @@ -4,7 +4,8 @@ startsWith = (string, substring) -> exports.config = paths: - 'public': 'public' + public: 'public' + watched: ['app', 'vendor', 'test/app', 'test/demo'] conventions: ignored: (path) -> startsWith(sysPath.basename(path), '_') sourceMaps: true diff --git a/headless_client/worker_world.coffee b/headless_client/worker_world.coffee index fadfc9519..9406cec63 100644 --- a/headless_client/worker_world.coffee +++ b/headless_client/worker_world.coffee @@ -78,6 +78,8 @@ work = () -> try self.world = new World(args.userCodeMap) self.world.levelSessionIDs = args.levelSessionIDs + self.world.submissionCount = args.submissionCount + self.world.flagHistory = args.flagHistory self.world.loadFromLevel args.level, true if args.level self.world.headless = args.headless self.goalManager = new GoalManager(self.world) diff --git a/scripts/transpile.coffee b/scripts/transpile.coffee index 090d44eae..1d17fcba2 100644 --- a/scripts/transpile.coffee +++ b/scripts/transpile.coffee @@ -17,7 +17,8 @@ transpileLevelSession = (sessionID, cb) -> if err then return cb err submittedCode = session.submittedCode unless session.submittedCodeLanguage - throw 'SUBMITTED CODE LANGUAGE DOESN\'T EXIST' + console.log '\n\n\n#{i++} SUBMITTED CODE LANGUAGE DOESN\'T EXIST\n', session, '\n\n' + return cb() else console.log "Transpiling code for session #{i++} #{session._id} in language #{session.submittedCodeLanguage}" transpiledCode = {} diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee index 908a6b1dd..b14a71968 100644 --- a/server/levels/level_handler.coffee +++ b/server/levels/level_handler.coffee @@ -67,7 +67,7 @@ LevelHandler = class LevelHandler extends Handler sessionQuery.team = req.query.team # TODO: generalize this for levels based on their teams - else if level.get('type') is 'ladder' + else if level.get('type') in ['ladder', 'hero-ladder'] sessionQuery.team = 'humans' Session.findOne(sessionQuery).exec (err, doc) => diff --git a/server/levels/sessions/level_session_handler.coffee b/server/levels/sessions/level_session_handler.coffee index 7e94efcaf..4e23a56f9 100644 --- a/server/levels/sessions/level_session_handler.coffee +++ b/server/levels/sessions/level_session_handler.coffee @@ -30,7 +30,7 @@ class LevelSessionHandler extends Handler @sendSuccess(res, documents) hasAccessToDocument: (req, document, method=null) -> - return true if req.method is 'GET' and document.get('totalScore') + return true if req.method is 'GET' and document.get('submitted') return true if ('employer' in (req.user.get('permissions') ? [])) and (method ? req.method).toLowerCase() is 'get' super(arguments...) diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee index d6aa6f3cb..fd7dbc984 100644 --- a/server/queues/scoring.coffee +++ b/server/queues/scoring.coffee @@ -124,7 +124,7 @@ module.exports.getTwoGames = (req, res) -> #if userIsAnonymous req then return errors.unauthorized(res, 'You need to be logged in to get games.') humansGameID = req.body.humansGameID ogresGameID = req.body.ogresGameID - ladderGameIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span'] + ladderGameIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span', 'dueling-grounds', 'cavern-survival'] levelID = _.sample ladderGameIDs unless ogresGameID and humansGameID #fetch random games here @@ -279,7 +279,7 @@ fetchAndVerifyLevelType = (levelID, cb) -> .lean() query.exec (err, levelWithType) -> if err? then return cb err - if not levelWithType.type or levelWithType.type isnt 'ladder' then return cb 'Level isn\'t of type "ladder"' + if not levelWithType.type or not (levelWithType.type in ['ladder', 'hero-ladder']) then return cb 'Level isn\'t of type "ladder"' cb null fetchSessionObjectToSubmit = (sessionID, callback) -> diff --git a/test/app/lib/LevelLoader.spec.coffee b/test/app/lib/LevelLoader.spec.coffee index 4a9fc25b1..f177c703f 100644 --- a/test/app/lib/LevelLoader.spec.coffee +++ b/test/app/lib/LevelLoader.spec.coffee @@ -98,7 +98,7 @@ describe 'LevelLoader', -> levelLoader.loadDependenciesForSession(session) requests = jasmine.Ajax.requests.all() urls = (r.url for r in requests) - expect('/db/thang.type/gloves/version?project=name,components,original' in urls).toBeTruthy() + expect('/db/thang.type/gloves/version?project=name,components,original,rasterIcon,kind' in urls).toBeTruthy() expect('/db/thang.type/anya/version' in urls).toBeTruthy() it 'loads components for the hero in the heroConfig in the given session', -> @@ -141,7 +141,7 @@ describe 'LevelLoader', -> jasmine.Ajax.requests.sendResponses(responses) requests = jasmine.Ajax.requests.all() urls = (r.url for r in requests) - expect('/db/thang.type/mace/version?project=name,components,original' in urls).toBeTruthy() + expect('/db/thang.type/mace/version?project=name,components,original,rasterIcon,kind' in urls).toBeTruthy() it 'loads components which are inherited by level thangs from thang type default components', -> new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'}) @@ -165,7 +165,7 @@ describe 'LevelLoader', -> jasmine.Ajax.requests.sendResponses(responses) requests = jasmine.Ajax.requests.all() urls = (r.url for r in requests) - expect('/db/thang.type/wand/version?project=name,components,original' in urls).toBeTruthy() + expect('/db/thang.type/wand/version?project=name,components,original,rasterIcon,kind' in urls).toBeTruthy() it 'loads components for item thang types which are inherited by level thangs from thang type default equips component configs', -> new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'}) @@ -173,7 +173,7 @@ describe 'LevelLoader', -> responses = '/db/level/id': levelWithShaman '/db/thang.type/names': [thangTypeShamanWithWandEquipped] - '/db/thang.type/wand/version?project=name,components,original': thangTypeWand + '/db/thang.type/wand/version?project=name,components,original,rasterIcon,kind': thangTypeWand jasmine.Ajax.requests.sendResponses(responses) requests = jasmine.Ajax.requests.all() diff --git a/test/app/views/play/level/tome/Problem.spec.coffee b/test/app/views/play/level/tome/Problem.spec.coffee index cf663225c..27ec88c8b 100644 --- a/test/app/views/play/level/tome/Problem.spec.coffee +++ b/test/app/views/play/level/tome/Problem.spec.coffee @@ -10,7 +10,7 @@ describe 'Problem', -> addMarker: -> } } - aether = { + aether = { raw: "this.say('hi');\nthis.sad('bye');" language: { id: 'javascript' } } @@ -27,7 +27,8 @@ describe 'Problem', -> } levelID = 'awesome' - it 'save user code problem', -> + # TODO: Problems are no longer saved when creating Problems; instead it's in SpellView. Update tests? + xit 'save user code problem', -> new Problem aether, aetherProblem, ace, false, true, levelID expect(jasmine.Ajax.requests.count()).toBe(1) @@ -46,7 +47,7 @@ describe 'Problem', -> expect(params.language).toEqual(aether.language.id) expect(params.levelID).toEqual(levelID) - it 'save user code problem no range', -> + xit 'save user code problem no range', -> aetherProblem.range = null new Problem aether, aetherProblem, ace, false, true, levelID expect(jasmine.Ajax.requests.count()).toBe(1) @@ -68,7 +69,7 @@ describe 'Problem', -> expect(params.codeSnippet).toBeUndefined() expect(params.errRange).toBeUndefined() - it 'save user code problem multi-line snippet', -> + xit 'save user code problem multi-line snippet', -> aether.raw = "this.say('hi');\nthis.sad\n('bye');" aetherProblem.range = [ { row: 1 }, { row: 2 } ]