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"
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.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 9485, host: 9485
config.vm.provision "shell", path: "scripts/vagrant/provision.sh"
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
config.vm.provider "vmware_fusion" do |v|
v.memory = 2048
v.cpus = 2
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") ->
return if @unsupported
kind = kind.replace 'intro', 'dungeon'
options = $.extend true, {}, particleKinds[kind]
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"
@ -224,7 +225,7 @@ particleKinds['level-dungeon-gate'] = ext particleKinds['level-dungeon-premium']
colorMiddleSpread: vec 1.5, 1.5, 1.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:
particleCount: 200
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
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:
particleCount: 90
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
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:
particleCount: 90
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
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:
particleCount: 90
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
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:
particleCount: 90
velocity: vec 0, 4, 0

View file

@ -57,7 +57,7 @@ module.exports = class CocoRouter extends Backbone.Router
'contribute/diplomat': go('contribute/DiplomatView')
'contribute/scribe': go('contribute/ScribeView')
'courses': -> @navigate('courses/mock1')
'courses': go('courses/mock1/CoursesView')
'courses/mock1': go('courses/mock1/CoursesView')
'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView')
'courses/mock1/:courseID/info': go('courses/mock1/CourseInfoView')
@ -103,7 +103,6 @@ module.exports = class CocoRouter extends Backbone.Router
'multiplayer': go('MultiplayerView')
'play-old': go('play/MainPlayView') # This used to be 'play'.
'play': go('play/CampaignView')
'play/ladder/:levelID': go('ladder/LadderView')
'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
subscriptions:
'self-wizard:target-changed': 'onSelfWizardTargetChanged'
'self-wizard:created': 'onSelfWizardCreated'
'tome:editing-began': 'onEditingBegan'
'tome:editing-ended': 'onEditingEnded'
'script:state-changed': 'onScriptStateChanged'
@ -55,27 +53,13 @@ module.exports = class LevelBus extends Bus
return true unless @session?.get('multiplayer')
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: =>
super()
@wizardRef?.child('wizardColor1').set(me.get('wizardColor1') or 0.0)
join: ->
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: ->
@wizardRef?.off()
@wizardRef = null
@fireScriptsRef?.off()
@fireScriptsRef = null
super()
@ -88,8 +72,8 @@ module.exports = class LevelBus extends Bus
# UPDATING FIREBASE AND SESSION
onEditingBegan: -> @wizardRef?.child('editing').set(true)
onEditingEnded: -> @wizardRef?.child('editing').set(false)
onEditingBegan: -> #@wizardRef?.child('editing').set(true) # no more wizards
onEditingEnded: -> #@wizardRef?.child('editing').set(false) # no more wizards
# HACK: Backbone does not work with nested documents, but we want 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}"
@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
loadThangsRequiredByLevelThang: (levelThang) ->
@ -369,7 +365,7 @@ module.exports = class LevelLoader extends CocoClass
@grabTeamConfigs()
@thangTypeTeams = {}
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
for component in thang.components
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"}}
@onInventoryModalPlayClicked()
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})
@inventoryModal = new InventoryModal({supermodel: @supermodel, session: @session, level: @level})
@heroesModalDestroy = @heroesModal.destroy

View file

@ -259,7 +259,6 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@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 ? {}
# ENDING NOTES

View file

@ -64,7 +64,7 @@ module.exports = class Dimmer extends CocoClass
updateDimMask: =>
@dimMask.graphics.clear()
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
cap = @camera.surfaceToCanvas sup
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'
{me} = require 'core/auth'
LayerAdapter = require './LayerAdapter'
IndieLank = require 'lib/surface/IndieLank'
WizardLank = require 'lib/surface/WizardLank'
FlagLank = require 'lib/surface/FlagLank'
Lank = require 'lib/surface/Lank'
Mark = require './Mark'
@ -11,8 +9,6 @@ utils = require 'core/utils'
module.exports = class LankBoss extends CocoClass
subscriptions:
'bus:player-joined': 'onPlayerJoined'
'bus:player-left': 'onPlayerLeft'
'level:set-debug': 'onSetDebug'
'sprite:highlight-sprites': 'onHighlightSprites'
'surface:stage-mouse-down': 'onStageMouseDown'
@ -40,7 +36,6 @@ module.exports = class LankBoss extends CocoClass
@options.thangTypes ?= []
@lanks = {}
@lankArray = [] # Mirror @lanks, but faster for when we just need to iterate
@selfWizardLank = null
@createLayers()
@pendingFlags = []
@ -100,49 +95,6 @@ module.exports = class LankBoss extends CocoClass
createLankOptions: (options) ->
_.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) ->
return if e.debug is @debug
@debug = e.debug

View file

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

View file

@ -70,7 +70,6 @@
choose_inventory: "Equip Items"
buy_gems: "Buy Gems"
subscription_required: "Subscription Required"
older_campaigns: "Older Campaigns"
anonymous: "Anonymous Player"
level_difficulty: "Difficulty: "
campaign_beginner: "Beginner Campaign"
@ -78,20 +77,8 @@
awaiting_levels_adventurer: "Sign up as an Adventurer"
awaiting_levels_adventurer_suffix: "to be the first to play new levels."
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_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_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_classic_algorithms: "Algorithmes classiques"
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."
share_progress_modal:
@ -617,7 +617,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
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_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_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: "."
@ -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_2: "CodeCombat n'est pas encore supporté sur iPad."
# teachers_survey:
teachers_survey:
# title: "Teacher Survey"
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
# retrieving: "Retrieving information..."
@ -660,9 +660,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
# description_2: "teachers"
# description_3: "page."
# description_4: "Please fill out this quick survey and well email you setup instructions."
# email: "Email Address"
# school: "Name of School"
# location: "Name of City"
email: "Adresse email"
school: "Nom de l'école"
location: "Nom de la ville"
# age_students: "How old are your students?"
# under: "Under"
# other: "Other:"
@ -707,7 +707,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
picture_tab: "Photos"
delete_account_tab: "Supprimer votre compte"
wrong_email: "Mauvaise adresse e-mail"
# wrong_password: "Wrong Password"
wrong_password: "Mauvais mot de passe"
upload_picture: "Télécharger une image"
delete_this_account: "Supprimer votre compte définitivement"
god_mode: "Puissance Divine"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
keyboard_shortcuts: "Raccourcis Clavier"
space: "Espace"
enter: "Entrer"
# press_enter: "press enter"
press_enter: "Appuyez sur entrée"
escape: "Echap"
shift: "Shift"
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é"
subs_only: "Abonnés seulement"
create_clan: "Créer un nouveau clan"
# private_preview: "Preview"
private_preview: "Aperçu"
public_clans: "Clans publiques"
my_clans: "Mes clans"
clan_name: "Nom du clan"
@ -1198,7 +1198,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
concepts:
advanced_strings: "Chaînes de caractères avancés"
algorithms: "Algorithmes"
# arguments: "Arguments"
arguments: "Paramètres"
arithmetic: "Arithmétique"
arrays: "Tableaux"
basic_syntax: "Syntaxe basique"
@ -1215,7 +1215,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
variables: "Variables"
vectors: "Vecteurs"
while_loops: "Boucles Tant que"
# recursion: "Recursion"
recursion: "Récursivité"
delta:
added: "Ajouté"

View file

@ -160,7 +160,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
unwatch: "הסר צפיה"
submit_patch: ".שלח תיקון"
submit_changes: "שלח שינויים"
# save_changes: "Save Changes"
save_changes: "שמור שינויים"
general:
and: "וגם"
@ -264,9 +264,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
victory_hour_of_code_done_yes: "שלי Hour of Code™! כן, סיימתי עם ה"
victory_experience_gained: "שנצבר XP"
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_become_a_viking: "Become a Viking"
victory_become_a_viking: "הפוך לוויקינג"
guide_title: "מדריך"
tome_minion_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_total: ":שמן מקסימלי"
time_goto: ":לך ל"
# non_user_code_problem_title: "Unable to Load Level"
# infinite_loop_title: "Infinite Loop Detected"
non_user_code_problem_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."
# 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_reset_level: "התחל שלב מחדש"
infinite_loop_comment_out: ".הפוך את הקוד שלי להערה"
@ -310,7 +310,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
tip_think_solution: ".תחשוב על הפתרון, לא על הבעיה"
tip_theory_practice: "תיאורטית, אין הבדל בין התאוריה לאימון. אבל באימון, יש. - יוגי ברה"
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_baby_coders: ".בעתיד, אפילו תינוקות יהיו כשפי על"
tip_morale_improves: ".הטעינה תמשיך עד שהמורל ישתפר"
@ -320,13 +320,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
tip_great_responsibility: "עם כישרון גדול בתכנות באה גם אחריות דיבאגינג גדולה."
tip_munchkin: "אם לא תאכל את הירקות, מאצ'קין יבוא אליך בלילה כשאתה ישן."
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_patience: "עליך להיות סבלני, פאדאוואן צעיר - יודה"
# tip_documented_bug: "A documented bug is not a bug; it is a feature."
tip_documented_bug: "באג מתועד הוא לא באג; הוא בונוס שבא עם התוכנה." #My personal translation
tip_impossible: "זה תמיד נראה בלתי אפשרי עד שזה נעשה. - נלסון מנדלה"
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_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"
@ -415,7 +415,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
feature4: "!בחינם כל חודש <strong>3500 אבני חן</strong>"
feature5: "הדרכות וידאו"
feature6: "תמיכת מייל בעדיפות ראשונה"
# feature7: "Private <strong>Clans</strong>"
feature7: "פרטיים <strong>שבטים</strong>"
free: "חינם"
month: "חודש"
subscribe_title: "רכוש מנוי"
@ -508,8 +508,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# health_1: "Gains"
# health_2: "of listed"
# health_3: "armor health."
# speed_1: "Moves at"
# speed_2: "meters per second."
speed_1: "זז במהירות של"
speed_2: "מטרים לשנייה."
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)
restricted_to_certain_heroes: ".רק גיבורים מסויימים יכולים לשחק בשלב זה"
@ -525,7 +525,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
action_radius: "רדיוס"
action_duration: "משך זמן"
example: "דוגמה"
ex: "למשל" # Abbreviation of "example"
ex: "כגון" # Abbreviation of "example"
current_value: "ערך נוכחי"
default_value: "ערך רגיל"
parameters: "פרמטרים"
@ -679,7 +679,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
cla_url: "CLA"
cla_suffix: "."
cla_agree: "אני מסכים"
# owner_approve: "An owner will need to approve it before your changes will become visible."
owner_approve: "אישור בעלים יתבקשת לפני שהשינויים יחולו."
contact:
contact_us: "צור קשר"
@ -697,7 +697,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
where_reply: "?איפה אנחנו אמורים להגיב"
send: "שלח מייל"
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:
title: "הגדרות חשבון"
@ -707,7 +707,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
picture_tab: "תמונה"
delete_account_tab: "מחק את חשבונך"
wrong_email: "כתובת מייל שגויה."
# wrong_password: "Wrong Password"
wrong_password: "סיסמא שגוייה"
upload_picture: "העלה תמונה"
delete_this_account: "מחק את חשבון זה לתמיד"
god_mode: "מצב אל"
@ -717,7 +717,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
new_password: "סיסמה חדשה"
new_password_verify: "חזור על הסיסמה שנית"
type_in_email: "הזן את כתובת המייל שלך על מנת לבצע את המחיקה" # {change}
# type_in_password: "Also, type in your password."
type_in_password: "גםת הזן את סיסמתך."
email_subscriptions: "הרשמויות אימייל"
email_subscriptions_none: ".אין מנויי מייל"
email_announcements: "הודעות"
@ -739,8 +739,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
password_mismatch: "סיסמאות לא זהות"
password_repeat: ".אנא חזור על הסיסמא"
job_profile: "פרופיל עבודה" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
job_profile_approved: "פרופיל העבודה שלך אושר על ידי CodeCombat. מעסיקים יוכלו לראות את הפרופיל עד שאתה או מסמן אותו כ 'לא פעיל' או אם הוא לא השתנה במשך ארבעה שבועות."
job_profile_explanation: "היי! מלא את זה, ואנו ניצור איתך קשר על מציאת עבודה כמפתח תוכנה."
sample_profile: "פרופיל לדוגמה"
view_profile: "צפה בפרופיל שלך"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
keyboard_shortcuts: "קיצורי מקשים"
space: "Space"
enter: "Enter"
# press_enter: "press enter"
press_enter: "לחץ enter"
escape: "Escape"
shift: "Shift"
run_code: ".הרץ קוד נוכחי"
@ -783,49 +783,49 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
social_hipchat: "CodeCombat הציבורי של HipChat room שוחח בצ'אט איתנו ב"
contribute_to_the_project: "תרום לפרוייקט"
# clans:
# clan: "Clan"
# clans: "Clans"
# new_name: "New clan name"
# new_description: "New clan description"
# make_private: "Make clan private"
# subs_only: "subscribers only"
# create_clan: "Create New Clan"
# private_preview: "Preview"
# public_clans: "Public Clans"
# my_clans: "My Clans"
# clan_name: "Clan Name"
# name: "Name"
# chieftain: "Chieftain"
# type: "Type"
# edit_clan_name: "Edit Clan Name"
# edit_clan_description: "Edit Clan Description"
# edit_name: "edit name"
# edit_description: "edit description"
# private: "(private)"
# summary: "Summary"
# average_level: "Average Level"
# average_achievements: "Average Achievements"
# delete_clan: "Delete Clan"
# leave_clan: "Leave Clan"
# join_clan: "Join Clan"
# invite_1: "Invite:"
# invite_2: "*Invite players to this Clan by sending them this link."
# members: "Members"
# progress: "Progress"
# not_started_1: "not started"
# started_1: "started"
# complete_1: "complete"
# exp_levels: "Expand levels"
# rem_hero: "Remove Hero"
# status: "Status"
# complete_2: "Complete"
# started_2: "Started"
# not_started_2: "Not Started"
# view_solution: "Click to view solution."
# latest_achievement: "Latest Achievement"
# playtime: "Playtime"
# last_played: "Last played"
clans:
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: "שבטים"
new_name: "שם שבט חדש"
new_description: "תיאור שבט חדש"
make_private: "הפוך שבט לפרטי"
subs_only: "מנויים בלבד"
create_clan: "צור שבט חדש"
private_preview: "צפה" #"Preview" translted as "watch"
public_clans: "שבטים פתוחים" #"public clans" translation sounds unnatural when translated literally "open clans" is a preferred translation
my_clans: "השבטים שלי"
clan_name: "שם השבט"
name: "שם"
chieftain: "צ'יף(מנהיג)"
type: "סוג"
edit_clan_name: "ערוך את שם השבט"
edit_clan_description: "ערוך את תיאור השבט"
edit_name: "ערוך שם"
edit_description: "ערוך תיאור"
private: "(פרטי)"
summary: "תקציר"
average_level: "רמה ממוצעת"
average_achievements: "מס' הישגם ממוצע"
delete_clan: "מחק שבט"
leave_clan: "עזוב שבט"
join_clan: "הצטרף לשבט"
invite_1: "הזמן:"
invite_2: "*הזמן שחקנים לשבט באמצעות שליחת הקישור הזה."
members: "חברים"
progress: "התקדמות"
not_started_1: "לא הותחל"
started_1: "הותחל"
complete_1: "סויים"
exp_levels: "הרחב שלבים"
rem_hero: "הסר גיבור"
status: "סטטוס"
complete_2: "סויים"
started_2: "הותחל"
not_started_2: "לא הותחל"
view_solution: "לחץ כדי לראות פתרונות."
latest_achievement: "הישגים עדכניים"
playtime: "זמן משחק"
last_played: "שיחק לאחרונה"
classes:
archmage_title: "כשף על"
@ -884,7 +884,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
level_tab_thangs_all: "הכל"
level_tab_thangs_conditions: "תנאים התחלתיים"
level_tab_thangs_add: "הוסף ת'אנגס"
# level_tab_thangs_search: "Search thangs"
level_tab_thangs_search: "חפש ת'אנגס"
add_components: "הוסף מרכיבים"
component_configs: "קבע תצורת מרכיבים"
config_thang: "לחץ פעמיים כדי לשנות ת'אנג"
@ -1078,7 +1078,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
no_achievements: ".עדיין לא השגת אף הישג"
favorite_prefix: " שפה מועדפת היא"
favorite_postfix: "."
# not_member_of_clans: "Not a member of any clans yet."
not_member_of_clans: "לא חבר באף שבט."
achievements:
last_earned: "Last Earned"

View file

@ -175,7 +175,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
submitter: "Autore"
submitted: "Data creazione"
commit_msg: "Messaggio di commit"
# review: "Review"
review: "Revisiona"
version_history: "Cronologia versioni"
version_history_for: "Cronologia versioni per: "
select_changes: "Scegli due versioni per vedere la differenza."
@ -193,10 +193,10 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
password: "Password"
message: "Messaggio"
code: "Codice"
# ladder: "Ladder"
ladder: "Scala"
when: "Quando"
opponent: "Avversario"
# rank: "Rank"
rank: "Classifica"
score: "Punteggio"
win: "Vittoria"
loss: "Sconfitta"
@ -265,7 +265,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
victory_experience_gained: "Punti XP guadagnati"
victory_gems_gained: "Gemme guadagnate"
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"
guide_title: "Guida"
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:"
non_user_code_problem_title: "Impossibile caricare livello"
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_link: "(istruzioni)"
infinite_loop_try_again: "Riprova"
infinite_loop_reset_level: "Riavvia livello"
infinite_loop_comment_out: "Commenta il codice"
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_open_source: "CodeCombat è 100% open source!"
tip_beta_launch: "CodeCombat è stato lanciato in beta nell'ottobre 2013."

View file

@ -1,17 +1,17 @@
module.exports = nativeDescription: "polski", englishDescription: "Polish", translation:
home:
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_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_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 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.
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ć."
# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval."
old_browser_suffix: "Mimo tego możesz spróbowac, ale prawdopodobnie gra nie będzie działać."
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"
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.
# or_ipad: "Or download for iPad"
or_ipad: "Albo ściągnij na swojego iPada"
nav:
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
players: "graczy" # 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
confirm: "Potwierdź"
# owned: "Owned" # For items you own
owned: "Posiadane" # For items you own
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"
# 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
achievements: "Osiągnięcia" # Tooltip on achievement list 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
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
# choose_inventory: "Equip Items"
choose_inventory: "Załóż przedmioty"
buy_gems: "Kup klejnoty"
# subscription_required: "Subscription Required"
subscription_required: "Wymagana subskrypcja"
older_campaigns: "Starsze kampanie"
anonymous: "Anonimowy gracz"
level_difficulty: "Poziom trudności: "
campaign_beginner: "Kampania dla początkujących"
awaiting_levels_adventurer_prefix: "Wydajemy pięć poziomów na tydzień." # {change}
awaiting_levels_adventurer: "Zapisz się jako Podróżnik"
awaiting_levels_adventurer_suffix: "aby jako pierwszy grać nowe poziomy."
awaiting_levels_adventurer: "Zapisz się jako Podróżnik,"
awaiting_levels_adventurer_suffix: "aby jako pierwszy grać w nowe poziomy."
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.
adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów lub omówić poziom na "
adventurer_forum: "forum Podróżników"
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_dev: "Losowe trudniejsze poziomy"
campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego."
campaign_multiplayer: "Pola walki dla wielu graczy"
campaign_multiplayer_description: "... w których konkurujesz z innymi graczami."
campaign_multiplayer: "Kampania dla wielu graczy"
campaign_multiplayer_description: "... w której konkurujesz z innymi graczami."
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_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_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
# share_progress_modal:
# blurb: "Youre making great progress! Tell your parent how much you've learned with CodeCombat."
# email_invalid: "Email address invalid."
# form_blurb: "Enter your parent's email below and well show them!"
# form_label: "Email Address"
# placeholder: "email address"
# title: "Excellent Work, Apprentice"
share_progress_modal:
blurb: "Robisz coraz to większe postępy! Pokaż swoim rodzicom jak wiele nauczyłeś się z CodeCombat."
email_invalid: "Błędny adres e-mail."
form_blurb: "Wpisz adres email swich rodziców, a my ich o tym poinformujemy!"
form_label: "Adres email"
placeholder: "adres email"
title: "Wspaniała robota, Adepcie"
login:
sign_up: "Stwórz konto"
@ -109,12 +109,12 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
logging_in: "Logowanie..."
log_out: "Wyloguj się"
forgot_password: "Nie pamiętasz hasła?"
# authenticate_gplus: "Authenticate G+"
# load_profile: "Load G+ Profile"
# finishing: "Finishing"
# sign_in_with_facebook: "Sign in with Facebook"
# sign_in_with_gplus: "Sign in with G+"
# signup_switch: "Want to create an account?"
authenticate_gplus: "Autoryzuj G+"
load_profile: "Wczytaj Profil G+"
finishing: "Kończenie"
sign_in_with_facebook: "Saloguj się używając Facebooka"
sign_in_with_gplus: "Zaloguj się używając G+"
signup_switch: "Chcesz stworzyć konto?"
signup:
email_announcements: "Otrzymuj powiadomienia na e-mail"
@ -128,7 +128,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
recover:
recover_account_title: "Odzyskaj konto"
send_password: "Wyślij hasło tymczasowe"
# recovery_sent: "Recovery email sent."
recovery_sent: "Email do dozyskania hasła został wysłany."
items:
primary: "Główne"
@ -160,7 +160,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
unwatch: "Nie obserwuj"
submit_patch: "Prześlij łatkę"
submit_changes: "Prześlij zmiany"
# save_changes: "Save Changes"
save_changes: "Zapisz zmiany"
general:
and: "i"
@ -175,7 +175,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
submitter: "Przesyłający"
submitted: "Przesłano"
commit_msg: "Wiadomość do commitu"
# review: "Review"
review: "Recenzja"
version_history: "Historia wersji"
version_history_for: "Historia wersji dla: "
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)"
redo_prefix: "Ponów"
redo_shortcut: "(Ctrl+Shift+Z)"
# play_preview: "Play preview of current level"
play_preview: "Odtwórz podgląd obecnego poziomu"
result: "Wynik"
results: "Wyniki"
description: "Opis"
@ -243,9 +243,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
failing: "Niepowodzenie"
action_timeline: "Oś czasu"
click_to_select: "Kliknij jednostkę, by ją zaznaczyć."
# control_bar_multiplayer: "Multiplayer"
# control_bar_join_game: "Join Game"
# reload: "Reload"
control_bar_multiplayer: "Multiplayer"
control_bar_join_game: "Dołącz do gry"
reload: "Wczytaj ponownie"
reload_title: "Przywrócić cały kod?"
reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?"
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_rate_the_level: "Oceń poziom: " # Only in old-style levels.
victory_return_to_ladder: "Powrót do drabinki"
victory_play_continue: "Kontynuuj"
# victory_saving_progress: "Saving Progress"
victory_play_continue: "Dalej"
victory_saving_progress: "Zapisywanie postępów"
victory_go_home: "Powrót do strony głównej" # Only in old-style levels.
victory_review: "Powiedz nam coś więcej!" # Only in old-style levels.
victory_hour_of_code_done: "Skończyłeś już?"
victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodu."
victory_experience_gained: "Doświadczenie 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_become_a_viking: "Become a Viking"
victory_become_a_viking: "Zostań wikingiem"
guide_title: "Przewodnik"
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_other_units: "Inne jednostki" # Only in old-style levels.
# tome_cast_button_run: "Run"
# tome_cast_button_running: "Running"
# tome_cast_button_ran: "Ran"
tome_cast_button_run: "Uruchom"
tome_cast_button_running: "Uruchomiono"
tome_cast_button_ran: "Uruchomiono"
tome_submit_button: "Prześlij"
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
# 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_help: "Pomoc"
# tome_current_method: "Current Method"
# hud_continue_short: "Continue"
hud_continue_short: "Kontynuuj"
code_saved: "Kod zapisano"
skip_tutorial: "Pomiń (esc)"
keyboard_shortcuts: "Skróty klawiszowe"
@ -294,11 +294,11 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
time_current: "Teraz:"
time_total: "Maksymalnie:"
time_goto: "Idź do:"
# non_user_code_problem_title: "Unable to Load Level"
# infinite_loop_title: "Infinite Loop Detected"
non_user_code_problem_title: "Błąd podczas ładowania poziomu"
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."
# 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_reset_level: "Resetuj poziom"
infinite_loop_comment_out: "Comment Out My Code"
@ -355,13 +355,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
save_load_tab: "Zapisz/Wczytaj"
options_tab: "Opcje"
guide_tab: "Przewodnik"
# guide_video_tutorial: "Video Tutorial"
guide_video_tutorial: "Wideo poradnik"
guide_tips: "Wskazówki"
multiplayer_tab: "Multiplayer"
auth_tab: "Zarejestruj się"
inventory_caption: "Wyposaż swojego bohatera"
choose_hero_caption: "Wybierz bohatera, język"
# save_load_caption: "... and view history"
save_load_caption: "... i przejrzyj historię"
options_caption: "Ustaw opcje"
guide_caption: "Dokumenty i wskazówki"
multiplayer_caption: "Graj ze znajomymi!"
@ -369,30 +369,30 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
leaderboard:
leaderboard: "Najlepsze wyniki"
# view_other_solutions: "View Leaderboards"
view_other_solutions: "Pokaż tablicę wyników"
scores: "Wyniki"
# top_players: "Top Players by"
top_players: "Najlepsi gracze"
day: "Dziś"
# week: "This Week"
# all: "All-Time"
week: "W tym tygodniu"
all: "Zawsze"
time: "Czas"
damage_taken: "Obrażenia otrzymane"
damage_dealt: "Obrażenia zadane"
# difficulty: "Difficulty"
difficulty: "Trudność"
gold_collected: "Złoto zebrane"
inventory:
# choose_inventory: "Equip Items"
# equipped_item: "Equipped"
choose_inventory: "Załóż przedmioty"
equipped_item: "Założone"
required_purchase_title: "Wymagane"
available_item: "Dostępne"
# restricted_title: "Restricted"
# should_equip: "(double-click to equip)"
# equipped: "(equipped)"
restricted_title: "Zabronione"
should_equip: "(kliknij podwójnie, aby założyć)"
equipped: "(założone)"
locked: "(zablokowane)"
restricted: "(niedostępne na tym poziomie)"
# equip: "Equip"
# unequip: "Unequip"
restricted: "(zabronione)"
equip: "Załóż"
unequip: "Zdejmij"
# buy_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."
# price: "x3500 / mo"
# subscribe:
subscribe:
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
# feature1: "100+ basic levels across 4 worlds"
# feature2: "10 powerful <strong>new heroes</strong> with unique skills!"
# feature3: "70+ bonus levels"
# feature4: "<strong>3500 bonus gems</strong> every month!"
# feature5: "Video tutorials"
feature5: "Poradniki wideo"
# feature6: "Premium email support"
# feature7: "Private <strong>Clans</strong>"
# free: "Free"
# month: "month"
feature7: "Prywatne <strong>Klany</strong>"
free: "Za darmo"
month: "miesięcznie"
# subscribe_title: "Subscribe"
# unsubscribe: "Unsubscribe"
# confirm_unsubscribe: "Confirm Unsubscribe"
@ -481,38 +481,38 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
programming_language: "Język programowania"
programming_language_description: "Którego języka programowania chcesz używać?"
default: "domyślny"
# experimental: "Experimental"
experimental: "Eksperymentalny"
python_blurb: "Prosty ale potężny."
javascript_blurb: "Język internetu."
coffeescript_blurb: "Przyjemniejsza składnia JavaScript."
clojure_blurb: "Nowoczesny Lisp."
lua_blurb: "Język skryptowy gier."
io_blurb: "Prosty lecz nieznany."
# status: "Status"
status: "Status"
hero_type: "Typ"
# weapons: "Weapons"
# weapons_warrior: "Swords - Short Range, No Magic"
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
# weapons_wizard: "Wands, Staffs - Long Range, Magic"
# attack: "Damage" # Can also translate as "Attack"
# health: "Health"
weapons: "Bronie"
weapons_warrior: "Miecze - Krótki zasięg, Brak magii"
weapons_ranger: "Kusze, Pistolety - Daleki zasięg, Brak magii"
weapons_wizard: "Różdżki, Laski - Daleki zasięg, Magia"
attack: "Obrażenia" # Can also translate as "Attack"
health: "Życie"
speed: "Szybkość"
# regeneration: "Regeneration"
regeneration: "Regenaracja"
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"
skills: "Umiejętności"
attack_1: "Zadaje"
# attack_2: "of listed"
# attack_3: "weapon damage."
# health_1: "Gains"
health_1: "Zdobywa"
# health_2: "of listed"
# health_3: "armor health."
# speed_1: "Moves at"
# speed_2: "meters per second."
speed_1: "Idzie do"
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
# 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)
# restricted_to_certain_heroes: "Only certain heroes can play this level."
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: "Tylko nieliczni bohaterowie mogą brać udział w tym poziomie."
skill_docs:
# 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"
current_value: "Aktualna wartość"
default_value: "Domyślna wartość"
# parameters: "Parameters"
# returns: "Returns"
# granted_by: "Granted by"
parameters: "Parametry"
returns: "Zwraca"
granted_by: "Zdobyte dzięki:"
save_load:
granularity_saved_games: "Zapisano"
# granularity_change_history: "History"
granularity_change_history: "Historia"
options:
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_blurb: "Sys Admin"
matt_title: "Programista" # {change}
# matt_blurb: "Bicyclist"
matt_blurb: "Rowerzysta"
# cat_title: "Chief Artisan"
# cat_blurb: "Airbender"
# josh_title: "Game Designer"
josh_blurb: "Podłoga to lawa"
# jose_title: "Music"
jose_title: "Muzyka"
# jose_blurb: "Taking Off"
# retrostyle_title: "Illustration"
# 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_suffix: "."
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_us: "Kontakt z CodeCombat"
@ -687,16 +687,16 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
forum_prefix: "W sprawach ogólnych, skorzystaj z "
forum_page: "naszego forum"
forum_suffix: "."
# faq_prefix: "There's also a"
faq_prefix: "Jest też"
faq: "FAQ"
# subscribe_prefix: "If you need help figuring out a level, please"
# subscribe: "buy a CodeCombat subscription"
# 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."
# screenshot_included: "Screenshot included."
# where_reply: "Where should we reply?"
where_reply: "Gdzie mamy odpisać?"
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
account_settings:
@ -707,7 +707,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
picture_tab: "Zdjęcie"
delete_account_tab: "Usuń swoje konto"
wrong_email: "Błędny e-mail"
# wrong_password: "Wrong Password"
wrong_password: "Błędne zdjęcie"
upload_picture: "Wgraj zdjęcie"
delete_this_account: "Usuń to konto całkowicie"
# god_mode: "God Mode"
@ -716,8 +716,8 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
admin: "Administrator"
new_password: "Nowe hasło"
new_password_verify: "Zweryfikuj"
# type_in_email: "Type in your email to confirm account deletion."
# type_in_password: "Also, type in your password."
type_in_email: "Wpisz swój email, aby potwierdzić usunięcie konta."
type_in_password: "Wpisz również swoje hasło."
email_subscriptions: "Powiadomienia email"
email_subscriptions_none: "Brak powiadomień e-mail."
email_announcements: "Ogłoszenia"
@ -748,10 +748,10 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
keyboard_shortcuts: "Skróty klawiszowe"
space: "Spacja"
enter: "Enter"
# press_enter: "press enter"
# escape: "Escape"
press_enter: "naciśnij enter"
escape: "Escape"
shift: "Shift"
# run_code: "Run current code."
run_code: "Uruchom obecny kod."
run_real_time: "Uruchom \"na żywo\"."
continue_script: "Kontynuuj ostatni skrypt."
# 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"
# contribute_to_the_project: "Contribute to the project"
# clans:
# clan: "Clan"
# clans: "Clans"
# new_name: "New clan name"
# new_description: "New clan description"
# make_private: "Make clan private"
# subs_only: "subscribers only"
# create_clan: "Create New Clan"
# private_preview: "Preview"
# public_clans: "Public Clans"
# my_clans: "My Clans"
# clan_name: "Clan Name"
# name: "Name"
# chieftain: "Chieftain"
# type: "Type"
# edit_clan_name: "Edit Clan Name"
# edit_clan_description: "Edit Clan Description"
# edit_name: "edit name"
# edit_description: "edit description"
# private: "(private)"
# summary: "Summary"
# average_level: "Average Level"
# average_achievements: "Average Achievements"
# delete_clan: "Delete Clan"
# leave_clan: "Leave Clan"
# join_clan: "Join Clan"
# invite_1: "Invite:"
# invite_2: "*Invite players to this Clan by sending them this link."
# members: "Members"
# progress: "Progress"
# not_started_1: "not started"
# started_1: "started"
# complete_1: "complete"
clans:
clan: "Klan"
clans: "Klany"
new_name: "Nazwa nowego klanu"
new_description: "Opis nowego klanu"
make_private: "Stwórz prywatny klan"
subs_only: "tylko subskrybenci"
create_clan: "Stwórz nowy klan"
private_preview: "Podgląd"
public_clans: "Publiczne klany"
my_clans: "Moje klany"
clan_name: "Nazwa klanu"
name: "Nazwa"
chieftain: "Dowódca"
type: "Typ"
edit_clan_name: "Edytuj nazwe klanu"
edit_clan_description: "Edytuj opis klanu"
edit_name: "edytuj nazwe"
edit_description: "edytuj opis"
private: "(prywatny)"
summary: "Podsumowanie"
average_level: "Średni poziom"
average_achievements: "Średnio osiągnięć"
delete_clan: "Usuń klan"
leave_clan: "Opuść klan"
join_clan: "Dołacz do klanu"
invite_1: "Zaproszenie:"
invite_2: "*Zaproś nowe osoby do klanu wysyłając im ten link."
members: "Członkowie"
progress: "Postęp"
not_started_1: "nierozpoczęty"
started_1: "rozpoczęty"
complete_1: "ukończony"
# exp_levels: "Expand levels"
# rem_hero: "Remove Hero"
# status: "Status"
rem_hero: "Usuń bohatera"
status: "Status"
# complete_2: "Complete"
# started_2: "Started"
# not_started_2: "Not Started"
# view_solution: "Click to view solution."
# latest_achievement: "Latest Achievement"
# playtime: "Playtime"
# last_played: "Last played"
playtime: "Czas gyr"
last_played: "Ostatnio grany"
classes:
archmage_title: "Arcymag"
@ -857,9 +857,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
back: "Wstecz"
revert: "Przywróć"
revert_models: "Przywróć wersję"
# pick_a_terrain: "Pick A Terrain"
pick_a_terrain: "Wybierz teren"
dungeon: "Loch"
# indoor: "Indoor"
indoor: "Wnętrze"
desert: "Pustynia"
grassy: "Trawa"
small: "Mały"
@ -889,8 +889,8 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# component_configs: "Component Configurations"
# config_thang: "Double click to configure a thang"
delete: "Usuń"
# duplicate: "Duplicate"
# stop_duplicate: "Stop Duplicate"
duplicate: "Powiel"
stop_duplicate: "Przestań powielać"
rotate: "Obróć"
level_settings_title: "Ustawienia"
level_component_tab_title: "Aktualne komponenty"
@ -931,14 +931,14 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
tasks: "Zadania"
# clear_storage: "Clear your local changes"
# add_system_title: "Add Systems to Level"
# done_adding: "Done Adding"
done_adding: "Zakończono dodawanie"
article:
edit_btn_preview: "Podgląd"
edit_article_title: "Edytuj artykuł"
# polls:
# priority: "Priority"
polls:
priority: "Priorytet"
contribute:
page_title: "Współpraca"
@ -1019,7 +1019,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
games_simulated_for: "Gry symulowane dla Ciebie:"
games_simulated: "Gier zasymulowanych"
games_played: "Gier rozegranych"
# ratio: "Ratio"
ratio: "Proporcje"
leaderboard: "Tabela rankingowa"
battle_as: "Walcz jako "
summary_your: "Twój "
@ -1033,7 +1033,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
rank_failed: "Błąd oceniania"
rank_being_ranked: "Aktualnie oceniane gry"
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."
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."
@ -1066,29 +1066,29 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
user:
stats: "Statystyki"
# singleplayer_title: "Singleplayer Levels"
# multiplayer_title: "Multiplayer Levels"
singleplayer_title: "Poziomy jednoosobowe"
multiplayer_title: "Poziomy multiplayer"
achievements_title: "Osiągnięcia"
# last_played: "Last Played"
last_played: "Ostatnio grany"
status: "Status"
status_completed: "Ukończono"
status_unfinished: "Nie ukończono"
# no_singleplayer: "No Singleplayer games played yet."
# no_multiplayer: "No Multiplayer games played yet."
# no_achievements: "No Achievements earned yet."
no_singleplayer: "Nie rozegrał żadnej gry jednoosobowej."
no_multiplayer: "Nie rozegrał żadnej gry multiplayer."
no_achievements: "Nie zdobył żadnych osiągnięć."
favorite_prefix: "Ulubiony język to "
# favorite_postfix: "."
# not_member_of_clans: "Not a member of any clans yet."
favorite_postfix: "."
not_member_of_clans: "Nie jest członkiem żadnego klanu."
# achievements:
# last_earned: "Last Earned"
# amount_achieved: "Amount"
# achievement: "Achievement"
achievements:
last_earned: "Ostatnio zdobyty"
amount_achieved: "Ilość"
achievement: "Osiągnięcie"
# category_contributor: "Contributor"
# category_ladder: "Ladder"
# category_level: "Level"
category_level: "Poziom"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
category_levels: "Poziomy"
# category_undefined: "Uncategorized"
# current_xp_prefix: ""
# current_xp_postfix: " in total"
@ -1145,9 +1145,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# unknown: "Unknown error."
resources:
# sessions: "Sessions"
# your_sessions: "Your Sessions"
# level: "Level"
sessions: "Sesje"
your_sessions: "Twoje sesje"
level: "Poziom"
# social_network_apis: "Social Network APIs"
# facebook_status: "Facebook Status"
# facebook_friends: "Facebook Friends"
@ -1184,38 +1184,38 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
# user_remarks: "User Remarks"
versions: "Wersje"
items: "Przedmioty"
# hero: "Hero"
hero: "Bohater"
heroes: "Bohaterowie"
achievement: "Osiągnięcie"
# clas: "CLAs"
# play_counts: "Play Counts"
# feedback: "Feedback"
feedback: "Wsparcie"
# payment_info: "Payment Info"
campaigns: "Kampanie"
poll: "Ankieta"
user_polls_record: "Historia oddanych głosów"
# concepts:
concepts:
# advanced_strings: "Advanced Strings"
# algorithms: "Algorithms"
# arguments: "Arguments"
# arithmetic: "Arithmetic"
# arrays: "Arrays"
# basic_syntax: "Basic Syntax"
# boolean_logic: "Boolean Logic"
algorithms: "Algorytmy"
arguments: "Argumenty"
arithmetic: "Arytmetyka"
arrays: "Tablice"
basic_syntax: "Podstawy składni"
boolean_logic: "Algebra Boole'a"
# break_statements: "Break Statements"
# classes: "Classes"
# for_loops: "For Loops"
# functions: "Functions"
# if_statements: "If Statements"
classes: "Klasy"
for_loops: "Pętle for"
functions: "Funkcje"
if_statements: "Wyrażenia warunkowe"
# input_handling: "Input Handling"
# math_operations: "Math Operations"
# object_literals: "Object Literals"
# strings: "Strings"
# variables: "Variables"
# vectors: "Vectors"
# while_loops: "Loops"
# recursion: "Recursion"
strings: "Ciągi znaków"
variables: "Zmienne"
vectors: "Wektory"
while_loops: "Pętle"
recursion: "Rekurencja"
delta:
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
account: "Conta" # Tooltip on account 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
change_hero: "Alterar Herói" # Go back from choose inventory to choose hero
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_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!"
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_strong_opponents: "Even the strongest of opponents always has a weakness. - Itachi Uchiha"
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: "Mesmo o mais forte dos adversários tem sua fraqueza. - Itachi Uchiha"
game_menu:
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_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
# private_clans_3: "."
# who_for_title: "Who is CodeCombat for?"
# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed."
who_for_title: "Para quem é indicado o CodeCombat?"
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."
# material_title: "How much material is there?"
# 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"
delete_account_tab: "Excluir sua conta"
wrong_email: "E-mail incorreto"
# wrong_password: "Wrong Password"
wrong_password: "Senha Incorreta"
upload_picture: "Enviar uma foto"
delete_this_account: "Excluir essa conta definitivamente"
god_mode: "Modo Deus"
@ -717,7 +717,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
new_password: "Nova Senha"
new_password_verify: "Confirmação"
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_none: "Sem Assinaturas de Email"
email_announcements: "Notícias"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
keyboard_shortcuts: "Atalhos do Teclado"
space: "Espaço"
enter: "Enter"
# press_enter: "press enter"
press_enter: "pressione enter"
escape: "Esc"
shift: "Shift"
run_code: "Rodar código atual."
@ -853,7 +853,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
thang_title: "Editor de Thang"
level_title: "Editor de Nível"
achievement_title: "Editor de Conquistas"
# poll_title: "Poll Editor"
poll_title: "Editor de Enquete"
back: "Voltar"
revert: "Reverter"
revert_models: "Reverter Modelos"
@ -884,7 +884,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
level_tab_thangs_all: "Tudo"
level_tab_thangs_conditions: "Condições de Início"
level_tab_thangs_add: "Adicionar Thangs"
# level_tab_thangs_search: "Search thangs"
level_tab_thangs_search: "Buscar thangs"
add_components: "Adicionar componentes"
component_configs: "Configurações de componente"
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_achievement_title: "Criar Nova Conquista"
new_achievement_title_login: "Faça login para Criar uma Nova Conquista"
# new_poll_title: "Create a New Poll"
# new_poll_title_login: "Log In to Create a New Poll"
new_poll_title: "Criar uma nova enquete"
new_poll_title_login: "Faça login para criar uma nova enquete"
article_search_title: "Procurar Artigos Aqui"
thang_search_title: "Procurar Tipos de Thang Aqui"
level_search_title: "Procurar Níveis Aqui"
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."
no_achievements: "Nenhuma conquista foi adicionada para esse nível ainda."
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_7: "Clãs Privados"
monitor_progress_title: "Como é que acompanho o progresso dos estudantes?"
# monitor_progress_1: "Student progress can be monitored by creating a"
# monitor_progress_2: "for your class."
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the"
# 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_1: "O progresso dos estudantes pode ser acompanhado ao criares um"
monitor_progress_2: "para a tua turma."
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: ", ao acederes ao teu."
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_2: "Para criares um Clã privado, marca a caixa 'Tornar o clã privado' aquando da criação de um"
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."
material_title: "Quanto material há?"
# 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?"
how_much_title: "Quanto custa uma subscrição mensal?"
how_much_1: "Uma"
@ -869,7 +869,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
generate_terrain: "Gerar Terreno"
more: "Mais"
wiki: "Wiki"
live_chat: "Chat Ao Vivo"
live_chat: "Chat ao Vivo"
thang_main: "Principal"
thang_spritesheets: "Spritesheets"
thang_colors: "Cores"
@ -1195,32 +1195,32 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
poll: "Votações"
user_polls_record: "Histórico das Votações"
# concepts:
# advanced_strings: "Advanced Strings"
# algorithms: "Algorithms"
# arguments: "Arguments"
# arithmetic: "Arithmetic"
# arrays: "Arrays"
# basic_syntax: "Basic Syntax"
# boolean_logic: "Boolean Logic"
# break_statements: "Break Statements"
# classes: "Classes"
# for_loops: "For Loops"
# functions: "Functions"
# if_statements: "If Statements"
# input_handling: "Input Handling"
# math_operations: "Math Operations"
# object_literals: "Object Literals"
# strings: "Strings"
# variables: "Variables"
# vectors: "Vectors"
# while_loops: "Loops"
# recursion: "Recursion"
concepts:
advanced_strings: "'Strings' Avançadas"
algorithms: "Algoritmos"
arguments: "Argumentos"
arithmetic: "Aritmética"
arrays: "'Arrays'"
basic_syntax: "Sintaxe Básica"
boolean_logic: "Lógica 'Boolean'"
break_statements: "Declarações 'Break'"
classes: "Classes"
for_loops: "'For Loops'"
functions: "Funções"
if_statements: "Declarações 'If'"
input_handling: "Manuseamento de 'Input'"
math_operations: "Operações Matemáticas"
object_literals: "'Object Literals'"
strings: "'Strings'"
variables: "Variáveis"
vectors: "Vetores"
while_loops: "'Loops'"
recursion: "Recursão"
delta:
added: "Adicionados/as"
modified: "Modificados/as"
deleted: "Eliminados/as"
added: "Adicionado"
modified: "Modificado"
deleted: "Eliminado"
moved_index: "Índice Movido"
text_diff: "Diferença de Texto"
merge_conflict_with: "FUNDIR CONFLITO COM"
@ -1402,19 +1402,19 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
# education_duration: "Dates"
education_duration_help: "Quando?"
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"
# remarks: "Remarks"
projects: "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."
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_help: "Descreve o projeto em poucas palavras."
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_help: "Ligação para o projeto."
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_classic_algorithms: "经典算法"
campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法"
# 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: "(过时的)旧的多人竞技场"
campaign_old_multiplayer_description: "一个文明时代的遗迹。没有模拟运行这些老的、英雄少的多人竞技场。"
share_progress_modal:
blurb: "你的进度真快快告诉其他人你从CodeCombat学到了什么" # {change}
@ -160,7 +160,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
unwatch: "取消关注"
submit_patch: "提交补丁"
submit_changes: "提交更新"
# save_changes: "Save Changes"
save_changes: "保存更新"
general:
and: ""
@ -296,7 +296,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
time_goto: "跳到:"
non_user_code_problem_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_link: "(说明)"
infinite_loop_try_again: "请重试"
@ -347,7 +347,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
tip_hate_computers: "那些认为他们讨厌电脑的人,其实他们讨厌的是垃圾程序编写员。- Larry Niven"
tip_open_source_contribute: "你可以帮助「CodeCombat」提高"
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"
game_menu:
@ -405,7 +405,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
prompt_body: "还需要更多吗?"
prompt_button: "进入商店"
recovered: "之前购买的宝石已恢复。请刷新页面。"
# price: "x3500 / mo"
price: "x3500 / 月"
subscribe:
comparison_blurb: "订阅CodeCombat大力的提升你的技能"
@ -450,31 +450,31 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
unlock_help_videos: "订阅后才可以解锁视频教学哦!"
personal_sub: "个人订阅" # Accounts Subscription View below
loading_info: "正在读入订阅内容..."
# managed_by: "Managed by"
# will_be_cancelled: "Will be cancelled on"
# currently_free: "You currently have a free subscription"
# currently_free_until: "You currently have a free subscription until"
# was_free_until: "You had a free subscription until"
# managed_subs: "Managed Subscriptions"
# managed_subs_desc: "Add subscriptions for other players (students, children, etc.)"
# managed_subs_desc_2: "Recipients must have a CodeCombat account associated with the email address you provide."
# group_discounts: "Group discounts"
# group_discounts_1: "We also offer group discounts for bulk subscriptions."
# group_discounts_1st: "1st subscription"
managed_by: "管理"
will_be_cancelled: "将被取消"
currently_free: "您目前有一个免费订阅"
currently_free_until: "您目前有一个免费订阅,直到"
was_free_until: "您有过一个免费订阅,直到"
managed_subs: "管理订阅"
managed_subs_desc: "为其他玩家(学生、儿童等)添加订阅。"
managed_subs_desc_2: "收件人必须有一个与您提供的电子邮件地址相关联的codecombat帐户。"
group_discounts: "团购价"
group_discounts_1: "我们还为批量订阅提供团购价"
group_discounts_1st: "1个订阅"
group_discounts_full: "全价"
# group_discounts_2nd: "Subscriptions 2-11"
group_discounts_2nd: "2-11个订阅"
group_discounts_20: "八折"
# group_discounts_12th: "Subscriptions 12+"
group_discounts_12th: "12+个订阅"
group_discounts_40: "六折"
# subscribing: "Subscribing..."
# recipient_emails_placeholder: "Enter email address to subscribe, one per line."
subscribing: "订阅中..."
recipient_emails_placeholder: "请输入电子邮件地址来订阅,每行一个。"
subscribe_users: "订阅用户"
# users_subscribed: "Users subscribed:"
# no_users_subscribed: "No users subscribed, please double check your email addresses."
# current_recipients: "Current Recipients"
# unsubscribing: "Unsubscribing..."
# subscribe_prepaid: "Click Subscribe to use prepaid code"
# using_prepaid: "Using prepaid code for monthly subscription"
users_subscribed: "用户订阅:"
no_users_subscribed: "没有用户订阅,请仔细检查您的电子邮件地址。"
current_recipients: "当前收件人"
unsubscribing: "取消订阅中..."
subscribe_prepaid: "点击订阅来使用预付费代码"
using_prepaid: "使用预付费代码进行每月订阅"
choose_hero:
choose_hero: "请选择您的英雄"
@ -502,13 +502,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
blocks: "格挡" # As in "this shield blocks this much damage"
backstab: "背刺" # As in "this dagger does this much backstab damage"
skills: "技能"
# attack_1: "Deals"
# attack_2: "of listed"
attack_1: "交易"
attack_2: "列表"
attack_3: "武器攻击力."
# health_1: "Gains"
# health_2: "of listed"
health_1: "收益"
health_2: "列表"
health_3: "装备血量."
# speed_1: "Moves at"
speed_1: "移动速度"
speed_2: "米每秒."
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)
@ -588,57 +588,57 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
josh_title: "游戏设计师"
josh_blurb: "地面是熔岩"
jose_title: "音乐"
# jose_blurb: "Taking Off"
# retrostyle_title: "Illustration"
# retrostyle_blurb: "RetroStyle Games"
jose_blurb: "放轻松"
retrostyle_title: "插画师"
retrostyle_blurb: "复古风格的游戏"
teachers:
title: "CodeCombat给教师的说明"
intro_1: "CodeCombat 是一个教编程的网上游戏。学生会用编程语言写代码。"
intro_2: "无需经验!"
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."
# free_1: "There are 100+ FREE levels which cover every concept."
# free_2: "A monthly subscription provides access to video tutorials and extra practice levels."
cost_china: "CodeCombat的前5个关卡在中国是免费的在这之后需花费每月9.99美元来访问我们架设在中国专属服务器上的140多个关卡。"
free_1: "有100多个覆盖了所有理论的免费关卡。"
free_2: "包月订阅可以访问视频教程和额外的练习关卡。"
teacher_subs_title: "教师可免费订阅!"
teacher_subs_1: "请联系" # {change}
# teacher_subs_2: "Teacher Survey"
# teacher_subs_3: "to set up your subscription."
# sub_includes_title: "What is included in the subscription?"
# sub_includes_1: "In addition to the 100+ basic levels, students with a monthly subscription get access to these additional features:"
teacher_subs_2: "教师调查"
teacher_subs_3: "建立您的订阅。"
sub_includes_title: "订阅里包含了什么内容?"
sub_includes_1: "除了100多个基础关卡学生包月订阅还可以使用这些附加功能"
sub_includes_2: "超过60个练习关卡" # {change}
sub_includes_3: "视频教学"
# sub_includes_4: "Premium email support"
# sub_includes_5: "10 new heroes with unique skills to master"
sub_includes_4: "优质的电子邮件支持"
sub_includes_5: "10个具有独特技能的新英雄"
sub_includes_6: "每月享有3500额外宝石"
# sub_includes_7: "Private Clans"
# monitor_progress_title: "How do I monitor student progress?"
# monitor_progress_1: "Student progress can be monitored by creating a"
# monitor_progress_2: "for your class."
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the"
# 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."
# 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_3: "."
# who_for_title: "Who is CodeCombat for?"
# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed."
# who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
# material_title: "How much material is there?"
# 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."
# concepts_title: "What concepts are covered?"
sub_includes_7: "私有团队"
monitor_progress_title: "我要如何查看学生的进度?"
monitor_progress_1: "要查看学生的进度,可以通过建立一个"
monitor_progress_2: "在你的课程。"
monitor_progress_3: "为了添加一个学生,可以给他们发送一个你的团队的邀请链接,这个在"
monitor_progress_4: "页面。"
monitor_progress_5: "当他们加入之后,你可以在你的团队页面看到这些学生的进度汇总。"
private_clans_1: "私有团队为每个学生增加了隐私和详细的进度信息。"
private_clans_2: "为了添加一个私有团队,可以勾选'私有团队'复选框,在你建立一个"
private_clans_3: ""
who_for_title: "谁是CodeCombat的使用对象呢"
who_for_1: "我们建议让9岁及以上的学生使用CodeCombat。无需任何编程经验。"
who_for_2: "我们设计CodeCombat来吸引男生女生。"
material_title: "这里有多少素材呢?"
material_china: "约40小时的游戏时间和目前为止超过170个的订阅关卡。"
material_1: "大约25个小时的免费内容和额外的15个小时的订阅内容。"
concepts_title: "包括了哪些理论知识?"
how_much_title: "每月的订阅费用是多少?"
how_much_1: ""
how_much_2: "每月订阅"
how_much_3: "每月$9.99, 并可随时要求退款."
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_6: "for more details."
# more_info_title: "Where can I find more information?"
# more_info_1: "Our"
# more_info_2: "teachers forum"
# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat."
how_much_5: "我们接受一次性的打折购买以及每年订阅的团体,比如班级或者学校。请联系"
how_much_6: "来获取详情。"
more_info_title: "我可以在哪里找到更多信息?"
more_info_1: "我们的"
more_info_2: "教师论坛"
more_info_3: "是个与其他使用CodeCombat的教育工作者联系的良好平台。"
sys_requirements_title: "系统需求"
sys_requirements_1: "因为CodeCombat是个游戏它对于电脑的要求很高以运行的顺畅。我们已经优化过他以便让他能在每一个最新浏览器或是比较旧的电脑跑得顺畅所以每一个人都能享受CodeCombat带来的乐趣。如上为了使你顺利的完成Hour of Code的学习我们建议你" # {change}
sys_requirements_2: "使用最新版本的Chrome或是Firefox." # {change}
@ -679,7 +679,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
cla_url: "贡献者许可协议"
cla_suffix: ""
cla_agree: "我同意"
# owner_approve: "An owner will need to approve it before your changes will become visible."
owner_approve: "你所做出的修改必须经拥有者确认才能生效。"
contact:
contact_us: "联系我们"
@ -707,7 +707,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
picture_tab: "图片"
delete_account_tab: "删除账户"
wrong_email: "错误的邮箱地址"
# wrong_password: "Wrong Password"
wrong_password: "密码错误"
upload_picture: "上传一张图片"
delete_this_account: "永久删除账户"
god_mode: "上帝模式"
@ -717,7 +717,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
new_password: "新密码"
new_password_verify: "核实"
type_in_email: "输入你的邮箱地址来确认删除" # {change}
# type_in_password: "Also, type in your password."
type_in_password: "同样的,输入你的密码。"
email_subscriptions: "邮箱订阅"
email_subscriptions_none: "取消订阅"
email_announcements: "通知"
@ -748,7 +748,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
keyboard_shortcuts: "快捷键"
space: "空格"
enter: "回车"
# press_enter: "press enter"
press_enter: "按回车键"
escape: "Esc"
shift: "Shift"
run_code: "运行当前代码"
@ -884,7 +884,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
level_tab_thangs_all: "所有"
level_tab_thangs_conditions: "启动条件"
level_tab_thangs_add: "增加物体"
# level_tab_thangs_search: "Search thangs"
level_tab_thangs_search: "查找物体"
add_components: "添加组件"
component_configs: "组件配置"
config_thang: "双击配置一个thang"
@ -931,7 +931,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
tasks: "任务"
# clear_storage: "Clear your local changes"
# add_system_title: "Add Systems to Level"
# done_adding: "Done Adding"
done_adding: "添加完毕"
article:
edit_btn_preview: "预览"
@ -1078,7 +1078,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
no_achievements: "还未得到任何成就。"
favorite_prefix: "最喜爱的语言是 "
favorite_postfix: ""
# not_member_of_clans: "Not a member of any clans yet."
not_member_of_clans: "还不是任何一个团队里的成员。"
achievements:
last_earned: "最近取得的"
@ -1104,7 +1104,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
payments: "支付方式"
purchased: "已购买"
subscription: "订阅"
# invoices: "Invoices"
invoices: "票据"
service_apple: "设备:苹果"
service_web: "设备:网页"
paid_on: "支付"
@ -1184,7 +1184,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
user_remarks: "用户备注"
versions: "版本"
items: "物品"
# hero: "Hero"
hero: "英雄"
heroes: "英雄"
achievement: "成就"
clas: "CLAs"

View file

@ -50,14 +50,14 @@ module.exports = class Level extends CocoModel
denormalize: (supermodel, session, otherSession) ->
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
@denormalizeThang(levelThang, supermodel, session, otherSession)
o
denormalizeThang: (levelThang, supermodel, session, otherSession) ->
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 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.

View file

@ -57,7 +57,7 @@ _.extend CampaignSchema.properties, {
i18n: { type: 'object', format: 'hidden' }
requiresSubscription: { 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' }
original: { type: 'string', format: 'hidden' }
adventurer: { type: 'boolean' }

View file

@ -293,7 +293,7 @@ _.extend LevelSchema.properties,
icon: {type: 'string', format: 'image-file', title: 'Icon'}
banner: {type: 'string', format: 'image-file', title: 'Banner'}
goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', '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
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'}

View file

@ -1,5 +1,10 @@
#course-details-view
.member-header
cursor: pointer
display: inline-block
padding: 2px
.textarea-emails
width: 50%
@ -13,6 +18,7 @@
.progress-header
margin-right: 14px
cursor: pointer
.progress-key
cursor: default
@ -51,6 +57,19 @@
background-color: blanchedalmond
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
display: inline-block
white-space: nowrap

View file

@ -1,18 +1,31 @@
#course-info-view
.btn-enroll
margin-top: 20px
.center
text-align: center
.caption-text
font-size: 14px
.concepts-container
width: 200px
.contact-container
margin-top: 20px
text-align: center
.info-container
margin: 0% 10%
font-size: 18px
.monitoring-img-container
margin-top: 10px
.praise-quote
font-size: 24px
font-style: italic
.praise-source
font-size: 16px
.progress-container
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='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
a(href="/play-old", data-i18n="play.older_campaigns") Older Campaigns
if me.isAdmin()
a(href='/admin', data-i18n="nav.admin") Admin

View file

@ -4,120 +4,156 @@ block content
//- DO NOT localize / i18n
div TODO: fix ugly tabs
div TODO: aggregate student progress
div TODO: student level progress popups
div
span *UNDER CONSTRUCTION, send feedback to
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
div
input.student-view-checkbox(type='checkbox')
input.student-mode-checkbox(type='checkbox', checked=studentMode)
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;')
h1= course.title
p= course.description
p
strong Concepts:
ul
each topic in course.topics
li= topic
strong= course.duration
//- p
//- strong Concepts:
//- ul
//- each concept in courseConcepts
//- li(data-i18n="concepts." + concept)
//- strong= course.duration
h3 Your Class
.form-group
select.form-control.select-session
each instance in instances
option= instance.name
span.spl
button.btn.btn-xs.edit-class-name-btn edit class name
if !studentMode
p
.form-group
span.spr Select your class
select.form-control.select-session
each instance in instances
option= instance.name
h3= instance.name
if !studentMode
span.spl
button.btn.btn-xs.edit-class-name-btn edit class name
p
if instance.description
span= instance.description
span.spl
button.btn.btn-xs.edit-description-btn edit class description
else
if !studentMode
span.spl
button.btn.btn-xs.edit-description-btn edit class description
else if !studentMode
div
button.btn.btn-xs.edit-description-btn add class description
.form-group
span Class programming language:
select.spl.form-control.select-language
option(value="Python") Python
option(value="JavaScript") JavaScript
option(value="All Languages") All Languages
if !studentMode
.form-group
span.spr Select language
select.form-control.select-language
option(value="Python") Python
option(value="JavaScript") JavaScript
option(value="All Languages") All Languages
div(role='tabpanel')
ul.nav.nav-tabs(role='tablist')
li.active(role='presentation')
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Students
li(role='presentation')
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
if !studentMode
li.active(role='presentation')
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Students
li(role='presentation')
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
li(role='presentation')
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels
.tab-content
.tab-pane.active#progress(role='tabpanel')
if instance.students
table.table.table-condensed
thead
tr
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
if !studentMode
.tab-pane.active#progress(role='tabpanel')
if instance.students
table.table.table-condensed
thead
tr
td
a= student
td.progress-cell
- var i = 0
each level in course.levels
if i <= userLevelStateMap[student].lastCompletedIndex
span.progress-level-cell.progress-level-cell-complete #{i + 1}
if showExpandedProgress || i === 0 || i === course.levels.length - 1
span.spl #{level}
else if i <= userLevelStateMap[student].lastStartedIndex
span.progress-level-cell.progress-level-cell-started #{i + 1}
if showExpandedProgress || i === 1 || i === userLevelStateMap[student].lastStartedIndex
span.spl #{level}
else
span.progress-level-cell.level-progression-level-not-started #{i + 1}
if showExpandedProgress || i === 1 || i === userLevelStateMap[student].lastStartedIndex
span.spl #{level}
if i === maxLastStartedIndex
- break
- i++
th
span.member-header.spr Name
if memberSort === 'nameAsc'
span.member-header.glyphicon.glyphicon-chevron-up
else if memberSort === 'nameDesc'
span.member-header.glyphicon.glyphicon-chevron-down
th
span.progress-header.spr Progress
if memberSort === 'progressAsc'
span.progress-header.glyphicon.glyphicon-chevron-up
else if memberSort === 'progressDesc'
span.progress-header.glyphicon.glyphicon-chevron-down
else
span(style='padding-left:16px;')
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
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')
p Invite students to join this class.
if course.title !== 'Introduction to Computer Science'
p Student unlock code: #{instance.code}
p Class capacity: 34/50
textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line")
div
button.btn.btn-success.btn-invite Send Invites
.tab-pane#levels(role='tabpanel')
table.table.table-condensed
thead
tr
th Level
th
tbody
each level in course.levels
tr
td
spa= level
td
button.btn.btn-success Play
.level-progression-levels Levels
- var i = 0
each level in course.levels
if userLevelStateMap[student][level] === 'complete'
span.progress-level-cell.progress-level-cell-complete #{i + 1}
if showExpandedProgress || i === 0 || i === course.levels.length - 1
span.spl #{level}
else if userLevelStateMap[student][level] === 'started'
span.progress-level-cell.progress-level-cell-started #{i + 1} #{level}
else
span.progress-level-cell.level-progression-level-not-started #{i + 1}
if showExpandedProgress || i === 0
span.spl #{level}
- i++
.tab-pane#invite(role='tabpanel')
p Invite students to join this class.
if course.title !== 'Introduction to Computer Science'
p Student unlock code: #{instance.code}
p Class capacity: 34/50
textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line")
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
div TODO: course-specific gameplay screenshots
div TODO: update images, add captions
div
span *UNDER CONSTRUCTION, send feedback to
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')
.well.info-container
.info-container
h1.center= course.title
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
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
span There is approximately
strong.spl 5 hours
span.spl of content.
h3 Topics
ul
each topic in course.topics
li= topic
ul
each topic in course.topics
li= topic
h1.center No Experience Necesssary
p
div.praise-quote "#{praise.quote}"
div.praise-source - #{praise.source}
strong.spr No outside experience
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
p There are help videos and premium email support
h1.center Monitor Student Progress
p.center.monitoring-img-container
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
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
span For more information, please contact

View file

@ -11,7 +11,7 @@ mixin deltaPanel(delta, conflict)
if delta.action === 'deleted'
strong(data-i18n="delta.deleted") Deleted
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'
strong(data-i18n="delta.text_diff") Text Diff
span
@ -45,4 +45,4 @@ mixin deltaPanel(delta, conflict)
+deltaPanel(delta)
if !deltas.length
alert.alert-warning(data-i18n="delta.no_changes") No changes

View file

@ -1,6 +1,6 @@
a(href="/")
img#small-nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
if campaign
.map
.gradient.horizontal-gradient.top-gradient
@ -39,9 +39,9 @@ if campaign
a.spr(href="/contribute/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.
if level.concepts && level.concepts.length
if level.displayConcepts && level.displayConcepts.length
p
for concept in level.concepts
for concept in level.displayConcepts
kbd(data-i18n="concepts." + concept)
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")
if me.get('anonymous', true)
button.btn.settings(data-toggle='coco-modal', data-target='core/AuthModal', data-i18n="[title]play.settings")
.user-status.header-font
.user-status-line
span.gem.gem-30

View file

@ -10,30 +10,6 @@ if docs.length === 1
div
!= 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
ul.nav.nav-tabs
for doc in docs

View file

@ -1,6 +1,8 @@
app = require 'core/application'
RootView = require 'views/core/RootView'
template = require 'templates/courses/mock1/course-details'
CocoCollection = require 'collections/CocoCollection'
Campaign = require 'models/Campaign'
module.exports = class CourseDetailsView extends RootView
id: 'course-details-view'
@ -9,40 +11,120 @@ module.exports = class CourseDetailsView extends RootView
events:
'change .expand-progress-checkbox': 'onExpandedProgressCheckbox'
'change .select-session': 'onChangeSession'
'change .student-mode-checkbox': 'onChangeStudent'
'click .btn-play-level': 'onClickPlayLevel'
'click .edit-class-name-btn': 'onClickEditClassName'
'click .edit-description-btn': 'onClickEditClassDescription'
'click .member-header': 'onClickMemberHeader'
'click .progress-header': 'onClickProgressHeader'
constructor: (options, @courseID) ->
super options
@initData()
destroy: ->
@stopListening?()
getRenderData: ->
context = super()
context.conceptsProgression = @conceptsProgression ? []
context.course = @course ? {}
context.courseConcepts = @courseConcepts ? []
context.instance = @instances?[@currentInstanceIndex] ? {}
context.instances = @instances ? []
context.levelConceptsMap = @levelConceptsMap ? {}
context.maxLastStartedIndex = @maxLastStartedIndex ? 0
context.memberSort = @memberSort
context.userConceptsMap = @userConceptsMap ? {}
context.userLevelStateMap = @userLevelStateMap ? {}
context.showExpandedProgress = @maxLastStartedIndex <= 30 or @showExpandedProgress
context.showExpandedProgress = @course.levels.length <= 30 or @showExpandedProgress
context.studentMode = @options.studentMode ? false
context
initData: ->
@memberSort = 'nameAsc'
mockData = require 'views/courses/mock1/CoursesMockData'
@course = mockData.courses[@courseID]
@currentInstanceIndex = 0
@instances = mockData.instances
@updateLevelMaps()
@campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign, comparator:'_id' })
@listenTo @campaigns, 'sync', @onCampaignSync
@supermodel.loadModel @campaigns, 'clan', cache: false
updateLevelMaps: ->
@levelMap = {}
@levelMap[level] = true for level in @course.levels
@userLevelStateMap = {}
@maxLastStartedIndex = -1
for student in @instances?[@currentInstanceIndex].students
@userLevelStateMap[student] = {}
lastCompletedIndex = _.random(0, @course.levels.length)
for i in [0..lastCompletedIndex]
@userLevelStateMap[student][@course.levels[i]] = 'complete'
lastStartedIndex = lastCompletedIndex + 1
@userLevelStateMap[student] =
lastCompletedIndex: lastCompletedIndex
lastStartedIndex: lastStartedIndex
@userLevelStateMap[student][@course.levels[lastStartedIndex]] = 'started'
@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) ->
@showExpandedProgress = false
@ -50,6 +132,7 @@ module.exports = class CourseDetailsView extends RootView
for val, index in @instances when val.name is newSessionValue
@currentInstanceIndex = index
@updateLevelMaps()
@onCampaignSync()
@render?()
onExpandedProgressCheckbox: (e) ->
@ -63,3 +146,22 @@ module.exports = class CourseDetailsView extends RootView
onClickEditClassDescription: (e) ->
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'
description: 'Learn basic syntax, while loops, and the CodeCombat learning environment.'
topics: ['Basic syntax', 'Strings', 'While Loops']
duration: '1 hour of material'
topics: ['Basic Syntax', 'Strings', 'Loops']
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']
},
{
title: 'Computer Science 102'
description: 'Add parameters, if statements, and some other stuff.'
topics: ['Variables', 'Booleans', 'If Statements', 'Arithmetic']
duration: '5 hours of material'
description: 'Computer Science 102 introduces Arguments, Variables, If Statements, and Arithmetic.'
topics: ['Arguments', 'Variables', 'If Statements', 'Arithmetic']
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']
},
{
title: 'Computer Science 103'
description: 'Learn how to handle input.'
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']
},
{
title: 'Computer Science 104'
description: 'Time to tackle arrays and some pvp stuff.'
topics: ['Arrays', 'Break Statements']
duration: '5 hours of material'
topics: ['Loops', 'Break Statements', 'Arrays']
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']
},
{
title: 'Computer Science 105'
description: 'Time to tackle arrays and some PVP.'
topics: ['Arrays', 'Break Statements', 'Object Literals']
duration: '5 hours of material'
topics: ['Break Statements', 'Arrays', 'Object Literals']
duration: 5
levels: ['Slalom', 'Black Diamond', 'Treasure Cave', 'Ogre Gorge Gouger', 'Dance-Off', 'Alpine Rally', 'Cloudrip Commander', 'Mountain Mercenaries']
},
{
title: 'Computer Science 106'
description: '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']
},
{
title: 'Computer Science 107'
description: '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']
},
{
title: 'Computer Science 108'
description: 'Maths.'
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"]
},
{
title: 'Computer Science 109'
description: 'Vectors and strings.'
topics: ['Vectors', 'Advanced Strings']
duration: '5 hours of material'
duration: 5
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('height', currentView.$el.height()*.6)
@surface = new Surface @world, normalCanvas, webGLCanvas, {
wizards: false
paths: false
grid: true
navigateToSelection: false

View file

@ -46,7 +46,7 @@ module.exports = class LevelThangEditView extends CocoView
level: @level
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
@listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged

View file

@ -202,7 +202,6 @@ module.exports = class ThangsTabView extends CocoView
webGLCanvas = $('canvas#webgl-surface', @$el)
normalCanvas = $('canvas#normal-surface', @$el)
@surface = new Surface @world, normalCanvas, webGLCanvas, {
wizards: false
paths: false
coords: true
grid: true
@ -583,14 +582,14 @@ module.exports = class ThangsTabView extends CocoView
if batchInsert
if thangType.get('name') is '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
thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}"
else
thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID)
if @cloneSourceThang
components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components
else if @level.get('type', true) 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
else
components = _.cloneDeep thangType.get('components') ? []

View file

@ -139,5 +139,5 @@ oldArenas = [
campaigns = [
{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 @editorMode
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.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete']
level.disabled = false if me.isInGodMode()
@ -275,6 +276,11 @@ module.exports = class CampaignView extends RootView
if level.unlocksHero
level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or [])
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
countLevels: (levels) ->
@ -348,7 +354,7 @@ module.exports = class CampaignView extends RootView
@particleMan.attach @$el.find('.map')
for level in @campaign.renderedLevels ? {}
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 'premium' if level.requiresSubscription
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')
levelSlug = levelElement.data('level-slug')
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]
else
@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()
@controlBar.setBus(@bus)
@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: ->
@session = @levelLoader.session
@ -207,7 +194,7 @@ module.exports = class SpectateLevelView extends RootView
initSurface: ->
webGLSurface = $('canvas#webgl-surface', @$el)
normalSurface = $('canvas#normal-surface', @$el)
@surface = new Surface @world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, 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()
bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}]
@surface.camera.setBounds(bounds)

View file

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

View file

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

View file

@ -180,7 +180,7 @@ module.exports = class PlayLevelView extends RootView
@session = @levelLoader.session
@world = @levelLoader.world
@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'
# 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
@ -280,7 +280,7 @@ module.exports = class PlayLevelView extends RootView
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session})
@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: ->
_.defer => @onLevelLoaderLoaded()
@ -310,7 +310,7 @@ module.exports = class PlayLevelView extends RootView
initSurface: ->
webGLSurface = $('canvas#webgl-surface', @$el)
normalSurface = $('canvas#normal-surface', @$el)
@surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, wizards: 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()
bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}]
@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
return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @
@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
@loadingView.startUnveiling()
@loadingView.unveil()
@ -370,7 +367,7 @@ module.exports = class PlayLevelView extends RootView
return if @alreadyLoadedState
@alreadyLoadedState = true
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 'tome:select-primary-sprite', {}
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false
@ -424,7 +421,7 @@ module.exports = class PlayLevelView extends RootView
onDonePressed: -> @showVictory()
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
return if @victorySeen
@victorySeen = true
@ -439,10 +436,10 @@ module.exports = class PlayLevelView extends RootView
application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID
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()
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)
@openModalView(victoryModal)
if me.get('anonymous')
@ -538,7 +535,7 @@ module.exports = class PlayLevelView extends RootView
onSubmissionComplete: =>
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
if @goalManager.checkOverallStatus() is 'success' and not @options.realTimeMultiplayerSessionID?
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'
User = require 'models/User'
utils = require 'core/utils'
Level = require 'models/Level'
module.exports = class HeroVictoryModal extends ModalView
id: 'hero-victory-modal'
@ -44,6 +45,9 @@ module.exports = class HeroVictoryModal extends ModalView
@previousXP = me.get 'points', true
@previousLevel = me.level()
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: ->
clearInterval @sequentialAnimationInterval
@ -68,7 +72,8 @@ module.exports = class HeroVictoryModal extends ModalView
for thangTypeOriginal in thangTypeOriginals
thangType = new ThangType()
thangType.url = "/db/thang.type/#{thangTypeOriginal}/version"
thangType.project = ['original', 'rasterIcon', 'name', '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
@newEarnedAchievements = []
@ -132,7 +137,7 @@ module.exports = class HeroVictoryModal extends ModalView
c.thangTypes = @thangTypes
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.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
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
@ -187,7 +192,7 @@ module.exports = class HeroVictoryModal extends ModalView
panel.queue(-> complete())
@animationComplete = not @animatedPanels.length
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
@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.
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'
nextCampaign = @getNextLevelCampaign()
link += '/' + nextCampaign
@ -345,7 +357,17 @@ module.exports = class HeroVictoryModal extends ModalView
justBeatLevel: @level
supermodel: if @options.hasReceivedMemoryWarning then null else @supermodel
_.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'])
@showOffer navigationEvent
else

View file

@ -48,7 +48,7 @@ module.exports = class CastButtonView extends CocoView
super()
@castButton = $('.cast-button', @$el)
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.
if @options.session.get('state')?.complete and @options.level.get 'hidesRealTimePlayback'
@$el.find('.done-button').show()
@ -72,7 +72,7 @@ module.exports = class CastButtonView extends CocoView
@updateReplayability()
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
Backbone.Mediator.publish 'level:show-victory', showModal: true

View file

@ -151,7 +151,7 @@ module.exports = class Spell
writable = @permissions.readwrite.length > 0
skipProtectAPI = @skipProtectAPI or not writable
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
aether = new Aether aetherOptions
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 @isEnemySpell() # Use transpiled for enemy spells.
# 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))
false

View file

@ -37,7 +37,7 @@ module.exports = class SpellListEntryView extends CocoView
context
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()
if @spell.language in ['python', 'lua']
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
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
# Actually, do it all the time, because we recently busted the pin CSS. TODO: restore pinning
jigglyPopover = $('.spell-palette-popover.popover')

View file

@ -161,7 +161,7 @@ module.exports = class SpellPaletteView extends CocoView
else
propStorage =
'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
else
@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')
@entryGroups = _.groupBy @entries, groupForEntry
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
@entryGroups = {}
@entryGroups[defaultGroup] = @entries

View file

@ -518,7 +518,7 @@ module.exports = class SpellView extends CocoView
@createToolbarView()
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
@$el.append @debugView.render().$el.hide()
@ -993,7 +993,7 @@ module.exports = class SpellView extends CocoView
markerRange.end = @aceDoc.createAnchor markerRange.end
markerRange.id = @aceSession.addMarker markerRange, clazz, markerType
@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.addGutterDecoration start.row, clazz
@decoratedGutter[start.row] = clazz

View file

@ -60,7 +60,7 @@ module.exports = class TomeView extends CocoView
@worker = @createWorker()
programmableThangs = _.filter @options.thangs, (t) -> t.isProgrammable and t.programmableMethods
@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
@castButton = @insertSubView new CastButtonView spells: @spells, level: @options.level, session: @options.session
@teamSpellMap = @generateTeamSpellMap(@spells)
@ -192,7 +192,7 @@ module.exports = class TomeView extends CocoView
@castButton?.$el.hide()
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
spellName = e.spellName
@spellList?.$el.hide()

View file

@ -34,7 +34,7 @@ module.exports = class GameMenuModal extends ModalView
submenus = ['guide', 'options', 'save-load', 'multiplayer']
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, '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
context.showTab = @options.showTab ? submenus[0]
context.submenus = submenus
@ -43,7 +43,7 @@ module.exports = class GameMenuModal extends ModalView
'guide': 'list'
'save-load': 'floppy-disk'
'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
afterRender: ->

View file

@ -15,7 +15,6 @@ module.exports = class LevelGuideView extends CocoView
events:
'click .start-subscription-button': 'clickSubscribe'
'click .resource-link': 'clickResourceLink'
constructor: (options) ->
@levelSlug = options.level.get('slug')
@ -78,13 +77,6 @@ module.exports = class LevelGuideView extends CocoView
@openModalView new SubscribeModal()
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) =>
@$el.find('li.active').removeClass('active')
@playSound 'guide-tab-switch'

View file

@ -27,7 +27,7 @@ module.exports = class MultiplayerView extends CocoView
@levelID = @level?.get 'slug'
@session = options.session
@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: ->
@realTimeSessions?.off 'add', @onRealTimeSessionAdded
@ -42,12 +42,12 @@ module.exports = class MultiplayerView extends CocoView
c.team = @session.get 'team'
c.levelSlug = @levelID
# 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.readyToRank = @session?.readyToRank()
# 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.realTimeSessions = @realTimeSessions
c.currentRealTimeSession = @currentRealTimeSession if @currentRealTimeSession
@ -78,7 +78,7 @@ module.exports = class MultiplayerView extends CocoView
updateLinkSection: ->
multiplayer = @$el.find('#multiplayer').prop('checked')
la = @$el.find('#link-area')
la.toggle if @level?.get('type') 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
onHidden: ->

View file

@ -1,11 +1,21 @@
#!/bin/bash
# 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 install python-software-properties git
sudo add-apt-repository -y ppa:chris-lea/node.js
sudo apt-get -y update
sudo apt-get -y install nodejs
sudo apt-get -y install g++ make
sudo apt-get -y install g++ make
mkdir /vagrant/node_modules
sudo mkdir /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
offers =
'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
'maker-square': isAdult and isFast
'the-firehose-project': isAdult and isFast
#'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']
nAdditionalOffers = Math.max 0, 1 - _.filter(offers).length
possibleAdditionalOffers = ['bloc', 'tuts-plus', 'thinkful']
for offer in _.sample possibleAdditionalOffers, nAdditionalOffers
offers[offer] = true
if user.isPremium()