Merge branch 'master' into production

This commit is contained in:
Nick Winter 2015-07-24 17:38:39 -07:00
commit 85db686e74
58 changed files with 933 additions and 1497 deletions

12
Vagrantfile vendored
View file

@ -6,16 +6,24 @@
VAGRANTFILE_API_VERSION = "2" VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# A VMware compatible box is avaliable from:
# https://github.com/spkane/vagrant-boxes/releases/download/v1.0.0/trusty64_vmware.box
config.vm.box = "ubuntu/trusty64" config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port", guest: 3000, host: 3000 config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 9485, host: 9485 config.vm.network "forwarded_port", guest: 9485, host: 9485
config.vm.provision "shell", path: "scripts/vagrant/provision.sh" config.vm.provision "shell", path: "scripts/vagrant/provision.sh"
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.memory = 2048 v.memory = 2048
v.cpus = 2 v.cpus = 2
end end
config.vm.provider "vmware_fusion" do |v|
v.memory = 2048
v.cpus = 2
end
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

View file

@ -84,6 +84,7 @@ module.exports = ParticleMan = class ParticleMan extends CocoClass
addEmitter: (x, y, kind="level-dungeon-premium") -> addEmitter: (x, y, kind="level-dungeon-premium") ->
return if @unsupported return if @unsupported
kind = kind.replace 'intro', 'dungeon'
options = $.extend true, {}, particleKinds[kind] options = $.extend true, {}, particleKinds[kind]
return console.error "Couldn't find particle configuration for", kind unless options.group return console.error "Couldn't find particle configuration for", kind unless options.group
options.group.texture = THREE.ImageUtils.loadTexture "/images/common/particles/#{options.group.texture}.png" options.group.texture = THREE.ImageUtils.loadTexture "/images/common/particles/#{options.group.texture}.png"
@ -224,7 +225,7 @@ particleKinds['level-dungeon-gate'] = ext particleKinds['level-dungeon-premium']
colorMiddleSpread: vec 1.5, 1.5, 1.5 colorMiddleSpread: vec 1.5, 1.5, 1.5
colorEndSpread: vec 2.5, 2.5, 2.5 colorEndSpread: vec 2.5, 2.5, 2.5
particleKinds['level-dungeon-hero-ladder'] = ext particleKinds['level-dungeon-premium'], particleKinds['level-dungeon-hero-ladder'] = particleKinds['level-dungeon-course-ladder'] = ext particleKinds['level-dungeon-premium'],
emitter: emitter:
particleCount: 200 particleCount: 200
acceleration: vec 0, 3, 0 acceleration: vec 0, 3, 0
@ -258,7 +259,7 @@ particleKinds['level-forest-gate'] = ext particleKinds['level-forest-premium'],
colorMiddleSpread: vec 1.5, 1.5, 1.5 colorMiddleSpread: vec 1.5, 1.5, 1.5
colorEndSpread: vec 2.5, 2.5, 2.5 colorEndSpread: vec 2.5, 2.5, 2.5
particleKinds['level-forest-hero-ladder'] = ext particleKinds['level-forest-premium'], particleKinds['level-forest-hero-ladder'] = particleKinds['level-forest-course-ladder'] = ext particleKinds['level-forest-premium'],
emitter: emitter:
particleCount: 90 particleCount: 90
velocity: vec 0, 4, 0 velocity: vec 0, 4, 0
@ -307,7 +308,7 @@ particleKinds['level-desert-gate'] = ext particleKinds['level-desert-premium'],
colorMiddleSpread: vec 1.5, 1.5, 1.5 colorMiddleSpread: vec 1.5, 1.5, 1.5
colorEndSpread: vec 2.5, 2.5, 2.5 colorEndSpread: vec 2.5, 2.5, 2.5
particleKinds['level-desert-hero-ladder'] = ext particleKinds['level-desert-premium'], particleKinds['level-desert-hero-ladder'] = particleKinds['level-desert-course-ladder'] = ext particleKinds['level-desert-premium'],
emitter: emitter:
particleCount: 90 particleCount: 90
velocity: vec 0, 4, 0 velocity: vec 0, 4, 0
@ -341,7 +342,7 @@ particleKinds['level-mountain-gate'] = ext particleKinds['level-mountain-premium
colorMiddleSpread: vec 1.5, 1.5, 1.5 colorMiddleSpread: vec 1.5, 1.5, 1.5
colorEndSpread: vec 2.5, 2.5, 2.5 colorEndSpread: vec 2.5, 2.5, 2.5
particleKinds['level-mountain-hero-ladder'] = ext particleKinds['level-mountain-premium'], particleKinds['level-mountain-hero-ladder'] = particleKinds['level-mountain-course-ladder'] = ext particleKinds['level-mountain-premium'],
emitter: emitter:
particleCount: 90 particleCount: 90
velocity: vec 0, 4, 0 velocity: vec 0, 4, 0
@ -375,7 +376,7 @@ particleKinds['level-glacier-gate'] = ext particleKinds['level-glacier-premium']
colorMiddleSpread: vec 1.5, 1.5, 1.5 colorMiddleSpread: vec 1.5, 1.5, 1.5
colorEndSpread: vec 2.5, 2.5, 2.5 colorEndSpread: vec 2.5, 2.5, 2.5
particleKinds['level-glacier-hero-ladder'] = ext particleKinds['level-glacier-premium'], particleKinds['level-glacier-hero-ladder'] = particleKinds['level-glacier-course-ladder'] = ext particleKinds['level-glacier-premium'],
emitter: emitter:
particleCount: 90 particleCount: 90
velocity: vec 0, 4, 0 velocity: vec 0, 4, 0

View file

@ -57,7 +57,7 @@ module.exports = class CocoRouter extends Backbone.Router
'contribute/diplomat': go('contribute/DiplomatView') 'contribute/diplomat': go('contribute/DiplomatView')
'contribute/scribe': go('contribute/ScribeView') 'contribute/scribe': go('contribute/ScribeView')
'courses': -> @navigate('courses/mock1') 'courses': go('courses/mock1/CoursesView')
'courses/mock1': go('courses/mock1/CoursesView') 'courses/mock1': go('courses/mock1/CoursesView')
'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView') 'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView')
'courses/mock1/:courseID/info': go('courses/mock1/CourseInfoView') 'courses/mock1/:courseID/info': go('courses/mock1/CourseInfoView')
@ -103,7 +103,6 @@ module.exports = class CocoRouter extends Backbone.Router
'multiplayer': go('MultiplayerView') 'multiplayer': go('MultiplayerView')
'play-old': go('play/MainPlayView') # This used to be 'play'.
'play': go('play/CampaignView') 'play': go('play/CampaignView')
'play/ladder/:levelID': go('ladder/LadderView') 'play/ladder/:levelID': go('ladder/LadderView')
'play/ladder': go('ladder/MainLadderView') 'play/ladder': go('ladder/MainLadderView')

View file

@ -10,8 +10,6 @@ module.exports = class LevelBus extends Bus
return Bus.getFromCache(docName) or new LevelBus docName return Bus.getFromCache(docName) or new LevelBus docName
subscriptions: subscriptions:
'self-wizard:target-changed': 'onSelfWizardTargetChanged'
'self-wizard:created': 'onSelfWizardCreated'
'tome:editing-began': 'onEditingBegan' 'tome:editing-began': 'onEditingBegan'
'tome:editing-ended': 'onEditingEnded' 'tome:editing-ended': 'onEditingEnded'
'script:state-changed': 'onScriptStateChanged' 'script:state-changed': 'onScriptStateChanged'
@ -55,27 +53,13 @@ module.exports = class LevelBus extends Bus
return true unless @session?.get('multiplayer') return true unless @session?.get('multiplayer')
super() super()
onSelfWizardCreated: (e) ->
@selfWizardLank = e.sprite
onSelfWizardTargetChanged: (e) ->
@wizardRef?.child('targetPos').set(@selfWizardLank?.targetPos or null)
@wizardRef?.child('targetSprite').set(@selfWizardLank?.targetSprite?.thang.id or null)
onMeSynced: => onMeSynced: =>
super() super()
@wizardRef?.child('wizardColor1').set(me.get('wizardColor1') or 0.0)
join: -> join: ->
super() super()
@wizardRef = @myConnection.child('wizard')
@wizardRef?.child('targetPos').set(@selfWizardLank?.targetPos or null)
@wizardRef?.child('targetSprite').set(@selfWizardLank?.targetSprite?.thang.id or null)
@wizardRef?.child('wizardColor1').set(me.get('wizardColor1') or 0.0)
disconnect: -> disconnect: ->
@wizardRef?.off()
@wizardRef = null
@fireScriptsRef?.off() @fireScriptsRef?.off()
@fireScriptsRef = null @fireScriptsRef = null
super() super()
@ -88,8 +72,8 @@ module.exports = class LevelBus extends Bus
# UPDATING FIREBASE AND SESSION # UPDATING FIREBASE AND SESSION
onEditingBegan: -> @wizardRef?.child('editing').set(true) onEditingBegan: -> #@wizardRef?.child('editing').set(true) # no more wizards
onEditingEnded: -> @wizardRef?.child('editing').set(false) onEditingEnded: -> #@wizardRef?.child('editing').set(false) # no more wizards
# HACK: Backbone does not work with nested documents, but we want to # HACK: Backbone does not work with nested documents, but we want to
# patch only those props that have changed. Look into plugins to # patch only those props that have changed. Look into plugins to

View file

@ -214,10 +214,6 @@ module.exports = class LevelLoader extends CocoClass
url = "/db/level/#{obj.original}/version/#{obj.majorVersion}" url = "/db/level/#{obj.original}/version/#{obj.majorVersion}"
@maybeLoadURL url, Level, 'level' @maybeLoadURL url, Level, 'level'
unless @headless or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
wizard = ThangType.loadUniversalWizard()
@supermodel.loadModel wizard, 'thang'
@worldNecessities = @worldNecessities.concat worldNecessities @worldNecessities = @worldNecessities.concat worldNecessities
loadThangsRequiredByLevelThang: (levelThang) -> loadThangsRequiredByLevelThang: (levelThang) ->
@ -369,7 +365,7 @@ module.exports = class LevelLoader extends CocoClass
@grabTeamConfigs() @grabTeamConfigs()
@thangTypeTeams = {} @thangTypeTeams = {}
for thang in @level.get('thangs') for thang in @level.get('thangs')
if @level.get('type', true) is 'hero' and thang.id is 'Hero Placeholder' if @level.get('type', true) in ['hero', 'course'] and thang.id is 'Hero Placeholder'
continue # No team colors for heroes on single-player levels continue # No team colors for heroes on single-player levels
for component in thang.components for component in thang.components
if team = component.config?.team if team = component.config?.team

View file

@ -61,6 +61,9 @@ module.exports = class LevelSetupManager extends CocoClass
@session.set 'heroConfig', {"thangType":sorcerer,"inventory":{"misc-0":"53e2396a53457600003e3f0f","programming-book":"546e266e9df4a17d0d449be5","minion":"54eb5dbc49fa2d5c905ddf56","feet":"53e214f153457600003e3eab","right-hand":"54eab7f52b7506e891ca7202","left-hand":"5463758f3839c6e02811d30f","wrists":"54693797a2b1f53ce79443e9","gloves":"5469425ca2b1f53ce7944421","torso":"546d4a549df4a17d0d449a97","neck":"54693274a2b1f53ce79443c9","eyes":"546941fda2b1f53ce794441d","head":"546d4ca19df4a17d0d449abf"}} @session.set 'heroConfig', {"thangType":sorcerer,"inventory":{"misc-0":"53e2396a53457600003e3f0f","programming-book":"546e266e9df4a17d0d449be5","minion":"54eb5dbc49fa2d5c905ddf56","feet":"53e214f153457600003e3eab","right-hand":"54eab7f52b7506e891ca7202","left-hand":"5463758f3839c6e02811d30f","wrists":"54693797a2b1f53ce79443e9","gloves":"5469425ca2b1f53ce7944421","torso":"546d4a549df4a17d0d449a97","neck":"54693274a2b1f53ce79443c9","eyes":"546941fda2b1f53ce794441d","head":"546d4ca19df4a17d0d449abf"}}
@onInventoryModalPlayClicked() @onInventoryModalPlayClicked()
return return
if @level.get('type', true) in ['course', 'course-ladder']
@onInventoryModalPlayClicked()
return
@heroesModal = new PlayHeroesModal({supermodel: @supermodel, session: @session, confirmButtonI18N: 'play.next', level: @level, hadEverChosenHero: @options.hadEverChosenHero}) @heroesModal = new PlayHeroesModal({supermodel: @supermodel, session: @session, confirmButtonI18N: 'play.next', level: @level, hadEverChosenHero: @options.hadEverChosenHero})
@inventoryModal = new InventoryModal({supermodel: @supermodel, session: @session, level: @level}) @inventoryModal = new InventoryModal({supermodel: @supermodel, session: @session, level: @level})
@heroesModalDestroy = @heroesModal.destroy @heroesModalDestroy = @heroesModal.destroy

View file

@ -259,7 +259,6 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@publishNote(note) @publishNote(note)
publishNote: (note) -> publishNote: (note) ->
Backbone.Mediator.publish 'playback:real-time-playback-ended', {} unless @session.get('heroConfig') # Only old levels need this, to stop interfering with old victory coolcams.
Backbone.Mediator.publish note.channel, note.event ? {} Backbone.Mediator.publish note.channel, note.event ? {}
# ENDING NOTES # ENDING NOTES

View file

@ -64,7 +64,7 @@ module.exports = class Dimmer extends CocoClass
updateDimMask: => updateDimMask: =>
@dimMask.graphics.clear() @dimMask.graphics.clear()
for thangID, sprite of @sprites for thangID, sprite of @sprites
continue unless (thangID in @highlightedThangIDs) or sprite.isTalking?() or sprite.thang?.id is 'My Wizard' continue unless (thangID in @highlightedThangIDs) or sprite.isTalking?()
sup = x: sprite.sprite.x, y: sprite.sprite.y sup = x: sprite.sprite.x, y: sprite.sprite.y
cap = @camera.surfaceToCanvas sup cap = @camera.surfaceToCanvas sup
r = 50 * @camera.zoom # TODO: find better way to get the radius based on the sprite's size r = 50 * @camera.zoom # TODO: find better way to get the radius based on the sprite's size

View file

@ -1,8 +1,6 @@
CocoClass = require 'core/CocoClass' CocoClass = require 'core/CocoClass'
{me} = require 'core/auth' {me} = require 'core/auth'
LayerAdapter = require './LayerAdapter' LayerAdapter = require './LayerAdapter'
IndieLank = require 'lib/surface/IndieLank'
WizardLank = require 'lib/surface/WizardLank'
FlagLank = require 'lib/surface/FlagLank' FlagLank = require 'lib/surface/FlagLank'
Lank = require 'lib/surface/Lank' Lank = require 'lib/surface/Lank'
Mark = require './Mark' Mark = require './Mark'
@ -11,8 +9,6 @@ utils = require 'core/utils'
module.exports = class LankBoss extends CocoClass module.exports = class LankBoss extends CocoClass
subscriptions: subscriptions:
'bus:player-joined': 'onPlayerJoined'
'bus:player-left': 'onPlayerLeft'
'level:set-debug': 'onSetDebug' 'level:set-debug': 'onSetDebug'
'sprite:highlight-sprites': 'onHighlightSprites' 'sprite:highlight-sprites': 'onHighlightSprites'
'surface:stage-mouse-down': 'onStageMouseDown' 'surface:stage-mouse-down': 'onStageMouseDown'
@ -40,7 +36,6 @@ module.exports = class LankBoss extends CocoClass
@options.thangTypes ?= [] @options.thangTypes ?= []
@lanks = {} @lanks = {}
@lankArray = [] # Mirror @lanks, but faster for when we just need to iterate @lankArray = [] # Mirror @lanks, but faster for when we just need to iterate
@selfWizardLank = null
@createLayers() @createLayers()
@pendingFlags = [] @pendingFlags = []
@ -100,49 +95,6 @@ module.exports = class LankBoss extends CocoClass
createLankOptions: (options) -> createLankOptions: (options) ->
_.extend options, camera: @camera, resolutionFactor: SPRITE_RESOLUTION_FACTOR, groundLayer: @layerAdapters['Ground'], textLayer: @surfaceTextLayer, floatingLayer: @layerAdapters['Floating'], showInvisible: @options.showInvisible _.extend options, camera: @camera, resolutionFactor: SPRITE_RESOLUTION_FACTOR, groundLayer: @layerAdapters['Ground'], textLayer: @surfaceTextLayer, floatingLayer: @layerAdapters['Floating'], showInvisible: @options.showInvisible
createIndieLanks: (indieLanks, withWizards) ->
unless @indieLanks
@indieLanks = []
@indieLanks = (@createIndieLank indieLank for indieLank in indieLanks) if indieLanks
if withWizards and not @selfWizardLank
@selfWizardLank = @createWizardLank thangID: 'My Wizard', isSelf: true, lanks: @lanks
createIndieLank: (indieLank) ->
unless thangType = @thangTypeFor indieLank.thangType
console.warn "Need to convert #{indieLank.id}'s ThangType #{indieLank.thangType} to a ThangType reference. Until then, #{indieLank.id} won't show up."
return
lank = new IndieLank thangType, @createLankOptions {thangID: indieLank.id, pos: indieLank.pos, lanks: @lanks, team: indieLank.team, teamColors: @world.getTeamColors()}
@addLank lank, lank.thang.id
createOpponentWizard: (opponent) ->
# TODO: colorize name and cloud by team, colorize wizard by user's color config, level-specific wizard spawn points
lank = @createWizardLank thangID: opponent.id, name: opponent.name, codeLanguage: opponent.codeLanguage
if not opponent.levelSlug or opponent.levelSlug is 'brawlwood'
lank.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28}
else if opponent.levelSlug in ['dungeon-arena', 'sky-span']
lank.targetPos = if opponent.team is 'ogres' then {x: 72, y: 39} else {x: 9, y: 39}
else if opponent.levelSlug is 'criss-cross'
lank.targetPos = if opponent.team is 'ogres' then {x: 50, y: 12} else {x: 0, y: 40}
else
lank.targetPos = if opponent.team is 'ogres' then {x: 52, y: 28} else {x: 20, y: 28}
createWizardLank: (options) ->
lank = new WizardLank @thangTypeFor('Wizard'), @createLankOptions(options)
@addLank lank, lank.thang.id, @layerAdapters['Floating']
onPlayerJoined: (e) ->
# Create another WizardLank, unless this player is just me
pid = e.player.id
return if pid is me.id
wiz = @createWizardLank thangID: pid, lanks: @lanks
wiz.animateIn()
state = e.player.wizard or {}
wiz.setInitialState(state.targetPos, @lanks[state.targetLank])
onPlayerLeft: (e) ->
pid = e.player.id
@lanks[pid]?.animateOut => @removeLank @lanks[pid]
onSetDebug: (e) -> onSetDebug: (e) ->
return if e.debug is @debug return if e.debug is @debug
@debug = e.debug @debug = e.debug

View file

@ -44,7 +44,6 @@ module.exports = Surface = class Surface extends CocoClass
debug: false debug: false
defaults: defaults:
wizards: true
paths: true paths: true
grid: false grid: false
navigateToSelection: true navigateToSelection: true
@ -160,17 +159,11 @@ module.exports = Surface = class Surface extends CocoClass
return if @loaded return if @loaded
@loaded = true @loaded = true
@lankBoss.createMarks() @lankBoss.createMarks()
@lankBoss.createIndieLanks @world.indieSprites, @options.wizards
@updateState true @updateState true
@drawCurrentFrame() @drawCurrentFrame()
createjs.Ticker.addEventListener 'tick', @tick createjs.Ticker.addEventListener 'tick', @tick
Backbone.Mediator.publish 'level:started', {} Backbone.Mediator.publish 'level:started', {}
createOpponentWizard: (opponent) ->
@lankBoss.createOpponentWizard opponent
#- Update loop #- Update loop
tick: (e) => tick: (e) =>
@ -572,7 +565,6 @@ module.exports = Surface = class Surface extends CocoClass
return if @realTime return if @realTime
@realTime = true @realTime = true
@onResize() @onResize()
@lankBoss.selfWizardLank?.toggle false
@playing = false # Will start when countdown is done. @playing = false # Will start when countdown is done.
if @heroLank if @heroLank
@previousCameraZoom = @camera.zoom @previousCameraZoom = @camera.zoom
@ -583,7 +575,6 @@ module.exports = Surface = class Surface extends CocoClass
@realTime = false @realTime = false
@onResize() @onResize()
_.delay @onResize, resizeDelay + 100 # Do it again just to be double sure that we don't stay zoomed in due to timing problems. _.delay @onResize, resizeDelay + 100 # Do it again just to be double sure that we don't stay zoomed in due to timing problems.
@lankBoss.selfWizardLank?.toggle true
@normalCanvas.add(@webGLCanvas).removeClass 'flag-color-selected' @normalCanvas.add(@webGLCanvas).removeClass 'flag-color-selected'
if @previousCameraZoom if @previousCameraZoom
@camera.zoomTo @camera.newTarget or @camera.target, @previousCameraZoom, 3000 @camera.zoomTo @camera.newTarget or @camera.target, @previousCameraZoom, 3000

View file

@ -1,272 +0,0 @@
IndieLank = require 'lib/surface/IndieLank'
{me} = require 'core/auth'
module.exports = class WizardLank extends IndieLank
# Wizard targets are constantly changing, so a simple tween doesn't work.
# Instead, the wizard stores its origin point and the (possibly) moving target.
# Then it figures out its current position based on tween percentage and
# those two points.
tweenPercentage: 1.0
originPos: null
targetPos: null
targetLank: null
reachedTarget: true
spriteXOffset: 4 # meters from target sprite
spriteYOffset: 0 # meters from target sprite
subscriptions:
'bus:player-states-changed': 'onPlayerStatesChanged'
'auth:me-synced': 'onMeSynced'
'surface:sprite-selected': 'onLankSelected'
'sprite:echo-all-wizard-sprites': 'onEchoAllWizardLanks'
shortcuts:
'up': 'onMoveKey'
'down': 'onMoveKey'
'left': 'onMoveKey'
'right': 'onMoveKey'
constructor: (thangType, options) ->
if @isSelf = options.isSelf
options.colorConfig = $.extend(true, {}, me.get('wizard')?.colorConfig) or {}
super thangType, options
@targetPos = @thang.pos
if @isSelf
@setNameLabel me.displayName()
else if options.name
@setNameLabel options.name
Backbone.Mediator.publish 'self-wizard:created', sprite: @
makeIndieThang: (thangType, options) ->
thang = super thangType, options
thang.isSelectable = false
thang.bobHeight = 0.75
thang.bobTime = 2
thang.pos.z += thang.bobHeight
thang
finishSetup: ->
@scaleFactor = @thang.scaleFactor if @thang?.scaleFactor
@updateScale()
@updateRotation()
# Don't call general update() because Thang isn't built yet
setNameLabel: (name) ->
if @options.codeLanguage and @options.codeLanguage isnt 'javascript' and not @isSelf
name += " (#{@options.codeLanguage})" # TODO: move on second line, capitalize properly
super name
toggle: (to) ->
@sprite?.visible = to
label[if to then 'show' else 'hide']() for name, label of @labels
mark.mark?.visible = to for name, mark of @marks
onPlayerStatesChanged: (e) ->
for playerID, state of e.states
continue unless playerID is @thang.id
@setEditing state.wizard?.editing
continue if playerID is me.id # ignore changes for self wizard lank
@setNameLabel state.name
continue unless state.wizard?
if targetID = state.wizard.targetLank
return console.warn 'Wizard Lank couldn\'t find target lank', targetID unless targetID of @options.lanks
@setTarget @options.lanks[targetID]
else
@setTarget state.wizard.targetPos
onMeSynced: (e) ->
return unless @isSelf
@setNameLabel me.displayName() if @sprite.visible # not if we hid the wiz
newColorConfig = me.get('wizard')?.colorConfig or {}
shouldUpdate = not _.isEqual(newColorConfig, @options.colorConfig)
@options.colorConfig = $.extend(true, {}, newColorConfig)
if shouldUpdate
@playAction(@currentAction) if @currentAction
onLankSelected: (e) ->
return unless @isSelf
@setTarget e.sprite or e.worldPos
animateIn: ->
@sprite.scaleX = @sprite.scaleY = @sprite.alpha = 0
createjs.Tween.get(@sprite)
.to({scaleX: 1, scaleY: 1, alpha: 1}, 1000, createjs.Ease.getPowInOut(2.2))
@labels.name?.show()
animateOut: (callback) ->
tween = createjs.Tween.get(@sprite)
.to({scaleX: 0, scaleY: 0, alpha: 0}, 1000, createjs.Ease.getPowInOut(2.2))
tween.call(callback) if callback
@labels.name?.hide()
setEditing: (@editing) ->
if @editing
@thang.actionActivated = @thang.action isnt 'cast'
@thang.action = 'cast'
else
@thang.action = 'idle' if @thang.action is 'cast'
setInitialState: (targetPos, @targetLank) ->
@targetPos = @getPosFromTarget(@targetLank or targetPos)
@endMoveTween()
onEchoAllWizardLanks: (e) -> e.payload.push @
defaultPos: -> x: 35, y: 24, z: @thang.depth / 2 + @thang.bobHeight
move: (pos, duration) -> @setTarget(pos, duration)
setTarget: (newTarget, duration, isLinear=false) ->
# ignore targets you're already heading for
targetPos = @getPosFromTarget(newTarget)
return if @targetPos and @targetPos.x is targetPos.x and @targetPos.y is targetPos.y
# ignore selecting sprites you can't control
isLank = newTarget?.thang?
return if isLank and not newTarget.thang.isProgrammable
return if isLank and newTarget is @targetLank
@shoveOtherWizards(true) if @targetLank
@targetLank = if isLank then newTarget else null
@targetPos = @boundWizard targetPos
@beginMoveTween(duration, isLinear)
@shoveOtherWizards()
Backbone.Mediator.publish('self-wizard:target-changed', {sprite: @}) if @isSelf
boundWizard: (target) ->
# Passed an {x, y} in world coordinates, returns {x, y} within world bounds
return target unless @options.camera.bounds
@bounds = @options.camera.bounds
surfaceTarget = @options.camera.worldToSurface target
x = Math.min(Math.max(surfaceTarget.x, @bounds.x), @bounds.x + @bounds.width)
y = Math.min(Math.max(surfaceTarget.y, @bounds.y), @bounds.y + @bounds.height)
return @options.camera.surfaceToWorld {x: x, y: y}
getPosFromTarget: (target) ->
"""
Could be null, a vector, or sprite object. Get the position from any of these.
"""
return @defaultPos() unless target?
return target if target.x?
return target.thang.pos
beginMoveTween: (duration=1000, isLinear=false) ->
# clear the old tween
createjs.Tween.removeTweens(@)
# create a new tween to go from the current location to the new location
@originPos = _.clone(@thang.pos)
@tweenPercentage = 1.0
@thang.action = 'move'
@pointToward(@targetPos)
if duration is 0
@updatePosition()
@endMoveTween()
return
if isLinear
ease = createjs.Ease.linear
else
ease = createjs.Ease.getPowInOut(3.0)
createjs.Tween
.get(@)
.to({tweenPercentage: 0.0}, duration, ease)
.call(@endMoveTween)
@reachedTarget = false
@update true
shoveOtherWizards: (removeMe) ->
return unless @targetLank
allWizards = []
Backbone.Mediator.publish 'sprite:echo-all-wizard-sprites', payload: allWizards
allOfUs = (wizard for wizard in allWizards when wizard.targetLank is @targetLank)
allOfUs = (wizard for wizard in allOfUs when wizard isnt @) if removeMe
# diagonal lineup pattern
# wizardPosition = [[4, 0], [5,1], [3,-1], [6,2], [2,-2]]
# step = 3
# for wizard, i in allOfUs
# [x,y] = wizardPositions[i%@wizardPositions.length]
# wizard.spriteXOffset = x
# wizard.spriteYOffset = y
# wizard.beginMoveTween()
# circular pattern
step = Math.PI * 2 / allOfUs.length
for wizard, i in allOfUs
wizard.spriteXOffset = 5*Math.cos(step*i)
wizard.spriteYOffset = 4*Math.sin(step*i)
wizard.beginMoveTween()
endMoveTween: =>
return if @destroyed
@thang.action = if @editing then 'cast' else 'idle'
@thang.actionActivated = @thang.action is 'cast'
@reachedTarget = true
@faceTarget()
@update true
updatePosition: (whileLoading=false) ->
return if whileLoading or not @options.camera
@thang.pos = @getCurrentPosition()
@faceTarget()
sup = @options.camera.worldToSurface x: @thang.pos.x, y: @thang.pos.y, z: @thang.pos.z - @thang.depth / 2
@sprite.x = sup.x
@sprite.y = sup.y
getCurrentPosition: ->
"""
Takes into account whether the wizard is in transit or not, and the bobbing up and down.
Eventually will also adjust based on where other wizards are.
"""
@targetPos = @targetLank.thang.pos if @targetLank?.thang
pos = _.clone(@targetPos)
pos.z = @defaultPos().z + @getBobOffset()
@adjustPositionToSideOfTarget(pos) if @targetLank # be off to the side depending on placement in world
return pos if @reachedTarget # stick like glue
# if here, then the wizard is in transit. Calculate the diff!
pos =
x: pos.x + ((@originPos.x - pos.x) * @tweenPercentage)
y: pos.y + ((@originPos.y - pos.y) * @tweenPercentage)
z: pos.z
return pos
adjustPositionToSideOfTarget: (targetPos) ->
targetPos.x += @spriteXOffset
return
# doesn't work when you're zoomed in on the target, so disabling
center = @options.camera.surfaceToWorld(@options.camera.currentTarget).x
distanceFromCenter = Math.abs(targetPos.x - center)
if @spriteXOffset
distanceFromTarget = Math.abs(@spriteXOffset) - (1 / (distanceFromCenter + (1/Math.abs(@spriteXOffset))))
else
distanceFromTarget = 0
@onLeftSide = targetPos.x > center
@onLeftSide = not @onLeftSide if @spriteXOffset < 0
distanceFromTarget *= -1 if @onLeftSide
targetPos.x += distanceFromTarget # adjusted
targetPos.y += @spriteYOffset
faceTarget: ->
if @targetLank?.thang
@pointToward(@targetLank.thang.pos)
updateMarks: ->
super() if @sprite.visible # not if we hid the wiz
onMoveKey: (e) ->
return unless @isSelf
e?.preventDefault()
yMovement = 0
xMovement = 0
yMovement += 2 if key.isPressed('up')
yMovement -= 2 if key.isPressed('down')
xMovement += 2 if key.isPressed('right')
xMovement -= 2 if key.isPressed('left')
@moveWizard xMovement, yMovement
moveWizard: (x, y) ->
interval = 500
position = {x: @targetPos.x + x, y: @targetPos.y + y}
@setTarget(position, interval, true)
@updatePosition()
Backbone.Mediator.publish 'camera:zoom-to', pos: position, duration: interval

View file

@ -52,31 +52,31 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
spectate: "مشاهد" # Ladder page spectate: "مشاهد" # Ladder page
players: "لاعبين" # Hover over a level on /play players: "لاعبين" # Hover over a level on /play
hours_played: "ساعات اللّعب" # 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
unlock: "فتح" # For purchasing items and heroes unlock: "فتح" # For purchasing items and heroes
confirm: "تأكيد" confirm: "تأكيد"
owned: "ممتَلَك" # For items you own owned: "ممتَلَك" # For items you own
locked: "مقفل" locked: "مقفل"
purchasable: "للشراء" # For a hero you unlocked but haven't purchased purchasable: "للشراء" # For a hero you unlocked but haven't purchased
available: "متوفر" available: "متوفر"
# skills_granted: "Skills Granted" # Property documentation details skills_granted: "مهارات الممنوحة" # Property documentation details
# heroes: "Heroes" # Tooltip on hero shop button from /play heroes: "الأبطال" # Tooltip on hero shop button from /play
# achievements: "Achievements" # Tooltip on achievement list button from /play achievements: "الإنجازات" # Tooltip on achievement list button from /play
account: "حساب" # Tooltip on account button from /play account: "حساب" # Tooltip on account button from /play
settings: "الإعدادات" # Tooltip on settings button from /play settings: "الإعدادات" # Tooltip on settings button from /play
# poll: "Poll" # Tooltip on poll button from /play # poll: "Poll" # Tooltip on poll button from /play
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: "Change Hero" # Go back from choose inventory to choose hero change_hero: "تغيير البطل" # Go back from choose inventory to choose hero
# choose_inventory: "Equip Items" choose_inventory: "فريق الأصناف"
# buy_gems: "Buy Gems" buy_gems: "شراء الأحجار الكريمة"
subscription_required: "الإشتراك إلزامي" subscription_required: "الإشتراك إلزامي"
older_campaigns: "حملات أقدم" older_campaigns: "حملات أقدم"
anonymous: "لاعب مجهول" anonymous: "لاعب مجهول"
level_difficulty: "الصعوبة:" level_difficulty: "الصعوبة:"
campaign_beginner: "حملة المبتدئين" campaign_beginner: "حملة المبتدئين"
# awaiting_levels_adventurer_prefix: "We release new levels every week." awaiting_levels_adventurer_prefix: "نحن الافراج عن مستويات جديدة كل أسبوع."
# awaiting_levels_adventurer: "Sign up as an Adventurer" awaiting_levels_adventurer: "التوقيع على النحو المغامر"
# awaiting_levels_adventurer_suffix: "to be the first to play new levels." awaiting_levels_adventurer_suffix: "أن تكون أول للعب مستويات جديدة."
adjust_volume: "تعديل الصوت" adjust_volume: "تعديل الصوت"
choose_your_level: "اختر مستواك" # The rest of this section is the old play view at /play-old and isn't very important. choose_your_level: "اختر مستواك" # The rest of this section is the old play view at /play-old and isn't very important.
adventurer_prefix: "يمكنك القفز إلى أي مستوى أدناه، أو مناقشة المستويات على " adventurer_prefix: "يمكنك القفز إلى أي مستوى أدناه، أو مناقشة المستويات على "
@ -93,10 +93,10 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
campaign_classic_algorithms: "الخوارزميات التقليديّة" campaign_classic_algorithms: "الخوارزميات التقليديّة"
campaign_classic_algorithms_description: "... فيها تتعلّم خوارزميّات الأكثر شعبيّة في علوم الحاسب الآلي." campaign_classic_algorithms_description: "... فيها تتعلّم خوارزميّات الأكثر شعبيّة في علوم الحاسب الآلي."
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" # campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." campaign_old_multiplayer_description: "قطع اثرية من العصر أكثر تحضرا. يتم تشغيل أي محاكاة لهذه السن، الساحات متعددة البطل أقل."
share_progress_modal: share_progress_modal:
# blurb: "Youre making great progress! Tell your parent how much you've learned with CodeCombat." blurb: "كنت تقدما كبيرا! أخبر والديك وكم كنت قد تعلمت مع CodeCombat."
email_invalid: "البريد الاكتروني غير صالح." email_invalid: "البريد الاكتروني غير صالح."
form_blurb: "ادخل بريد اولياء امرك الالكتروني لكي نريهم!" form_blurb: "ادخل بريد اولياء امرك الالكتروني لكي نريهم!"
form_label: "عنوان البريد الالكتروني" form_label: "عنوان البريد الالكتروني"
@ -109,9 +109,9 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
logging_in: "جاري تسجيل الدخول" logging_in: "جاري تسجيل الدخول"
log_out: "تسجيل الخروج" log_out: "تسجيل الخروج"
forgot_password: "نسيت رمز الدخول?" forgot_password: "نسيت رمز الدخول?"
# authenticate_gplus: "Authenticate G+" authenticate_gplus: "مصادقة G+"
load_profile: "تحميل صفحة غوغل بلس" load_profile: "تحميل صفحة غوغل بلس"
# finishing: "Finishing" finishing: "الانتهاء"
sign_in_with_facebook: "سجل الدخول بواسطة فيسبوك" sign_in_with_facebook: "سجل الدخول بواسطة فيسبوك"
sign_in_with_gplus: "سجل الدخول بواسطة غوغل بلس" sign_in_with_gplus: "سجل الدخول بواسطة غوغل بلس"
signup_switch: "تريد انشاء حساب?" signup_switch: "تريد انشاء حساب?"
@ -134,8 +134,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
primary: "الأولي" primary: "الأولي"
secondary: "ثانوي" secondary: "ثانوي"
armor: "درع" armor: "درع"
# accessories: "Accessories" accessories: "إكسسوارات"
# misc: "Misc" misc: "متفرقات"
books: "كتب" books: "كتب"
common: common:
@ -153,14 +153,14 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
fork: "إنسخ" fork: "إنسخ"
play: "إلعب" # When used as an action verb, like "Play next level" play: "إلعب" # When used as an action verb, like "Play next level"
retry: "إعادة" retry: "إعادة"
# actions: "Actions" actions: "Actions"
info: "معلومات" info: "معلومات"
help: "مساعدة" help: "مساعدة"
watch: "مشاهدة" watch: "مشاهدة"
unwatch: "إنهاء المشاهدة" unwatch: "إنهاء المشاهدة"
submit_patch: "تقديم التصحيح" submit_patch: "تقديم التصحيح"
submit_changes: "تقديم التغييرات" submit_changes: "تقديم التغييرات"
# save_changes: "Save Changes" save_changes: "حفظ التغيرات"
general: general:
and: "و" and: "و"
@ -179,10 +179,10 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
version_history: "تاريخ النسخة" version_history: "تاريخ النسخة"
version_history_for: "تاريخ النسخة لل: " version_history_for: "تاريخ النسخة لل: "
select_changes: "اختر تغيريين." select_changes: "اختر تغيريين."
# undo_prefix: "Undo" undo_prefix: "فك"
# undo_shortcut: "(Ctrl+Z)" undo_shortcut: "(Ctrl+Z)"
# redo_prefix: "Redo" redo_prefix: "Redo"
# redo_shortcut: "(Ctrl+Shift+Z)" redo_shortcut: "(Ctrl+Shift+Z)"
play_preview: "شاهد مقطع فيديو عن المستوى الحالي" play_preview: "شاهد مقطع فيديو عن المستوى الحالي"
result: "نتيجة" result: "نتيجة"
results: "نتائج" results: "نتائج"
@ -228,7 +228,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
play_level: play_level:
done: "انتهاء" done: "انتهاء"
# home: "Home" # Not used any more, will be removed soon. home: "Home" # Not used any more, will be removed soon.
level: "مستوى" # Like "Level: Dungeons of Kithgard" level: "مستوى" # Like "Level: Dungeons of Kithgard"
skip: "الغاء" skip: "الغاء"
game_menu: "قائمة اللعبة" game_menu: "قائمة اللعبة"
@ -241,39 +241,39 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
incomplete: "غير مكتمل" incomplete: "غير مكتمل"
timed_out: "تم انتهاء الوقت" timed_out: "تم انتهاء الوقت"
failing: "فشل" failing: "فشل"
# action_timeline: "Action Timeline" action_timeline: "عمل الجدول الزمني"
# click_to_select: "Click on a unit to select it." click_to_select: "انقر على وحدة لتحديده."
# control_bar_multiplayer: "Multiplayer" control_bar_multiplayer: "متعددة"
# control_bar_join_game: "Join Game" control_bar_join_game: "تاريخ لعبة"
# reload: "Reload" reload: "تحديث"
# reload_title: "Reload All Code?" reload_title: "تحديث الصفحة كل رمز؟"
# reload_really: "Are you sure you want to reload this level back to the beginning?" reload_really: "هل أنت متأكد أنك تريد تحميل هذا المستوى مرة أخرى إلى البداية؟"
# reload_confirm: "Reload All" reload_confirm: "تحديث جميع"
# victory: "Victory" victory: "فوز"
# victory_title_prefix: "" victory_title_prefix: ""
# victory_title_suffix: " Complete" victory_title_suffix: " كامل"
# victory_sign_up: "Sign Up to Save Progress" victory_sign_up: "اشترك لإنقاذ التقدم"
# victory_sign_up_poke: "Want to save your code? Create a free account!" victory_sign_up_poke: "تريد حفظ التعليمات البرمجية الخاصة بك؟ إنشاء حساب مجاني!"
# victory_rate_the_level: "Rate the level: " # Only in old-style levels. victory_rate_the_level: "معدل المستوى: " # Only in old-style levels.
# victory_return_to_ladder: "Return to Ladder" victory_return_to_ladder: "العودة إلى سلم"
# victory_play_continue: "Continue" victory_play_continue: "استمر"
# victory_saving_progress: "Saving Progress" victory_saving_progress: "توفير التقدم"
# victory_go_home: "Go Home" # Only in old-style levels. victory_go_home: "اذهب للمنزل" # Only in old-style levels.
# victory_review: "Tell us more!" # Only in old-style levels. victory_review: "إخبرنا المزيد!" # Only in old-style levels.
# victory_hour_of_code_done: "Are You Done?" # victory_hour_of_code_done: "Are You Done?"
# victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!" victory_hour_of_code_done_yes: "نعم، أنا مع الانتهاء من ساعتي من قانون ™!"
# victory_experience_gained: "XP Gained" # victory_experience_gained: "XP Gained"
# victory_gems_gained: "Gems Gained" victory_gems_gained: "الأحجار الكريمة المكتسبة"
# victory_new_item: "New Item" victory_new_item: "عنصر جديد"
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." victory_viking_code_school: "يدخن المقدسة، وكان ذلك على مستوى الثابت الذي فاز فقط! إذا لم تكن بالفعل مطور برامج، يجب أن تكون. كنت فقط حصلت على المسار السريع لقبوله مع مدرسة فايكنغ المدونة، حيث يمكنك أن تأخذ المهارات الخاصة بك إلى المستوى التالي وتصبح مطور ويب محترف في 14 أسبوعا."
# victory_become_a_viking: "Become a Viking" victory_become_a_viking: "تصبح فايكنغ"
# guide_title: "Guide" guide_title: "دليل"
# tome_minion_spells: "Your Minions' Spells" # Only in old-style levels. tome_minion_spells: "نوبات التوابع الخاصة بك" # Only in old-style levels.
# tome_read_only_spells: "Read-Only Spells" # Only in old-style levels. tome_read_only_spells: "Read-Only Spells" # Only in old-style levels.
# tome_other_units: "Other Units" # Only in old-style levels. tome_other_units: "وحدات أخرى" # Only in old-style levels.
# tome_cast_button_run: "Run" tome_cast_button_run: "Run"
# tome_cast_button_running: "Running" tome_cast_button_running: "تشغيل"
# tome_cast_button_ran: "Ran" tome_cast_button_ran: "ران"
# tome_submit_button: "Submit" # tome_submit_button: "Submit"
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button. # tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
# tome_select_method: "Select a Method" # tome_select_method: "Select a Method"
@ -394,17 +394,17 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# equip: "Equip" # equip: "Equip"
# unequip: "Unequip" # unequip: "Unequip"
# buy_gems: buy_gems:
# few_gems: "A few gems" few_gems: " عدد قليل من الأحجار الكريمة"
# pile_gems: "Pile of gems" pile_gems: "كومة من الأحجار الكريمة"
# chest_gems: "Chest of gems" chest_gems: "الصدر من الأحجار الكريمة"
# purchasing: "Purchasing..." purchasing: "شراء ..."
# declined: "Your card was declined" # declined: "Your card was declined"
# retrying: "Server error, retrying." # retrying: "Server error, retrying."
# prompt_title: "Not Enough Gems" # prompt_title: "Not Enough Gems"
# prompt_body: "Do you want to get more?" # prompt_body: "Do you want to get more?"
# prompt_button: "Enter Shop" prompt_button: "أدخل متجر"
# recovered: "Previous gems purchase recovered. Please refresh the page." recovered: "الأحجار الكريمة السابقة أون استردادها. يرجى تحديث الصفحة."
# price: "x3500 / mo" # price: "x3500 / mo"
# subscribe: # subscribe:
@ -477,11 +477,11 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# using_prepaid: "Using prepaid code for monthly subscription" # using_prepaid: "Using prepaid code for monthly subscription"
choose_hero: choose_hero:
# choose_hero: "Choose Your Hero" choose_hero: "اختر بطلك"
# programming_language: "Programming Language" programming_language: "لغة البرمجة"
# programming_language_description: "Which programming language do you want to use?" # programming_language_description: "Which programming language do you want to use?"
# default: "Default" # default: "Default"
# experimental: "Experimental" experimental: "تجريبي"
python_blurb: "بسيطة لكنها قوية، بيثون هي لغة برمجة عظيمة للأغراض العامة." python_blurb: "بسيطة لكنها قوية، بيثون هي لغة برمجة عظيمة للأغراض العامة."
javascript_blurb: "لغة الويب. عظيم للكتابة المواقع، تطبيقات الويب، ألعاب HTML5، والخوادم." javascript_blurb: "لغة الويب. عظيم للكتابة المواقع، تطبيقات الويب، ألعاب HTML5، والخوادم."
coffeescript_blurb: "Nicer JavaScript syntax." coffeescript_blurb: "Nicer JavaScript syntax."
@ -495,13 +495,13 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic" # weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
# weapons_wizard: "Wands, Staffs - Long Range, Magic" # weapons_wizard: "Wands, Staffs - Long Range, Magic"
# attack: "Damage" # Can also translate as "Attack" # attack: "Damage" # Can also translate as "Attack"
# health: "Health" health: "الصحة"
# speed: "Speed" speed: "سرعة"
# regeneration: "Regeneration" regeneration: "تجديد"
# range: "Range" # As in "attack or visual range" # range: "Range" # As in "attack or visual range"
# blocks: "Blocks" # As in "this shield blocks this much damage" # blocks: "Blocks" # As in "this shield blocks this much damage"
# backstab: "Backstab" # As in "this dagger does this much backstab damage" # backstab: "Backstab" # As in "this dagger does this much backstab damage"
# skills: "Skills" skills: "المهارات"
# attack_1: "Deals" # attack_1: "Deals"
# attack_2: "of listed" # attack_2: "of listed"
# attack_3: "weapon damage." # attack_3: "weapon damage."
@ -688,7 +688,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
forum_page: "منتدانا" forum_page: "منتدانا"
forum_suffix: "بدلا من ذلك." forum_suffix: "بدلا من ذلك."
# faq_prefix: "There's also a" # faq_prefix: "There's also a"
# faq: "FAQ" faq: "FAQ"
# subscribe_prefix: "If you need help figuring out a level, please" # subscribe_prefix: "If you need help figuring out a level, please"
# subscribe: "buy a CodeCombat subscription" # subscribe: "buy a CodeCombat subscription"
# subscribe_suffix: "and we'll be happy to help you with your code." # subscribe_suffix: "and we'll be happy to help you with your code."
@ -699,26 +699,26 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
contact_candidate: "الاتصال المرشح" # Deprecated 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 # 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
# account_settings: account_settings:
# title: "Account Settings" title: "إعدادات الحساب"
# not_logged_in: "Log in or create an account to change your settings." not_logged_in: "تسجيل الدخول أو إنشاء حساب لتغيير الإعدادات الخاصة بك."
# autosave: "Changes Save Automatically" autosave: "تغييرات حفظ تلقائيا"
# me_tab: "Me" me_tab: "أنا"
# picture_tab: "Picture" picture_tab: "صورة"
# delete_account_tab: "Delete Your Account" delete_account_tab: "حذف حسابك الخاص"
# wrong_email: "Wrong Email" wrong_email: "Email خاطئ"
# wrong_password: "Wrong Password" wrong_password: "كلمة مرور خاطئة"
# upload_picture: "Upload a picture" # upload_picture: "Upload a picture"
# delete_this_account: "Delete this account permanently" delete_this_account: "حذف هذا الحساب بشكل دائم"
# god_mode: "God Mode" # god_mode: "God Mode"
# password_tab: "Password" # password_tab: "Password"
# emails_tab: "Emails" # emails_tab: "Emails"
# admin: "Admin" # admin: "Admin"
# new_password: "New Password" new_password: "كلمة سر جديدة"
# new_password_verify: "Verify" new_password_verify: "تحقق من"
# type_in_email: "Type in your email to confirm account deletion." type_in_email: "اكتب في البريد الإلكتروني الخاص بك لتأكيد الحساب الحذف."
# type_in_password: "Also, type in your password." type_in_password: "أيضا، اكتب كلمة المرور الخاصة بك."
# email_subscriptions: "Email Subscriptions" email_subscriptions: "الاشتراكات البريد الإلكتروني"
# email_subscriptions_none: "No Email Subscriptions." # email_subscriptions_none: "No Email Subscriptions."
# email_announcements: "Announcements" # email_announcements: "Announcements"
# email_announcements_description: "Get emails on the latest news and developments at CodeCombat." # email_announcements_description: "Get emails on the latest news and developments at CodeCombat."

View file

@ -70,7 +70,6 @@
choose_inventory: "Equip Items" choose_inventory: "Equip Items"
buy_gems: "Buy Gems" buy_gems: "Buy Gems"
subscription_required: "Subscription Required" subscription_required: "Subscription Required"
older_campaigns: "Older Campaigns"
anonymous: "Anonymous Player" anonymous: "Anonymous Player"
level_difficulty: "Difficulty: " level_difficulty: "Difficulty: "
campaign_beginner: "Beginner Campaign" campaign_beginner: "Beginner Campaign"
@ -78,20 +77,8 @@
awaiting_levels_adventurer: "Sign up as an Adventurer" awaiting_levels_adventurer: "Sign up as an Adventurer"
awaiting_levels_adventurer_suffix: "to be the first to play new levels." awaiting_levels_adventurer_suffix: "to be the first to play new levels."
adjust_volume: "Adjust volume" adjust_volume: "Adjust volume"
choose_your_level: "Choose Your Level" # The rest of this section is the old play view at /play-old and isn't very important.
adventurer_prefix: "You can jump to any level below, or discuss the levels on "
adventurer_forum: "the Adventurer forum"
adventurer_suffix: "."
campaign_old_beginner: "Old Beginner Campaign"
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" campaign_multiplayer: "Multiplayer Arenas"
campaign_multiplayer_description: "... in which you code head-to-head against other players." campaign_multiplayer_description: "... in which you code head-to-head against other players."
campaign_player_created: "Player-Created"
campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute/artisan\">Artisan Wizards</a>."
campaign_classic_algorithms: "Classic Algorithms"
campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."

View file

@ -92,7 +92,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
campaign_player_created_description: "... dans lesquels vous serez confronté à la créativité des vôtres.<a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... dans lesquels vous serez confronté à la créativité des vôtres.<a href=\"/contribute#artisan\">Artisan Wizards</a>."
campaign_classic_algorithms: "Algorithmes classiques" campaign_classic_algorithms: "Algorithmes classiques"
campaign_classic_algorithms_description: "... dans lesquels vous apprendrez les algorithmes les plus populaires dans l'informatique." campaign_classic_algorithms_description: "... dans lesquels vous apprendrez les algorithmes les plus populaires dans l'informatique."
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" campaign_old_multiplayer: "(Obsolète) Ancienne arènes multijoueurs"
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." # campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
share_progress_modal: share_progress_modal:
@ -617,7 +617,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
monitor_progress_2: "pour votre classe" monitor_progress_2: "pour votre classe"
monitor_progress_3: "Pour ajouter un étudiant, envoyer leur le lien contenant une invitation pour votre Clan" monitor_progress_3: "Pour ajouter un étudiant, envoyer leur le lien contenant une invitation pour votre Clan"
monitor_progress_4: "page." monitor_progress_4: "page."
monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page." monitor_progress_5: "Après leur adhésion, vous verrez un résumé des progrès de l'élève sur la page de votre clan."
private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student." private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
private_clans_2: "Pour créer un Clan privé, veuillez vous référer à la boîte à cocher 'Faire un clan privé' pendant la création du" private_clans_2: "Pour créer un Clan privé, veuillez vous référer à la boîte à cocher 'Faire un clan privé' pendant la création du"
private_clans_3: "." private_clans_3: "."
@ -643,7 +643,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
sys_requirements_1: "Un navigateur moderne. La dernière version de Chrome, Firefox, ou de Safari. Internet Explorer 9 ou plus récent." sys_requirements_1: "Un navigateur moderne. La dernière version de Chrome, Firefox, ou de Safari. Internet Explorer 9 ou plus récent."
sys_requirements_2: "CodeCombat n'est pas encore supporté sur iPad." sys_requirements_2: "CodeCombat n'est pas encore supporté sur iPad."
# teachers_survey: teachers_survey:
# title: "Teacher Survey" # title: "Teacher Survey"
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above." # must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
# retrieving: "Retrieving information..." # retrieving: "Retrieving information..."
@ -660,9 +660,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
# description_2: "teachers" # description_2: "teachers"
# description_3: "page." # description_3: "page."
# description_4: "Please fill out this quick survey and well email you setup instructions." # description_4: "Please fill out this quick survey and well email you setup instructions."
# email: "Email Address" email: "Adresse email"
# school: "Name of School" school: "Nom de l'école"
# location: "Name of City" location: "Nom de la ville"
# age_students: "How old are your students?" # age_students: "How old are your students?"
# under: "Under" # under: "Under"
# other: "Other:" # other: "Other:"
@ -707,7 +707,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
picture_tab: "Photos" picture_tab: "Photos"
delete_account_tab: "Supprimer votre compte" delete_account_tab: "Supprimer votre compte"
wrong_email: "Mauvaise adresse e-mail" wrong_email: "Mauvaise adresse e-mail"
# wrong_password: "Wrong Password" wrong_password: "Mauvais mot de passe"
upload_picture: "Télécharger une image" upload_picture: "Télécharger une image"
delete_this_account: "Supprimer votre compte définitivement" delete_this_account: "Supprimer votre compte définitivement"
god_mode: "Puissance Divine" god_mode: "Puissance Divine"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
keyboard_shortcuts: "Raccourcis Clavier" keyboard_shortcuts: "Raccourcis Clavier"
space: "Espace" space: "Espace"
enter: "Entrer" enter: "Entrer"
# press_enter: "press enter" press_enter: "Appuyez sur entrée"
escape: "Echap" escape: "Echap"
shift: "Shift" shift: "Shift"
run_code: "Exécuter le code actuel." run_code: "Exécuter le code actuel."
@ -791,7 +791,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
make_private: "Rendre le clan privé" make_private: "Rendre le clan privé"
subs_only: "Abonnés seulement" subs_only: "Abonnés seulement"
create_clan: "Créer un nouveau clan" create_clan: "Créer un nouveau clan"
# private_preview: "Preview" private_preview: "Aperçu"
public_clans: "Clans publiques" public_clans: "Clans publiques"
my_clans: "Mes clans" my_clans: "Mes clans"
clan_name: "Nom du clan" clan_name: "Nom du clan"
@ -1198,7 +1198,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
concepts: concepts:
advanced_strings: "Chaînes de caractères avancés" advanced_strings: "Chaînes de caractères avancés"
algorithms: "Algorithmes" algorithms: "Algorithmes"
# arguments: "Arguments" arguments: "Paramètres"
arithmetic: "Arithmétique" arithmetic: "Arithmétique"
arrays: "Tableaux" arrays: "Tableaux"
basic_syntax: "Syntaxe basique" basic_syntax: "Syntaxe basique"
@ -1215,7 +1215,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
variables: "Variables" variables: "Variables"
vectors: "Vecteurs" vectors: "Vecteurs"
while_loops: "Boucles Tant que" while_loops: "Boucles Tant que"
# recursion: "Recursion" recursion: "Récursivité"
delta: delta:
added: "Ajouté" added: "Ajouté"

View file

@ -160,7 +160,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
unwatch: "הסר צפיה" unwatch: "הסר צפיה"
submit_patch: ".שלח תיקון" submit_patch: ".שלח תיקון"
submit_changes: "שלח שינויים" submit_changes: "שלח שינויים"
# save_changes: "Save Changes" save_changes: "שמור שינויים"
general: general:
and: "וגם" and: "וגם"
@ -264,9 +264,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
victory_hour_of_code_done_yes: "שלי Hour of Code™! כן, סיימתי עם ה" victory_hour_of_code_done_yes: "שלי Hour of Code™! כן, סיימתי עם ה"
victory_experience_gained: "שנצבר XP" victory_experience_gained: "שנצבר XP"
victory_gems_gained: "אבני חן שנצברו" victory_gems_gained: "אבני חן שנצברו"
# victory_new_item: "New Item" victory_new_item: "חפץ חדש"
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." # victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
# victory_become_a_viking: "Become a Viking" victory_become_a_viking: "הפוך לוויקינג"
guide_title: "מדריך" guide_title: "מדריך"
tome_minion_spells: "הכישופים של המשרתים שלך" # Only in old-style levels. tome_minion_spells: "הכישופים של המשרתים שלך" # Only in old-style levels.
tome_read_only_spells: "כישופים לקריאה בלבד" # Only in old-style levels. tome_read_only_spells: "כישופים לקריאה בלבד" # Only in old-style levels.
@ -294,11 +294,11 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
time_current: ":זמו נוכחי" time_current: ":זמו נוכחי"
time_total: ":שמן מקסימלי" time_total: ":שמן מקסימלי"
time_goto: ":לך ל" time_goto: ":לך ל"
# non_user_code_problem_title: "Unable to Load Level" non_user_code_problem_title: "טעינת שלב נכשלה"
# infinite_loop_title: "Infinite Loop Detected" infinite_loop_title: "לופ אינסופי זוהה"
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." # infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
# check_dev_console: "You can also open the developer console to see what might be going wrong." # check_dev_console: "You can also open the developer console to see what might be going wrong."
# check_dev_console_link: "(instructions)" check_dev_console_link: "(הוראות)"
infinite_loop_try_again: "נסה שוב" infinite_loop_try_again: "נסה שוב"
infinite_loop_reset_level: "התחל שלב מחדש" infinite_loop_reset_level: "התחל שלב מחדש"
infinite_loop_comment_out: ".הפוך את הקוד שלי להערה" infinite_loop_comment_out: ".הפוך את הקוד שלי להערה"
@ -310,7 +310,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
tip_think_solution: ".תחשוב על הפתרון, לא על הבעיה" tip_think_solution: ".תחשוב על הפתרון, לא על הבעיה"
tip_theory_practice: "תיאורטית, אין הבדל בין התאוריה לאימון. אבל באימון, יש. - יוגי ברה" tip_theory_practice: "תיאורטית, אין הבדל בין התאוריה לאימון. אבל באימון, יש. - יוגי ברה"
tip_error_free: "יש שתי דרכים לכתוב תוכנות בלי אף תקלה; רק השלישית עובדת. - אלן פרליס" tip_error_free: "יש שתי דרכים לכתוב תוכנות בלי אף תקלה; רק השלישית עובדת. - אלן פרליס"
# 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_debugging_program: "אם ניפוי הוא התהליך של הסרת באגים, אז תכנות חייב להיות התהליך של לשים אותם -. אדגר ו. דיקסטרא"
tip_forums: "!לך לפורומים וספר לנו מה אתה חושב" tip_forums: "!לך לפורומים וספר לנו מה אתה חושב"
tip_baby_coders: ".בעתיד, אפילו תינוקות יהיו כשפי על" tip_baby_coders: ".בעתיד, אפילו תינוקות יהיו כשפי על"
tip_morale_improves: ".הטעינה תמשיך עד שהמורל ישתפר" tip_morale_improves: ".הטעינה תמשיך עד שהמורל ישתפר"
@ -320,13 +320,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
tip_great_responsibility: "עם כישרון גדול בתכנות באה גם אחריות דיבאגינג גדולה." tip_great_responsibility: "עם כישרון גדול בתכנות באה גם אחריות דיבאגינג גדולה."
tip_munchkin: "אם לא תאכל את הירקות, מאצ'קין יבוא אליך בלילה כשאתה ישן." tip_munchkin: "אם לא תאכל את הירקות, מאצ'קין יבוא אליך בלילה כשאתה ישן."
tip_binary: "יש רק 10 אנשים בעולם: כאלה שמבינים בינארית וכאלה שלא." tip_binary: "יש רק 10 אנשים בעולם: כאלה שמבינים בינארית וכאלה שלא."
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" tip_commitment_yoda: "מתכנת חייב להיות עם המחויבות העמוקה ביותר, עם המחשבה הרצינית ביותר. ~ יודה"
tip_no_try: "תעשה. או אל תעשה. אין לנסות - יודה" tip_no_try: "תעשה. או אל תעשה. אין לנסות - יודה"
tip_patience: "עליך להיות סבלני, פאדאוואן צעיר - יודה" tip_patience: "עליך להיות סבלני, פאדאוואן צעיר - יודה"
# tip_documented_bug: "A documented bug is not a bug; it is a feature." tip_documented_bug: "באג מתועד הוא לא באג; הוא בונוס שבא עם התוכנה." #My personal translation
tip_impossible: "זה תמיד נראה בלתי אפשרי עד שזה נעשה. - נלסון מנדלה" tip_impossible: "זה תמיד נראה בלתי אפשרי עד שזה נעשה. - נלסון מנדלה"
tip_talk_is_cheap: "דיבור זה זול. תראה לי את הקוד - לינוס טורבאלדס" tip_talk_is_cheap: "דיבור זה זול. תראה לי את הקוד - לינוס טורבאלדס"
# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" tip_first_language: "הדבר ההרסני ביותר שאי פעם תלמד הוא שפת התכנות הראשונה שלך. - אלן קיי"
tip_hardware_problem: "ש: כמה מתכנתים צריך כדי להחליף נורה? ת: אפס, זו בכלל בעיה בחומרה." 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_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: "Premature optimization is the root of all evil. - Donald Knuth"
@ -415,7 +415,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
feature4: "!בחינם כל חודש <strong>3500 אבני חן</strong>" feature4: "!בחינם כל חודש <strong>3500 אבני חן</strong>"
feature5: "הדרכות וידאו" feature5: "הדרכות וידאו"
feature6: "תמיכת מייל בעדיפות ראשונה" feature6: "תמיכת מייל בעדיפות ראשונה"
# feature7: "Private <strong>Clans</strong>" feature7: "פרטיים <strong>שבטים</strong>"
free: "חינם" free: "חינם"
month: "חודש" month: "חודש"
subscribe_title: "רכוש מנוי" subscribe_title: "רכוש מנוי"
@ -508,8 +508,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# health_1: "Gains" # health_1: "Gains"
# health_2: "of listed" # health_2: "of listed"
# health_3: "armor health." # health_3: "armor health."
# speed_1: "Moves at" speed_1: "זז במהירות של"
# speed_2: "meters per second." speed_2: "מטרים לשנייה."
available_for_purchase: "ניתן לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store available_for_purchase: "ניתן לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store
level_to_unlock: ":שלב כדי לפתוח" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) level_to_unlock: ":שלב כדי לפתוח" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
restricted_to_certain_heroes: ".רק גיבורים מסויימים יכולים לשחק בשלב זה" restricted_to_certain_heroes: ".רק גיבורים מסויימים יכולים לשחק בשלב זה"
@ -525,7 +525,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
action_radius: "רדיוס" action_radius: "רדיוס"
action_duration: "משך זמן" action_duration: "משך זמן"
example: "דוגמה" example: "דוגמה"
ex: "למשל" # Abbreviation of "example" ex: "כגון" # Abbreviation of "example"
current_value: "ערך נוכחי" current_value: "ערך נוכחי"
default_value: "ערך רגיל" default_value: "ערך רגיל"
parameters: "פרמטרים" parameters: "פרמטרים"
@ -679,7 +679,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
cla_url: "CLA" cla_url: "CLA"
cla_suffix: "." cla_suffix: "."
cla_agree: "אני מסכים" cla_agree: "אני מסכים"
# owner_approve: "An owner will need to approve it before your changes will become visible." owner_approve: "אישור בעלים יתבקשת לפני שהשינויים יחולו."
contact: contact:
contact_us: "צור קשר" contact_us: "צור קשר"
@ -697,7 +697,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
where_reply: "?איפה אנחנו אמורים להגיב" where_reply: "?איפה אנחנו אמורים להגיב"
send: "שלח מייל" send: "שלח מייל"
contact_candidate: "צור קשר עם נציג" # Deprecated 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 recruitment_reminder: "השתמש בטופס זה כדי להגיע למועמדים שאתה מעוניין לראיין. זכור כי CodeCombat גובה 15% מהשכר בשנה הראשונה.התשלום מתבצע בעת שכירת העובדים ויוחזר במשך 90 ימים אם העובד לא יישאר מועסק. משרה חלקית, עובדים מרוחקים, עובדי חוזה הם חינם, כמו גם מתמחה." # Deprecated
account_settings: account_settings:
title: "הגדרות חשבון" title: "הגדרות חשבון"
@ -707,7 +707,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
picture_tab: "תמונה" picture_tab: "תמונה"
delete_account_tab: "מחק את חשבונך" delete_account_tab: "מחק את חשבונך"
wrong_email: "כתובת מייל שגויה." wrong_email: "כתובת מייל שגויה."
# wrong_password: "Wrong Password" wrong_password: "סיסמא שגוייה"
upload_picture: "העלה תמונה" upload_picture: "העלה תמונה"
delete_this_account: "מחק את חשבון זה לתמיד" delete_this_account: "מחק את חשבון זה לתמיד"
god_mode: "מצב אל" god_mode: "מצב אל"
@ -717,7 +717,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
new_password: "סיסמה חדשה" new_password: "סיסמה חדשה"
new_password_verify: "חזור על הסיסמה שנית" new_password_verify: "חזור על הסיסמה שנית"
type_in_email: "הזן את כתובת המייל שלך על מנת לבצע את המחיקה" # {change} type_in_email: "הזן את כתובת המייל שלך על מנת לבצע את המחיקה" # {change}
# type_in_password: "Also, type in your password." type_in_password: "גםת הזן את סיסמתך."
email_subscriptions: "הרשמויות אימייל" email_subscriptions: "הרשמויות אימייל"
email_subscriptions_none: ".אין מנויי מייל" email_subscriptions_none: ".אין מנויי מייל"
email_announcements: "הודעות" email_announcements: "הודעות"
@ -739,8 +739,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
password_mismatch: "סיסמאות לא זהות" password_mismatch: "סיסמאות לא זהות"
password_repeat: ".אנא חזור על הסיסמא" password_repeat: ".אנא חזור על הסיסמא"
job_profile: "פרופיל עבודה" # Rest of this section (the job profile stuff and wizard stuff) is deprecated 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_approved: "פרופיל העבודה שלך אושר על ידי CodeCombat. מעסיקים יוכלו לראות את הפרופיל עד שאתה או מסמן אותו כ 'לא פעיל' או אם הוא לא השתנה במשך ארבעה שבועות."
# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." job_profile_explanation: "היי! מלא את זה, ואנו ניצור איתך קשר על מציאת עבודה כמפתח תוכנה."
sample_profile: "פרופיל לדוגמה" sample_profile: "פרופיל לדוגמה"
view_profile: "צפה בפרופיל שלך" view_profile: "צפה בפרופיל שלך"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
keyboard_shortcuts: "קיצורי מקשים" keyboard_shortcuts: "קיצורי מקשים"
space: "Space" space: "Space"
enter: "Enter" enter: "Enter"
# press_enter: "press enter" press_enter: "לחץ enter"
escape: "Escape" escape: "Escape"
shift: "Shift" shift: "Shift"
run_code: ".הרץ קוד נוכחי" run_code: ".הרץ קוד נוכחי"
@ -783,49 +783,49 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
social_hipchat: "CodeCombat הציבורי של HipChat room שוחח בצ'אט איתנו ב" social_hipchat: "CodeCombat הציבורי של HipChat room שוחח בצ'אט איתנו ב"
contribute_to_the_project: "תרום לפרוייקט" contribute_to_the_project: "תרום לפרוייקט"
# clans: clans:
# clan: "Clan" clan: "שבט" #NOTE: "clans" translation in hebrew (חמולה) sounds rude and has a lot of negative meanings associated to it. use of the word "tribe" ("שבט") is preferred.
# clans: "Clans" clans: "שבטים"
# new_name: "New clan name" new_name: "שם שבט חדש"
# new_description: "New clan description" new_description: "תיאור שבט חדש"
# make_private: "Make clan private" make_private: "הפוך שבט לפרטי"
# subs_only: "subscribers only" subs_only: "מנויים בלבד"
# create_clan: "Create New Clan" create_clan: "צור שבט חדש"
# private_preview: "Preview" private_preview: "צפה" #"Preview" translted as "watch"
# public_clans: "Public Clans" public_clans: "שבטים פתוחים" #"public clans" translation sounds unnatural when translated literally "open clans" is a preferred translation
# my_clans: "My Clans" my_clans: "השבטים שלי"
# clan_name: "Clan Name" clan_name: "שם השבט"
# name: "Name" name: "שם"
# chieftain: "Chieftain" chieftain: "צ'יף(מנהיג)"
# type: "Type" type: "סוג"
# edit_clan_name: "Edit Clan Name" edit_clan_name: "ערוך את שם השבט"
# edit_clan_description: "Edit Clan Description" edit_clan_description: "ערוך את תיאור השבט"
# edit_name: "edit name" edit_name: "ערוך שם"
# edit_description: "edit description" edit_description: "ערוך תיאור"
# private: "(private)" private: "(פרטי)"
# summary: "Summary" summary: "תקציר"
# average_level: "Average Level" average_level: "רמה ממוצעת"
# average_achievements: "Average Achievements" average_achievements: "מס' הישגם ממוצע"
# delete_clan: "Delete Clan" delete_clan: "מחק שבט"
# leave_clan: "Leave Clan" leave_clan: "עזוב שבט"
# join_clan: "Join Clan" join_clan: "הצטרף לשבט"
# invite_1: "Invite:" invite_1: "הזמן:"
# invite_2: "*Invite players to this Clan by sending them this link." invite_2: "*הזמן שחקנים לשבט באמצעות שליחת הקישור הזה."
# members: "Members" members: "חברים"
# progress: "Progress" progress: "התקדמות"
# not_started_1: "not started" not_started_1: "לא הותחל"
# started_1: "started" started_1: "הותחל"
# complete_1: "complete" complete_1: "סויים"
# exp_levels: "Expand levels" exp_levels: "הרחב שלבים"
# rem_hero: "Remove Hero" rem_hero: "הסר גיבור"
# status: "Status" status: "סטטוס"
# complete_2: "Complete" complete_2: "סויים"
# started_2: "Started" started_2: "הותחל"
# not_started_2: "Not Started" not_started_2: "לא הותחל"
# view_solution: "Click to view solution." view_solution: "לחץ כדי לראות פתרונות."
# latest_achievement: "Latest Achievement" latest_achievement: "הישגים עדכניים"
# playtime: "Playtime" playtime: "זמן משחק"
# last_played: "Last played" last_played: "שיחק לאחרונה"
classes: classes:
archmage_title: "כשף על" archmage_title: "כשף על"
@ -884,7 +884,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
level_tab_thangs_all: "הכל" level_tab_thangs_all: "הכל"
level_tab_thangs_conditions: "תנאים התחלתיים" level_tab_thangs_conditions: "תנאים התחלתיים"
level_tab_thangs_add: "הוסף ת'אנגס" level_tab_thangs_add: "הוסף ת'אנגס"
# level_tab_thangs_search: "Search thangs" level_tab_thangs_search: "חפש ת'אנגס"
add_components: "הוסף מרכיבים" add_components: "הוסף מרכיבים"
component_configs: "קבע תצורת מרכיבים" component_configs: "קבע תצורת מרכיבים"
config_thang: "לחץ פעמיים כדי לשנות ת'אנג" config_thang: "לחץ פעמיים כדי לשנות ת'אנג"
@ -1078,7 +1078,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
no_achievements: ".עדיין לא השגת אף הישג" no_achievements: ".עדיין לא השגת אף הישג"
favorite_prefix: " שפה מועדפת היא" favorite_prefix: " שפה מועדפת היא"
favorite_postfix: "." favorite_postfix: "."
# not_member_of_clans: "Not a member of any clans yet." not_member_of_clans: "לא חבר באף שבט."
achievements: achievements:
last_earned: "Last Earned" last_earned: "Last Earned"

View file

@ -175,7 +175,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
submitter: "Autore" submitter: "Autore"
submitted: "Data creazione" submitted: "Data creazione"
commit_msg: "Messaggio di commit" commit_msg: "Messaggio di commit"
# review: "Review" review: "Revisiona"
version_history: "Cronologia versioni" version_history: "Cronologia versioni"
version_history_for: "Cronologia versioni per: " version_history_for: "Cronologia versioni per: "
select_changes: "Scegli due versioni per vedere la differenza." select_changes: "Scegli due versioni per vedere la differenza."
@ -193,10 +193,10 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
password: "Password" password: "Password"
message: "Messaggio" message: "Messaggio"
code: "Codice" code: "Codice"
# ladder: "Ladder" ladder: "Scala"
when: "Quando" when: "Quando"
opponent: "Avversario" opponent: "Avversario"
# rank: "Rank" rank: "Classifica"
score: "Punteggio" score: "Punteggio"
win: "Vittoria" win: "Vittoria"
loss: "Sconfitta" loss: "Sconfitta"
@ -265,7 +265,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
victory_experience_gained: "Punti XP guadagnati" victory_experience_gained: "Punti XP guadagnati"
victory_gems_gained: "Gemme guadagnate" victory_gems_gained: "Gemme guadagnate"
victory_new_item: "Nuovo oggetto" victory_new_item: "Nuovo oggetto"
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." victory_viking_code_school: "Fumi sacri, era un livello duro quello che hai passato! Se non sei già uno sviluppatore, dovresti esserlo. Sei appena stato raccomandato per entrare nella Viking Code School, dove potrai raggiungere il prossimo livello di conoscenza e diventare uno sviluppatore web professionale in 14 settimane."
victory_become_a_viking: "Diventa un Vichingo" victory_become_a_viking: "Diventa un Vichingo"
guide_title: "Guida" guide_title: "Guida"
tome_minion_spells: "Incantesimi dei tuoi seguaci" # Only in old-style levels. tome_minion_spells: "Incantesimi dei tuoi seguaci" # Only in old-style levels.
@ -296,14 +296,14 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
time_goto: "Vai a:" time_goto: "Vai a:"
non_user_code_problem_title: "Impossibile caricare livello" non_user_code_problem_title: "Impossibile caricare livello"
infinite_loop_title: "Ciclo infinito rilevato" infinite_loop_title: "Ciclo infinito rilevato"
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." infinite_loop_description: "Il programma iniziale per costruire il mondo non ha mai finito di girare. O è molto lento o è in un ciclo infinito. O ci potrebbe essere un bug. Puoi provare a lasciarlo girare o farlo ripartire. Se non funziona, per favore avvertici."
check_dev_console: "Puoi anche aprire la console sviluppatore per vedere cosa potrebbe non funzionare." check_dev_console: "Puoi anche aprire la console sviluppatore per vedere cosa potrebbe non funzionare."
check_dev_console_link: "(istruzioni)" check_dev_console_link: "(istruzioni)"
infinite_loop_try_again: "Riprova" infinite_loop_try_again: "Riprova"
infinite_loop_reset_level: "Riavvia livello" infinite_loop_reset_level: "Riavvia livello"
infinite_loop_comment_out: "Commenta il codice" infinite_loop_comment_out: "Commenta il codice"
tip_toggle_play: "Scambia play/pausa con Ctrl+P." tip_toggle_play: "Scambia play/pausa con Ctrl+P."
# tip_scrub_shortcut: "Use Ctrl+[ and Ctrl+] to rewind and fast-forward." tip_scrub_shortcut: "Usa Ctrl+[ e Ctrl+] per tornare indietro o avanzare rapidamente."
tip_guide_exists: "Clicca sulla Guida, nel menù di gioco (in alto nella pagina), per informazioni utili." tip_guide_exists: "Clicca sulla Guida, nel menù di gioco (in alto nella pagina), per informazioni utili."
tip_open_source: "CodeCombat è 100% open source!" tip_open_source: "CodeCombat è 100% open source!"
tip_beta_launch: "CodeCombat è stato lanciato in beta nell'ottobre 2013." tip_beta_launch: "CodeCombat è stato lanciato in beta nell'ottobre 2013."

View file

@ -1,17 +1,17 @@
module.exports = nativeDescription: "polski", englishDescription: "Polish", translation: module.exports = nativeDescription: "polski", englishDescription: "Polish", translation:
home: home:
slogan: "Naucz się programowania grając" slogan: "Naucz się programowania grając"
no_ie: "CodeCombat nie działa na Internet Explorer 8 lub starszym. Przepraszamy!" # Warning that only shows up in IE8 and older no_ie: "CodeCombat nie działa na Internet Explorer 8 i starszych. Przepraszamy!" # Warning that only shows up in IE8 and older
no_mobile: "CodeCombat nie został zaprojektowany dla urządzeń przenośnych więc może nie działać!" # Warning that shows up on mobile devices no_mobile: "CodeCombat nie został zaprojektowany dla urządzeń przenośnych, więc mogą występować pewne problemy w jego działaniu!" # Warning that shows up on mobile devices
play: "Graj" # The big play button that opens up the campaign view. play: "Graj" # The big play button that opens up the campaign view.
old_browser: "Wygląda na to, że twoja przeglądarka jest zbyt stara, by obsłużyć CodeCombat. Wybacz!" # Warning that shows up on really old Firefox/Chrome/Safari old_browser: "Wygląda na to, że twoja przeglądarka jest zbyt stara, by obsłużyć CodeCombat. Wybacz!" # Warning that shows up on really old Firefox/Chrome/Safari
old_browser_suffix: "Możesz spróbowac mimo tego, ale prawdopodobnie gra nie będzie działać." old_browser_suffix: "Mimo tego możesz spróbowac, ale prawdopodobnie gra nie będzie działać."
# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval." ipad_browser: "Zła wiadomość: CodeCombat nie działa na przeglądarce w iPadzie. Dobra wiadomość: nasza aplikacja na iPada czeka na akceptację od Apple."
campaign: "Kampania" campaign: "Kampania"
for_beginners: "Dla początkujących" for_beginners: "Dla początkujących"
# multiplayer: "Multiplayer" # Not currently shown on home page multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Dla developerów" # Not currently shown on home page. for_developers: "Dla developerów" # Not currently shown on home page.
# or_ipad: "Or download for iPad" or_ipad: "Albo ściągnij na swojego iPada"
nav: nav:
play: "Poziomy" # The top nav bar entry where players choose which levels to play play: "Poziomy" # The top nav bar entry where players choose which levels to play
@ -52,14 +52,14 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
spectate: "Oglądaj" # Ladder page spectate: "Oglądaj" # Ladder page
players: "graczy" # Hover over a level on /play players: "graczy" # Hover over a level on /play
hours_played: "rozegranych godzin" # Hover over a level on /play hours_played: "rozegranych godzin" # Hover over a level on /play
# items: "Items" # Tooltip on item shop button from /play items: "Przedmioty" # Tooltip on item shop button from /play
unlock: "Odblokuj" # For purchasing items and heroes unlock: "Odblokuj" # For purchasing items and heroes
confirm: "Potwierdź" confirm: "Potwierdź"
# owned: "Owned" # For items you own owned: "Posiadane" # For items you own
locked: "Zablokowane" locked: "Zablokowane"
# purchasable: "Purchasable" # For a hero you unlocked but haven't purchased purchasable: "Można kupić" # For a hero you unlocked but haven't purchased
available: "Dostępny" available: "Dostępny"
# skills_granted: "Skills Granted" # Property documentation details skills_granted: "Zdobyte umiejętności" # Property documentation details
heroes: "Bohaterowie" # Tooltip on hero shop button from /play heroes: "Bohaterowie" # Tooltip on hero shop button from /play
achievements: "Osiągnięcia" # Tooltip on achievement list button from /play achievements: "Osiągnięcia" # Tooltip on achievement list button from /play
account: "Konto" # Tooltip on account button from /play account: "Konto" # Tooltip on account button from /play
@ -67,27 +67,27 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
poll: "Ankieta" # Tooltip on poll button from /play poll: "Ankieta" # Tooltip on poll button from /play
next: "Dalej" # Go from choose hero to choose inventory before playing a level next: "Dalej" # Go from choose hero to choose inventory before playing a level
change_hero: "Wybierz bohatera" # Go back from choose inventory to choose hero change_hero: "Wybierz bohatera" # Go back from choose inventory to choose hero
# choose_inventory: "Equip Items" choose_inventory: "Załóż przedmioty"
buy_gems: "Kup klejnoty" buy_gems: "Kup klejnoty"
# subscription_required: "Subscription Required" subscription_required: "Wymagana subskrypcja"
older_campaigns: "Starsze kampanie" older_campaigns: "Starsze kampanie"
anonymous: "Anonimowy gracz" anonymous: "Anonimowy gracz"
level_difficulty: "Poziom trudności: " level_difficulty: "Poziom trudności: "
campaign_beginner: "Kampania dla początkujących" campaign_beginner: "Kampania dla początkujących"
awaiting_levels_adventurer_prefix: "Wydajemy pięć poziomów na tydzień." # {change} awaiting_levels_adventurer_prefix: "Wydajemy pięć poziomów na tydzień." # {change}
awaiting_levels_adventurer: "Zapisz się jako Podróżnik" awaiting_levels_adventurer: "Zapisz się jako Podróżnik,"
awaiting_levels_adventurer_suffix: "aby jako pierwszy grać nowe poziomy." awaiting_levels_adventurer_suffix: "aby jako pierwszy grać w nowe poziomy."
adjust_volume: "Dopasuj głośność" adjust_volume: "Dopasuj głośność"
choose_your_level: "Wybierz poziom" # The rest of this section is the old play view at /play-old and isn't very important. choose_your_level: "Wybierz poziom" # The rest of this section is the old play view at /play-old and isn't very important.
adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów lub omówić poziom na " adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów lub omówić poziom na "
adventurer_forum: "forum Podróżników" adventurer_forum: "forum Podróżników"
adventurer_suffix: "." adventurer_suffix: "."
# campaign_old_beginner: "Old Beginner Campaign" campaign_old_beginner: "Stara kampania nowicjusza"
campaign_old_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: "Losowe trudniejsze poziomy"
campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego." campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego."
campaign_multiplayer: "Pola walki dla wielu graczy" campaign_multiplayer: "Kampania dla wielu graczy"
campaign_multiplayer_description: "... w których konkurujesz z innymi graczami." campaign_multiplayer_description: "... w której konkurujesz z innymi graczami."
campaign_player_created: "Stworzone przez graczy" campaign_player_created: "Stworzone przez graczy"
campaign_player_created_description: "... w których walczysz przeciwko dziełom <a href=\"/contribute#artisan\">Czarodziejów Rzemieślników</a>" campaign_player_created_description: "... w których walczysz przeciwko dziełom <a href=\"/contribute#artisan\">Czarodziejów Rzemieślników</a>"
campaign_classic_algorithms: "Algorytmy klasyczne" campaign_classic_algorithms: "Algorytmy klasyczne"
@ -95,13 +95,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" # campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." # campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
# share_progress_modal: share_progress_modal:
# blurb: "Youre making great progress! Tell your parent how much you've learned with CodeCombat." blurb: "Robisz coraz to większe postępy! Pokaż swoim rodzicom jak wiele nauczyłeś się z CodeCombat."
# email_invalid: "Email address invalid." email_invalid: "Błędny adres e-mail."
# form_blurb: "Enter your parent's email below and well show them!" form_blurb: "Wpisz adres email swich rodziców, a my ich o tym poinformujemy!"
# form_label: "Email Address" form_label: "Adres email"
# placeholder: "email address" placeholder: "adres email"
# title: "Excellent Work, Apprentice" title: "Wspaniała robota, Adepcie"
login: login:
sign_up: "Stwórz konto" sign_up: "Stwórz konto"
@ -109,12 +109,12 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
logging_in: "Logowanie..." logging_in: "Logowanie..."
log_out: "Wyloguj się" log_out: "Wyloguj się"
forgot_password: "Nie pamiętasz hasła?" forgot_password: "Nie pamiętasz hasła?"
# authenticate_gplus: "Authenticate G+" authenticate_gplus: "Autoryzuj G+"
# load_profile: "Load G+ Profile" load_profile: "Wczytaj Profil G+"
# finishing: "Finishing" finishing: "Kończenie"
# sign_in_with_facebook: "Sign in with Facebook" sign_in_with_facebook: "Saloguj się używając Facebooka"
# sign_in_with_gplus: "Sign in with G+" sign_in_with_gplus: "Zaloguj się używając G+"
# signup_switch: "Want to create an account?" signup_switch: "Chcesz stworzyć konto?"
signup: signup:
email_announcements: "Otrzymuj powiadomienia na e-mail" email_announcements: "Otrzymuj powiadomienia na e-mail"
@ -128,7 +128,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
recover: recover:
recover_account_title: "Odzyskaj konto" recover_account_title: "Odzyskaj konto"
send_password: "Wyślij hasło tymczasowe" send_password: "Wyślij hasło tymczasowe"
# recovery_sent: "Recovery email sent." recovery_sent: "Email do dozyskania hasła został wysłany."
items: items:
primary: "Główne" primary: "Główne"
@ -160,7 +160,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
unwatch: "Nie obserwuj" unwatch: "Nie obserwuj"
submit_patch: "Prześlij łatkę" submit_patch: "Prześlij łatkę"
submit_changes: "Prześlij zmiany" submit_changes: "Prześlij zmiany"
# save_changes: "Save Changes" save_changes: "Zapisz zmiany"
general: general:
and: "i" and: "i"
@ -175,7 +175,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
submitter: "Przesyłający" submitter: "Przesyłający"
submitted: "Przesłano" submitted: "Przesłano"
commit_msg: "Wiadomość do commitu" commit_msg: "Wiadomość do commitu"
# review: "Review" review: "Recenzja"
version_history: "Historia wersji" version_history: "Historia wersji"
version_history_for: "Historia wersji dla: " version_history_for: "Historia wersji dla: "
select_changes: "Zaznacz dwie zmiany poniżej aby zobaczyć różnice." select_changes: "Zaznacz dwie zmiany poniżej aby zobaczyć różnice."
@ -183,7 +183,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
undo_shortcut: "(Ctrl+Z)" undo_shortcut: "(Ctrl+Z)"
redo_prefix: "Ponów" redo_prefix: "Ponów"
redo_shortcut: "(Ctrl+Shift+Z)" redo_shortcut: "(Ctrl+Shift+Z)"
# play_preview: "Play preview of current level" play_preview: "Odtwórz podgląd obecnego poziomu"
result: "Wynik" result: "Wynik"
results: "Wyniki" results: "Wyniki"
description: "Opis" description: "Opis"
@ -243,9 +243,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
failing: "Niepowodzenie" failing: "Niepowodzenie"
action_timeline: "Oś czasu" action_timeline: "Oś czasu"
click_to_select: "Kliknij jednostkę, by ją zaznaczyć." click_to_select: "Kliknij jednostkę, by ją zaznaczyć."
# control_bar_multiplayer: "Multiplayer" control_bar_multiplayer: "Multiplayer"
# control_bar_join_game: "Join Game" control_bar_join_game: "Dołącz do gry"
# reload: "Reload" reload: "Wczytaj ponownie"
reload_title: "Przywrócić cały kod?" reload_title: "Przywrócić cały kod?"
reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?" reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?"
reload_confirm: "Przywróć cały kod" reload_confirm: "Przywróć cały kod"
@ -256,24 +256,24 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
victory_sign_up_poke: "Chcesz zapisać swój kod? Stwórz bezpłatne konto!" victory_sign_up_poke: "Chcesz zapisać swój kod? Stwórz bezpłatne konto!"
victory_rate_the_level: "Oceń poziom: " # Only in old-style levels. victory_rate_the_level: "Oceń poziom: " # Only in old-style levels.
victory_return_to_ladder: "Powrót do drabinki" victory_return_to_ladder: "Powrót do drabinki"
victory_play_continue: "Kontynuuj" victory_play_continue: "Dalej"
# victory_saving_progress: "Saving Progress" victory_saving_progress: "Zapisywanie postępów"
victory_go_home: "Powrót do strony głównej" # Only in old-style levels. 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_review: "Powiedz nam coś więcej!" # Only in old-style levels.
victory_hour_of_code_done: "Skończyłeś już?" victory_hour_of_code_done: "Skończyłeś już?"
victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodu." victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodu."
victory_experience_gained: "Doświadczenie zdobyte" victory_experience_gained: "Doświadczenie zdobyte"
victory_gems_gained: "Klejnoty zdobyte" victory_gems_gained: "Klejnoty zdobyte"
# victory_new_item: "New Item" victory_new_item: "Nowy przedmiot"
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." # victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
# victory_become_a_viking: "Become a Viking" victory_become_a_viking: "Zostań wikingiem"
guide_title: "Przewodnik" guide_title: "Przewodnik"
tome_minion_spells: "Czary twojego podopiecznego" # Only in old-style levels. tome_minion_spells: "Czary twojego podopiecznego" # Only in old-style levels.
tome_read_only_spells: "Czary tylko do odczytu" # Only in old-style levels. tome_read_only_spells: "Czary tylko do odczytu" # Only in old-style levels.
tome_other_units: "Inne jednostki" # Only in old-style levels. tome_other_units: "Inne jednostki" # Only in old-style levels.
# tome_cast_button_run: "Run" tome_cast_button_run: "Uruchom"
# tome_cast_button_running: "Running" tome_cast_button_running: "Uruchomiono"
# tome_cast_button_ran: "Ran" tome_cast_button_ran: "Uruchomiono"
tome_submit_button: "Prześlij" tome_submit_button: "Prześlij"
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button. # tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
# tome_select_method: "Select a Method" # tome_select_method: "Select a Method"
@ -283,7 +283,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
tome_your_skills: "Twoje umiejętności" tome_your_skills: "Twoje umiejętności"
tome_help: "Pomoc" tome_help: "Pomoc"
# tome_current_method: "Current Method" # tome_current_method: "Current Method"
# hud_continue_short: "Continue" hud_continue_short: "Kontynuuj"
code_saved: "Kod zapisano" code_saved: "Kod zapisano"
skip_tutorial: "Pomiń (esc)" skip_tutorial: "Pomiń (esc)"
keyboard_shortcuts: "Skróty klawiszowe" keyboard_shortcuts: "Skróty klawiszowe"
@ -294,11 +294,11 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
time_current: "Teraz:" time_current: "Teraz:"
time_total: "Maksymalnie:" time_total: "Maksymalnie:"
time_goto: "Idź do:" time_goto: "Idź do:"
# non_user_code_problem_title: "Unable to Load Level" non_user_code_problem_title: "Błąd podczas ładowania poziomu"
# infinite_loop_title: "Infinite Loop Detected" infinite_loop_title: "Wykryto niekończącą się pętlę"
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." # infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
# check_dev_console: "You can also open the developer console to see what might be going wrong." # check_dev_console: "You can also open the developer console to see what might be going wrong."
# check_dev_console_link: "(instructions)" check_dev_console_link: "(instrukcje)"
infinite_loop_try_again: "Próbuj ponownie" infinite_loop_try_again: "Próbuj ponownie"
infinite_loop_reset_level: "Resetuj poziom" infinite_loop_reset_level: "Resetuj poziom"
infinite_loop_comment_out: "Comment Out My Code" infinite_loop_comment_out: "Comment Out My Code"
@ -355,13 +355,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
save_load_tab: "Zapisz/Wczytaj" save_load_tab: "Zapisz/Wczytaj"
options_tab: "Opcje" options_tab: "Opcje"
guide_tab: "Przewodnik" guide_tab: "Przewodnik"
# guide_video_tutorial: "Video Tutorial" guide_video_tutorial: "Wideo poradnik"
guide_tips: "Wskazówki" guide_tips: "Wskazówki"
multiplayer_tab: "Multiplayer" multiplayer_tab: "Multiplayer"
auth_tab: "Zarejestruj się" auth_tab: "Zarejestruj się"
inventory_caption: "Wyposaż swojego bohatera" inventory_caption: "Wyposaż swojego bohatera"
choose_hero_caption: "Wybierz bohatera, język" choose_hero_caption: "Wybierz bohatera, język"
# save_load_caption: "... and view history" save_load_caption: "... i przejrzyj historię"
options_caption: "Ustaw opcje" options_caption: "Ustaw opcje"
guide_caption: "Dokumenty i wskazówki" guide_caption: "Dokumenty i wskazówki"
multiplayer_caption: "Graj ze znajomymi!" multiplayer_caption: "Graj ze znajomymi!"
@ -369,30 +369,30 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
leaderboard: leaderboard:
leaderboard: "Najlepsze wyniki" leaderboard: "Najlepsze wyniki"
# view_other_solutions: "View Leaderboards" view_other_solutions: "Pokaż tablicę wyników"
scores: "Wyniki" scores: "Wyniki"
# top_players: "Top Players by" top_players: "Najlepsi gracze"
day: "Dziś" day: "Dziś"
# week: "This Week" week: "W tym tygodniu"
# all: "All-Time" all: "Zawsze"
time: "Czas" time: "Czas"
damage_taken: "Obrażenia otrzymane" damage_taken: "Obrażenia otrzymane"
damage_dealt: "Obrażenia zadane" damage_dealt: "Obrażenia zadane"
# difficulty: "Difficulty" difficulty: "Trudność"
gold_collected: "Złoto zebrane" gold_collected: "Złoto zebrane"
inventory: inventory:
# choose_inventory: "Equip Items" choose_inventory: "Załóż przedmioty"
# equipped_item: "Equipped" equipped_item: "Założone"
required_purchase_title: "Wymagane" required_purchase_title: "Wymagane"
available_item: "Dostępne" available_item: "Dostępne"
# restricted_title: "Restricted" restricted_title: "Zabronione"
# should_equip: "(double-click to equip)" should_equip: "(kliknij podwójnie, aby założyć)"
# equipped: "(equipped)" equipped: "(założone)"
locked: "(zablokowane)" locked: "(zablokowane)"
restricted: "(niedostępne na tym poziomie)" restricted: "(zabronione)"
# equip: "Equip" equip: "Załóż"
# unequip: "Unequip" unequip: "Zdejmij"
# buy_gems: # buy_gems:
# few_gems: "A few gems" # few_gems: "A few gems"
@ -407,17 +407,17 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# recovered: "Previous gems purchase recovered. Please refresh the page." # recovered: "Previous gems purchase recovered. Please refresh the page."
# price: "x3500 / mo" # price: "x3500 / mo"
# subscribe: subscribe:
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!" # comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
# feature1: "100+ basic levels across 4 worlds" # feature1: "100+ basic levels across 4 worlds"
# feature2: "10 powerful <strong>new heroes</strong> with unique skills!" # feature2: "10 powerful <strong>new heroes</strong> with unique skills!"
# feature3: "70+ bonus levels" # feature3: "70+ bonus levels"
# feature4: "<strong>3500 bonus gems</strong> every month!" # feature4: "<strong>3500 bonus gems</strong> every month!"
# feature5: "Video tutorials" feature5: "Poradniki wideo"
# feature6: "Premium email support" # feature6: "Premium email support"
# feature7: "Private <strong>Clans</strong>" feature7: "Prywatne <strong>Klany</strong>"
# free: "Free" free: "Za darmo"
# month: "month" month: "miesięcznie"
# subscribe_title: "Subscribe" # subscribe_title: "Subscribe"
# unsubscribe: "Unsubscribe" # unsubscribe: "Unsubscribe"
# confirm_unsubscribe: "Confirm Unsubscribe" # confirm_unsubscribe: "Confirm Unsubscribe"
@ -481,38 +481,38 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
programming_language: "Język programowania" programming_language: "Język programowania"
programming_language_description: "Którego języka programowania chcesz używać?" programming_language_description: "Którego języka programowania chcesz używać?"
default: "domyślny" default: "domyślny"
# experimental: "Experimental" experimental: "Eksperymentalny"
python_blurb: "Prosty ale potężny." python_blurb: "Prosty ale potężny."
javascript_blurb: "Język internetu." javascript_blurb: "Język internetu."
coffeescript_blurb: "Przyjemniejsza składnia JavaScript." coffeescript_blurb: "Przyjemniejsza składnia JavaScript."
clojure_blurb: "Nowoczesny Lisp." clojure_blurb: "Nowoczesny Lisp."
lua_blurb: "Język skryptowy gier." lua_blurb: "Język skryptowy gier."
io_blurb: "Prosty lecz nieznany." io_blurb: "Prosty lecz nieznany."
# status: "Status" status: "Status"
hero_type: "Typ" hero_type: "Typ"
# weapons: "Weapons" weapons: "Bronie"
# weapons_warrior: "Swords - Short Range, No Magic" weapons_warrior: "Miecze - Krótki zasięg, Brak magii"
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic" weapons_ranger: "Kusze, Pistolety - Daleki zasięg, Brak magii"
# weapons_wizard: "Wands, Staffs - Long Range, Magic" weapons_wizard: "Różdżki, Laski - Daleki zasięg, Magia"
# attack: "Damage" # Can also translate as "Attack" attack: "Obrażenia" # Can also translate as "Attack"
# health: "Health" health: "Życie"
speed: "Szybkość" speed: "Szybkość"
# regeneration: "Regeneration" regeneration: "Regenaracja"
range: "Zasięg" # As in "attack or visual range" range: "Zasięg" # As in "attack or visual range"
# blocks: "Blocks" # As in "this shield blocks this much damage" blocks: "Blok" # As in "this shield blocks this much damage"
# backstab: "Backstab" # As in "this dagger does this much backstab damage" # backstab: "Backstab" # As in "this dagger does this much backstab damage"
skills: "Umiejętności" skills: "Umiejętności"
attack_1: "Zadaje" attack_1: "Zadaje"
# attack_2: "of listed" # attack_2: "of listed"
# attack_3: "weapon damage." # attack_3: "weapon damage."
# health_1: "Gains" health_1: "Zdobywa"
# health_2: "of listed" # health_2: "of listed"
# health_3: "armor health." # health_3: "armor health."
# speed_1: "Moves at" speed_1: "Idzie do"
# speed_2: "meters per second." speed_2: "metrów na sekundę."
# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store # available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store
# level_to_unlock: "Level to unlock:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) level_to_unlock: "Musisz odblokować poziom:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
# restricted_to_certain_heroes: "Only certain heroes can play this level." restricted_to_certain_heroes: "Tylko nieliczni bohaterowie mogą brać udział w tym poziomie."
skill_docs: skill_docs:
# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this # writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
@ -528,13 +528,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
ex: "np." # Abbreviation of "example" ex: "np." # Abbreviation of "example"
current_value: "Aktualna wartość" current_value: "Aktualna wartość"
default_value: "Domyślna wartość" default_value: "Domyślna wartość"
# parameters: "Parameters" parameters: "Parametry"
# returns: "Returns" returns: "Zwraca"
# granted_by: "Granted by" granted_by: "Zdobyte dzięki:"
save_load: save_load:
granularity_saved_games: "Zapisano" granularity_saved_games: "Zapisano"
# granularity_change_history: "History" granularity_change_history: "Historia"
options: options:
general_options: "Opcje ogólne" # Check out the Options tab in the Game Menu while playing a level general_options: "Opcje ogólne" # Check out the Options tab in the Game Menu while playing a level
@ -582,12 +582,12 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
michael_title: "Programista" michael_title: "Programista"
# michael_blurb: "Sys Admin" # michael_blurb: "Sys Admin"
matt_title: "Programista" # {change} matt_title: "Programista" # {change}
# matt_blurb: "Bicyclist" matt_blurb: "Rowerzysta"
# cat_title: "Chief Artisan" # cat_title: "Chief Artisan"
# cat_blurb: "Airbender" # cat_blurb: "Airbender"
# josh_title: "Game Designer" # josh_title: "Game Designer"
josh_blurb: "Podłoga to lawa" josh_blurb: "Podłoga to lawa"
# jose_title: "Music" jose_title: "Muzyka"
# jose_blurb: "Taking Off" # jose_blurb: "Taking Off"
# retrostyle_title: "Illustration" # retrostyle_title: "Illustration"
# retrostyle_blurb: "RetroStyle Games" # retrostyle_blurb: "RetroStyle Games"
@ -679,7 +679,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
cla_url: "umowę licencyjną dla współtwórców (CLA)" cla_url: "umowę licencyjną dla współtwórców (CLA)"
cla_suffix: "." cla_suffix: "."
cla_agree: "AKCEPTUJĘ" cla_agree: "AKCEPTUJĘ"
# owner_approve: "An owner will need to approve it before your changes will become visible." owner_approve: "Przed pojawieniem się zmian, właściciel musi je zatwierdzić."
contact: contact:
contact_us: "Kontakt z CodeCombat" contact_us: "Kontakt z CodeCombat"
@ -687,16 +687,16 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
forum_prefix: "W sprawach ogólnych, skorzystaj z " forum_prefix: "W sprawach ogólnych, skorzystaj z "
forum_page: "naszego forum" forum_page: "naszego forum"
forum_suffix: "." forum_suffix: "."
# faq_prefix: "There's also a" faq_prefix: "Jest też"
faq: "FAQ" faq: "FAQ"
# subscribe_prefix: "If you need help figuring out a level, please" # subscribe_prefix: "If you need help figuring out a level, please"
# subscribe: "buy a CodeCombat subscription" # subscribe: "buy a CodeCombat subscription"
# subscribe_suffix: "and we'll be happy to help you with your code." # subscribe_suffix: "and we'll be happy to help you with your code."
# subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support." # subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support."
# screenshot_included: "Screenshot included." # screenshot_included: "Screenshot included."
# where_reply: "Where should we reply?" where_reply: "Gdzie mamy odpisać?"
send: "Wyślij wiadomość" send: "Wyślij wiadomość"
# contact_candidate: "Contact Candidate" # Deprecated contact_candidate: "Kontakt z kandydatem" # 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 # 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
account_settings: account_settings:
@ -707,7 +707,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
picture_tab: "Zdjęcie" picture_tab: "Zdjęcie"
delete_account_tab: "Usuń swoje konto" delete_account_tab: "Usuń swoje konto"
wrong_email: "Błędny e-mail" wrong_email: "Błędny e-mail"
# wrong_password: "Wrong Password" wrong_password: "Błędne zdjęcie"
upload_picture: "Wgraj zdjęcie" upload_picture: "Wgraj zdjęcie"
delete_this_account: "Usuń to konto całkowicie" delete_this_account: "Usuń to konto całkowicie"
# god_mode: "God Mode" # god_mode: "God Mode"
@ -716,8 +716,8 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
admin: "Administrator" admin: "Administrator"
new_password: "Nowe hasło" new_password: "Nowe hasło"
new_password_verify: "Zweryfikuj" new_password_verify: "Zweryfikuj"
# type_in_email: "Type in your email to confirm account deletion." type_in_email: "Wpisz swój email, aby potwierdzić usunięcie konta."
# type_in_password: "Also, type in your password." type_in_password: "Wpisz również swoje hasło."
email_subscriptions: "Powiadomienia email" email_subscriptions: "Powiadomienia email"
email_subscriptions_none: "Brak powiadomień e-mail." email_subscriptions_none: "Brak powiadomień e-mail."
email_announcements: "Ogłoszenia" email_announcements: "Ogłoszenia"
@ -748,10 +748,10 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
keyboard_shortcuts: "Skróty klawiszowe" keyboard_shortcuts: "Skróty klawiszowe"
space: "Spacja" space: "Spacja"
enter: "Enter" enter: "Enter"
# press_enter: "press enter" press_enter: "naciśnij enter"
# escape: "Escape" escape: "Escape"
shift: "Shift" shift: "Shift"
# run_code: "Run current code." run_code: "Uruchom obecny kod."
run_real_time: "Uruchom \"na żywo\"." run_real_time: "Uruchom \"na żywo\"."
continue_script: "Kontynuuj ostatni skrypt." continue_script: "Kontynuuj ostatni skrypt."
# skip_scripts: "Skip past all skippable scripts." # skip_scripts: "Skip past all skippable scripts."
@ -783,49 +783,49 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# social_hipchat: "Chat with us in the public CodeCombat HipChat room" # social_hipchat: "Chat with us in the public CodeCombat HipChat room"
# contribute_to_the_project: "Contribute to the project" # contribute_to_the_project: "Contribute to the project"
# clans: clans:
# clan: "Clan" clan: "Klan"
# clans: "Clans" clans: "Klany"
# new_name: "New clan name" new_name: "Nazwa nowego klanu"
# new_description: "New clan description" new_description: "Opis nowego klanu"
# make_private: "Make clan private" make_private: "Stwórz prywatny klan"
# subs_only: "subscribers only" subs_only: "tylko subskrybenci"
# create_clan: "Create New Clan" create_clan: "Stwórz nowy klan"
# private_preview: "Preview" private_preview: "Podgląd"
# public_clans: "Public Clans" public_clans: "Publiczne klany"
# my_clans: "My Clans" my_clans: "Moje klany"
# clan_name: "Clan Name" clan_name: "Nazwa klanu"
# name: "Name" name: "Nazwa"
# chieftain: "Chieftain" chieftain: "Dowódca"
# type: "Type" type: "Typ"
# edit_clan_name: "Edit Clan Name" edit_clan_name: "Edytuj nazwe klanu"
# edit_clan_description: "Edit Clan Description" edit_clan_description: "Edytuj opis klanu"
# edit_name: "edit name" edit_name: "edytuj nazwe"
# edit_description: "edit description" edit_description: "edytuj opis"
# private: "(private)" private: "(prywatny)"
# summary: "Summary" summary: "Podsumowanie"
# average_level: "Average Level" average_level: "Średni poziom"
# average_achievements: "Average Achievements" average_achievements: "Średnio osiągnięć"
# delete_clan: "Delete Clan" delete_clan: "Usuń klan"
# leave_clan: "Leave Clan" leave_clan: "Opuść klan"
# join_clan: "Join Clan" join_clan: "Dołacz do klanu"
# invite_1: "Invite:" invite_1: "Zaproszenie:"
# invite_2: "*Invite players to this Clan by sending them this link." invite_2: "*Zaproś nowe osoby do klanu wysyłając im ten link."
# members: "Members" members: "Członkowie"
# progress: "Progress" progress: "Postęp"
# not_started_1: "not started" not_started_1: "nierozpoczęty"
# started_1: "started" started_1: "rozpoczęty"
# complete_1: "complete" complete_1: "ukończony"
# exp_levels: "Expand levels" # exp_levels: "Expand levels"
# rem_hero: "Remove Hero" rem_hero: "Usuń bohatera"
# status: "Status" status: "Status"
# complete_2: "Complete" # complete_2: "Complete"
# started_2: "Started" # started_2: "Started"
# not_started_2: "Not Started" # not_started_2: "Not Started"
# view_solution: "Click to view solution." # view_solution: "Click to view solution."
# latest_achievement: "Latest Achievement" # latest_achievement: "Latest Achievement"
# playtime: "Playtime" playtime: "Czas gyr"
# last_played: "Last played" last_played: "Ostatnio grany"
classes: classes:
archmage_title: "Arcymag" archmage_title: "Arcymag"
@ -857,9 +857,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
back: "Wstecz" back: "Wstecz"
revert: "Przywróć" revert: "Przywróć"
revert_models: "Przywróć wersję" revert_models: "Przywróć wersję"
# pick_a_terrain: "Pick A Terrain" pick_a_terrain: "Wybierz teren"
dungeon: "Loch" dungeon: "Loch"
# indoor: "Indoor" indoor: "Wnętrze"
desert: "Pustynia" desert: "Pustynia"
grassy: "Trawa" grassy: "Trawa"
small: "Mały" small: "Mały"
@ -889,8 +889,8 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# component_configs: "Component Configurations" # component_configs: "Component Configurations"
# config_thang: "Double click to configure a thang" # config_thang: "Double click to configure a thang"
delete: "Usuń" delete: "Usuń"
# duplicate: "Duplicate" duplicate: "Powiel"
# stop_duplicate: "Stop Duplicate" stop_duplicate: "Przestań powielać"
rotate: "Obróć" rotate: "Obróć"
level_settings_title: "Ustawienia" level_settings_title: "Ustawienia"
level_component_tab_title: "Aktualne komponenty" level_component_tab_title: "Aktualne komponenty"
@ -931,14 +931,14 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
tasks: "Zadania" tasks: "Zadania"
# clear_storage: "Clear your local changes" # clear_storage: "Clear your local changes"
# add_system_title: "Add Systems to Level" # add_system_title: "Add Systems to Level"
# done_adding: "Done Adding" done_adding: "Zakończono dodawanie"
article: article:
edit_btn_preview: "Podgląd" edit_btn_preview: "Podgląd"
edit_article_title: "Edytuj artykuł" edit_article_title: "Edytuj artykuł"
# polls: polls:
# priority: "Priority" priority: "Priorytet"
contribute: contribute:
page_title: "Współpraca" page_title: "Współpraca"
@ -1019,7 +1019,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
games_simulated_for: "Gry symulowane dla Ciebie:" games_simulated_for: "Gry symulowane dla Ciebie:"
games_simulated: "Gier zasymulowanych" games_simulated: "Gier zasymulowanych"
games_played: "Gier rozegranych" games_played: "Gier rozegranych"
# ratio: "Ratio" ratio: "Proporcje"
leaderboard: "Tabela rankingowa" leaderboard: "Tabela rankingowa"
battle_as: "Walcz jako " battle_as: "Walcz jako "
summary_your: "Twój " summary_your: "Twój "
@ -1033,7 +1033,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
rank_failed: "Błąd oceniania" rank_failed: "Błąd oceniania"
rank_being_ranked: "Aktualnie oceniane gry" rank_being_ranked: "Aktualnie oceniane gry"
rank_last_submitted: "przesłano " rank_last_submitted: "przesłano "
# help_simulate: "Help simulate games?" help_simulate: "Pomóc w symulowaniu gier?"
code_being_simulated: "Twój nowy kod jest aktualnie symulowany przez innych graczy w celu oceny. W miarę pojawiania sie nowych pojedynków, nastąpi odświeżenie." code_being_simulated: "Twój nowy kod jest aktualnie symulowany przez innych graczy w celu oceny. W miarę pojawiania sie nowych pojedynków, nastąpi odświeżenie."
no_ranked_matches_pre: "Brak ocenionych pojedynków dla drużyny " no_ranked_matches_pre: "Brak ocenionych pojedynków dla drużyny "
no_ranked_matches_post: " ! Zagraj przeciwko kilku oponentom i wróc tutaj, aby uzyskać ocenę gry." no_ranked_matches_post: " ! Zagraj przeciwko kilku oponentom i wróc tutaj, aby uzyskać ocenę gry."
@ -1066,29 +1066,29 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
user: user:
stats: "Statystyki" stats: "Statystyki"
# singleplayer_title: "Singleplayer Levels" singleplayer_title: "Poziomy jednoosobowe"
# multiplayer_title: "Multiplayer Levels" multiplayer_title: "Poziomy multiplayer"
achievements_title: "Osiągnięcia" achievements_title: "Osiągnięcia"
# last_played: "Last Played" last_played: "Ostatnio grany"
status: "Status" status: "Status"
status_completed: "Ukończono" status_completed: "Ukończono"
status_unfinished: "Nie ukończono" status_unfinished: "Nie ukończono"
# no_singleplayer: "No Singleplayer games played yet." no_singleplayer: "Nie rozegrał żadnej gry jednoosobowej."
# no_multiplayer: "No Multiplayer games played yet." no_multiplayer: "Nie rozegrał żadnej gry multiplayer."
# no_achievements: "No Achievements earned yet." no_achievements: "Nie zdobył żadnych osiągnięć."
favorite_prefix: "Ulubiony język to " favorite_prefix: "Ulubiony język to "
# favorite_postfix: "." favorite_postfix: "."
# not_member_of_clans: "Not a member of any clans yet." not_member_of_clans: "Nie jest członkiem żadnego klanu."
# achievements: achievements:
# last_earned: "Last Earned" last_earned: "Ostatnio zdobyty"
# amount_achieved: "Amount" amount_achieved: "Ilość"
# achievement: "Achievement" achievement: "Osiągnięcie"
# category_contributor: "Contributor" # category_contributor: "Contributor"
# category_ladder: "Ladder" # category_ladder: "Ladder"
# category_level: "Level" category_level: "Poziom"
# category_miscellaneous: "Miscellaneous" # category_miscellaneous: "Miscellaneous"
# category_levels: "Levels" category_levels: "Poziomy"
# category_undefined: "Uncategorized" # category_undefined: "Uncategorized"
# current_xp_prefix: "" # current_xp_prefix: ""
# current_xp_postfix: " in total" # current_xp_postfix: " in total"
@ -1145,9 +1145,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# unknown: "Unknown error." # unknown: "Unknown error."
resources: resources:
# sessions: "Sessions" sessions: "Sesje"
# your_sessions: "Your Sessions" your_sessions: "Twoje sesje"
# level: "Level" level: "Poziom"
# social_network_apis: "Social Network APIs" # social_network_apis: "Social Network APIs"
# facebook_status: "Facebook Status" # facebook_status: "Facebook Status"
# facebook_friends: "Facebook Friends" # facebook_friends: "Facebook Friends"
@ -1184,38 +1184,38 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# user_remarks: "User Remarks" # user_remarks: "User Remarks"
versions: "Wersje" versions: "Wersje"
items: "Przedmioty" items: "Przedmioty"
# hero: "Hero" hero: "Bohater"
heroes: "Bohaterowie" heroes: "Bohaterowie"
achievement: "Osiągnięcie" achievement: "Osiągnięcie"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback" feedback: "Wsparcie"
# payment_info: "Payment Info" # payment_info: "Payment Info"
campaigns: "Kampanie" campaigns: "Kampanie"
poll: "Ankieta" poll: "Ankieta"
user_polls_record: "Historia oddanych głosów" user_polls_record: "Historia oddanych głosów"
# concepts: concepts:
# advanced_strings: "Advanced Strings" # advanced_strings: "Advanced Strings"
# algorithms: "Algorithms" algorithms: "Algorytmy"
# arguments: "Arguments" arguments: "Argumenty"
# arithmetic: "Arithmetic" arithmetic: "Arytmetyka"
# arrays: "Arrays" arrays: "Tablice"
# basic_syntax: "Basic Syntax" basic_syntax: "Podstawy składni"
# boolean_logic: "Boolean Logic" boolean_logic: "Algebra Boole'a"
# break_statements: "Break Statements" # break_statements: "Break Statements"
# classes: "Classes" classes: "Klasy"
# for_loops: "For Loops" for_loops: "Pętle for"
# functions: "Functions" functions: "Funkcje"
# if_statements: "If Statements" if_statements: "Wyrażenia warunkowe"
# input_handling: "Input Handling" # input_handling: "Input Handling"
# math_operations: "Math Operations" # math_operations: "Math Operations"
# object_literals: "Object Literals" # object_literals: "Object Literals"
# strings: "Strings" strings: "Ciągi znaków"
# variables: "Variables" variables: "Zmienne"
# vectors: "Vectors" vectors: "Wektory"
# while_loops: "Loops" while_loops: "Pętle"
# recursion: "Recursion" recursion: "Rekurencja"
delta: delta:
added: "Dodano" added: "Dodano"

View file

@ -64,7 +64,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
achievements: "Conquistas" # Tooltip on achievement list button from /play achievements: "Conquistas" # Tooltip on achievement list button from /play
account: "Conta" # Tooltip on account button from /play account: "Conta" # Tooltip on account button from /play
settings: "Configurações" # Tooltip on settings button from /play settings: "Configurações" # Tooltip on settings button from /play
# poll: "Poll" # Tooltip on poll button from /play poll: "Enquete" # Tooltip on poll button from /play
next: "Próximo" # Go from choose hero to choose inventory before playing a level next: "Próximo" # Go from choose hero to choose inventory before playing a level
change_hero: "Alterar Herói" # Go back from choose inventory to choose hero change_hero: "Alterar Herói" # Go back from choose inventory to choose hero
choose_inventory: "Equipar Itens" choose_inventory: "Equipar Itens"
@ -347,8 +347,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
tip_hate_computers: "As pessoas realmente pensam porque odeiam computadores. O que eles realmente odeiam são programadores ruins. - Larry Niven" tip_hate_computers: "As pessoas realmente pensam porque odeiam computadores. O que eles realmente odeiam são programadores ruins. - Larry Niven"
tip_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!" tip_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!"
tip_recurse: "Para iterar é humano, para recursão, é divino. - L. Peter Deutsch" tip_recurse: "Para iterar é humano, para recursão, é divino. - L. Peter Deutsch"
# tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus" tip_free_your_mind: "Você tem que deixar isso tudo passar, Neo. O medo, a dúvida e a descrença. Liberte sua mente - Morpheus"
# tip_strong_opponents: "Even the strongest of opponents always has a weakness. - Itachi Uchiha" tip_strong_opponents: "Mesmo o mais forte dos adversários tem sua fraqueza. - Itachi Uchiha"
game_menu: game_menu:
inventory_tab: "Inventário" inventory_tab: "Inventário"
@ -621,8 +621,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student." # private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
# private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a" # private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
# private_clans_3: "." # private_clans_3: "."
# who_for_title: "Who is CodeCombat for?" who_for_title: "Para quem é indicado o CodeCombat?"
# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed." who_for_1: "Nós recomendamos CodeCombat para estudantes a partir de 9 anos de idade. Nenhuma experiência anterior em programação é necessária."
# who_for_2: "We've designed CodeCombat to appeal to both boys and girls." # who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
# material_title: "How much material is there?" # material_title: "How much material is there?"
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far." # material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
@ -707,7 +707,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
picture_tab: "Foto" picture_tab: "Foto"
delete_account_tab: "Excluir sua conta" delete_account_tab: "Excluir sua conta"
wrong_email: "E-mail incorreto" wrong_email: "E-mail incorreto"
# wrong_password: "Wrong Password" wrong_password: "Senha Incorreta"
upload_picture: "Enviar uma foto" upload_picture: "Enviar uma foto"
delete_this_account: "Excluir essa conta definitivamente" delete_this_account: "Excluir essa conta definitivamente"
god_mode: "Modo Deus" god_mode: "Modo Deus"
@ -717,7 +717,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
new_password: "Nova Senha" new_password: "Nova Senha"
new_password_verify: "Confirmação" new_password_verify: "Confirmação"
type_in_email: "Digite seu e-mail para confirmar a exclusão" # {change} type_in_email: "Digite seu e-mail para confirmar a exclusão" # {change}
# type_in_password: "Also, type in your password." type_in_password: "Digite sua senha."
email_subscriptions: "Assinaturas para Notícias por Email" email_subscriptions: "Assinaturas para Notícias por Email"
email_subscriptions_none: "Sem Assinaturas de Email" email_subscriptions_none: "Sem Assinaturas de Email"
email_announcements: "Notícias" email_announcements: "Notícias"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
keyboard_shortcuts: "Atalhos do Teclado" keyboard_shortcuts: "Atalhos do Teclado"
space: "Espaço" space: "Espaço"
enter: "Enter" enter: "Enter"
# press_enter: "press enter" press_enter: "pressione enter"
escape: "Esc" escape: "Esc"
shift: "Shift" shift: "Shift"
run_code: "Rodar código atual." run_code: "Rodar código atual."
@ -853,7 +853,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
thang_title: "Editor de Thang" thang_title: "Editor de Thang"
level_title: "Editor de Nível" level_title: "Editor de Nível"
achievement_title: "Editor de Conquistas" achievement_title: "Editor de Conquistas"
# poll_title: "Poll Editor" poll_title: "Editor de Enquete"
back: "Voltar" back: "Voltar"
revert: "Reverter" revert: "Reverter"
revert_models: "Reverter Modelos" revert_models: "Reverter Modelos"
@ -884,7 +884,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
level_tab_thangs_all: "Tudo" level_tab_thangs_all: "Tudo"
level_tab_thangs_conditions: "Condições de Início" level_tab_thangs_conditions: "Condições de Início"
level_tab_thangs_add: "Adicionar Thangs" level_tab_thangs_add: "Adicionar Thangs"
# level_tab_thangs_search: "Search thangs" level_tab_thangs_search: "Buscar thangs"
add_components: "Adicionar componentes" add_components: "Adicionar componentes"
component_configs: "Configurações de componente" component_configs: "Configurações de componente"
config_thang: "Duplo-clique para configurar uma thang" config_thang: "Duplo-clique para configurar uma thang"
@ -915,13 +915,13 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
new_level_title_login: "Faça login para Criar um Novo Nível" new_level_title_login: "Faça login para Criar um Novo Nível"
new_achievement_title: "Criar Nova Conquista" new_achievement_title: "Criar Nova Conquista"
new_achievement_title_login: "Faça login para Criar uma Nova Conquista" new_achievement_title_login: "Faça login para Criar uma Nova Conquista"
# new_poll_title: "Create a New Poll" new_poll_title: "Criar uma nova enquete"
# new_poll_title_login: "Log In to Create a New Poll" new_poll_title_login: "Faça login para criar uma nova enquete"
article_search_title: "Procurar Artigos Aqui" article_search_title: "Procurar Artigos Aqui"
thang_search_title: "Procurar Tipos de Thang Aqui" thang_search_title: "Procurar Tipos de Thang Aqui"
level_search_title: "Procurar Níveis Aqui" level_search_title: "Procurar Níveis Aqui"
achievement_search_title: "Buscar Conquistas" achievement_search_title: "Buscar Conquistas"
# poll_search_title: "Search Polls" poll_search_title: "Buscar enquetes"
read_only_warning2: "Nota: você não pode salvar suas edições aqui pois não está logado." 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." no_achievements: "Nenhuma conquista foi adicionada para esse nível ainda."
achievement_query_misc: "Conquista chave desligada dos variados" achievement_query_misc: "Conquista chave desligada dos variados"

View file

@ -613,11 +613,11 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
sub_includes_6: "3500 gemas de bónus todos os meses" sub_includes_6: "3500 gemas de bónus todos os meses"
sub_includes_7: "Clãs Privados" sub_includes_7: "Clãs Privados"
monitor_progress_title: "Como é que acompanho o progresso dos estudantes?" monitor_progress_title: "Como é que acompanho o progresso dos estudantes?"
# monitor_progress_1: "Student progress can be monitored by creating a" monitor_progress_1: "O progresso dos estudantes pode ser acompanhado ao criares um"
# monitor_progress_2: "for your class." monitor_progress_2: "para a tua turma."
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the" monitor_progress_3: "Para adicionares um estudante, envia-lhe a ligação de convite para o teu Clã, a qual podes encontrar através da página dos"
# monitor_progress_4: "page." monitor_progress_4: ", ao acederes ao teu."
# monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page." monitor_progress_5: "Depois de ele se juntar, verás um resumo do progresso do estudante na tua página do Clã."
private_clans_1: "Os Clãs Privados garantem privacidade e informações sobre o progresso de cada estudante superiores." private_clans_1: "Os Clãs Privados garantem privacidade e informações sobre o progresso de cada estudante superiores."
private_clans_2: "Para criares um Clã privado, marca a caixa 'Tornar o clã privado' aquando da criação de um" private_clans_2: "Para criares um Clã privado, marca a caixa 'Tornar o clã privado' aquando da criação de um"
private_clans_3: "." private_clans_3: "."
@ -626,7 +626,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
who_for_2: "O CodeCombat foi pensado de forma a ser apelativo tanto para rapazes como para raparigas." who_for_2: "O CodeCombat foi pensado de forma a ser apelativo tanto para rapazes como para raparigas."
material_title: "Quanto material há?" material_title: "Quanto material há?"
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far." # material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
# material_1: "Approximately 25 hours of free content and an additional 15 hours of subscriber content." material_1: "Aproximadamente 25 horas de conteúdo gratuito e 15 horas adicionais de conteúdo para subscritores."
concepts_title: "Que conceitos são abordados?" concepts_title: "Que conceitos são abordados?"
how_much_title: "Quanto custa uma subscrição mensal?" how_much_title: "Quanto custa uma subscrição mensal?"
how_much_1: "Uma" how_much_1: "Uma"
@ -869,7 +869,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
generate_terrain: "Gerar Terreno" generate_terrain: "Gerar Terreno"
more: "Mais" more: "Mais"
wiki: "Wiki" wiki: "Wiki"
live_chat: "Chat Ao Vivo" live_chat: "Chat ao Vivo"
thang_main: "Principal" thang_main: "Principal"
thang_spritesheets: "Spritesheets" thang_spritesheets: "Spritesheets"
thang_colors: "Cores" thang_colors: "Cores"
@ -1195,32 +1195,32 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
poll: "Votações" poll: "Votações"
user_polls_record: "Histórico das Votações" user_polls_record: "Histórico das Votações"
# concepts: concepts:
# advanced_strings: "Advanced Strings" advanced_strings: "'Strings' Avançadas"
# algorithms: "Algorithms" algorithms: "Algoritmos"
# arguments: "Arguments" arguments: "Argumentos"
# arithmetic: "Arithmetic" arithmetic: "Aritmética"
# arrays: "Arrays" arrays: "'Arrays'"
# basic_syntax: "Basic Syntax" basic_syntax: "Sintaxe Básica"
# boolean_logic: "Boolean Logic" boolean_logic: "Lógica 'Boolean'"
# break_statements: "Break Statements" break_statements: "Declarações 'Break'"
# classes: "Classes" classes: "Classes"
# for_loops: "For Loops" for_loops: "'For Loops'"
# functions: "Functions" functions: "Funções"
# if_statements: "If Statements" if_statements: "Declarações 'If'"
# input_handling: "Input Handling" input_handling: "Manuseamento de 'Input'"
# math_operations: "Math Operations" math_operations: "Operações Matemáticas"
# object_literals: "Object Literals" object_literals: "'Object Literals'"
# strings: "Strings" strings: "'Strings'"
# variables: "Variables" variables: "Variáveis"
# vectors: "Vectors" vectors: "Vetores"
# while_loops: "Loops" while_loops: "'Loops'"
# recursion: "Recursion" recursion: "Recursão"
delta: delta:
added: "Adicionados/as" added: "Adicionado"
modified: "Modificados/as" modified: "Modificado"
deleted: "Eliminados/as" deleted: "Eliminado"
moved_index: "Índice Movido" moved_index: "Índice Movido"
text_diff: "Diferença de Texto" text_diff: "Diferença de Texto"
merge_conflict_with: "FUNDIR CONFLITO COM" merge_conflict_with: "FUNDIR CONFLITO COM"
@ -1402,19 +1402,19 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
# education_duration: "Dates" # education_duration: "Dates"
education_duration_help: "Quando?" education_duration_help: "Quando?"
education_description: "Descrição" education_description: "Descrição"
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)" education_description_help: "Destaca algo sobre esta experiência educacional. (140 carateres; opcional)"
# our_notes: "CodeCombat's Notes" # our_notes: "CodeCombat's Notes"
# remarks: "Remarks" # remarks: "Remarks"
projects: "Projetos" projects: "Projetos"
projects_header: "Adiciona 3 projetos" projects_header: "Adiciona 3 projetos"
# projects_header_2: "Projects (Top 3)" projects_header_2: "Projetos (Top 3)"
# projects_blurb: "Highlight your projects to amaze employers." # projects_blurb: "Highlight your projects to amaze employers."
project_name: "Nome do Projeto" project_name: "Nome do Projeto"
# project_name_help: "What was the project called?" project_name_help: "Qual era o nome do projeto?"
project_description: "Descrição" project_description: "Descrição"
project_description_help: "Descreve o projeto em poucas palavras." project_description_help: "Descreve o projeto em poucas palavras."
project_picture: "Imagem" project_picture: "Imagem"
# project_picture_help: "Upload a 230x115px or larger image showing off the project." project_picture_help: "Faz upload de uma imagem 230x115px ou maior que mostre o projeto."
project_link: "Ligação" project_link: "Ligação"
project_link_help: "Ligação para o projeto." project_link_help: "Ligação para o projeto."
player_code: "Código do Jogador" player_code: "Código do Jogador"

View file

@ -92,8 +92,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>。" campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>。"
campaign_classic_algorithms: "经典算法" campaign_classic_algorithms: "经典算法"
campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法" campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法"
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas" campaign_old_multiplayer: "(过时的)旧的多人竞技场"
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas." campaign_old_multiplayer_description: "一个文明时代的遗迹。没有模拟运行这些老的、英雄少的多人竞技场。"
share_progress_modal: share_progress_modal:
blurb: "你的进度真快快告诉其他人你从CodeCombat学到了什么" # {change} blurb: "你的进度真快快告诉其他人你从CodeCombat学到了什么" # {change}
@ -160,7 +160,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
unwatch: "取消关注" unwatch: "取消关注"
submit_patch: "提交补丁" submit_patch: "提交补丁"
submit_changes: "提交更新" submit_changes: "提交更新"
# save_changes: "Save Changes" save_changes: "保存更新"
general: general:
and: "" and: ""
@ -296,7 +296,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
time_goto: "跳到:" time_goto: "跳到:"
non_user_code_problem_title: "不能读入关卡" non_user_code_problem_title: "不能读入关卡"
infinite_loop_title: "有无限循环" infinite_loop_title: "有无限循环"
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know." infinite_loop_description: "建立世界的初始代码永远不会运行完毕。这可能是真的运行的很慢或者陷入了一个死循环。又或者可能存在bug。您可以尝试再次运行该代码或者将代码重置为默认状态。如果仍旧解决不了请让告诉我们。"
check_dev_console: "你也可以打开开发者界面看一下有什么可能出错了。" check_dev_console: "你也可以打开开发者界面看一下有什么可能出错了。"
check_dev_console_link: "(说明)" check_dev_console_link: "(说明)"
infinite_loop_try_again: "请重试" infinite_loop_try_again: "请重试"
@ -347,7 +347,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
tip_hate_computers: "那些认为他们讨厌电脑的人,其实他们讨厌的是垃圾程序编写员。- Larry Niven" tip_hate_computers: "那些认为他们讨厌电脑的人,其实他们讨厌的是垃圾程序编写员。- Larry Niven"
tip_open_source_contribute: "你可以帮助「CodeCombat」提高" tip_open_source_contribute: "你可以帮助「CodeCombat」提高"
tip_recurse: "迭代为人,递归为神 - L. Peter Deutsch" tip_recurse: "迭代为人,递归为神 - L. Peter Deutsch"
# tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus" tip_free_your_mind: "丢掉一切私心杂念,丢掉害怕、疑问和拒信,解放你的思想。 - Morpheus"
tip_strong_opponents: "即使是最强大的对手也是有弱点的. - Itachi Uchiha" tip_strong_opponents: "即使是最强大的对手也是有弱点的. - Itachi Uchiha"
game_menu: game_menu:
@ -405,7 +405,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
prompt_body: "还需要更多吗?" prompt_body: "还需要更多吗?"
prompt_button: "进入商店" prompt_button: "进入商店"
recovered: "之前购买的宝石已恢复。请刷新页面。" recovered: "之前购买的宝石已恢复。请刷新页面。"
# price: "x3500 / mo" price: "x3500 / 月"
subscribe: subscribe:
comparison_blurb: "订阅CodeCombat大力的提升你的技能" comparison_blurb: "订阅CodeCombat大力的提升你的技能"
@ -450,31 +450,31 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
unlock_help_videos: "订阅后才可以解锁视频教学哦!" unlock_help_videos: "订阅后才可以解锁视频教学哦!"
personal_sub: "个人订阅" # Accounts Subscription View below personal_sub: "个人订阅" # Accounts Subscription View below
loading_info: "正在读入订阅内容..." loading_info: "正在读入订阅内容..."
# managed_by: "Managed by" managed_by: "管理"
# will_be_cancelled: "Will be cancelled on" will_be_cancelled: "将被取消"
# currently_free: "You currently have a free subscription" currently_free: "您目前有一个免费订阅"
# currently_free_until: "You currently have a free subscription until" currently_free_until: "您目前有一个免费订阅,直到"
# was_free_until: "You had a free subscription until" was_free_until: "您有过一个免费订阅,直到"
# managed_subs: "Managed Subscriptions" managed_subs: "管理订阅"
# managed_subs_desc: "Add subscriptions for other players (students, children, etc.)" managed_subs_desc: "为其他玩家(学生、儿童等)添加订阅。"
# managed_subs_desc_2: "Recipients must have a CodeCombat account associated with the email address you provide." managed_subs_desc_2: "收件人必须有一个与您提供的电子邮件地址相关联的codecombat帐户。"
# group_discounts: "Group discounts" group_discounts: "团购价"
# group_discounts_1: "We also offer group discounts for bulk subscriptions." group_discounts_1: "我们还为批量订阅提供团购价"
# group_discounts_1st: "1st subscription" group_discounts_1st: "1个订阅"
group_discounts_full: "全价" group_discounts_full: "全价"
# group_discounts_2nd: "Subscriptions 2-11" group_discounts_2nd: "2-11个订阅"
group_discounts_20: "八折" group_discounts_20: "八折"
# group_discounts_12th: "Subscriptions 12+" group_discounts_12th: "12+个订阅"
group_discounts_40: "六折" group_discounts_40: "六折"
# subscribing: "Subscribing..." subscribing: "订阅中..."
# recipient_emails_placeholder: "Enter email address to subscribe, one per line." recipient_emails_placeholder: "请输入电子邮件地址来订阅,每行一个。"
subscribe_users: "订阅用户" subscribe_users: "订阅用户"
# users_subscribed: "Users subscribed:" users_subscribed: "用户订阅:"
# no_users_subscribed: "No users subscribed, please double check your email addresses." no_users_subscribed: "没有用户订阅,请仔细检查您的电子邮件地址。"
# current_recipients: "Current Recipients" current_recipients: "当前收件人"
# unsubscribing: "Unsubscribing..." unsubscribing: "取消订阅中..."
# subscribe_prepaid: "Click Subscribe to use prepaid code" subscribe_prepaid: "点击订阅来使用预付费代码"
# using_prepaid: "Using prepaid code for monthly subscription" using_prepaid: "使用预付费代码进行每月订阅"
choose_hero: choose_hero:
choose_hero: "请选择您的英雄" choose_hero: "请选择您的英雄"
@ -502,13 +502,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
blocks: "格挡" # As in "this shield blocks this much damage" blocks: "格挡" # As in "this shield blocks this much damage"
backstab: "背刺" # As in "this dagger does this much backstab damage" backstab: "背刺" # As in "this dagger does this much backstab damage"
skills: "技能" skills: "技能"
# attack_1: "Deals" attack_1: "交易"
# attack_2: "of listed" attack_2: "列表"
attack_3: "武器攻击力." attack_3: "武器攻击力."
# health_1: "Gains" health_1: "收益"
# health_2: "of listed" health_2: "列表"
health_3: "装备血量." health_3: "装备血量."
# speed_1: "Moves at" speed_1: "移动速度"
speed_2: "米每秒." speed_2: "米每秒."
available_for_purchase: "可以购买" # Shows up when you have unlocked, but not purchased, a hero in the hero store available_for_purchase: "可以购买" # Shows up when you have unlocked, but not purchased, a hero in the hero store
level_to_unlock: "未解锁关卡:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see) level_to_unlock: "未解锁关卡:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
@ -588,57 +588,57 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
josh_title: "游戏设计师" josh_title: "游戏设计师"
josh_blurb: "地面是熔岩" josh_blurb: "地面是熔岩"
jose_title: "音乐" jose_title: "音乐"
# jose_blurb: "Taking Off" jose_blurb: "放轻松"
# retrostyle_title: "Illustration" retrostyle_title: "插画师"
# retrostyle_blurb: "RetroStyle Games" retrostyle_blurb: "复古风格的游戏"
teachers: teachers:
title: "CodeCombat给教师的说明" title: "CodeCombat给教师的说明"
intro_1: "CodeCombat 是一个教编程的网上游戏。学生会用编程语言写代码。" intro_1: "CodeCombat 是一个教编程的网上游戏。学生会用编程语言写代码。"
intro_2: "无需经验!" intro_2: "无需经验!"
free_title: "要多少钱?" free_title: "要多少钱?"
# cost_china: "CodeCombat in China is free for the first five levels, after which it costs $9.99 USD per month for access to our other 140+ levels on our exclusive China servers." cost_china: "CodeCombat的前5个关卡在中国是免费的在这之后需花费每月9.99美元来访问我们架设在中国专属服务器上的140多个关卡。"
# free_1: "There are 100+ FREE levels which cover every concept." free_1: "有100多个覆盖了所有理论的免费关卡。"
# free_2: "A monthly subscription provides access to video tutorials and extra practice levels." free_2: "包月订阅可以访问视频教程和额外的练习关卡。"
teacher_subs_title: "教师可免费订阅!" teacher_subs_title: "教师可免费订阅!"
teacher_subs_1: "请联系" # {change} teacher_subs_1: "请联系" # {change}
# teacher_subs_2: "Teacher Survey" teacher_subs_2: "教师调查"
# teacher_subs_3: "to set up your subscription." teacher_subs_3: "建立您的订阅。"
# sub_includes_title: "What is included in the subscription?" sub_includes_title: "订阅里包含了什么内容?"
# sub_includes_1: "In addition to the 100+ basic levels, students with a monthly subscription get access to these additional features:" sub_includes_1: "除了100多个基础关卡学生包月订阅还可以使用这些附加功能"
sub_includes_2: "超过60个练习关卡" # {change} sub_includes_2: "超过60个练习关卡" # {change}
sub_includes_3: "视频教学" sub_includes_3: "视频教学"
# sub_includes_4: "Premium email support" sub_includes_4: "优质的电子邮件支持"
# sub_includes_5: "10 new heroes with unique skills to master" sub_includes_5: "10个具有独特技能的新英雄"
sub_includes_6: "每月享有3500额外宝石" sub_includes_6: "每月享有3500额外宝石"
# sub_includes_7: "Private Clans" sub_includes_7: "私有团队"
# monitor_progress_title: "How do I monitor student progress?" monitor_progress_title: "我要如何查看学生的进度?"
# monitor_progress_1: "Student progress can be monitored by creating a" monitor_progress_1: "要查看学生的进度,可以通过建立一个"
# monitor_progress_2: "for your class." monitor_progress_2: "在你的课程。"
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the" monitor_progress_3: "为了添加一个学生,可以给他们发送一个你的团队的邀请链接,这个在"
# monitor_progress_4: "page." monitor_progress_4: "页面。"
# monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page." monitor_progress_5: "当他们加入之后,你可以在你的团队页面看到这些学生的进度汇总。"
# private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student." private_clans_1: "私有团队为每个学生增加了隐私和详细的进度信息。"
# private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a" private_clans_2: "为了添加一个私有团队,可以勾选'私有团队'复选框,在你建立一个"
# private_clans_3: "." private_clans_3: ""
# who_for_title: "Who is CodeCombat for?" who_for_title: "谁是CodeCombat的使用对象呢"
# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed." who_for_1: "我们建议让9岁及以上的学生使用CodeCombat。无需任何编程经验。"
# who_for_2: "We've designed CodeCombat to appeal to both boys and girls." who_for_2: "我们设计CodeCombat来吸引男生女生。"
# material_title: "How much material is there?" material_title: "这里有多少素材呢?"
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far." material_china: "约40小时的游戏时间和目前为止超过170个的订阅关卡。"
# material_1: "Approximately 25 hours of free content and an additional 15 hours of subscriber content." material_1: "大约25个小时的免费内容和额外的15个小时的订阅内容。"
# concepts_title: "What concepts are covered?" concepts_title: "包括了哪些理论知识?"
how_much_title: "每月的订阅费用是多少?" how_much_title: "每月的订阅费用是多少?"
how_much_1: "" how_much_1: ""
how_much_2: "每月订阅" how_much_2: "每月订阅"
how_much_3: "每月$9.99, 并可随时要求退款." how_much_3: "每月$9.99, 并可随时要求退款."
how_much_4: "另外,团体购买者将享受折扣优惠" how_much_4: "另外,团体购买者将享受折扣优惠"
# how_much_5: "We accept discounted one-time purchases and yearly subscription purchases for groups, such as a class or school. Please contact" how_much_5: "我们接受一次性的打折购买以及每年订阅的团体,比如班级或者学校。请联系"
# how_much_6: "for more details." how_much_6: "来获取详情。"
# more_info_title: "Where can I find more information?" more_info_title: "我可以在哪里找到更多信息?"
# more_info_1: "Our" more_info_1: "我们的"
# more_info_2: "teachers forum" more_info_2: "教师论坛"
# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat." more_info_3: "是个与其他使用CodeCombat的教育工作者联系的良好平台。"
sys_requirements_title: "系统需求" sys_requirements_title: "系统需求"
sys_requirements_1: "因为CodeCombat是个游戏它对于电脑的要求很高以运行的顺畅。我们已经优化过他以便让他能在每一个最新浏览器或是比较旧的电脑跑得顺畅所以每一个人都能享受CodeCombat带来的乐趣。如上为了使你顺利的完成Hour of Code的学习我们建议你" # {change} sys_requirements_1: "因为CodeCombat是个游戏它对于电脑的要求很高以运行的顺畅。我们已经优化过他以便让他能在每一个最新浏览器或是比较旧的电脑跑得顺畅所以每一个人都能享受CodeCombat带来的乐趣。如上为了使你顺利的完成Hour of Code的学习我们建议你" # {change}
sys_requirements_2: "使用最新版本的Chrome或是Firefox." # {change} sys_requirements_2: "使用最新版本的Chrome或是Firefox." # {change}
@ -679,7 +679,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
cla_url: "贡献者许可协议" cla_url: "贡献者许可协议"
cla_suffix: "" cla_suffix: ""
cla_agree: "我同意" cla_agree: "我同意"
# owner_approve: "An owner will need to approve it before your changes will become visible." owner_approve: "你所做出的修改必须经拥有者确认才能生效。"
contact: contact:
contact_us: "联系我们" contact_us: "联系我们"
@ -707,7 +707,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
picture_tab: "图片" picture_tab: "图片"
delete_account_tab: "删除账户" delete_account_tab: "删除账户"
wrong_email: "错误的邮箱地址" wrong_email: "错误的邮箱地址"
# wrong_password: "Wrong Password" wrong_password: "密码错误"
upload_picture: "上传一张图片" upload_picture: "上传一张图片"
delete_this_account: "永久删除账户" delete_this_account: "永久删除账户"
god_mode: "上帝模式" god_mode: "上帝模式"
@ -717,7 +717,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
new_password: "新密码" new_password: "新密码"
new_password_verify: "核实" new_password_verify: "核实"
type_in_email: "输入你的邮箱地址来确认删除" # {change} type_in_email: "输入你的邮箱地址来确认删除" # {change}
# type_in_password: "Also, type in your password." type_in_password: "同样的,输入你的密码。"
email_subscriptions: "邮箱订阅" email_subscriptions: "邮箱订阅"
email_subscriptions_none: "取消订阅" email_subscriptions_none: "取消订阅"
email_announcements: "通知" email_announcements: "通知"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
keyboard_shortcuts: "快捷键" keyboard_shortcuts: "快捷键"
space: "空格" space: "空格"
enter: "回车" enter: "回车"
# press_enter: "press enter" press_enter: "按回车键"
escape: "Esc" escape: "Esc"
shift: "Shift" shift: "Shift"
run_code: "运行当前代码" run_code: "运行当前代码"
@ -884,7 +884,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
level_tab_thangs_all: "所有" level_tab_thangs_all: "所有"
level_tab_thangs_conditions: "启动条件" level_tab_thangs_conditions: "启动条件"
level_tab_thangs_add: "增加物体" level_tab_thangs_add: "增加物体"
# level_tab_thangs_search: "Search thangs" level_tab_thangs_search: "查找物体"
add_components: "添加组件" add_components: "添加组件"
component_configs: "组件配置" component_configs: "组件配置"
config_thang: "双击配置一个thang" config_thang: "双击配置一个thang"
@ -931,7 +931,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
tasks: "任务" tasks: "任务"
# clear_storage: "Clear your local changes" # clear_storage: "Clear your local changes"
# add_system_title: "Add Systems to Level" # add_system_title: "Add Systems to Level"
# done_adding: "Done Adding" done_adding: "添加完毕"
article: article:
edit_btn_preview: "预览" edit_btn_preview: "预览"
@ -1078,7 +1078,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
no_achievements: "还未得到任何成就。" no_achievements: "还未得到任何成就。"
favorite_prefix: "最喜爱的语言是 " favorite_prefix: "最喜爱的语言是 "
favorite_postfix: "" favorite_postfix: ""
# not_member_of_clans: "Not a member of any clans yet." not_member_of_clans: "还不是任何一个团队里的成员。"
achievements: achievements:
last_earned: "最近取得的" last_earned: "最近取得的"
@ -1104,7 +1104,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
payments: "支付方式" payments: "支付方式"
purchased: "已购买" purchased: "已购买"
subscription: "订阅" subscription: "订阅"
# invoices: "Invoices" invoices: "票据"
service_apple: "设备:苹果" service_apple: "设备:苹果"
service_web: "设备:网页" service_web: "设备:网页"
paid_on: "支付" paid_on: "支付"
@ -1184,7 +1184,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
user_remarks: "用户备注" user_remarks: "用户备注"
versions: "版本" versions: "版本"
items: "物品" items: "物品"
# hero: "Hero" hero: "英雄"
heroes: "英雄" heroes: "英雄"
achievement: "成就" achievement: "成就"
clas: "CLAs" clas: "CLAs"

View file

@ -50,14 +50,14 @@ module.exports = class Level extends CocoModel
denormalize: (supermodel, session, otherSession) -> denormalize: (supermodel, session, otherSession) ->
o = $.extend true, {}, @attributes o = $.extend true, {}, @attributes
if o.thangs and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] if o.thangs and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
for levelThang in o.thangs for levelThang in o.thangs
@denormalizeThang(levelThang, supermodel, session, otherSession) @denormalizeThang(levelThang, supermodel, session, otherSession)
o o
denormalizeThang: (levelThang, supermodel, session, otherSession) -> denormalizeThang: (levelThang, supermodel, session, otherSession) ->
levelThang.components ?= [] levelThang.components ?= []
isHero = /Hero Placeholder/.test levelThang.id isHero = /Hero Placeholder/.test(levelThang.id) and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
if isHero and otherSession if isHero and otherSession
# If it's a hero and there's another session, find the right session for it. # 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. # If there is no other session (playing against default code, or on single player), clone all placeholders.

View file

@ -57,7 +57,7 @@ _.extend CampaignSchema.properties, {
i18n: { type: 'object', format: 'hidden' } i18n: { type: 'object', format: 'hidden' }
requiresSubscription: { type: 'boolean' } requiresSubscription: { type: 'boolean' }
replayable: { type: 'boolean' } replayable: { type: 'boolean' }
type: {'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop']} type: {'enum': ['ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']}
slug: { type: 'string', format: 'hidden' } slug: { type: 'string', format: 'hidden' }
original: { type: 'string', format: 'hidden' } original: { type: 'string', format: 'hidden' }
adventurer: { type: 'boolean' } adventurer: { type: 'boolean' }

View file

@ -293,7 +293,7 @@ _.extend LevelSchema.properties,
icon: {type: 'string', format: 'image-file', title: 'Icon'} icon: {type: 'string', format: 'image-file', title: 'Icon'}
banner: {type: 'string', format: 'image-file', title: 'Banner'} 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 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', 'hero-ladder', 'hero-coop']) type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'])
terrain: c.terrainString 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']) showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
requiresSubscription: {title: 'Requires Subscription', description: 'Whether this level is available to subscribers only.', type: 'boolean'} requiresSubscription: {title: 'Requires Subscription', description: 'Whether this level is available to subscribers only.', type: 'boolean'}

View file

@ -1,5 +1,10 @@
#course-details-view #course-details-view
.member-header
cursor: pointer
display: inline-block
padding: 2px
.textarea-emails .textarea-emails
width: 50% width: 50%
@ -13,6 +18,7 @@
.progress-header .progress-header
margin-right: 14px margin-right: 14px
cursor: pointer
.progress-key .progress-key
cursor: default cursor: default
@ -51,6 +57,19 @@
background-color: blanchedalmond background-color: blanchedalmond
font-size: 10pt font-size: 10pt
.level-progression-concepts
color: #317EAC
font-size: 12pt
font-weight: bold
margin-top: 8px
margin-bottom: 4px
.level-progression-levels
color: #317EAC
font-size: 12pt
font-weight: bold
margin-top: 8px
.progress-level-cell .progress-level-cell
display: inline-block display: inline-block
white-space: nowrap white-space: nowrap

View file

@ -1,18 +1,31 @@
#course-info-view #course-info-view
.btn-enroll
margin-top: 20px
.center .center
text-align: center text-align: center
.caption-text
font-size: 14px
.concepts-container
width: 200px
.contact-container .contact-container
margin-top: 20px margin-top: 20px
text-align: center text-align: center
.info-container .info-container
margin: 0% 10% margin: 0% 10%
font-size: 18px
.monitoring-img-container
margin-top: 10px
.praise-quote .praise-quote
font-size: 24px font-size: 24px
font-style: italic font-style: italic
.praise-source .progress-container
font-size: 16px font-size: 20px

View file

@ -1,63 +0,0 @@
@import "app/styles/mixins"
@import "app/styles/bootstrap/variables"
#play-view
.row
margin: 20px 0px 0px 0px
.campaign-container
margin-bottom: 40px
.campaign-description
font-style: italic
margin-top: -10px
a[disabled] .level
opacity: 0.7
a.complete h3:after
content: " - Complete!"
color: green
a.started h3:after
content: " - Started"
color: desaturate(green, 50%)
.level
@include box-sizing(border-box)
border: 1px solid transparent
&:hover, &:focus
border: 1px solid cyan
background-color: rgba(128, 192, 212, 0.25)
.level-image
float: left
.level-info
float: left
width: 330px
margin-left: 20px
h3
margin-top: 0
margin-bottom: 0px
.level-description
color: black
text-shadow: 0 1px 0 white
.modal.play-modal
.modal-header
border: 0
text-align: center
padding: 0
margin: 0 25px
h3
margin-bottom: 0
.modal-body
padding-top: 0

View file

@ -62,7 +62,6 @@ block footer
a(href='http://blog.codecombat.com/', data-i18n="nav.blog") a(href='http://blog.codecombat.com/', data-i18n="nav.blog")
a(href='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute a(href='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
a(href="/play-old", data-i18n="play.older_campaigns") Older Campaigns
if me.isAdmin() if me.isAdmin()
a(href='/admin', data-i18n="nav.admin") Admin a(href='/admin', data-i18n="nav.admin") Admin

View file

@ -4,120 +4,156 @@ block content
//- DO NOT localize / i18n //- DO NOT localize / i18n
div TODO: fix ugly tabs
div TODO: aggregate student progress
div TODO: student level progress popups
div div
span *UNDER CONSTRUCTION, send feedback to span *UNDER CONSTRUCTION, send feedback to
a.spl(href='mailto:team@codecombat.com') team@codecombat.com a.spl(href='mailto:team@codecombat.com') team@codecombat.com
div div
input.student-view-checkbox(type='checkbox') input.student-mode-checkbox(type='checkbox', checked=studentMode)
span.spl Student view span.spl Student view
div TODO: fix ugly tabs
div TODO: level concepts, status, working play button
div TODO: student view
div TODO: aggregate student progress
div TODO: student level progress popups
div TODO: student concept progress
div(style='border-bottom: 1px solid black;') div(style='border-bottom: 1px solid black;')
h1= course.title h1= course.title
p= course.description p= course.description
p //- p
strong Concepts: //- strong Concepts:
ul //- ul
each topic in course.topics //- each concept in courseConcepts
li= topic //- li(data-i18n="concepts." + concept)
strong= course.duration //- strong= course.duration
h3 Your Class if !studentMode
.form-group p
select.form-control.select-session .form-group
each instance in instances span.spr Select your class
option= instance.name select.form-control.select-session
span.spl each instance in instances
button.btn.btn-xs.edit-class-name-btn edit class name option= instance.name
h3= instance.name
if !studentMode
span.spl
button.btn.btn-xs.edit-class-name-btn edit class name
p p
if instance.description if instance.description
span= instance.description span= instance.description
span.spl if !studentMode
button.btn.btn-xs.edit-description-btn edit class description span.spl
else button.btn.btn-xs.edit-description-btn edit class description
else if !studentMode
div div
button.btn.btn-xs.edit-description-btn add class description button.btn.btn-xs.edit-description-btn add class description
.form-group if !studentMode
span Class programming language: .form-group
select.spl.form-control.select-language span.spr Select language
option(value="Python") Python select.form-control.select-language
option(value="JavaScript") JavaScript option(value="Python") Python
option(value="All Languages") All Languages option(value="JavaScript") JavaScript
option(value="All Languages") All Languages
div(role='tabpanel') div(role='tabpanel')
ul.nav.nav-tabs(role='tablist') ul.nav.nav-tabs(role='tablist')
li.active(role='presentation') if !studentMode
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Students li.active(role='presentation')
li(role='presentation') a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Students
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students li(role='presentation')
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
li(role='presentation') li(role='presentation')
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels
.tab-content .tab-content
.tab-pane.active#progress(role='tabpanel') if !studentMode
if instance.students .tab-pane.active#progress(role='tabpanel')
table.table.table-condensed if instance.students
thead table.table.table-condensed
tr thead
th
th
span.progress-header Progress
span.progress-key.progress-key-complete complete
span.progress-key.progress-key-started started
span.progress-key not started
if maxLastStartedIndex > 30
input.expand-progress-checkbox(type='checkbox')
span.spl.expand-progress-label(data-i18n="clans.exp_levels") Expand levels
tbody
each student in instance.students
tr tr
td th
a= student span.member-header.spr Name
td.progress-cell if memberSort === 'nameAsc'
- var i = 0 span.member-header.glyphicon.glyphicon-chevron-up
each level in course.levels else if memberSort === 'nameDesc'
if i <= userLevelStateMap[student].lastCompletedIndex span.member-header.glyphicon.glyphicon-chevron-down
span.progress-level-cell.progress-level-cell-complete #{i + 1} th
if showExpandedProgress || i === 0 || i === course.levels.length - 1 span.progress-header.spr Progress
span.spl #{level} if memberSort === 'progressAsc'
else if i <= userLevelStateMap[student].lastStartedIndex span.progress-header.glyphicon.glyphicon-chevron-up
span.progress-level-cell.progress-level-cell-started #{i + 1} else if memberSort === 'progressDesc'
if showExpandedProgress || i === 1 || i === userLevelStateMap[student].lastStartedIndex span.progress-header.glyphicon.glyphicon-chevron-down
span.spl #{level} else
else span(style='padding-left:16px;')
span.progress-level-cell.level-progression-level-not-started #{i + 1} span.progress-key.progress-key-complete complete
if showExpandedProgress || i === 1 || i === userLevelStateMap[student].lastStartedIndex span.progress-key.progress-key-started started
span.spl #{level} span.progress-key not started
if i === maxLastStartedIndex if maxLastStartedIndex > 30
- break input.expand-progress-checkbox(type='checkbox')
- i++ span.spl.expand-progress-label(data-i18n="clans.exp_levels") Expand levels
tbody
each student in instance.students
tr
td
a= student
td.progress-cell
.level-progression-concepts Concepts
each concept in courseConcepts
if userConceptsMap[student] && userConceptsMap[student][concept] === 'complete'
span.spr.progress-level-cell.progress-level-cell-complete(data-i18n="concepts." + concept)
else if userConceptsMap[student] && userConceptsMap[student][concept] === 'started'
span.spr.progress-level-cell.progress-level-cell-started(data-i18n="concepts." + concept)
else
span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept)
.tab-pane#invite(role='tabpanel') .level-progression-levels Levels
p Invite students to join this class. - var i = 0
if course.title !== 'Introduction to Computer Science' each level in course.levels
p Student unlock code: #{instance.code} if userLevelStateMap[student][level] === 'complete'
p Class capacity: 34/50 span.progress-level-cell.progress-level-cell-complete #{i + 1}
textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line") if showExpandedProgress || i === 0 || i === course.levels.length - 1
div span.spl #{level}
button.btn.btn-success.btn-invite Send Invites else if userLevelStateMap[student][level] === 'started'
span.progress-level-cell.progress-level-cell-started #{i + 1} #{level}
.tab-pane#levels(role='tabpanel') else
table.table.table-condensed span.progress-level-cell.level-progression-level-not-started #{i + 1}
thead if showExpandedProgress || i === 0
tr span.spl #{level}
th Level - i++
th
tbody .tab-pane#invite(role='tabpanel')
each level in course.levels p Invite students to join this class.
tr if course.title !== 'Introduction to Computer Science'
td p Student unlock code: #{instance.code}
spa= level p Class capacity: 34/50
td textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line")
button.btn.btn-success Play div
button.btn.btn-success.btn-invite Send Invites
.tab-pane#levels(role='tabpanel')
+levels-tab
else
.tab-pane.active#levels(role='tabpanel')
+levels-tab
mixin levels-tab
table.table.table-striped.table-condensed
thead
tr
th
th Status
th Level
th Concepts
tbody
- var student = instance.students[0]
each level in course.levels
tr
td
button.btn.btn-success.btn-play-level(data-level=level) Play
td= userLevelStateMap[student][level]
td= level
td
each concept in courseConcepts
if levelConceptsMap[level] && levelConceptsMap[level][concept]
span.spr.progress-level-cell.level-progression-level-not-started(data-i18n="concepts." + concept)

View file

@ -4,42 +4,77 @@ block content
//- DO NOT localize / i18n //- DO NOT localize / i18n
div TODO: course-specific gameplay screenshots
div TODO: update images, add captions
div div
span *UNDER CONSTRUCTION, send feedback to span *UNDER CONSTRUCTION, send feedback to
a.spl(href='mailto:team@codecombat.com') team@codecombat.com a.spl(href='mailto:team@codecombat.com') team@codecombat.com
div TODO: update images, add captions
div TODO: Add real marketing copy.
div(style='border-bottom: 1px solid black; margin-bottom: 20px') div(style='border-bottom: 1px solid black; margin-bottom: 20px')
.well.info-container .info-container
h1.center= course.title h1.center= course.title
p.center.gameplay-img-container p.center.gameplay-img-container
img(src='/images/pages/about/coco_comic.jpg' width='700') img(src='/images/pages/courses/102_info.png' width='800')
div.center.caption-text TODO: Add caption
p= course.description p= course.description
h1.center Learn More in Less Time
p
span.spr Your students will learn
strong.spr more computer science
span.spr material in
strong.spr less time
span with CodeCombat!
p
span.spr In about
strong.spr #{course.duration} hours
span.spr your students will work through
strong.spr #{course.levels.length} lessons
span and cover these high-level topics:
p p
span There is approximately ul
strong.spl 5 hours each topic in course.topics
span.spl of content. li= topic
h3 Topics
ul
each topic in course.topics
li= topic
h1.center No Experience Necesssary
p p
div.praise-quote "#{praise.quote}" strong.spr No outside experience
div.praise-source - #{praise.source} span is needed for students to complete this course. They will pick up where the left off from the previous CodeCombat course.
p
strong.spr Teachers do not need programming experience
span to administer this course. Your students will learn on their own.
p
span.spr There are built-in
strong.spr help videos, level guides, tool tips
span to explain everything to your students.
p
span.spr Use
strong.spr student progress monitoring
span to match up stronger students with those that need a little extra help!
h3 Extras h1.center Monitor Student Progress
p There are help videos and premium email support
p.center.monitoring-img-container p.center.monitoring-img-container
img(src='/images/pages/clans/dashboard_preview.png' width='700') img(src='/images/pages/clans/dashboard_preview.png' width='700')
p There is detailed student progress monitoring. div.center.caption-text TODO: Add caption
p.progress-container
ul
li
strong Track concepts
span.spl learned by each student
li Track levels completed for each student
li
span See your students'
strong.spl solutions
li Sort students by name or progress
h1.center Teachers Love CodeCombat!
p
div.praise-quote "#{praise.quote}"
div.caption-text - #{praise.source}
p.center p.center
button.btn.btn-info.btn-lg.btn-enroll(data-course-id="#{courseID}") Enroll button.btn.btn-info.btn-lg.btn-enroll(data-course-id="#{courseID}") Enroll Now
p.contact-container p.contact-container
span For more information, please contact span For more information, please contact

View file

@ -11,7 +11,7 @@ mixin deltaPanel(delta, conflict)
if delta.action === 'deleted' if delta.action === 'deleted'
strong(data-i18n="delta.deleted") Deleted strong(data-i18n="delta.deleted") Deleted
if delta.action === 'moved-index' if delta.action === 'moved-index'
strong(data-i18n="delta.modified_array") Moved Index strong(data-i18n="delta.moved_index") Moved Index
if delta.action === 'text-diff' if delta.action === 'text-diff'
strong(data-i18n="delta.text_diff") Text Diff strong(data-i18n="delta.text_diff") Text Diff
span span
@ -45,4 +45,4 @@ mixin deltaPanel(delta, conflict)
+deltaPanel(delta) +deltaPanel(delta)
if !deltas.length if !deltas.length
alert.alert-warning(data-i18n="delta.no_changes") No changes alert.alert-warning(data-i18n="delta.no_changes") No changes

View file

@ -1,6 +1,6 @@
a(href="/") a(href="/")
img#small-nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat") img#small-nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
if campaign if campaign
.map .map
.gradient.horizontal-gradient.top-gradient .gradient.horizontal-gradient.top-gradient
@ -39,9 +39,9 @@ if campaign
a.spr(href="/contribute/adventurer") a.spr(href="/contribute/adventurer")
strong(data-i18n="play.awaiting_levels_adventurer") Sign up as an Adventurer strong(data-i18n="play.awaiting_levels_adventurer") Sign up as an Adventurer
span.spl(data-i18n="play.awaiting_levels_adventurer_suffix") to be the first to play new levels. span.spl(data-i18n="play.awaiting_levels_adventurer_suffix") to be the first to play new levels.
if level.concepts && level.concepts.length if level.displayConcepts && level.displayConcepts.length
p p
for concept in level.concepts for concept in level.displayConcepts
kbd(data-i18n="concepts." + concept) kbd(data-i18n="concepts." + concept)
if !level.disabled && !level.locked if !level.disabled && !level.locked
@ -101,7 +101,7 @@ else
// button.btn.settings(data-toggle='coco-modal', data-target='play/modal/PlaySettingsModal', data-i18n="[title]play.settings") // button.btn.settings(data-toggle='coco-modal', data-target='play/modal/PlaySettingsModal', data-i18n="[title]play.settings")
if me.get('anonymous', true) if me.get('anonymous', true)
button.btn.settings(data-toggle='coco-modal', data-target='core/AuthModal', data-i18n="[title]play.settings") button.btn.settings(data-toggle='coco-modal', data-target='core/AuthModal', data-i18n="[title]play.settings")
.user-status.header-font .user-status.header-font
.user-status-line .user-status-line
span.gem.gem-30 span.gem.gem-30

View file

@ -10,30 +10,6 @@ if docs.length === 1
div div
!= docs[0].html != docs[0].html
if (!me.isPremium() || me.isAdmin()) && (me.get('preferredLanguage') || 'en-US').substr(0, 2) == 'en'
hr
h3 Want more programming lessons?
ul
li
strong
a(class="resource-link", data-resource="breakout-mentors", href='http://breakoutmentors.com/?referral=codecombat') Breakout Mentors
| : Personalized code mentoring for kids from Stanford and UC Berkeley mentors, online or in person.
li
strong
a(class="resource-link", data-resource="ostraining", href='https://www.ostraining.com/codecombat/') OSTraining
| : Watch over 2600 videos on how to make great websites with Wordpress, Drupal, Joomla, and more.
li
strong
a(class="resource-link", data-resource="one-month", href='http://mbsy.co/bVRtZ') One Month
| : Learn any tech skill in 30 days with just 15 minutes a day.
li
strong
a(class="resource-link", data-resource="code-school", href='http://mbsy.co/bVRsR') Code School
| : Learn web technologies with video lessons, coding challenges, and screencasts.
li
strong
a(class="resource-link", data-resource="pluralsight", href='http://shrsl.com/?~81i5') Pluralsight
| : Unlock new tech skills with over 3000 online courses.
else else
ul.nav.nav-tabs ul.nav.nav-tabs
for doc in docs for doc in docs

View file

@ -1,6 +1,8 @@
app = require 'core/application' app = require 'core/application'
RootView = require 'views/core/RootView' RootView = require 'views/core/RootView'
template = require 'templates/courses/mock1/course-details' template = require 'templates/courses/mock1/course-details'
CocoCollection = require 'collections/CocoCollection'
Campaign = require 'models/Campaign'
module.exports = class CourseDetailsView extends RootView module.exports = class CourseDetailsView extends RootView
id: 'course-details-view' id: 'course-details-view'
@ -9,40 +11,120 @@ module.exports = class CourseDetailsView extends RootView
events: events:
'change .expand-progress-checkbox': 'onExpandedProgressCheckbox' 'change .expand-progress-checkbox': 'onExpandedProgressCheckbox'
'change .select-session': 'onChangeSession' 'change .select-session': 'onChangeSession'
'change .student-mode-checkbox': 'onChangeStudent'
'click .btn-play-level': 'onClickPlayLevel'
'click .edit-class-name-btn': 'onClickEditClassName' 'click .edit-class-name-btn': 'onClickEditClassName'
'click .edit-description-btn': 'onClickEditClassDescription' 'click .edit-description-btn': 'onClickEditClassDescription'
'click .member-header': 'onClickMemberHeader'
'click .progress-header': 'onClickProgressHeader'
constructor: (options, @courseID) -> constructor: (options, @courseID) ->
super options super options
@initData() @initData()
destroy: ->
@stopListening?()
getRenderData: -> getRenderData: ->
context = super() context = super()
context.conceptsProgression = @conceptsProgression ? []
context.course = @course ? {} context.course = @course ? {}
context.courseConcepts = @courseConcepts ? []
context.instance = @instances?[@currentInstanceIndex] ? {} context.instance = @instances?[@currentInstanceIndex] ? {}
context.instances = @instances ? [] context.instances = @instances ? []
context.levelConceptsMap = @levelConceptsMap ? {}
context.maxLastStartedIndex = @maxLastStartedIndex ? 0 context.maxLastStartedIndex = @maxLastStartedIndex ? 0
context.memberSort = @memberSort
context.userConceptsMap = @userConceptsMap ? {}
context.userLevelStateMap = @userLevelStateMap ? {} context.userLevelStateMap = @userLevelStateMap ? {}
context.showExpandedProgress = @maxLastStartedIndex <= 30 or @showExpandedProgress context.showExpandedProgress = @course.levels.length <= 30 or @showExpandedProgress
context.studentMode = @options.studentMode ? false
context context
initData: -> initData: ->
@memberSort = 'nameAsc'
mockData = require 'views/courses/mock1/CoursesMockData' mockData = require 'views/courses/mock1/CoursesMockData'
@course = mockData.courses[@courseID] @course = mockData.courses[@courseID]
@currentInstanceIndex = 0 @currentInstanceIndex = 0
@instances = mockData.instances @instances = mockData.instances
@updateLevelMaps() @updateLevelMaps()
@campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign, comparator:'_id' })
@listenTo @campaigns, 'sync', @onCampaignSync
@supermodel.loadModel @campaigns, 'clan', cache: false
updateLevelMaps: -> updateLevelMaps: ->
@levelMap = {}
@levelMap[level] = true for level in @course.levels
@userLevelStateMap = {} @userLevelStateMap = {}
@maxLastStartedIndex = -1 @maxLastStartedIndex = -1
for student in @instances?[@currentInstanceIndex].students for student in @instances?[@currentInstanceIndex].students
@userLevelStateMap[student] = {}
lastCompletedIndex = _.random(0, @course.levels.length) lastCompletedIndex = _.random(0, @course.levels.length)
for i in [0..lastCompletedIndex]
@userLevelStateMap[student][@course.levels[i]] = 'complete'
lastStartedIndex = lastCompletedIndex + 1 lastStartedIndex = lastCompletedIndex + 1
@userLevelStateMap[student] = @userLevelStateMap[student][@course.levels[lastStartedIndex]] = 'started'
lastCompletedIndex: lastCompletedIndex
lastStartedIndex: lastStartedIndex
@maxLastStartedIndex = lastStartedIndex if lastStartedIndex > @maxLastStartedIndex @maxLastStartedIndex = lastStartedIndex if lastStartedIndex > @maxLastStartedIndex
@sortMembers()
sortMembers: ->
# Progress sort precedence: most completed concepts, most started concepts, most levels, name sort
instance = @instances?[@currentInstanceIndex] ? {}
return if _.isEmpty(instance)
switch @memberSort
when "nameDesc"
instance.students.sort (a, b) -> b.localeCompare(a)
when "progressAsc"
instance.students.sort (a, b) =>
for level in @course.levels
if @userLevelStateMap[a][level] isnt 'complete' and @userLevelStateMap[b][level] is 'complete'
return -1
else if @userLevelStateMap[a][level] is 'complete' and @userLevelStateMap[b][level] isnt 'complete'
return 1
0
when "progressDesc"
instance.students.sort (a, b) =>
for level in @course.levels
if @userLevelStateMap[a][level] isnt 'complete' and @userLevelStateMap[b][level] is 'complete'
return 1
else if @userLevelStateMap[a][level] is 'complete' and @userLevelStateMap[b][level] isnt 'complete'
return -1
0
else
instance.students.sort (a, b) -> a.localeCompare(b)
onCampaignSync: ->
return unless @campaigns.loaded
@conceptsProgression = []
@courseConcepts = []
@levelConceptsMap = {}
@levelNameSlugMap = {}
@userConceptsMap = {}
for campaign in @campaigns.models
continue if campaign.get('slug') is 'auditions'
for levelID, level of campaign.get('levels')
@levelNameSlugMap[level.name] = level.slug
if level.concepts?
for concept in level.concepts
@conceptsProgression.push concept unless concept in @conceptsProgression
continue unless @levelMap[level.name]
@courseConcepts.push concept unless concept in @courseConcepts
@levelConceptsMap[level.name] ?= {}
@levelConceptsMap[level.name][concept] = true
for student in @instances?[@currentInstanceIndex].students
@userConceptsMap[student] ?= {}
if @userLevelStateMap[student][level.name] is 'complete'
@userConceptsMap[student][concept] = 'complete'
else if @userLevelStateMap[student][level.name] is 'started'
@userConceptsMap[student][concept] ?= 'started'
@courseConcepts.sort (a, b) => if @conceptsProgression.indexOf(a) < @conceptsProgression.indexOf(b) then -1 else 1
@render?()
onChangeStudent: (e) ->
@options.studentMode = $('.student-mode-checkbox').prop('checked')
@render?()
$('.student-mode-checkbox').attr('checked', @options.studentMode)
onChangeSession: (e) -> onChangeSession: (e) ->
@showExpandedProgress = false @showExpandedProgress = false
@ -50,6 +132,7 @@ module.exports = class CourseDetailsView extends RootView
for val, index in @instances when val.name is newSessionValue for val, index in @instances when val.name is newSessionValue
@currentInstanceIndex = index @currentInstanceIndex = index
@updateLevelMaps() @updateLevelMaps()
@onCampaignSync()
@render?() @render?()
onExpandedProgressCheckbox: (e) -> onExpandedProgressCheckbox: (e) ->
@ -63,3 +146,22 @@ module.exports = class CourseDetailsView extends RootView
onClickEditClassDescription: (e) -> onClickEditClassDescription: (e) ->
alert 'TODO: Popup for editing description for this course session' alert 'TODO: Popup for editing description for this course session'
onClickMemberHeader: (e) ->
@memberSort = if @memberSort is 'nameAsc' then 'nameDesc' else 'nameAsc'
@sortMembers()
@render?()
onClickProgressHeader: (e) ->
@memberSort = if @memberSort is 'progressAsc' then 'progressDesc' else 'progressAsc'
@sortMembers()
@render?()
onClickPlayLevel: (e) ->
levelName = $(e.target).data('level')
levelSlug = @levelNameSlugMap[levelName]
Backbone.Mediator.publish 'router:navigate', {
route: "/play/level/#{levelSlug}"
viewClass: 'views/play/level/PlayLevelView'
viewArgs: [{}, levelSlug]
}

View file

@ -25,64 +25,64 @@ data.courses = [
{ {
title: 'Introduction to Computer Science' title: 'Introduction to Computer Science'
description: 'Learn basic syntax, while loops, and the CodeCombat learning environment.' description: 'Learn basic syntax, while loops, and the CodeCombat learning environment.'
topics: ['Basic syntax', 'Strings', 'While Loops'] topics: ['Basic Syntax', 'Strings', 'Loops']
duration: '1 hour of material' duration: 1
levels: ['Dungeons of Kithgard', 'Gems in the Deep', 'Shadow Guard', 'Kounter Kithwise', 'Crawlways of Kithgard', 'Enemy Mine', 'Illusory Interruption', 'Forgetful Gemsmith', 'Signs and Portents', 'Favorable Odds', 'True Names', 'The Prisoner', 'Banefire', 'The Raised Sword', 'Haunted Kithmaze', 'Riddling Kithmaze', 'Descending Further', 'The Second Kithmaze', 'Dread Door', 'Cupboards of Kithgard', 'Hack and Dash'] levels: ['Dungeons of Kithgard', 'Gems in the Deep', 'Shadow Guard', 'Kounter Kithwise', 'Crawlways of Kithgard', 'Enemy Mine', 'Illusory Interruption', 'Forgetful Gemsmith', 'Signs and Portents', 'Favorable Odds', 'True Names', 'The Prisoner', 'Banefire', 'The Raised Sword', 'Haunted Kithmaze', 'Riddling Kithmaze', 'Descending Further', 'The Second Kithmaze', 'Dread Door', 'Cupboards of Kithgard', 'Hack and Dash']
}, },
{ {
title: 'Computer Science 102' title: 'Computer Science 102'
description: 'Add parameters, if statements, and some other stuff.' description: 'Computer Science 102 introduces Arguments, Variables, If Statements, and Arithmetic.'
topics: ['Variables', 'Booleans', 'If Statements', 'Arithmetic'] topics: ['Arguments', 'Variables', 'If Statements', 'Arithmetic']
duration: '5 hours of material' duration: 5
levels: ['Known Enemy', 'Master of Names', 'Lowly Kithmen', 'Closing the Distance', 'Tactical Strike', 'The Final Kithmaze', 'The Gauntlet', 'Radiant Aura', 'Kithgard Gates', 'Destroying Angel', 'Deadly Dungeon Rescue', 'Kithgard Brawl', 'Cavern Survival', 'Breakout', 'Attack Wisely!', 'Kithgard Mastery', 'Kithgard Apprentice', 'Long Kithmaze', 'Boom! and Bust', 'Defense of Plainswood', 'Winding Trail', 'Thumb Biter', 'Gems or Death', 'Backwoods Ambush', 'Patrol Buster', 'Endangered Burl', 'Village Guard', 'Thornbush Farm', 'Back to Back', 'Ogre Encampment', 'Woodland Cleaver', 'Shield Rush', 'Peasant Protection', 'Munchkin Swarm'] levels: ['Known Enemy', 'Master of Names', 'Lowly Kithmen', 'Closing the Distance', 'Tactical Strike', 'The Final Kithmaze', 'The Gauntlet', 'Radiant Aura', 'Kithgard Gates', 'Destroying Angel', 'Deadly Dungeon Rescue', 'Kithgard Brawl', 'Cavern Survival', 'Breakout', 'Attack Wisely!', 'Kithgard Mastery', 'Kithgard Apprentice', 'Long Kithmaze', 'Boom! and Bust', 'Defense of Plainswood', 'Winding Trail', 'Thumb Biter', 'Gems or Death', 'Backwoods Ambush', 'Patrol Buster', 'Endangered Burl', 'Village Guard', 'Thornbush Farm', 'Back to Back', 'Ogre Encampment', 'Woodland Cleaver', 'Shield Rush', 'Peasant Protection', 'Munchkin Swarm']
}, },
{ {
title: 'Computer Science 103' title: 'Computer Science 103'
description: 'Learn how to handle input.' description: 'Learn how to handle input.'
topics: ['If Statements', 'Arithmetic', 'Input Handling'] topics: ['If Statements', 'Arithmetic', 'Input Handling']
duration: '5 hours of material' duration: 5
levels: ['Munchkin Harvest', 'Swift Dagger', 'Shrapnel', 'Arcane Ally', 'Touch of Death', 'Bonemender', 'Coinucopia', 'Copper Meadows', 'Drop the Flag', 'Deadly Pursuit', 'Rich Forager', 'Siege of Stonehold', 'Multiplayer Treasure Grove', 'Dueling Grounds', 'Backwoods Brawl', 'Backwoods Treasure', 'Range Finder', 'Stillness in Motion', 'The Agrippa Defense', 'Storming the Towers of Areth', 'Hold the Forest Pass', 'Hold for Reinforcements', 'Storming the Farmhouse', 'Wild Horses', 'Boulder Woods', 'Unfair Support', 'Tactical Timing', 'Apocalypse', 'Doom Glade', 'Defend the Garrison', 'Lost Viking', 'Forest Flower Grove', 'The Dunes', 'The Mighty Sand Yak', 'Oasis', 'Sarven Road', 'Sarven Gaps', 'Thunderhooves', 'Medical Attention', 'The Great Yak Stampede', 'Minesweeper', 'Sarven Sentry', 'Keeping Time'] levels: ['Munchkin Harvest', 'Swift Dagger', 'Shrapnel', 'Arcane Ally', 'Touch of Death', 'Bonemender', 'Coinucopia', 'Copper Meadows', 'Drop the Flag', 'Deadly Pursuit', 'Rich Forager', 'Siege of Stonehold', 'Multiplayer Treasure Grove', 'Dueling Grounds', 'Backwoods Brawl', 'Backwoods Treasure', 'Range Finder', 'Stillness in Motion', 'The Agrippa Defense', 'Storming the Towers of Areth', 'Hold the Forest Pass', 'Hold for Reinforcements', 'Storming the Farmhouse', 'Wild Horses', 'Boulder Woods', 'Unfair Support', 'Tactical Timing', 'Apocalypse', 'Doom Glade', 'Defend the Garrison', 'Lost Viking', 'Forest Flower Grove', 'The Dunes', 'The Mighty Sand Yak', 'Oasis', 'Sarven Road', 'Sarven Gaps', 'Thunderhooves', 'Medical Attention', 'The Great Yak Stampede', 'Minesweeper', 'Sarven Sentry', 'Keeping Time']
}, },
{ {
title: 'Computer Science 104' title: 'Computer Science 104'
description: 'Time to tackle arrays and some pvp stuff.' description: 'Time to tackle arrays and some pvp stuff.'
topics: ['Arrays', 'Break Statements'] topics: ['Loops', 'Break Statements', 'Arrays']
duration: '5 hours of material' duration: 5
levels: ['Hoarding Gold', 'Decoy Drill', 'Yakstraction', 'Sarven Brawl', 'Desert Combat', 'Dust', 'Sarven Rescue', 'Sacred Statue', 'Mirage Maker', 'Sarven Savior', 'Odd Sandstorm', 'Lurkers', 'Preferential Treatment', 'Sarven Shepherd', 'Shine Getter', 'The Trials', 'Mad Maxer', 'Mad Maxer Strikes Back', 'Mad Maxer Sells Out', 'Mad Maxer Gets Greedy', 'Mad Maxer: Redemption', 'Sarven Treasure', 'Harrowland', 'Sarven Siege', 'Clash of Clones', 'Sand Snakes', 'Crag Tag'] levels: ['Hoarding Gold', 'Decoy Drill', 'Yakstraction', 'Sarven Brawl', 'Desert Combat', 'Dust', 'Sarven Rescue', 'Sacred Statue', 'Mirage Maker', 'Sarven Savior', 'Odd Sandstorm', 'Lurkers', 'Preferential Treatment', 'Sarven Shepherd', 'Shine Getter', 'The Trials', 'Mad Maxer', 'Mad Maxer Strikes Back', 'Mad Maxer Sells Out', 'Mad Maxer Gets Greedy', 'Mad Maxer: Redemption', 'Sarven Treasure', 'Harrowland', 'Sarven Siege', 'Clash of Clones', 'Sand Snakes', 'Crag Tag']
}, },
{ {
title: 'Computer Science 105' title: 'Computer Science 105'
description: 'Time to tackle arrays and some PVP.' description: 'Time to tackle arrays and some PVP.'
topics: ['Arrays', 'Break Statements', 'Object Literals'] topics: ['Break Statements', 'Arrays', 'Object Literals']
duration: '5 hours of material' duration: 5
levels: ['Slalom', 'Black Diamond', 'Treasure Cave', 'Ogre Gorge Gouger', 'Dance-Off', 'Alpine Rally', 'Cloudrip Commander', 'Mountain Mercenaries'] levels: ['Slalom', 'Black Diamond', 'Treasure Cave', 'Ogre Gorge Gouger', 'Dance-Off', 'Alpine Rally', 'Cloudrip Commander', 'Mountain Mercenaries']
}, },
{ {
title: 'Computer Science 106' title: 'Computer Science 106'
description: 'For loops!' description: 'For loops!'
topics: ['Break Statements', 'Object Literals', 'For loops'] topics: ['Break Statements', 'Object Literals', 'For loops']
duration: '5 hours of material' duration: 5
levels: ['Timber Guard', 'Hunting Party', 'Zoo Keeper', 'Cloudrip Brawl', 'Cloudrip Treasure', 'Cloudrip Siege', 'Noble Sacrifice', 'Zero Sum', 'Borrowed Sword', 'Protect and Serve'] levels: ['Timber Guard', 'Hunting Party', 'Zoo Keeper', 'Cloudrip Brawl', 'Cloudrip Treasure', 'Cloudrip Siege', 'Noble Sacrifice', 'Zero Sum', 'Borrowed Sword', 'Protect and Serve']
}, },
{ {
title: 'Computer Science 107' title: 'Computer Science 107'
description: 'Functions!' description: 'Functions!'
topics: ['Object Literals', 'For loops', 'Functions'] topics: ['Object Literals', 'For loops', 'Functions']
duration: '5 hours of material' duration: 5
levels: ['Vital Powers', 'Timber Turncoat', 'Restless Dead', 'Ring Bearer', 'The Two Flowers', 'The Geometry of Flowers', 'Mountain Flower Grove', 'Hunters and Prey', 'Library Tactician'] levels: ['Vital Powers', 'Timber Turncoat', 'Restless Dead', 'Ring Bearer', 'The Two Flowers', 'The Geometry of Flowers', 'Mountain Flower Grove', 'Hunters and Prey', 'Library Tactician']
}, },
{ {
title: 'Computer Science 108' title: 'Computer Science 108'
description: 'Maths.' description: 'Maths.'
topics: ['For loops', 'Functions', 'Math Operations'] topics: ['For loops', 'Functions', 'Math Operations']
duration: '5 hours of material' duration: 5
levels: ['Steelclaw Gap', 'Pesky Yaks', 'Mixed Unit Tactics', 'Sowing Fire', 'Reaping Fire', 'Toil and Trouble', 'What in Carnation', 'Misty Island Mine', 'Raiders of the Long Dark', 'Grim Determination', 'Deadly Discs', "Summit's Gate"] levels: ['Steelclaw Gap', 'Pesky Yaks', 'Mixed Unit Tactics', 'Sowing Fire', 'Reaping Fire', 'Toil and Trouble', 'What in Carnation', 'Misty Island Mine', 'Raiders of the Long Dark', 'Grim Determination', 'Deadly Discs', "Summit's Gate"]
}, },
{ {
title: 'Computer Science 109' title: 'Computer Science 109'
description: 'Vectors and strings.' description: 'Vectors and strings.'
topics: ['Vectors', 'Advanced Strings'] topics: ['Vectors', 'Advanced Strings']
duration: '5 hours of material' duration: 5
levels: ['Circle Walking', 'Skating Away', 'Kelvintaph Crusader', 'Kelvintaph Burgler', 'Ice Soccer', 'Razorfray'] levels: ['Circle Walking', 'Skating Away', 'Kelvintaph Crusader', 'Kelvintaph Burgler', 'Ice Soccer', 'Razorfray']
} }
] ]

View file

@ -47,7 +47,6 @@ module.exports = class WorldSelectModal extends ModalView
canvases.attr('width', currentView.$el.width()*.8-70) canvases.attr('width', currentView.$el.width()*.8-70)
canvases.attr('height', currentView.$el.height()*.6) canvases.attr('height', currentView.$el.height()*.6)
@surface = new Surface @world, normalCanvas, webGLCanvas, { @surface = new Surface @world, normalCanvas, webGLCanvas, {
wizards: false
paths: false paths: false
grid: true grid: true
navigateToSelection: false navigateToSelection: false

View file

@ -46,7 +46,7 @@ module.exports = class LevelThangEditView extends CocoView
level: @level level: @level
world: @world world: @world
if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then options.thangType = thangType if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then options.thangType = thangType
@thangComponentEditView = new ThangComponentsEditView options @thangComponentEditView = new ThangComponentsEditView options
@listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged @listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged

View file

@ -202,7 +202,6 @@ module.exports = class ThangsTabView extends CocoView
webGLCanvas = $('canvas#webgl-surface', @$el) webGLCanvas = $('canvas#webgl-surface', @$el)
normalCanvas = $('canvas#normal-surface', @$el) normalCanvas = $('canvas#normal-surface', @$el)
@surface = new Surface @world, normalCanvas, webGLCanvas, { @surface = new Surface @world, normalCanvas, webGLCanvas, {
wizards: false
paths: false paths: false
coords: true coords: true
grid: true grid: true
@ -583,14 +582,14 @@ module.exports = class ThangsTabView extends CocoView
if batchInsert if batchInsert
if thangType.get('name') is 'Hero Placeholder' if thangType.get('name') is 'Hero Placeholder'
thangID = 'Hero Placeholder' thangID = 'Hero Placeholder'
return if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or @getThangByID(thangID) return if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']) or @getThangByID(thangID)
else else
thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}" thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}"
else else
thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID) thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID)
if @cloneSourceThang if @cloneSourceThang
components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components
else if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] else if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
components = [] # Load them all from default ThangType Components components = [] # Load them all from default ThangType Components
else else
components = _.cloneDeep thangType.get('components') ? [] components = _.cloneDeep thangType.get('components') ? []

View file

@ -139,5 +139,5 @@ oldArenas = [
campaigns = [ campaigns = [
{id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: heroArenas} {id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: heroArenas}
{id: 'old_multiplayer', name: '(Deprecated) Old Multiplayer Arenas', description: 'Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas.', levels: oldArenas} #{id: 'old_multiplayer', name: '(Deprecated) Old Multiplayer Arenas', description: 'Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas.', levels: oldArenas}
] ]

View file

@ -264,6 +264,7 @@ module.exports = class CampaignView extends RootView
level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete'] level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete']
level.locked = false if @editorMode level.locked = false if @editorMode
level.locked = false if @campaign?.get('name') is 'Auditions' level.locked = false if @campaign?.get('name') is 'Auditions'
level.locked = false if @campaign?.get('name') is 'Intro'
level.locked = false if me.isInGodMode() level.locked = false if me.isInGodMode()
level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete'] level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete']
level.disabled = false if me.isInGodMode() level.disabled = false if me.isInGodMode()
@ -275,6 +276,11 @@ module.exports = class CampaignView extends RootView
if level.unlocksHero if level.unlocksHero
level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or []) level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or [])
level.hidden = level.locked level.hidden = level.locked
if level.concepts?.length
level.displayConcepts = level.concepts
maxConcepts = 6
if level.displayConcepts.length > maxConcepts
level.displayConcepts = level.displayConcepts.slice -maxConcepts
level level
countLevels: (levels) -> countLevels: (levels) ->
@ -348,7 +354,7 @@ module.exports = class CampaignView extends RootView
@particleMan.attach @$el.find('.map') @particleMan.attach @$el.find('.map')
for level in @campaign.renderedLevels ? {} for level in @campaign.renderedLevels ? {}
particleKey = ['level', @terrain] particleKey = ['level', @terrain]
particleKey.push level.type if level.type and level.type isnt 'hero' particleKey.push level.type if level.type and not (level.type in ['hero', 'course'])
particleKey.push 'replayable' if level.replayable particleKey.push 'replayable' if level.replayable
particleKey.push 'premium' if level.requiresSubscription particleKey.push 'premium' if level.requiresSubscription
particleKey.push 'gate' if level.slug in ['kithgard-gates', 'siege-of-stonehold', 'clash-of-clones', 'summits-gate'] particleKey.push 'gate' if level.slug in ['kithgard-gates', 'siege-of-stonehold', 'clash-of-clones', 'summits-gate']
@ -468,7 +474,7 @@ module.exports = class CampaignView extends RootView
levelElement = $(e.target).parents('.level-info-container') levelElement = $(e.target).parents('.level-info-container')
levelSlug = levelElement.data('level-slug') levelSlug = levelElement.data('level-slug')
level = _.find _.values(@campaign.get('levels')), slug: levelSlug level = _.find _.values(@campaign.get('levels')), slug: levelSlug
if level.type is 'hero-ladder' if level.type in ['hero-ladder', 'course-ladder']
Backbone.Mediator.publish 'router:navigate', route: "/play/ladder/#{levelSlug}", viewClass: 'views/ladder/LadderView', viewArgs: [{supermodel: @supermodel}, levelSlug] Backbone.Mediator.publish 'router:navigate', route: "/play/ladder/#{levelSlug}", viewClass: 'views/ladder/LadderView', viewArgs: [{supermodel: @supermodel}, levelSlug]
else else
@showLeaderboard levelSlug @showLeaderboard levelSlug

View file

@ -1,337 +0,0 @@
RootView = require 'views/core/RootView'
template = require 'templates/play/main-play-view'
LevelSession = require 'models/LevelSession'
CocoCollection = require 'collections/CocoCollection'
class LevelSessionsCollection extends CocoCollection
url: ''
model: LevelSession
constructor: (model) ->
super()
@url = "/db/user/#{me.id}/level.sessions?project=state.complete,levelID"
module.exports = class MainPlayView extends RootView
id: 'play-view'
template: template
constructor: (options) ->
super options
@levelStatusMap = {}
@levelPlayCountMap = {}
@sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', {cache: false}, 0).model
@listenToOnce @sessions, 'sync', @onSessionsLoaded
@getLevelPlayCounts()
onSessionsLoaded: (e) ->
for session in @sessions.models
@levelStatusMap[session.get('levelID')] = if session.get('state')?.complete then 'complete' else 'started'
@render()
getLevelPlayCounts: ->
success = (levelPlayCounts) =>
return if @destroyed
for level in levelPlayCounts
@levelPlayCountMap[level._id] = playtime: level.playtime, sessions: level.sessions
@render() if @supermodel.finished()
levelIDs = []
for campaign in campaigns
for level in campaign.levels
levelIDs.push level.id
levelPlayCountsRequest = @supermodel.addRequestResource 'play_counts', {
url: '/db/level/-/play_counts'
data: {ids: levelIDs}
method: 'POST'
success: success
}, 0
levelPlayCountsRequest.load()
getRenderData: (context={}) ->
context = super(context)
context.campaigns = campaigns
context.levelStatusMap = @levelStatusMap
context.levelPlayCountMap = @levelPlayCountMap
context
tutorials = [
{
name: 'Rescue Mission'
difficulty: 1
id: 'rescue-mission'
image: '/file/db/level/52740644904ac0411700067c/rescue_mission_icon.png'
description: 'Tharin has been captured!'
}
{
name: 'Grab the Mushroom'
difficulty: 1
id: 'grab-the-mushroom'
image: '/file/db/level/529662dfe0df8f0000000007/grab_the_mushroom_icon.png'
description: 'Grab a powerup and smash a big ogre.'
}
{
name: 'Drink Me'
difficulty: 1
id: 'drink-me'
image: '/file/db/level/525dc5589a0765e496000006/drink_me_icon.png'
description: 'Drink up and slay two munchkins.'
}
{
name: 'Taunt the Guards'
difficulty: 1
id: 'taunt-the-guards'
image: '/file/db/level/5276c9bdcf83207a2801ff8f/taunt_icon.png'
description: 'Tharin, if clever, can escape with Phoebe.'
}
{
name: 'It\'s a Trap'
difficulty: 1
id: 'its-a-trap'
image: '/file/db/level/528aea2d7f37fc4e0700016b/its_a_trap_icon.png'
description: 'Organize a dungeon ambush with archers.'
}
{
name: 'Break the Prison'
difficulty: 1
id: 'break-the-prison'
image: '/file/db/level/5275272c69abdcb12401216e/break_the_prison_icon.png'
description: 'More comrades are imprisoned!'
}
{
name: 'Taunt'
difficulty: 1
id: 'taunt'
image: '/file/db/level/525f150306e1ab0962000018/taunt_icon.png'
description: 'Taunt the ogre to claim victory.'
}
{
name: 'Cowardly Taunt'
difficulty: 1
id: 'cowardly-taunt'
image: '/file/db/level/525abfd9b12777d78e000009/cowardly_taunt_icon.png'
description: 'Lure infuriated ogres to their doom.'
}
{
name: 'Commanding Followers'
difficulty: 1
id: 'commanding-followers'
image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png'
description: 'Lead allied soldiers into battle.'
}
{
name: 'Mobile Artillery'
difficulty: 1
id: 'mobile-artillery'
image: '/file/db/level/525085419851b83f4b000001/mobile_artillery_icon.png'
description: 'Blow ogres up!'
}
]
experienced = [
{
name: 'Hunter Triplets'
difficulty: 2
id: 'hunter-triplets'
image: '/file/db/level/526711d9add4f8965f000002/hunter_triplets_icon.png'
description: 'Three soldiers go ogre hunting.'
}
{
name: 'Emphasis on Aim'
difficulty: 2
id: 'emphasis-on-aim'
image: '/file/db/level/525f384d96cd77000000000f/munchkin_masher_icon.png'
description: 'Choose your targets carefully.'
}
{
name: 'Zone of Danger'
difficulty: 3
id: 'zone-of-danger'
image: '/file/db/level/526ae95c1e5cd30000000008/zone_of_danger_icon.png'
description: 'Target the ogres swarming into arrow range.'
}
{
name: 'Molotov Medic'
difficulty: 2
id: 'molotov-medic'
image: '/file/db/level/52602ecb026e8481e7000001/generic_1.png'
description: 'Tharin must play support in this dungeon battle.'
}
{
name: 'Gridmancer'
difficulty: 5
id: 'gridmancer'
image: '/file/db/level/52ae2460ef42c52f13000008/gridmancer_icon.png'
description: 'Super algorithm challenge level!'
}
]
arenas = [
{
name: 'Criss-Cross'
difficulty: 5
id: 'criss-cross'
image: '/file/db/level/528aea2d7f37fc4e0700016b/its_a_trap_icon.png'
description: 'Participate in a bidding war with opponents to reach the other side!'
levelPath: 'ladder'
}
{
name: 'Greed'
difficulty: 4
id: 'greed'
image: '/file/db/level/526fd3043c637ece50001bb2/the_herd_icon.png'
description: 'Liked Dungeon Arena and Gold Rush? Put them together in this economic arena!'
levelPath: 'ladder'
}
{
name: 'Dungeon Arena'
difficulty: 3
id: 'dungeon-arena'
image: '/file/db/level/526ae95c1e5cd30000000008/zone_of_danger_icon.png'
description: 'Play head-to-head against fellow Wizards in a dungeon melee!'
levelPath: 'ladder'
}
{
name: 'Gold Rush'
difficulty: 3
id: 'gold-rush'
image: '/file/db/level/52602ecb026e8481e7000001/generic_1.png'
description: 'Prove you are better at collecting gold than your opponent!'
levelPath: 'ladder'
}
{
name: 'Brawlwood'
difficulty: 4
id: 'brawlwood'
image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png'
description: 'Combat the armies of other Wizards in a strategic forest arena! (Fast computer required.)'
levelPath: 'ladder'
}
{
name: 'Sky Span (Testing)'
difficulty: 3
id: 'sky-span'
image: '/file/db/level/526ae95c1e5cd30000000008/zone_of_danger_icon.png'
description: 'Preview version of an upgraded Dungeon Arena. Help us with hero balance before release!'
levelPath: 'ladder'
}
]
classicAlgorithms = [
{
name: 'Bubble Sort Bootcamp Battle'
difficulty: 3
id: 'bubble-sort-bootcamp-battle'
image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png'
description: 'Write a bubble sort to organize your soldiers. - by Alexandru Caciulescu'
}
{
name: 'Ogres of Hanoi'
difficulty: 3
id: 'ogres-of-hanoi'
image: '/file/db/level/526fd3043c637ece50001bb2/the_herd_icon.png'
description: 'Transfer a stack of ogres while preserving their honor. - by Alexandru Caciulescu'
}
{
name: 'Danger! Minefield'
difficulty: 3
id: 'danger-minefield'
image: '/file/db/level/526bda3fe79aefde2a003e36/mobile_artillery_icon.png'
description: 'Learn how to find prime numbers while defusing mines! - by Alexandru Caciulescu'
}
{
name: 'K-means++ Cluster Wars'
difficulty: 4
id: 'k-means-cluster-wars'
image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png'
description: 'Learn cluster analysis while leading armies into battle! - by Alexandru Caciulescu'
}
{
name: 'Quicksort the Spiral'
difficulty: 3
id: 'quicksort-the-spiral'
image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png'
description: 'Learn Quicksort while sorting a spiral of ogres! - by Alexandru Caciulescu'
}
{
name: 'Minimax Tic-Tac-Toe'
difficulty: 4
id: 'minimax-tic-tac-toe'
image: '/file/db/level/525ef8ef06e1ab0962000003/commanding_followers_icon.png'
description: 'Learn how to make a game AI with the Minimax algorithm. - by Alexandru Caciulescu'
}
]
playerCreated = [
{
name: 'Extra Extrapolation'
difficulty: 2
id: 'extra-extrapolation'
image: '/file/db/level/526bda3fe79aefde2a003e36/mobile_artillery_icon.png'
description: 'Predict your target\'s position for deadly aim. - by Sootn'
}
{
name: 'The Right Route'
difficulty: 1
id: 'the-right-route'
image: '/file/db/level/526fd3043c637ece50001bb2/the_herd_icon.png'
description: 'Strike at the weak point in an array of enemies. - by Aftermath'
}
{
name: 'Sword Loop'
difficulty: 2
id: 'sword-loop'
image: '/file/db/level/525dc5589a0765e496000006/drink_me_icon.png'
description: 'Kill the ogres and save the peasants with for-loops. - by Prabh Simran Singh Baweja'
}
{
name: 'Coin Mania'
difficulty: 2
id: 'coin-mania'
image: '/file/db/level/529662dfe0df8f0000000007/grab_the_mushroom_icon.png'
description: 'Learn while-loops to grab coins and potions. - by Prabh Simran Singh Baweja'
}
{
name: 'Find the Spy'
difficulty: 2
id: 'find-the-spy'
image: '/file/db/level/526ae95c1e5cd30000000008/zone_of_danger_icon.png'
description: 'Identify the spies hidden among your soldiers - by Nathan Gossett'
}
{
name: 'Harvest Time'
difficulty: 2
id: 'harvest-time'
image: '/file/db/level/529662dfe0df8f0000000007/grab_the_mushroom_icon.png'
description: 'Collect a hundred mushrooms in just five lines of code - by Nathan Gossett'
}
{
name: 'Guide Everyone Home'
difficulty: 2
id: 'guide-everyone-home'
image: '/file/db/level/52740644904ac0411700067c/rescue_mission_icon.png'
description: 'Fetch the wizards teleporting into the area - by Nathan Gossett'
}
{
name: "Let's go Fly a Kite"
difficulty: 3
id: 'lets-go-fly-a-kite'
image: '/file/db/level/526711d9add4f8965f000002/hunter_triplets_icon.png'
description: 'There is a horde of ogres marching on your village. Stay out of reach and use your bow to take them out! - by Danny Whittaker'
}
{
name: "IFC - Videira"
difficulty: 3
id: 'ifc-videira'
image: '/file/db/level/52602ecb026e8481e7000001/generic_1.png'
description: 'A level inspired by IFC Videira. - by Leonardo Meneguzzi.'
}
]
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_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}
]

View file

@ -119,19 +119,6 @@ module.exports = class SpectateLevelView extends RootView
@register() @register()
@controlBar.setBus(@bus) @controlBar.setBus(@bus)
@surface.showLevel() @surface.showLevel()
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')
name: @session.get('creatorName')
team: @session.get('team')
levelSlug: @level.get('slug')
@surface.createOpponentWizard
id: @otherSession.get('creator')
name: @otherSession.get('creatorName')
team: @otherSession.get('team')
levelSlug: @level.get('slug')
grabLevelLoaderData: -> grabLevelLoaderData: ->
@session = @levelLoader.session @session = @levelLoader.session
@ -207,7 +194,7 @@ module.exports = class SpectateLevelView extends RootView
initSurface: -> initSurface: ->
webGLSurface = $('canvas#webgl-surface', @$el) webGLSurface = $('canvas#webgl-surface', @$el)
normalSurface = $('canvas#normal-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) is 'ladder', playerNames: @findPlayerNames() @surface = new Surface @world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, playerNames: @findPlayerNames()
worldBounds = @world.getBounds() worldBounds = @world.getBounds()
bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}] bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}]
@surface.camera.setBounds(bounds) @surface.camera.setBounds(bounds)

View file

@ -35,7 +35,7 @@ module.exports = class ControlBarView extends CocoView
@spectateGame = options.spectateGame ? false @spectateGame = options.spectateGame ? false
@observing = options.session.get('creator') isnt me.id @observing = options.session.get('creator') isnt me.id
super options super options
if @level.get('type') in ['hero-ladder'] and me.isAdmin() if @level.get('type') in ['hero-ladder', 'course-ladder'] and me.isAdmin()
@isMultiplayerLevel = true @isMultiplayerLevel = true
@multiplayerStatusManager = new MultiplayerStatusManager @levelID, @onMultiplayerStateChanged @multiplayerStatusManager = new MultiplayerStatusManager @levelID, @onMultiplayerStateChanged
if @level.get 'replayable' if @level.get 'replayable'
@ -59,7 +59,7 @@ module.exports = class ControlBarView extends CocoView
super c super c
c.worldName = @worldName c.worldName = @worldName
c.multiplayerEnabled = @session.get('multiplayer') c.multiplayerEnabled = @session.get('multiplayer')
c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder'] c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder', 'course-ladder']
if c.isMultiplayerLevel = @isMultiplayerLevel if c.isMultiplayerLevel = @isMultiplayerLevel
c.multiplayerStatus = @multiplayerStatusManager?.status c.multiplayerStatus = @multiplayerStatusManager?.status
if @level.get 'replayable' if @level.get 'replayable'
@ -71,22 +71,27 @@ module.exports = class ControlBarView extends CocoView
c.spectateGame = @spectateGame c.spectateGame = @spectateGame
c.observing = @observing c.observing = @observing
@homeViewArgs = [{supermodel: if @hasReceivedMemoryWarning then null else @supermodel}] @homeViewArgs = [{supermodel: if @hasReceivedMemoryWarning then null else @supermodel}]
if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder'] if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder', 'course-ladder']
levelID = @level.get('slug').replace /\-tutorial$/, '' levelID = @level.get('slug').replace /\-tutorial$/, ''
@homeLink = c.homeLink = '/play/ladder/' + levelID @homeLink = '/play/ladder/' + levelID
@homeViewClass = 'views/ladder/LadderView' @homeViewClass = 'views/ladder/LadderView'
@homeViewArgs.push levelID @homeViewArgs.push levelID
else if @level.get('type', true) in ['hero', 'hero-coop'] else if @level.get('type', true) in ['hero', 'hero-coop']
@homeLink = c.homeLink = '/play' @homeLink = '/play'
@homeViewClass = 'views/play/CampaignView' @homeViewClass = 'views/play/CampaignView'
campaign = @level.get 'campaign' campaign = @level.get 'campaign'
@homeLink += '/' + campaign @homeLink += '/' + campaign
@homeViewArgs.push campaign @homeViewArgs.push campaign
else if @level.get('type', true) in ['campaign'] else if @level.get('type', true) in ['course', 'course-ladder']
@homeLink = c.homeLink = '/play-old' @homeLink = '/courses/mock1'
@homeViewClass = 'views/MainPlayView' @homeViewClass = 'views/courses/mock1/CourseDetailsView'
#campaign = @level.get 'campaign'
#@homeLink += '/' + campaign
#@homeViewArgs.push campaign
@homeLink += '/' + '0'
@homeViewArgs.push '0'
else else
@homeLink = c.homeLink = '/' @homeLink = '/'
@homeViewClass = 'views/HomeView' @homeViewClass = 'views/HomeView'
c.editorLink = "/editor/level/#{@level.get('slug')}" c.editorLink = "/editor/level/#{@level.get('slug')}"
c.homeLink = @homeLink c.homeLink = @homeLink

View file

@ -109,7 +109,6 @@ module.exports = class LevelPlaybackView extends CocoView
@togglePlaybackControls false @togglePlaybackControls false
Backbone.Mediator.publish 'playback:real-time-playback-started', {} 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 'audio-player:play-sound', trigger: 'real-time-playback-start', volume: 1
Backbone.Mediator.publish 'level:set-letterbox', on: true if @options.level.get('type', true) is ['hero'] # not with flags...?
onRealTimeMultiplayerCast: (e) -> onRealTimeMultiplayerCast: (e) ->
@realTime = true @realTime = true

View file

@ -180,7 +180,7 @@ module.exports = class PlayLevelView extends RootView
@session = @levelLoader.session @session = @levelLoader.session
@world = @levelLoader.world @world = @levelLoader.world
@level = @levelLoader.level @level = @levelLoader.level
@$el.addClass 'hero' if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] @$el.addClass 'hero' if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
@$el.addClass 'flags' if _.any(@world.thangs, (t) -> (t.programmableProperties and 'findFlags' in t.programmableProperties) or t.inventory?.flag) or @level.get('slug') is 'sky-span' @$el.addClass 'flags' if _.any(@world.thangs, (t) -> (t.programmableProperties and 'findFlags' in t.programmableProperties) or t.inventory?.flag) or @level.get('slug') is 'sky-span'
# TODO: Update terminology to always be opponentSession or otherSession # TODO: Update terminology to always be opponentSession or otherSession
# TODO: E.g. if it's always opponent right now, then variable names should be opponentSession until we have coop play # TODO: E.g. if it's always opponent right now, then variable names should be opponentSession until we have coop play
@ -280,7 +280,7 @@ module.exports = class PlayLevelView extends RootView
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session}) @setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session})
@setupManager.open() @setupManager.open()
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder'] @onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder', 'course-ladder']
onLoaded: -> onLoaded: ->
_.defer => @onLevelLoaderLoaded() _.defer => @onLevelLoaderLoaded()
@ -310,7 +310,7 @@ module.exports = class PlayLevelView extends RootView
initSurface: -> initSurface: ->
webGLSurface = $('canvas#webgl-surface', @$el) webGLSurface = $('canvas#webgl-surface', @$el)
normalSurface = $('canvas#normal-surface', @$el) normalSurface = $('canvas#normal-surface', @$el)
@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']), observing: @observing, playerNames: @findPlayerNames()) @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, observing: @observing, playerNames: @findPlayerNames())
worldBounds = @world.getBounds() worldBounds = @world.getBounds()
bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}] bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}]
@surface.camera.setBounds(bounds) @surface.camera.setBounds(bounds)
@ -332,9 +332,6 @@ module.exports = class PlayLevelView extends RootView
if window.currentModal and not window.currentModal.destroyed and window.currentModal.constructor isnt VictoryModal if window.currentModal and not window.currentModal.destroyed and window.currentModal.constructor isnt VictoryModal
return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @ return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @
@surface.showLevel() @surface.showLevel()
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 or @observing if @isEditorPreview or @observing
@loadingView.startUnveiling() @loadingView.startUnveiling()
@loadingView.unveil() @loadingView.unveil()
@ -370,7 +367,7 @@ module.exports = class PlayLevelView extends RootView
return if @alreadyLoadedState return if @alreadyLoadedState
@alreadyLoadedState = true @alreadyLoadedState = true
state = @originalSessionState state = @originalSessionState
if not @level or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] if not @level or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: true Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: true
Backbone.Mediator.publish 'tome:select-primary-sprite', {} Backbone.Mediator.publish 'tome:select-primary-sprite', {}
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false
@ -424,7 +421,7 @@ module.exports = class PlayLevelView extends RootView
onDonePressed: -> @showVictory() onDonePressed: -> @showVictory()
onShowVictory: (e) -> onShowVictory: (e) ->
$('#level-done-button').show() unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] $('#level-done-button').show() unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
@showVictory() if e.showModal @showVictory() if e.showModal
return if @victorySeen return if @victorySeen
@victorySeen = true @victorySeen = true
@ -439,10 +436,10 @@ module.exports = class PlayLevelView extends RootView
application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID
showVictory: -> showVictory: ->
return if @isEditorPreview and @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor return if @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
@endHighlight() @endHighlight()
options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning} options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning}
ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then HeroVictoryModal else VictoryModal ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then HeroVictoryModal else VictoryModal
victoryModal = new ModalClass(options) victoryModal = new ModalClass(options)
@openModalView(victoryModal) @openModalView(victoryModal)
if me.get('anonymous') if me.get('anonymous')
@ -538,7 +535,7 @@ module.exports = class PlayLevelView extends RootView
onSubmissionComplete: => onSubmissionComplete: =>
return if @destroyed return if @destroyed
return if @isEditorPreview and @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor return if @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
# TODO: Show a victory dialog specific to hero-ladder level # TODO: Show a victory dialog specific to hero-ladder level
if @goalManager.checkOverallStatus() is 'success' and not @options.realTimeMultiplayerSessionID? if @goalManager.checkOverallStatus() is 'success' and not @options.realTimeMultiplayerSessionID?
showModalFn = -> Backbone.Mediator.publish 'level:show-victory', showModal: true showModalFn = -> Backbone.Mediator.publish 'level:show-victory', showModal: true

View file

@ -11,6 +11,7 @@ LadderSubmissionView = require 'views/play/common/LadderSubmissionView'
AudioPlayer = require 'lib/AudioPlayer' AudioPlayer = require 'lib/AudioPlayer'
User = require 'models/User' User = require 'models/User'
utils = require 'core/utils' utils = require 'core/utils'
Level = require 'models/Level'
module.exports = class HeroVictoryModal extends ModalView module.exports = class HeroVictoryModal extends ModalView
id: 'hero-victory-modal' id: 'hero-victory-modal'
@ -44,6 +45,9 @@ module.exports = class HeroVictoryModal extends ModalView
@previousXP = me.get 'points', true @previousXP = me.get 'points', true
@previousLevel = me.level() @previousLevel = me.level()
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory' Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory'
if @level.get('type', true) is 'course' and nextLevel = @level.get('nextLevel')
@nextLevel = new Level().setURL "/db/level/#{nextLevel.original}/version/#{nextLevel.majorVersion}"
@nextLevel = @supermodel.loadModel(@nextLevel, 'level').model
destroy: -> destroy: ->
clearInterval @sequentialAnimationInterval clearInterval @sequentialAnimationInterval
@ -68,7 +72,8 @@ module.exports = class HeroVictoryModal extends ModalView
for thangTypeOriginal in thangTypeOriginals for thangTypeOriginal in thangTypeOriginals
thangType = new ThangType() thangType = new ThangType()
thangType.url = "/db/thang.type/#{thangTypeOriginal}/version" thangType.url = "/db/thang.type/#{thangTypeOriginal}/version"
thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers', 'i18n'] #thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers', 'i18n'] # This is what we need, but the PlayHeroesModal needs more, and so we load more to fill up the supermodel.
thangType.project = ['original', 'rasterIcon', 'name', 'slug', 'soundTriggers', 'featureImages', 'gems', 'heroClass', 'description', 'components', 'extendedName', 'unlockLevelName', 'i18n']
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model @thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
@newEarnedAchievements = [] @newEarnedAchievements = []
@ -132,7 +137,7 @@ module.exports = class HeroVictoryModal extends ModalView
c.thangTypes = @thangTypes c.thangTypes = @thangTypes
c.me = me c.me = me
c.readyToRank = @level.get('type', true) is 'hero-ladder' and @session.readyToRank() c.readyToRank = @level.get('type', true) in ['hero-ladder', 'course-ladder'] and @session.readyToRank()
c.level = @level c.level = @level
c.i18n = utils.i18n c.i18n = utils.i18n
@ -152,7 +157,7 @@ module.exports = class HeroVictoryModal extends ModalView
# Show the "I'm done" button between 30 - 120 minutes if they definitely came from Hour of Code # Show the "I'm done" button between 30 - 120 minutes if they definitely came from Hour of Code
c.showHourOfCodeDoneButton = me.get('hourOfCode') and showDone c.showHourOfCodeDoneButton = me.get('hourOfCode') and showDone
c.showLeaderboard = @level.get('scoreTypes')?.length > 0 c.showLeaderboard = @level.get('scoreTypes')?.length > 0 and @level.get('type', true) isnt 'course'
return c return c
@ -187,7 +192,7 @@ module.exports = class HeroVictoryModal extends ModalView
panel.queue(-> complete()) panel.queue(-> complete())
@animationComplete = not @animatedPanels.length @animationComplete = not @animatedPanels.length
complete() if @animationComplete complete() if @animationComplete
if @level.get('type', true) is 'hero-ladder' if @level.get('type', true) in ['hero-ladder', 'course-ladder']
@ladderSubmissionView = new LadderSubmissionView session: @session, level: @level @ladderSubmissionView = new LadderSubmissionView session: @session, level: @level
@insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view') @insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view')
@ -332,6 +337,13 @@ module.exports = class HeroVictoryModal extends ModalView
{'kithgard-gates': 'forest', 'kithgard-mastery': 'forest', 'siege-of-stonehold': 'desert', 'clash-of-clones': 'mountain'}[@level.get('slug')] or @level.get 'campaign' # Much easier to just keep this updated than to dynamically figure it out. {'kithgard-gates': 'forest', 'kithgard-mastery': 'forest', 'siege-of-stonehold': 'desert', 'clash-of-clones': 'mountain'}[@level.get('slug')] or @level.get 'campaign' # Much easier to just keep this updated than to dynamically figure it out.
getNextLevelLink: -> getNextLevelLink: ->
if @level.get('type', true) is 'course' and nextLevel = @level.get('nextLevel')
# need to do something more complicated to load its slug
console.log 'have @nextLevel', @nextLevel, 'from nextLevel', nextLevel
return "/play/level/#{@nextLevel.get('slug')}"
else if @level.get('type', true) is 'course'
# TODO: figure out which course it is
return '/courses/mock1/0'
link = '/play' link = '/play'
nextCampaign = @getNextLevelCampaign() nextCampaign = @getNextLevelCampaign()
link += '/' + nextCampaign link += '/' + nextCampaign
@ -345,7 +357,17 @@ module.exports = class HeroVictoryModal extends ModalView
justBeatLevel: @level justBeatLevel: @level
supermodel: if @options.hasReceivedMemoryWarning then null else @supermodel supermodel: if @options.hasReceivedMemoryWarning then null else @supermodel
_.merge options, extraOptions if extraOptions _.merge options, extraOptions if extraOptions
navigationEvent = route: nextLevelLink, viewClass: require('views/play/CampaignView'), viewArgs: [options, @getNextLevelCampaign()] if @level.get('type', true) is 'course' and @nextLevel
viewClass = require 'views/play/level/PlayLevelView'
viewArgs = [options, @nextLevel.get('slug')]
else if @level.get('type', true) is 'course'
options.studentMode = true
viewClass = require 'views/courses/mock1/CourseDetailsView'
viewArgs = [options, '0']
else
viewClass = require 'views/play/CampaignView'
viewArgs = [options, @getNextLevelCampaign()]
navigationEvent = route: nextLevelLink, viewClass: viewClass, viewArgs: viewArgs
if @level.get('slug') is 'lost-viking' and not (me.get('age') in ['0-13', '14-17']) if @level.get('slug') is 'lost-viking' and not (me.get('age') in ['0-13', '14-17'])
@showOffer navigationEvent @showOffer navigationEvent
else else

View file

@ -48,7 +48,7 @@ module.exports = class CastButtonView extends CocoView
super() super()
@castButton = $('.cast-button', @$el) @castButton = $('.cast-button', @$el)
spell.view?.createOnCodeChangeHandlers() for spellKey, spell of @spells spell.view?.createOnCodeChangeHandlers() for spellKey, spell of @spells
if @options.level.get('hidesSubmitUntilRun') or @options.level.get('hidesRealTimePlayback') if @options.level.get('hidesSubmitUntilRun') or @options.level.get 'hidesRealTimePlayback'
@$el.find('.submit-button').hide() # Hide Submit for the first few until they run it once. @$el.find('.submit-button').hide() # Hide Submit for the first few until they run it once.
if @options.session.get('state')?.complete and @options.level.get 'hidesRealTimePlayback' if @options.session.get('state')?.complete and @options.level.get 'hidesRealTimePlayback'
@$el.find('.done-button').show() @$el.find('.done-button').show()
@ -72,7 +72,7 @@ module.exports = class CastButtonView extends CocoView
@updateReplayability() @updateReplayability()
onDoneButtonClick: (e) -> onDoneButtonClick: (e) ->
return if @getQueryVariable('dev') and @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor return if @options.level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
@options.session.recordScores @world.scores, @options.level @options.session.recordScores @world.scores, @options.level
Backbone.Mediator.publish 'level:show-victory', showModal: true Backbone.Mediator.publish 'level:show-victory', showModal: true

View file

@ -151,7 +151,7 @@ module.exports = class Spell
writable = @permissions.readwrite.length > 0 writable = @permissions.readwrite.length > 0
skipProtectAPI = @skipProtectAPI or not writable skipProtectAPI = @skipProtectAPI or not writable
problemContext = @createProblemContext thang problemContext = @createProblemContext thang
includeFlow = (@levelType in ['hero', 'hero-ladder', 'hero-coop']) and not skipProtectAPI includeFlow = (@levelType in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']) and not skipProtectAPI
aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: includeFlow, problemContext: problemContext aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: includeFlow, problemContext: problemContext
aether = new Aether aetherOptions aether = new Aether aetherOptions
if @worker if @worker
@ -189,7 +189,7 @@ module.exports = class Spell
return true if @spectateView # Use transpiled code for both teams if we're just spectating. return true if @spectateView # Use transpiled code for both teams if we're just spectating.
return true if @isEnemySpell() # Use transpiled for enemy spells. return true if @isEnemySpell() # Use transpiled for enemy spells.
# Players without permissions can't view the raw code. # Players without permissions can't view the raw code.
return false if @observing and @levelType is 'hero' return false if @observing and @levelType in ['hero', 'course']
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true)) return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
false false

View file

@ -37,7 +37,7 @@ module.exports = class SpellListEntryView extends CocoView
context context
createMethodSignature: -> createMethodSignature: ->
return @spell.name if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] return @spell.name if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
parameters = (@spell.parameters or []).slice() parameters = (@spell.parameters or []).slice()
if @spell.language in ['python', 'lua'] if @spell.language in ['python', 'lua']
parameters.unshift 'self' parameters.unshift 'self'

View file

@ -107,7 +107,7 @@ module.exports = class SpellPaletteEntryView extends CocoView
Backbone.Mediator.publish 'tome:palette-pin-toggled', entry: @, pinned: @popoverPinned Backbone.Mediator.publish 'tome:palette-pin-toggled', entry: @, pinned: @popoverPinned
onClick: (e) => onClick: (e) =>
if true or @options.level.get('type', true) is 'hero' if true or @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
# Jiggle instead of pin for hero levels # Jiggle instead of pin for hero levels
# Actually, do it all the time, because we recently busted the pin CSS. TODO: restore pinning # Actually, do it all the time, because we recently busted the pin CSS. TODO: restore pinning
jigglyPopover = $('.spell-palette-popover.popover') jigglyPopover = $('.spell-palette-popover.popover')

View file

@ -161,7 +161,7 @@ module.exports = class SpellPaletteView extends CocoView
else else
propStorage = propStorage =
'this': ['apiProperties', 'apiMethods'] 'this': ['apiProperties', 'apiMethods']
if not (@options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or not @options.programmable if not (@options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']) or not @options.programmable
@organizePalette propStorage, allDocs, excludedDocs @organizePalette propStorage, allDocs, excludedDocs
else else
@organizePaletteHero propStorage, allDocs, excludedDocs @organizePaletteHero propStorage, allDocs, excludedDocs
@ -203,7 +203,7 @@ module.exports = class SpellPaletteView extends CocoView
if tabbify and _.find @entries, ((entry) -> entry.doc.owner isnt 'this') if tabbify and _.find @entries, ((entry) -> entry.doc.owner isnt 'this')
@entryGroups = _.groupBy @entries, groupForEntry @entryGroups = _.groupBy @entries, groupForEntry
else else
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' i18nKey = if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then 'play_level.tome_your_skills' else 'play_level.tome_available_spells'
defaultGroup = $.i18n.t i18nKey defaultGroup = $.i18n.t i18nKey
@entryGroups = {} @entryGroups = {}
@entryGroups[defaultGroup] = @entries @entryGroups[defaultGroup] = @entries

View file

@ -518,7 +518,7 @@ module.exports = class SpellView extends CocoView
@createToolbarView() @createToolbarView()
createDebugView: -> createDebugView: ->
return if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] # We'll turn this on later, maybe, but not yet. return if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] # We'll turn this on later, maybe, but not yet.
@debugView = new SpellDebugView ace: @ace, thang: @thang, spell:@spell @debugView = new SpellDebugView ace: @ace, thang: @thang, spell:@spell
@$el.append @debugView.render().$el.hide() @$el.append @debugView.render().$el.hide()
@ -993,7 +993,7 @@ module.exports = class SpellView extends CocoView
markerRange.end = @aceDoc.createAnchor markerRange.end markerRange.end = @aceDoc.createAnchor markerRange.end
markerRange.id = @aceSession.addMarker markerRange, clazz, markerType markerRange.id = @aceSession.addMarker markerRange, clazz, markerType
@markerRanges.push markerRange @markerRanges.push markerRange
if false and executedRows[start.row] and @decoratedGutter[start.row] isnt clazz if executedRows[start.row] and @decoratedGutter[start.row] isnt clazz
@aceSession.removeGutterDecoration start.row, @decoratedGutter[start.row] if @decoratedGutter[start.row] isnt '' @aceSession.removeGutterDecoration start.row, @decoratedGutter[start.row] if @decoratedGutter[start.row] isnt ''
@aceSession.addGutterDecoration start.row, clazz @aceSession.addGutterDecoration start.row, clazz
@decoratedGutter[start.row] = clazz @decoratedGutter[start.row] = clazz

View file

@ -60,7 +60,7 @@ module.exports = class TomeView extends CocoView
@worker = @createWorker() @worker = @createWorker()
programmableThangs = _.filter @options.thangs, (t) -> t.isProgrammable and t.programmableMethods programmableThangs = _.filter @options.thangs, (t) -> t.isProgrammable and t.programmableMethods
@createSpells programmableThangs, programmableThangs[0]?.world # Do before spellList, thangList, and castButton @createSpells programmableThangs, programmableThangs[0]?.world # Do before spellList, thangList, and castButton
unless @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] unless @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
@spellList = @insertSubView new SpellListView spells: @spells, supermodel: @supermodel, level: @options.level @spellList = @insertSubView new SpellListView spells: @spells, supermodel: @supermodel, level: @options.level
@castButton = @insertSubView new CastButtonView spells: @spells, level: @options.level, session: @options.session @castButton = @insertSubView new CastButtonView spells: @spells, level: @options.level, session: @options.session
@teamSpellMap = @generateTeamSpellMap(@spells) @teamSpellMap = @generateTeamSpellMap(@spells)
@ -192,7 +192,7 @@ module.exports = class TomeView extends CocoView
@castButton?.$el.hide() @castButton?.$el.hide()
onSpriteSelected: (e) -> onSpriteSelected: (e) ->
return if @spellView and @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] # Never deselect the hero in the Tome. return if @spellView and @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] # Never deselect the hero in the Tome.
thang = e.thang thang = e.thang
spellName = e.spellName spellName = e.spellName
@spellList?.$el.hide() @spellList?.$el.hide()

View file

@ -34,7 +34,7 @@ module.exports = class GameMenuModal extends ModalView
submenus = ['guide', 'options', 'save-load', 'multiplayer'] submenus = ['guide', 'options', 'save-load', 'multiplayer']
submenus = _.without submenus, 'guide' unless docs.specificArticles?.length or docs.generalArticles?.length submenus = _.without submenus, 'guide' unless docs.specificArticles?.length or docs.generalArticles?.length
submenus = _.without submenus, 'save-load' unless me.isAdmin() or /https?:\/\/localhost/.test(window.location.href) submenus = _.without submenus, 'save-load' unless me.isAdmin() or /https?:\/\/localhost/.test(window.location.href)
submenus = _.without submenus, 'multiplayer' unless me.isAdmin() or @level?.get('type') in ['ladder', 'hero-ladder'] submenus = _.without submenus, 'multiplayer' unless me.isAdmin() or @level?.get('type') in ['ladder', 'hero-ladder', 'course-ladder']
@includedSubmenus = submenus @includedSubmenus = submenus
context.showTab = @options.showTab ? submenus[0] context.showTab = @options.showTab ? submenus[0]
context.submenus = submenus context.submenus = submenus
@ -43,7 +43,7 @@ module.exports = class GameMenuModal extends ModalView
'guide': 'list' 'guide': 'list'
'save-load': 'floppy-disk' 'save-load': 'floppy-disk'
'multiplayer': 'globe' 'multiplayer': 'globe'
context.showsChooseHero = @options.levelID not in ['zero-sum'] context.showsChooseHero = (@level?.get('type') not in ['course', 'course-ladder']) and (@options.levelID not in ['zero-sum'])
context context
afterRender: -> afterRender: ->

View file

@ -15,7 +15,6 @@ module.exports = class LevelGuideView extends CocoView
events: events:
'click .start-subscription-button': 'clickSubscribe' 'click .start-subscription-button': 'clickSubscribe'
'click .resource-link': 'clickResourceLink'
constructor: (options) -> constructor: (options) ->
@levelSlug = options.level.get('slug') @levelSlug = options.level.get('slug')
@ -78,13 +77,6 @@ module.exports = class LevelGuideView extends CocoView
@openModalView new SubscribeModal() @openModalView new SubscribeModal()
window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'help video clicked', level: level window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'help video clicked', level: level
clickResourceLink: (e) ->
e.preventDefault()
resource = $(e.target).data 'resource'
url = $(e.target).attr 'href'
window.tracker?.trackEvent 'Click resource', category: 'Resources', source: 'guide', level: @levelSlug, resource: resource
window.open url, '_blank'
clickTab: (e) => clickTab: (e) =>
@$el.find('li.active').removeClass('active') @$el.find('li.active').removeClass('active')
@playSound 'guide-tab-switch' @playSound 'guide-tab-switch'

View file

@ -27,7 +27,7 @@ module.exports = class MultiplayerView extends CocoView
@levelID = @level?.get 'slug' @levelID = @level?.get 'slug'
@session = options.session @session = options.session
@listenTo @session, 'change:multiplayer', @updateLinkSection @listenTo @session, 'change:multiplayer', @updateLinkSection
@watchRealTimeSessions() if @level?.get('type') in ['hero-ladder'] and me.isAdmin() @watchRealTimeSessions() if @level?.get('type') in ['hero-ladder', 'course-ladder'] and me.isAdmin()
destroy: -> destroy: ->
@realTimeSessions?.off 'add', @onRealTimeSessionAdded @realTimeSessions?.off 'add', @onRealTimeSessionAdded
@ -42,12 +42,12 @@ module.exports = class MultiplayerView extends CocoView
c.team = @session.get 'team' c.team = @session.get 'team'
c.levelSlug = @levelID c.levelSlug = @levelID
# For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet. # For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet.
if @level?.get('type') in ['ladder', 'hero-ladder'] if @level?.get('type') in ['ladder', 'hero-ladder', 'course-ladder']
c.ladderGame = true c.ladderGame = true
c.readyToRank = @session?.readyToRank() c.readyToRank = @session?.readyToRank()
# Real-time multiplayer stuff # Real-time multiplayer stuff
if @level?.get('type') in ['hero-ladder'] and me.isAdmin() if @level?.get('type') in ['hero-ladder', 'course-ladder'] and me.isAdmin()
c.levelID = @session.get('levelID') c.levelID = @session.get('levelID')
c.realTimeSessions = @realTimeSessions c.realTimeSessions = @realTimeSessions
c.currentRealTimeSession = @currentRealTimeSession if @currentRealTimeSession c.currentRealTimeSession = @currentRealTimeSession if @currentRealTimeSession
@ -78,7 +78,7 @@ module.exports = class MultiplayerView extends CocoView
updateLinkSection: -> updateLinkSection: ->
multiplayer = @$el.find('#multiplayer').prop('checked') multiplayer = @$el.find('#multiplayer').prop('checked')
la = @$el.find('#link-area') la = @$el.find('#link-area')
la.toggle if @level?.get('type') in ['ladder', 'hero-ladder'] then false else Boolean(multiplayer) la.toggle if @level?.get('type') in ['ladder', 'hero-ladder', 'course-ladder'] then false else Boolean(multiplayer)
true true
onHidden: -> onHidden: ->

View file

@ -1,11 +1,21 @@
#!/bin/bash #!/bin/bash
# Original content copyright (c) 2014 dpen2000 licensed under the MIT license # Original content copyright (c) 2014 dpen2000 licensed under the MIT license
# Set default ulimits
cat <<- EOF > /tmp/limits.conf
* soft nofile 10000
* hard nofile 10000
EOF
sudo mv /tmp/limits.conf /etc/security/limits.conf
sudo chown root:root /etc/security/limits.conf
#Install required software
sudo apt-get -y update sudo apt-get -y update
sudo apt-get -y install python-software-properties git sudo apt-get -y install python-software-properties git
sudo add-apt-repository -y ppa:chris-lea/node.js sudo add-apt-repository -y ppa:chris-lea/node.js
sudo apt-get -y update sudo apt-get -y update
sudo apt-get -y install nodejs sudo apt-get -y install nodejs
sudo apt-get -y install g++ make sudo apt-get -y install g++ make
mkdir /vagrant/node_modules mkdir /vagrant/node_modules
sudo mkdir /node_modules sudo mkdir /node_modules
sudo chown vagrant:vagrant /node_modules sudo chown vagrant:vagrant /node_modules

View file

@ -720,17 +720,9 @@ sendNextStepsEmail = (user, now, daysAgo) ->
isKid = not isAdult # Assume kid if not specified isKid = not isAdult # Assume kid if not specified
offers = offers =
'app-academy': isAdult and isVeryFast 'app-academy': isAdult and isVeryFast
'designlab': isAdult and Math.random() < 0.25
'tealeaf-academy': isAdult and isFast
'talent-buddy': isAdult and Math.random() < 0.25
'coding-campus': isAdult and Math.random() < 0.25 # TODO: geodetect UT and give priority
'viking': isAdult and isFast 'viking': isAdult and isFast
'maker-square': isAdult and isFast nAdditionalOffers = Math.max 0, 1 - _.filter(offers).length
'the-firehose-project': isAdult and isFast possibleAdditionalOffers = ['bloc', 'tuts-plus', 'thinkful']
#'mv-code-club': isKid # TODO: geodetect, get landing page URL
'breakout-mentors': isKid
nAdditionalOffers = Math.max 0, 4 - _.filter(offers).length
possibleAdditionalOffers = ['ostraining', 'code-school', 'one-month', 'pluralsight']
for offer in _.sample possibleAdditionalOffers, nAdditionalOffers for offer in _.sample possibleAdditionalOffers, nAdditionalOffers
offers[offer] = true offers[offer] = true
if user.isPremium() if user.isPremium()