mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 08:08:15 -05:00
Merge branch 'master' into production
This commit is contained in:
commit
85db686e74
58 changed files with 933 additions and 1497 deletions
12
Vagrantfile
vendored
12
Vagrantfile
vendored
|
@ -6,16 +6,24 @@
|
||||||
VAGRANTFILE_API_VERSION = "2"
|
VAGRANTFILE_API_VERSION = "2"
|
||||||
|
|
||||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
|
|
||||||
|
# A VMware compatible box is avaliable from:
|
||||||
|
# https://github.com/spkane/vagrant-boxes/releases/download/v1.0.0/trusty64_vmware.box
|
||||||
config.vm.box = "ubuntu/trusty64"
|
config.vm.box = "ubuntu/trusty64"
|
||||||
|
|
||||||
config.vm.network "forwarded_port", guest: 3000, host: 3000
|
config.vm.network "forwarded_port", guest: 3000, host: 3000
|
||||||
config.vm.network "forwarded_port", guest: 9485, host: 9485
|
config.vm.network "forwarded_port", guest: 9485, host: 9485
|
||||||
|
|
||||||
config.vm.provision "shell", path: "scripts/vagrant/provision.sh"
|
config.vm.provision "shell", path: "scripts/vagrant/provision.sh"
|
||||||
|
|
||||||
config.vm.provider "virtualbox" do |v|
|
config.vm.provider "virtualbox" do |v|
|
||||||
v.memory = 2048
|
v.memory = 2048
|
||||||
v.cpus = 2
|
v.cpus = 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
config.vm.provider "vmware_fusion" do |v|
|
||||||
|
v.memory = 2048
|
||||||
|
v.cpus = 2
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
BIN
app/assets/images/pages/courses/102_info.png
Normal file
BIN
app/assets/images/pages/courses/102_info.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 349 KiB |
|
@ -84,6 +84,7 @@ module.exports = ParticleMan = class ParticleMan extends CocoClass
|
||||||
|
|
||||||
addEmitter: (x, y, kind="level-dungeon-premium") ->
|
addEmitter: (x, y, kind="level-dungeon-premium") ->
|
||||||
return if @unsupported
|
return if @unsupported
|
||||||
|
kind = kind.replace 'intro', 'dungeon'
|
||||||
options = $.extend true, {}, particleKinds[kind]
|
options = $.extend true, {}, particleKinds[kind]
|
||||||
return console.error "Couldn't find particle configuration for", kind unless options.group
|
return console.error "Couldn't find particle configuration for", kind unless options.group
|
||||||
options.group.texture = THREE.ImageUtils.loadTexture "/images/common/particles/#{options.group.texture}.png"
|
options.group.texture = THREE.ImageUtils.loadTexture "/images/common/particles/#{options.group.texture}.png"
|
||||||
|
@ -224,7 +225,7 @@ particleKinds['level-dungeon-gate'] = ext particleKinds['level-dungeon-premium']
|
||||||
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
||||||
colorEndSpread: vec 2.5, 2.5, 2.5
|
colorEndSpread: vec 2.5, 2.5, 2.5
|
||||||
|
|
||||||
particleKinds['level-dungeon-hero-ladder'] = ext particleKinds['level-dungeon-premium'],
|
particleKinds['level-dungeon-hero-ladder'] = particleKinds['level-dungeon-course-ladder'] = ext particleKinds['level-dungeon-premium'],
|
||||||
emitter:
|
emitter:
|
||||||
particleCount: 200
|
particleCount: 200
|
||||||
acceleration: vec 0, 3, 0
|
acceleration: vec 0, 3, 0
|
||||||
|
@ -258,7 +259,7 @@ particleKinds['level-forest-gate'] = ext particleKinds['level-forest-premium'],
|
||||||
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
||||||
colorEndSpread: vec 2.5, 2.5, 2.5
|
colorEndSpread: vec 2.5, 2.5, 2.5
|
||||||
|
|
||||||
particleKinds['level-forest-hero-ladder'] = ext particleKinds['level-forest-premium'],
|
particleKinds['level-forest-hero-ladder'] = particleKinds['level-forest-course-ladder'] = ext particleKinds['level-forest-premium'],
|
||||||
emitter:
|
emitter:
|
||||||
particleCount: 90
|
particleCount: 90
|
||||||
velocity: vec 0, 4, 0
|
velocity: vec 0, 4, 0
|
||||||
|
@ -307,7 +308,7 @@ particleKinds['level-desert-gate'] = ext particleKinds['level-desert-premium'],
|
||||||
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
||||||
colorEndSpread: vec 2.5, 2.5, 2.5
|
colorEndSpread: vec 2.5, 2.5, 2.5
|
||||||
|
|
||||||
particleKinds['level-desert-hero-ladder'] = ext particleKinds['level-desert-premium'],
|
particleKinds['level-desert-hero-ladder'] = particleKinds['level-desert-course-ladder'] = ext particleKinds['level-desert-premium'],
|
||||||
emitter:
|
emitter:
|
||||||
particleCount: 90
|
particleCount: 90
|
||||||
velocity: vec 0, 4, 0
|
velocity: vec 0, 4, 0
|
||||||
|
@ -341,7 +342,7 @@ particleKinds['level-mountain-gate'] = ext particleKinds['level-mountain-premium
|
||||||
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
||||||
colorEndSpread: vec 2.5, 2.5, 2.5
|
colorEndSpread: vec 2.5, 2.5, 2.5
|
||||||
|
|
||||||
particleKinds['level-mountain-hero-ladder'] = ext particleKinds['level-mountain-premium'],
|
particleKinds['level-mountain-hero-ladder'] = particleKinds['level-mountain-course-ladder'] = ext particleKinds['level-mountain-premium'],
|
||||||
emitter:
|
emitter:
|
||||||
particleCount: 90
|
particleCount: 90
|
||||||
velocity: vec 0, 4, 0
|
velocity: vec 0, 4, 0
|
||||||
|
@ -375,7 +376,7 @@ particleKinds['level-glacier-gate'] = ext particleKinds['level-glacier-premium']
|
||||||
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
colorMiddleSpread: vec 1.5, 1.5, 1.5
|
||||||
colorEndSpread: vec 2.5, 2.5, 2.5
|
colorEndSpread: vec 2.5, 2.5, 2.5
|
||||||
|
|
||||||
particleKinds['level-glacier-hero-ladder'] = ext particleKinds['level-glacier-premium'],
|
particleKinds['level-glacier-hero-ladder'] = particleKinds['level-glacier-course-ladder'] = ext particleKinds['level-glacier-premium'],
|
||||||
emitter:
|
emitter:
|
||||||
particleCount: 90
|
particleCount: 90
|
||||||
velocity: vec 0, 4, 0
|
velocity: vec 0, 4, 0
|
||||||
|
|
|
@ -57,7 +57,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
'contribute/diplomat': go('contribute/DiplomatView')
|
'contribute/diplomat': go('contribute/DiplomatView')
|
||||||
'contribute/scribe': go('contribute/ScribeView')
|
'contribute/scribe': go('contribute/ScribeView')
|
||||||
|
|
||||||
'courses': -> @navigate('courses/mock1')
|
'courses': go('courses/mock1/CoursesView')
|
||||||
'courses/mock1': go('courses/mock1/CoursesView')
|
'courses/mock1': go('courses/mock1/CoursesView')
|
||||||
'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView')
|
'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView')
|
||||||
'courses/mock1/:courseID/info': go('courses/mock1/CourseInfoView')
|
'courses/mock1/:courseID/info': go('courses/mock1/CourseInfoView')
|
||||||
|
@ -103,7 +103,6 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
|
|
||||||
'multiplayer': go('MultiplayerView')
|
'multiplayer': go('MultiplayerView')
|
||||||
|
|
||||||
'play-old': go('play/MainPlayView') # This used to be 'play'.
|
|
||||||
'play': go('play/CampaignView')
|
'play': go('play/CampaignView')
|
||||||
'play/ladder/:levelID': go('ladder/LadderView')
|
'play/ladder/:levelID': go('ladder/LadderView')
|
||||||
'play/ladder': go('ladder/MainLadderView')
|
'play/ladder': go('ladder/MainLadderView')
|
||||||
|
|
|
@ -10,8 +10,6 @@ module.exports = class LevelBus extends Bus
|
||||||
return Bus.getFromCache(docName) or new LevelBus docName
|
return Bus.getFromCache(docName) or new LevelBus docName
|
||||||
|
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'self-wizard:target-changed': 'onSelfWizardTargetChanged'
|
|
||||||
'self-wizard:created': 'onSelfWizardCreated'
|
|
||||||
'tome:editing-began': 'onEditingBegan'
|
'tome:editing-began': 'onEditingBegan'
|
||||||
'tome:editing-ended': 'onEditingEnded'
|
'tome:editing-ended': 'onEditingEnded'
|
||||||
'script:state-changed': 'onScriptStateChanged'
|
'script:state-changed': 'onScriptStateChanged'
|
||||||
|
@ -55,27 +53,13 @@ module.exports = class LevelBus extends Bus
|
||||||
return true unless @session?.get('multiplayer')
|
return true unless @session?.get('multiplayer')
|
||||||
super()
|
super()
|
||||||
|
|
||||||
onSelfWizardCreated: (e) ->
|
|
||||||
@selfWizardLank = e.sprite
|
|
||||||
|
|
||||||
onSelfWizardTargetChanged: (e) ->
|
|
||||||
@wizardRef?.child('targetPos').set(@selfWizardLank?.targetPos or null)
|
|
||||||
@wizardRef?.child('targetSprite').set(@selfWizardLank?.targetSprite?.thang.id or null)
|
|
||||||
|
|
||||||
onMeSynced: =>
|
onMeSynced: =>
|
||||||
super()
|
super()
|
||||||
@wizardRef?.child('wizardColor1').set(me.get('wizardColor1') or 0.0)
|
|
||||||
|
|
||||||
join: ->
|
join: ->
|
||||||
super()
|
super()
|
||||||
@wizardRef = @myConnection.child('wizard')
|
|
||||||
@wizardRef?.child('targetPos').set(@selfWizardLank?.targetPos or null)
|
|
||||||
@wizardRef?.child('targetSprite').set(@selfWizardLank?.targetSprite?.thang.id or null)
|
|
||||||
@wizardRef?.child('wizardColor1').set(me.get('wizardColor1') or 0.0)
|
|
||||||
|
|
||||||
disconnect: ->
|
disconnect: ->
|
||||||
@wizardRef?.off()
|
|
||||||
@wizardRef = null
|
|
||||||
@fireScriptsRef?.off()
|
@fireScriptsRef?.off()
|
||||||
@fireScriptsRef = null
|
@fireScriptsRef = null
|
||||||
super()
|
super()
|
||||||
|
@ -88,8 +72,8 @@ module.exports = class LevelBus extends Bus
|
||||||
|
|
||||||
# UPDATING FIREBASE AND SESSION
|
# UPDATING FIREBASE AND SESSION
|
||||||
|
|
||||||
onEditingBegan: -> @wizardRef?.child('editing').set(true)
|
onEditingBegan: -> #@wizardRef?.child('editing').set(true) # no more wizards
|
||||||
onEditingEnded: -> @wizardRef?.child('editing').set(false)
|
onEditingEnded: -> #@wizardRef?.child('editing').set(false) # no more wizards
|
||||||
|
|
||||||
# HACK: Backbone does not work with nested documents, but we want to
|
# HACK: Backbone does not work with nested documents, but we want to
|
||||||
# patch only those props that have changed. Look into plugins to
|
# patch only those props that have changed. Look into plugins to
|
||||||
|
|
|
@ -214,10 +214,6 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
url = "/db/level/#{obj.original}/version/#{obj.majorVersion}"
|
url = "/db/level/#{obj.original}/version/#{obj.majorVersion}"
|
||||||
@maybeLoadURL url, Level, 'level'
|
@maybeLoadURL url, Level, 'level'
|
||||||
|
|
||||||
unless @headless or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
|
||||||
wizard = ThangType.loadUniversalWizard()
|
|
||||||
@supermodel.loadModel wizard, 'thang'
|
|
||||||
|
|
||||||
@worldNecessities = @worldNecessities.concat worldNecessities
|
@worldNecessities = @worldNecessities.concat worldNecessities
|
||||||
|
|
||||||
loadThangsRequiredByLevelThang: (levelThang) ->
|
loadThangsRequiredByLevelThang: (levelThang) ->
|
||||||
|
@ -369,7 +365,7 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
@grabTeamConfigs()
|
@grabTeamConfigs()
|
||||||
@thangTypeTeams = {}
|
@thangTypeTeams = {}
|
||||||
for thang in @level.get('thangs')
|
for thang in @level.get('thangs')
|
||||||
if @level.get('type', true) is 'hero' and thang.id is 'Hero Placeholder'
|
if @level.get('type', true) in ['hero', 'course'] and thang.id is 'Hero Placeholder'
|
||||||
continue # No team colors for heroes on single-player levels
|
continue # No team colors for heroes on single-player levels
|
||||||
for component in thang.components
|
for component in thang.components
|
||||||
if team = component.config?.team
|
if team = component.config?.team
|
||||||
|
|
|
@ -61,6 +61,9 @@ module.exports = class LevelSetupManager extends CocoClass
|
||||||
@session.set 'heroConfig', {"thangType":sorcerer,"inventory":{"misc-0":"53e2396a53457600003e3f0f","programming-book":"546e266e9df4a17d0d449be5","minion":"54eb5dbc49fa2d5c905ddf56","feet":"53e214f153457600003e3eab","right-hand":"54eab7f52b7506e891ca7202","left-hand":"5463758f3839c6e02811d30f","wrists":"54693797a2b1f53ce79443e9","gloves":"5469425ca2b1f53ce7944421","torso":"546d4a549df4a17d0d449a97","neck":"54693274a2b1f53ce79443c9","eyes":"546941fda2b1f53ce794441d","head":"546d4ca19df4a17d0d449abf"}}
|
@session.set 'heroConfig', {"thangType":sorcerer,"inventory":{"misc-0":"53e2396a53457600003e3f0f","programming-book":"546e266e9df4a17d0d449be5","minion":"54eb5dbc49fa2d5c905ddf56","feet":"53e214f153457600003e3eab","right-hand":"54eab7f52b7506e891ca7202","left-hand":"5463758f3839c6e02811d30f","wrists":"54693797a2b1f53ce79443e9","gloves":"5469425ca2b1f53ce7944421","torso":"546d4a549df4a17d0d449a97","neck":"54693274a2b1f53ce79443c9","eyes":"546941fda2b1f53ce794441d","head":"546d4ca19df4a17d0d449abf"}}
|
||||||
@onInventoryModalPlayClicked()
|
@onInventoryModalPlayClicked()
|
||||||
return
|
return
|
||||||
|
if @level.get('type', true) in ['course', 'course-ladder']
|
||||||
|
@onInventoryModalPlayClicked()
|
||||||
|
return
|
||||||
@heroesModal = new PlayHeroesModal({supermodel: @supermodel, session: @session, confirmButtonI18N: 'play.next', level: @level, hadEverChosenHero: @options.hadEverChosenHero})
|
@heroesModal = new PlayHeroesModal({supermodel: @supermodel, session: @session, confirmButtonI18N: 'play.next', level: @level, hadEverChosenHero: @options.hadEverChosenHero})
|
||||||
@inventoryModal = new InventoryModal({supermodel: @supermodel, session: @session, level: @level})
|
@inventoryModal = new InventoryModal({supermodel: @supermodel, session: @session, level: @level})
|
||||||
@heroesModalDestroy = @heroesModal.destroy
|
@heroesModalDestroy = @heroesModal.destroy
|
||||||
|
|
|
@ -259,7 +259,6 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
|
||||||
@publishNote(note)
|
@publishNote(note)
|
||||||
|
|
||||||
publishNote: (note) ->
|
publishNote: (note) ->
|
||||||
Backbone.Mediator.publish 'playback:real-time-playback-ended', {} unless @session.get('heroConfig') # Only old levels need this, to stop interfering with old victory coolcams.
|
|
||||||
Backbone.Mediator.publish note.channel, note.event ? {}
|
Backbone.Mediator.publish note.channel, note.event ? {}
|
||||||
|
|
||||||
# ENDING NOTES
|
# ENDING NOTES
|
||||||
|
|
|
@ -64,7 +64,7 @@ module.exports = class Dimmer extends CocoClass
|
||||||
updateDimMask: =>
|
updateDimMask: =>
|
||||||
@dimMask.graphics.clear()
|
@dimMask.graphics.clear()
|
||||||
for thangID, sprite of @sprites
|
for thangID, sprite of @sprites
|
||||||
continue unless (thangID in @highlightedThangIDs) or sprite.isTalking?() or sprite.thang?.id is 'My Wizard'
|
continue unless (thangID in @highlightedThangIDs) or sprite.isTalking?()
|
||||||
sup = x: sprite.sprite.x, y: sprite.sprite.y
|
sup = x: sprite.sprite.x, y: sprite.sprite.y
|
||||||
cap = @camera.surfaceToCanvas sup
|
cap = @camera.surfaceToCanvas sup
|
||||||
r = 50 * @camera.zoom # TODO: find better way to get the radius based on the sprite's size
|
r = 50 * @camera.zoom # TODO: find better way to get the radius based on the sprite's size
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
CocoClass = require 'core/CocoClass'
|
CocoClass = require 'core/CocoClass'
|
||||||
{me} = require 'core/auth'
|
{me} = require 'core/auth'
|
||||||
LayerAdapter = require './LayerAdapter'
|
LayerAdapter = require './LayerAdapter'
|
||||||
IndieLank = require 'lib/surface/IndieLank'
|
|
||||||
WizardLank = require 'lib/surface/WizardLank'
|
|
||||||
FlagLank = require 'lib/surface/FlagLank'
|
FlagLank = require 'lib/surface/FlagLank'
|
||||||
Lank = require 'lib/surface/Lank'
|
Lank = require 'lib/surface/Lank'
|
||||||
Mark = require './Mark'
|
Mark = require './Mark'
|
||||||
|
@ -11,8 +9,6 @@ utils = require 'core/utils'
|
||||||
|
|
||||||
module.exports = class LankBoss extends CocoClass
|
module.exports = class LankBoss extends CocoClass
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'bus:player-joined': 'onPlayerJoined'
|
|
||||||
'bus:player-left': 'onPlayerLeft'
|
|
||||||
'level:set-debug': 'onSetDebug'
|
'level:set-debug': 'onSetDebug'
|
||||||
'sprite:highlight-sprites': 'onHighlightSprites'
|
'sprite:highlight-sprites': 'onHighlightSprites'
|
||||||
'surface:stage-mouse-down': 'onStageMouseDown'
|
'surface:stage-mouse-down': 'onStageMouseDown'
|
||||||
|
@ -40,7 +36,6 @@ module.exports = class LankBoss extends CocoClass
|
||||||
@options.thangTypes ?= []
|
@options.thangTypes ?= []
|
||||||
@lanks = {}
|
@lanks = {}
|
||||||
@lankArray = [] # Mirror @lanks, but faster for when we just need to iterate
|
@lankArray = [] # Mirror @lanks, but faster for when we just need to iterate
|
||||||
@selfWizardLank = null
|
|
||||||
@createLayers()
|
@createLayers()
|
||||||
@pendingFlags = []
|
@pendingFlags = []
|
||||||
|
|
||||||
|
@ -100,49 +95,6 @@ module.exports = class LankBoss extends CocoClass
|
||||||
createLankOptions: (options) ->
|
createLankOptions: (options) ->
|
||||||
_.extend options, camera: @camera, resolutionFactor: SPRITE_RESOLUTION_FACTOR, groundLayer: @layerAdapters['Ground'], textLayer: @surfaceTextLayer, floatingLayer: @layerAdapters['Floating'], showInvisible: @options.showInvisible
|
_.extend options, camera: @camera, resolutionFactor: SPRITE_RESOLUTION_FACTOR, groundLayer: @layerAdapters['Ground'], textLayer: @surfaceTextLayer, floatingLayer: @layerAdapters['Floating'], showInvisible: @options.showInvisible
|
||||||
|
|
||||||
createIndieLanks: (indieLanks, withWizards) ->
|
|
||||||
unless @indieLanks
|
|
||||||
@indieLanks = []
|
|
||||||
@indieLanks = (@createIndieLank indieLank for indieLank in indieLanks) if indieLanks
|
|
||||||
if withWizards and not @selfWizardLank
|
|
||||||
@selfWizardLank = @createWizardLank thangID: 'My Wizard', isSelf: true, lanks: @lanks
|
|
||||||
|
|
||||||
createIndieLank: (indieLank) ->
|
|
||||||
unless thangType = @thangTypeFor indieLank.thangType
|
|
||||||
console.warn "Need to convert #{indieLank.id}'s ThangType #{indieLank.thangType} to a ThangType reference. Until then, #{indieLank.id} won't show up."
|
|
||||||
return
|
|
||||||
lank = new IndieLank thangType, @createLankOptions {thangID: indieLank.id, pos: indieLank.pos, lanks: @lanks, team: indieLank.team, teamColors: @world.getTeamColors()}
|
|
||||||
@addLank lank, lank.thang.id
|
|
||||||
|
|
||||||
createOpponentWizard: (opponent) ->
|
|
||||||
# TODO: colorize name and cloud by team, colorize wizard by user's color config, level-specific wizard spawn points
|
|
||||||
lank = @createWizardLank thangID: opponent.id, name: opponent.name, codeLanguage: opponent.codeLanguage
|
|
||||||
if not opponent.levelSlug or opponent.levelSlug is 'brawlwood'
|
|
||||||
lank.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28}
|
|
||||||
else if opponent.levelSlug in ['dungeon-arena', 'sky-span']
|
|
||||||
lank.targetPos = if opponent.team is 'ogres' then {x: 72, y: 39} else {x: 9, y: 39}
|
|
||||||
else if opponent.levelSlug is 'criss-cross'
|
|
||||||
lank.targetPos = if opponent.team is 'ogres' then {x: 50, y: 12} else {x: 0, y: 40}
|
|
||||||
else
|
|
||||||
lank.targetPos = if opponent.team is 'ogres' then {x: 52, y: 28} else {x: 20, y: 28}
|
|
||||||
|
|
||||||
createWizardLank: (options) ->
|
|
||||||
lank = new WizardLank @thangTypeFor('Wizard'), @createLankOptions(options)
|
|
||||||
@addLank lank, lank.thang.id, @layerAdapters['Floating']
|
|
||||||
|
|
||||||
onPlayerJoined: (e) ->
|
|
||||||
# Create another WizardLank, unless this player is just me
|
|
||||||
pid = e.player.id
|
|
||||||
return if pid is me.id
|
|
||||||
wiz = @createWizardLank thangID: pid, lanks: @lanks
|
|
||||||
wiz.animateIn()
|
|
||||||
state = e.player.wizard or {}
|
|
||||||
wiz.setInitialState(state.targetPos, @lanks[state.targetLank])
|
|
||||||
|
|
||||||
onPlayerLeft: (e) ->
|
|
||||||
pid = e.player.id
|
|
||||||
@lanks[pid]?.animateOut => @removeLank @lanks[pid]
|
|
||||||
|
|
||||||
onSetDebug: (e) ->
|
onSetDebug: (e) ->
|
||||||
return if e.debug is @debug
|
return if e.debug is @debug
|
||||||
@debug = e.debug
|
@debug = e.debug
|
||||||
|
|
|
@ -44,7 +44,6 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
debug: false
|
debug: false
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
wizards: true
|
|
||||||
paths: true
|
paths: true
|
||||||
grid: false
|
grid: false
|
||||||
navigateToSelection: true
|
navigateToSelection: true
|
||||||
|
@ -160,17 +159,11 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
return if @loaded
|
return if @loaded
|
||||||
@loaded = true
|
@loaded = true
|
||||||
@lankBoss.createMarks()
|
@lankBoss.createMarks()
|
||||||
@lankBoss.createIndieLanks @world.indieSprites, @options.wizards
|
|
||||||
@updateState true
|
@updateState true
|
||||||
@drawCurrentFrame()
|
@drawCurrentFrame()
|
||||||
createjs.Ticker.addEventListener 'tick', @tick
|
createjs.Ticker.addEventListener 'tick', @tick
|
||||||
Backbone.Mediator.publish 'level:started', {}
|
Backbone.Mediator.publish 'level:started', {}
|
||||||
|
|
||||||
createOpponentWizard: (opponent) ->
|
|
||||||
@lankBoss.createOpponentWizard opponent
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#- Update loop
|
#- Update loop
|
||||||
|
|
||||||
tick: (e) =>
|
tick: (e) =>
|
||||||
|
@ -572,7 +565,6 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
return if @realTime
|
return if @realTime
|
||||||
@realTime = true
|
@realTime = true
|
||||||
@onResize()
|
@onResize()
|
||||||
@lankBoss.selfWizardLank?.toggle false
|
|
||||||
@playing = false # Will start when countdown is done.
|
@playing = false # Will start when countdown is done.
|
||||||
if @heroLank
|
if @heroLank
|
||||||
@previousCameraZoom = @camera.zoom
|
@previousCameraZoom = @camera.zoom
|
||||||
|
@ -583,7 +575,6 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
@realTime = false
|
@realTime = false
|
||||||
@onResize()
|
@onResize()
|
||||||
_.delay @onResize, resizeDelay + 100 # Do it again just to be double sure that we don't stay zoomed in due to timing problems.
|
_.delay @onResize, resizeDelay + 100 # Do it again just to be double sure that we don't stay zoomed in due to timing problems.
|
||||||
@lankBoss.selfWizardLank?.toggle true
|
|
||||||
@normalCanvas.add(@webGLCanvas).removeClass 'flag-color-selected'
|
@normalCanvas.add(@webGLCanvas).removeClass 'flag-color-selected'
|
||||||
if @previousCameraZoom
|
if @previousCameraZoom
|
||||||
@camera.zoomTo @camera.newTarget or @camera.target, @previousCameraZoom, 3000
|
@camera.zoomTo @camera.newTarget or @camera.target, @previousCameraZoom, 3000
|
||||||
|
|
|
@ -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
|
|
|
@ -52,31 +52,31 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
spectate: "مشاهد" # Ladder page
|
spectate: "مشاهد" # Ladder page
|
||||||
players: "لاعبين" # Hover over a level on /play
|
players: "لاعبين" # Hover over a level on /play
|
||||||
hours_played: "ساعات اللّعب" # Hover over a level on /play
|
hours_played: "ساعات اللّعب" # Hover over a level on /play
|
||||||
# items: "Items" # Tooltip on item shop button from /play
|
items: "العناصر" # Tooltip on item shop button from /play
|
||||||
unlock: "فتح" # For purchasing items and heroes
|
unlock: "فتح" # For purchasing items and heroes
|
||||||
confirm: "تأكيد"
|
confirm: "تأكيد"
|
||||||
owned: "ممتَلَك" # For items you own
|
owned: "ممتَلَك" # For items you own
|
||||||
locked: "مقفل"
|
locked: "مقفل"
|
||||||
purchasable: "للشراء" # For a hero you unlocked but haven't purchased
|
purchasable: "للشراء" # For a hero you unlocked but haven't purchased
|
||||||
available: "متوفر"
|
available: "متوفر"
|
||||||
# skills_granted: "Skills Granted" # Property documentation details
|
skills_granted: "مهارات الممنوحة" # Property documentation details
|
||||||
# heroes: "Heroes" # Tooltip on hero shop button from /play
|
heroes: "الأبطال" # Tooltip on hero shop button from /play
|
||||||
# achievements: "Achievements" # Tooltip on achievement list button from /play
|
achievements: "الإنجازات" # Tooltip on achievement list button from /play
|
||||||
account: "حساب" # Tooltip on account button from /play
|
account: "حساب" # Tooltip on account button from /play
|
||||||
settings: "الإعدادات" # Tooltip on settings button from /play
|
settings: "الإعدادات" # Tooltip on settings button from /play
|
||||||
# poll: "Poll" # Tooltip on poll button from /play
|
# poll: "Poll" # Tooltip on poll button from /play
|
||||||
next: "التالي" # Go from choose hero to choose inventory before playing a level
|
next: "التالي" # Go from choose hero to choose inventory before playing a level
|
||||||
# change_hero: "Change Hero" # Go back from choose inventory to choose hero
|
change_hero: "تغيير البطل" # Go back from choose inventory to choose hero
|
||||||
# choose_inventory: "Equip Items"
|
choose_inventory: "فريق الأصناف"
|
||||||
# buy_gems: "Buy Gems"
|
buy_gems: "شراء الأحجار الكريمة"
|
||||||
subscription_required: "الإشتراك إلزامي"
|
subscription_required: "الإشتراك إلزامي"
|
||||||
older_campaigns: "حملات أقدم"
|
older_campaigns: "حملات أقدم"
|
||||||
anonymous: "لاعب مجهول"
|
anonymous: "لاعب مجهول"
|
||||||
level_difficulty: "الصعوبة:"
|
level_difficulty: "الصعوبة:"
|
||||||
campaign_beginner: "حملة المبتدئين"
|
campaign_beginner: "حملة المبتدئين"
|
||||||
# awaiting_levels_adventurer_prefix: "We release new levels every week."
|
awaiting_levels_adventurer_prefix: "نحن الافراج عن مستويات جديدة كل أسبوع."
|
||||||
# awaiting_levels_adventurer: "Sign up as an Adventurer"
|
awaiting_levels_adventurer: "التوقيع على النحو المغامر"
|
||||||
# awaiting_levels_adventurer_suffix: "to be the first to play new levels."
|
awaiting_levels_adventurer_suffix: "أن تكون أول للعب مستويات جديدة."
|
||||||
adjust_volume: "تعديل الصوت"
|
adjust_volume: "تعديل الصوت"
|
||||||
choose_your_level: "اختر مستواك" # The rest of this section is the old play view at /play-old and isn't very important.
|
choose_your_level: "اختر مستواك" # The rest of this section is the old play view at /play-old and isn't very important.
|
||||||
adventurer_prefix: "يمكنك القفز إلى أي مستوى أدناه، أو مناقشة المستويات على "
|
adventurer_prefix: "يمكنك القفز إلى أي مستوى أدناه، أو مناقشة المستويات على "
|
||||||
|
@ -93,10 +93,10 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
campaign_classic_algorithms: "الخوارزميات التقليديّة"
|
campaign_classic_algorithms: "الخوارزميات التقليديّة"
|
||||||
campaign_classic_algorithms_description: "... فيها تتعلّم خوارزميّات الأكثر شعبيّة في علوم الحاسب الآلي."
|
campaign_classic_algorithms_description: "... فيها تتعلّم خوارزميّات الأكثر شعبيّة في علوم الحاسب الآلي."
|
||||||
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
||||||
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
campaign_old_multiplayer_description: "قطع اثرية من العصر أكثر تحضرا. يتم تشغيل أي محاكاة لهذه السن، الساحات متعددة البطل أقل."
|
||||||
|
|
||||||
share_progress_modal:
|
share_progress_modal:
|
||||||
# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat."
|
blurb: "كنت تقدما كبيرا! أخبر والديك وكم كنت قد تعلمت مع CodeCombat."
|
||||||
email_invalid: "البريد الاكتروني غير صالح."
|
email_invalid: "البريد الاكتروني غير صالح."
|
||||||
form_blurb: "ادخل بريد اولياء امرك الالكتروني لكي نريهم!"
|
form_blurb: "ادخل بريد اولياء امرك الالكتروني لكي نريهم!"
|
||||||
form_label: "عنوان البريد الالكتروني"
|
form_label: "عنوان البريد الالكتروني"
|
||||||
|
@ -109,9 +109,9 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
logging_in: "جاري تسجيل الدخول"
|
logging_in: "جاري تسجيل الدخول"
|
||||||
log_out: "تسجيل الخروج"
|
log_out: "تسجيل الخروج"
|
||||||
forgot_password: "نسيت رمز الدخول?"
|
forgot_password: "نسيت رمز الدخول?"
|
||||||
# authenticate_gplus: "Authenticate G+"
|
authenticate_gplus: "مصادقة G+"
|
||||||
load_profile: "تحميل صفحة غوغل بلس"
|
load_profile: "تحميل صفحة غوغل بلس"
|
||||||
# finishing: "Finishing"
|
finishing: "الانتهاء"
|
||||||
sign_in_with_facebook: "سجل الدخول بواسطة فيسبوك"
|
sign_in_with_facebook: "سجل الدخول بواسطة فيسبوك"
|
||||||
sign_in_with_gplus: "سجل الدخول بواسطة غوغل بلس"
|
sign_in_with_gplus: "سجل الدخول بواسطة غوغل بلس"
|
||||||
signup_switch: "تريد انشاء حساب?"
|
signup_switch: "تريد انشاء حساب?"
|
||||||
|
@ -134,8 +134,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
primary: "الأولي"
|
primary: "الأولي"
|
||||||
secondary: "ثانوي"
|
secondary: "ثانوي"
|
||||||
armor: "درع"
|
armor: "درع"
|
||||||
# accessories: "Accessories"
|
accessories: "إكسسوارات"
|
||||||
# misc: "Misc"
|
misc: "متفرقات"
|
||||||
books: "كتب"
|
books: "كتب"
|
||||||
|
|
||||||
common:
|
common:
|
||||||
|
@ -153,14 +153,14 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
fork: "إنسخ"
|
fork: "إنسخ"
|
||||||
play: "إلعب" # When used as an action verb, like "Play next level"
|
play: "إلعب" # When used as an action verb, like "Play next level"
|
||||||
retry: "إعادة"
|
retry: "إعادة"
|
||||||
# actions: "Actions"
|
actions: "Actions"
|
||||||
info: "معلومات"
|
info: "معلومات"
|
||||||
help: "مساعدة"
|
help: "مساعدة"
|
||||||
watch: "مشاهدة"
|
watch: "مشاهدة"
|
||||||
unwatch: "إنهاء المشاهدة"
|
unwatch: "إنهاء المشاهدة"
|
||||||
submit_patch: "تقديم التصحيح"
|
submit_patch: "تقديم التصحيح"
|
||||||
submit_changes: "تقديم التغييرات"
|
submit_changes: "تقديم التغييرات"
|
||||||
# save_changes: "Save Changes"
|
save_changes: "حفظ التغيرات"
|
||||||
|
|
||||||
general:
|
general:
|
||||||
and: "و"
|
and: "و"
|
||||||
|
@ -179,10 +179,10 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
version_history: "تاريخ النسخة"
|
version_history: "تاريخ النسخة"
|
||||||
version_history_for: "تاريخ النسخة لل: "
|
version_history_for: "تاريخ النسخة لل: "
|
||||||
select_changes: "اختر تغيريين."
|
select_changes: "اختر تغيريين."
|
||||||
# undo_prefix: "Undo"
|
undo_prefix: "فك"
|
||||||
# undo_shortcut: "(Ctrl+Z)"
|
undo_shortcut: "(Ctrl+Z)"
|
||||||
# redo_prefix: "Redo"
|
redo_prefix: "Redo"
|
||||||
# redo_shortcut: "(Ctrl+Shift+Z)"
|
redo_shortcut: "(Ctrl+Shift+Z)"
|
||||||
play_preview: "شاهد مقطع فيديو عن المستوى الحالي"
|
play_preview: "شاهد مقطع فيديو عن المستوى الحالي"
|
||||||
result: "نتيجة"
|
result: "نتيجة"
|
||||||
results: "نتائج"
|
results: "نتائج"
|
||||||
|
@ -228,7 +228,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
|
|
||||||
play_level:
|
play_level:
|
||||||
done: "انتهاء"
|
done: "انتهاء"
|
||||||
# home: "Home" # Not used any more, will be removed soon.
|
home: "Home" # Not used any more, will be removed soon.
|
||||||
level: "مستوى" # Like "Level: Dungeons of Kithgard"
|
level: "مستوى" # Like "Level: Dungeons of Kithgard"
|
||||||
skip: "الغاء"
|
skip: "الغاء"
|
||||||
game_menu: "قائمة اللعبة"
|
game_menu: "قائمة اللعبة"
|
||||||
|
@ -241,39 +241,39 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
incomplete: "غير مكتمل"
|
incomplete: "غير مكتمل"
|
||||||
timed_out: "تم انتهاء الوقت"
|
timed_out: "تم انتهاء الوقت"
|
||||||
failing: "فشل"
|
failing: "فشل"
|
||||||
# action_timeline: "Action Timeline"
|
action_timeline: "عمل الجدول الزمني"
|
||||||
# click_to_select: "Click on a unit to select it."
|
click_to_select: "انقر على وحدة لتحديده."
|
||||||
# control_bar_multiplayer: "Multiplayer"
|
control_bar_multiplayer: "متعددة"
|
||||||
# control_bar_join_game: "Join Game"
|
control_bar_join_game: "تاريخ لعبة"
|
||||||
# reload: "Reload"
|
reload: "تحديث"
|
||||||
# reload_title: "Reload All Code?"
|
reload_title: "تحديث الصفحة كل رمز؟"
|
||||||
# reload_really: "Are you sure you want to reload this level back to the beginning?"
|
reload_really: "هل أنت متأكد أنك تريد تحميل هذا المستوى مرة أخرى إلى البداية؟"
|
||||||
# reload_confirm: "Reload All"
|
reload_confirm: "تحديث جميع"
|
||||||
# victory: "Victory"
|
victory: "فوز"
|
||||||
# victory_title_prefix: ""
|
victory_title_prefix: ""
|
||||||
# victory_title_suffix: " Complete"
|
victory_title_suffix: " كامل"
|
||||||
# victory_sign_up: "Sign Up to Save Progress"
|
victory_sign_up: "اشترك لإنقاذ التقدم"
|
||||||
# victory_sign_up_poke: "Want to save your code? Create a free account!"
|
victory_sign_up_poke: "تريد حفظ التعليمات البرمجية الخاصة بك؟ إنشاء حساب مجاني!"
|
||||||
# victory_rate_the_level: "Rate the level: " # Only in old-style levels.
|
victory_rate_the_level: "معدل المستوى: " # Only in old-style levels.
|
||||||
# victory_return_to_ladder: "Return to Ladder"
|
victory_return_to_ladder: "العودة إلى سلم"
|
||||||
# victory_play_continue: "Continue"
|
victory_play_continue: "استمر"
|
||||||
# victory_saving_progress: "Saving Progress"
|
victory_saving_progress: "توفير التقدم"
|
||||||
# victory_go_home: "Go Home" # Only in old-style levels.
|
victory_go_home: "اذهب للمنزل" # Only in old-style levels.
|
||||||
# victory_review: "Tell us more!" # Only in old-style levels.
|
victory_review: "إخبرنا المزيد!" # Only in old-style levels.
|
||||||
# victory_hour_of_code_done: "Are You Done?"
|
# victory_hour_of_code_done: "Are You Done?"
|
||||||
# victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!"
|
victory_hour_of_code_done_yes: "نعم، أنا مع الانتهاء من ساعتي من قانون ™!"
|
||||||
# victory_experience_gained: "XP Gained"
|
# victory_experience_gained: "XP Gained"
|
||||||
# victory_gems_gained: "Gems Gained"
|
victory_gems_gained: "الأحجار الكريمة المكتسبة"
|
||||||
# victory_new_item: "New Item"
|
victory_new_item: "عنصر جديد"
|
||||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
victory_viking_code_school: "يدخن المقدسة، وكان ذلك على مستوى الثابت الذي فاز فقط! إذا لم تكن بالفعل مطور برامج، يجب أن تكون. كنت فقط حصلت على المسار السريع لقبوله مع مدرسة فايكنغ المدونة، حيث يمكنك أن تأخذ المهارات الخاصة بك إلى المستوى التالي وتصبح مطور ويب محترف في 14 أسبوعا."
|
||||||
# victory_become_a_viking: "Become a Viking"
|
victory_become_a_viking: "تصبح فايكنغ"
|
||||||
# guide_title: "Guide"
|
guide_title: "دليل"
|
||||||
# tome_minion_spells: "Your Minions' Spells" # Only in old-style levels.
|
tome_minion_spells: "نوبات التوابع الخاصة بك" # Only in old-style levels.
|
||||||
# tome_read_only_spells: "Read-Only Spells" # Only in old-style levels.
|
tome_read_only_spells: "Read-Only Spells" # Only in old-style levels.
|
||||||
# tome_other_units: "Other Units" # Only in old-style levels.
|
tome_other_units: "وحدات أخرى" # Only in old-style levels.
|
||||||
# tome_cast_button_run: "Run"
|
tome_cast_button_run: "Run"
|
||||||
# tome_cast_button_running: "Running"
|
tome_cast_button_running: "تشغيل"
|
||||||
# tome_cast_button_ran: "Ran"
|
tome_cast_button_ran: "ران"
|
||||||
# tome_submit_button: "Submit"
|
# tome_submit_button: "Submit"
|
||||||
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
||||||
# tome_select_method: "Select a Method"
|
# tome_select_method: "Select a Method"
|
||||||
|
@ -394,17 +394,17 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
# equip: "Equip"
|
# equip: "Equip"
|
||||||
# unequip: "Unequip"
|
# unequip: "Unequip"
|
||||||
|
|
||||||
# buy_gems:
|
buy_gems:
|
||||||
# few_gems: "A few gems"
|
few_gems: " عدد قليل من الأحجار الكريمة"
|
||||||
# pile_gems: "Pile of gems"
|
pile_gems: "كومة من الأحجار الكريمة"
|
||||||
# chest_gems: "Chest of gems"
|
chest_gems: "الصدر من الأحجار الكريمة"
|
||||||
# purchasing: "Purchasing..."
|
purchasing: "شراء ..."
|
||||||
# declined: "Your card was declined"
|
# declined: "Your card was declined"
|
||||||
# retrying: "Server error, retrying."
|
# retrying: "Server error, retrying."
|
||||||
# prompt_title: "Not Enough Gems"
|
# prompt_title: "Not Enough Gems"
|
||||||
# prompt_body: "Do you want to get more?"
|
# prompt_body: "Do you want to get more?"
|
||||||
# prompt_button: "Enter Shop"
|
prompt_button: "أدخل متجر"
|
||||||
# recovered: "Previous gems purchase recovered. Please refresh the page."
|
recovered: "الأحجار الكريمة السابقة أون استردادها. يرجى تحديث الصفحة."
|
||||||
# price: "x3500 / mo"
|
# price: "x3500 / mo"
|
||||||
|
|
||||||
# subscribe:
|
# subscribe:
|
||||||
|
@ -477,11 +477,11 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
# using_prepaid: "Using prepaid code for monthly subscription"
|
# using_prepaid: "Using prepaid code for monthly subscription"
|
||||||
|
|
||||||
choose_hero:
|
choose_hero:
|
||||||
# choose_hero: "Choose Your Hero"
|
choose_hero: "اختر بطلك"
|
||||||
# programming_language: "Programming Language"
|
programming_language: "لغة البرمجة"
|
||||||
# programming_language_description: "Which programming language do you want to use?"
|
# programming_language_description: "Which programming language do you want to use?"
|
||||||
# default: "Default"
|
# default: "Default"
|
||||||
# experimental: "Experimental"
|
experimental: "تجريبي"
|
||||||
python_blurb: "بسيطة لكنها قوية، بيثون هي لغة برمجة عظيمة للأغراض العامة."
|
python_blurb: "بسيطة لكنها قوية، بيثون هي لغة برمجة عظيمة للأغراض العامة."
|
||||||
javascript_blurb: "لغة الويب. عظيم للكتابة المواقع، تطبيقات الويب، ألعاب HTML5، والخوادم."
|
javascript_blurb: "لغة الويب. عظيم للكتابة المواقع، تطبيقات الويب، ألعاب HTML5، والخوادم."
|
||||||
coffeescript_blurb: "Nicer JavaScript syntax."
|
coffeescript_blurb: "Nicer JavaScript syntax."
|
||||||
|
@ -495,13 +495,13 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
|
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
|
||||||
# weapons_wizard: "Wands, Staffs - Long Range, Magic"
|
# weapons_wizard: "Wands, Staffs - Long Range, Magic"
|
||||||
# attack: "Damage" # Can also translate as "Attack"
|
# attack: "Damage" # Can also translate as "Attack"
|
||||||
# health: "Health"
|
health: "الصحة"
|
||||||
# speed: "Speed"
|
speed: "سرعة"
|
||||||
# regeneration: "Regeneration"
|
regeneration: "تجديد"
|
||||||
# range: "Range" # As in "attack or visual range"
|
# range: "Range" # As in "attack or visual range"
|
||||||
# blocks: "Blocks" # As in "this shield blocks this much damage"
|
# blocks: "Blocks" # As in "this shield blocks this much damage"
|
||||||
# backstab: "Backstab" # As in "this dagger does this much backstab damage"
|
# backstab: "Backstab" # As in "this dagger does this much backstab damage"
|
||||||
# skills: "Skills"
|
skills: "المهارات"
|
||||||
# attack_1: "Deals"
|
# attack_1: "Deals"
|
||||||
# attack_2: "of listed"
|
# attack_2: "of listed"
|
||||||
# attack_3: "weapon damage."
|
# attack_3: "weapon damage."
|
||||||
|
@ -688,7 +688,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
forum_page: "منتدانا"
|
forum_page: "منتدانا"
|
||||||
forum_suffix: "بدلا من ذلك."
|
forum_suffix: "بدلا من ذلك."
|
||||||
# faq_prefix: "There's also a"
|
# faq_prefix: "There's also a"
|
||||||
# faq: "FAQ"
|
faq: "FAQ"
|
||||||
# subscribe_prefix: "If you need help figuring out a level, please"
|
# subscribe_prefix: "If you need help figuring out a level, please"
|
||||||
# subscribe: "buy a CodeCombat subscription"
|
# subscribe: "buy a CodeCombat subscription"
|
||||||
# subscribe_suffix: "and we'll be happy to help you with your code."
|
# subscribe_suffix: "and we'll be happy to help you with your code."
|
||||||
|
@ -699,26 +699,26 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
|
||||||
contact_candidate: "الاتصال المرشح" # Deprecated
|
contact_candidate: "الاتصال المرشح" # Deprecated
|
||||||
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
|
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
|
||||||
|
|
||||||
# account_settings:
|
account_settings:
|
||||||
# title: "Account Settings"
|
title: "إعدادات الحساب"
|
||||||
# not_logged_in: "Log in or create an account to change your settings."
|
not_logged_in: "تسجيل الدخول أو إنشاء حساب لتغيير الإعدادات الخاصة بك."
|
||||||
# autosave: "Changes Save Automatically"
|
autosave: "تغييرات حفظ تلقائيا"
|
||||||
# me_tab: "Me"
|
me_tab: "أنا"
|
||||||
# picture_tab: "Picture"
|
picture_tab: "صورة"
|
||||||
# delete_account_tab: "Delete Your Account"
|
delete_account_tab: "حذف حسابك الخاص"
|
||||||
# wrong_email: "Wrong Email"
|
wrong_email: "Email خاطئ"
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "كلمة مرور خاطئة"
|
||||||
# upload_picture: "Upload a picture"
|
# upload_picture: "Upload a picture"
|
||||||
# delete_this_account: "Delete this account permanently"
|
delete_this_account: "حذف هذا الحساب بشكل دائم"
|
||||||
# god_mode: "God Mode"
|
# god_mode: "God Mode"
|
||||||
# password_tab: "Password"
|
# password_tab: "Password"
|
||||||
# emails_tab: "Emails"
|
# emails_tab: "Emails"
|
||||||
# admin: "Admin"
|
# admin: "Admin"
|
||||||
# new_password: "New Password"
|
new_password: "كلمة سر جديدة"
|
||||||
# new_password_verify: "Verify"
|
new_password_verify: "تحقق من"
|
||||||
# type_in_email: "Type in your email to confirm account deletion."
|
type_in_email: "اكتب في البريد الإلكتروني الخاص بك لتأكيد الحساب الحذف."
|
||||||
# type_in_password: "Also, type in your password."
|
type_in_password: "أيضا، اكتب كلمة المرور الخاصة بك."
|
||||||
# email_subscriptions: "Email Subscriptions"
|
email_subscriptions: "الاشتراكات البريد الإلكتروني"
|
||||||
# email_subscriptions_none: "No Email Subscriptions."
|
# email_subscriptions_none: "No Email Subscriptions."
|
||||||
# email_announcements: "Announcements"
|
# email_announcements: "Announcements"
|
||||||
# email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
|
# email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
|
||||||
|
|
|
@ -70,7 +70,6 @@
|
||||||
choose_inventory: "Equip Items"
|
choose_inventory: "Equip Items"
|
||||||
buy_gems: "Buy Gems"
|
buy_gems: "Buy Gems"
|
||||||
subscription_required: "Subscription Required"
|
subscription_required: "Subscription Required"
|
||||||
older_campaigns: "Older Campaigns"
|
|
||||||
anonymous: "Anonymous Player"
|
anonymous: "Anonymous Player"
|
||||||
level_difficulty: "Difficulty: "
|
level_difficulty: "Difficulty: "
|
||||||
campaign_beginner: "Beginner Campaign"
|
campaign_beginner: "Beginner Campaign"
|
||||||
|
@ -78,20 +77,8 @@
|
||||||
awaiting_levels_adventurer: "Sign up as an Adventurer"
|
awaiting_levels_adventurer: "Sign up as an Adventurer"
|
||||||
awaiting_levels_adventurer_suffix: "to be the first to play new levels."
|
awaiting_levels_adventurer_suffix: "to be the first to play new levels."
|
||||||
adjust_volume: "Adjust volume"
|
adjust_volume: "Adjust volume"
|
||||||
choose_your_level: "Choose Your Level" # The rest of this section is the old play view at /play-old and isn't very important.
|
|
||||||
adventurer_prefix: "You can jump to any level below, or discuss the levels on "
|
|
||||||
adventurer_forum: "the Adventurer forum"
|
|
||||||
adventurer_suffix: "."
|
|
||||||
campaign_old_beginner: "Old Beginner Campaign"
|
|
||||||
campaign_old_beginner_description: "... in which you learn the wizardry of programming."
|
|
||||||
campaign_dev: "Random Harder Levels"
|
|
||||||
campaign_dev_description: "... in which you learn the interface while doing something a little harder."
|
|
||||||
campaign_multiplayer: "Multiplayer Arenas"
|
campaign_multiplayer: "Multiplayer Arenas"
|
||||||
campaign_multiplayer_description: "... in which you code head-to-head against other players."
|
campaign_multiplayer_description: "... in which you code head-to-head against other players."
|
||||||
campaign_player_created: "Player-Created"
|
|
||||||
campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute/artisan\">Artisan Wizards</a>."
|
|
||||||
campaign_classic_algorithms: "Classic Algorithms"
|
|
||||||
campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
|
|
||||||
campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
||||||
campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
campaign_player_created_description: "... dans lesquels vous serez confronté à la créativité des vôtres.<a href=\"/contribute#artisan\">Artisan Wizards</a>."
|
campaign_player_created_description: "... dans lesquels vous serez confronté à la créativité des vôtres.<a href=\"/contribute#artisan\">Artisan Wizards</a>."
|
||||||
campaign_classic_algorithms: "Algorithmes classiques"
|
campaign_classic_algorithms: "Algorithmes classiques"
|
||||||
campaign_classic_algorithms_description: "... dans lesquels vous apprendrez les algorithmes les plus populaires dans l'informatique."
|
campaign_classic_algorithms_description: "... dans lesquels vous apprendrez les algorithmes les plus populaires dans l'informatique."
|
||||||
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
campaign_old_multiplayer: "(Obsolète) Ancienne arènes multijoueurs"
|
||||||
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
||||||
|
|
||||||
share_progress_modal:
|
share_progress_modal:
|
||||||
|
@ -617,7 +617,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
monitor_progress_2: "pour votre classe"
|
monitor_progress_2: "pour votre classe"
|
||||||
monitor_progress_3: "Pour ajouter un étudiant, envoyer leur le lien contenant une invitation pour votre Clan"
|
monitor_progress_3: "Pour ajouter un étudiant, envoyer leur le lien contenant une invitation pour votre Clan"
|
||||||
monitor_progress_4: "page."
|
monitor_progress_4: "page."
|
||||||
monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page."
|
monitor_progress_5: "Après leur adhésion, vous verrez un résumé des progrès de l'élève sur la page de votre clan."
|
||||||
private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
|
private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
|
||||||
private_clans_2: "Pour créer un Clan privé, veuillez vous référer à la boîte à cocher 'Faire un clan privé' pendant la création du"
|
private_clans_2: "Pour créer un Clan privé, veuillez vous référer à la boîte à cocher 'Faire un clan privé' pendant la création du"
|
||||||
private_clans_3: "."
|
private_clans_3: "."
|
||||||
|
@ -643,7 +643,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
sys_requirements_1: "Un navigateur moderne. La dernière version de Chrome, Firefox, ou de Safari. Internet Explorer 9 ou plus récent."
|
sys_requirements_1: "Un navigateur moderne. La dernière version de Chrome, Firefox, ou de Safari. Internet Explorer 9 ou plus récent."
|
||||||
sys_requirements_2: "CodeCombat n'est pas encore supporté sur iPad."
|
sys_requirements_2: "CodeCombat n'est pas encore supporté sur iPad."
|
||||||
|
|
||||||
# teachers_survey:
|
teachers_survey:
|
||||||
# title: "Teacher Survey"
|
# title: "Teacher Survey"
|
||||||
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
||||||
# retrieving: "Retrieving information..."
|
# retrieving: "Retrieving information..."
|
||||||
|
@ -660,9 +660,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
# description_2: "teachers"
|
# description_2: "teachers"
|
||||||
# description_3: "page."
|
# description_3: "page."
|
||||||
# description_4: "Please fill out this quick survey and we’ll email you setup instructions."
|
# description_4: "Please fill out this quick survey and we’ll email you setup instructions."
|
||||||
# email: "Email Address"
|
email: "Adresse email"
|
||||||
# school: "Name of School"
|
school: "Nom de l'école"
|
||||||
# location: "Name of City"
|
location: "Nom de la ville"
|
||||||
# age_students: "How old are your students?"
|
# age_students: "How old are your students?"
|
||||||
# under: "Under"
|
# under: "Under"
|
||||||
# other: "Other:"
|
# other: "Other:"
|
||||||
|
@ -707,7 +707,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
picture_tab: "Photos"
|
picture_tab: "Photos"
|
||||||
delete_account_tab: "Supprimer votre compte"
|
delete_account_tab: "Supprimer votre compte"
|
||||||
wrong_email: "Mauvaise adresse e-mail"
|
wrong_email: "Mauvaise adresse e-mail"
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "Mauvais mot de passe"
|
||||||
upload_picture: "Télécharger une image"
|
upload_picture: "Télécharger une image"
|
||||||
delete_this_account: "Supprimer votre compte définitivement"
|
delete_this_account: "Supprimer votre compte définitivement"
|
||||||
god_mode: "Puissance Divine"
|
god_mode: "Puissance Divine"
|
||||||
|
@ -748,7 +748,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
keyboard_shortcuts: "Raccourcis Clavier"
|
keyboard_shortcuts: "Raccourcis Clavier"
|
||||||
space: "Espace"
|
space: "Espace"
|
||||||
enter: "Entrer"
|
enter: "Entrer"
|
||||||
# press_enter: "press enter"
|
press_enter: "Appuyez sur entrée"
|
||||||
escape: "Echap"
|
escape: "Echap"
|
||||||
shift: "Shift"
|
shift: "Shift"
|
||||||
run_code: "Exécuter le code actuel."
|
run_code: "Exécuter le code actuel."
|
||||||
|
@ -791,7 +791,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
make_private: "Rendre le clan privé"
|
make_private: "Rendre le clan privé"
|
||||||
subs_only: "Abonnés seulement"
|
subs_only: "Abonnés seulement"
|
||||||
create_clan: "Créer un nouveau clan"
|
create_clan: "Créer un nouveau clan"
|
||||||
# private_preview: "Preview"
|
private_preview: "Aperçu"
|
||||||
public_clans: "Clans publiques"
|
public_clans: "Clans publiques"
|
||||||
my_clans: "Mes clans"
|
my_clans: "Mes clans"
|
||||||
clan_name: "Nom du clan"
|
clan_name: "Nom du clan"
|
||||||
|
@ -1198,7 +1198,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
concepts:
|
concepts:
|
||||||
advanced_strings: "Chaînes de caractères avancés"
|
advanced_strings: "Chaînes de caractères avancés"
|
||||||
algorithms: "Algorithmes"
|
algorithms: "Algorithmes"
|
||||||
# arguments: "Arguments"
|
arguments: "Paramètres"
|
||||||
arithmetic: "Arithmétique"
|
arithmetic: "Arithmétique"
|
||||||
arrays: "Tableaux"
|
arrays: "Tableaux"
|
||||||
basic_syntax: "Syntaxe basique"
|
basic_syntax: "Syntaxe basique"
|
||||||
|
@ -1215,7 +1215,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
vectors: "Vecteurs"
|
vectors: "Vecteurs"
|
||||||
while_loops: "Boucles Tant que"
|
while_loops: "Boucles Tant que"
|
||||||
# recursion: "Recursion"
|
recursion: "Récursivité"
|
||||||
|
|
||||||
delta:
|
delta:
|
||||||
added: "Ajouté"
|
added: "Ajouté"
|
||||||
|
|
|
@ -160,7 +160,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
unwatch: "הסר צפיה"
|
unwatch: "הסר צפיה"
|
||||||
submit_patch: ".שלח תיקון"
|
submit_patch: ".שלח תיקון"
|
||||||
submit_changes: "שלח שינויים"
|
submit_changes: "שלח שינויים"
|
||||||
# save_changes: "Save Changes"
|
save_changes: "שמור שינויים"
|
||||||
|
|
||||||
general:
|
general:
|
||||||
and: "וגם"
|
and: "וגם"
|
||||||
|
@ -264,9 +264,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
victory_hour_of_code_done_yes: "שלי Hour of Code™! כן, סיימתי עם ה"
|
victory_hour_of_code_done_yes: "שלי Hour of Code™! כן, סיימתי עם ה"
|
||||||
victory_experience_gained: "שנצבר XP"
|
victory_experience_gained: "שנצבר XP"
|
||||||
victory_gems_gained: "אבני חן שנצברו"
|
victory_gems_gained: "אבני חן שנצברו"
|
||||||
# victory_new_item: "New Item"
|
victory_new_item: "חפץ חדש"
|
||||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
||||||
# victory_become_a_viking: "Become a Viking"
|
victory_become_a_viking: "הפוך לוויקינג"
|
||||||
guide_title: "מדריך"
|
guide_title: "מדריך"
|
||||||
tome_minion_spells: "הכישופים של המשרתים שלך" # Only in old-style levels.
|
tome_minion_spells: "הכישופים של המשרתים שלך" # Only in old-style levels.
|
||||||
tome_read_only_spells: "כישופים לקריאה בלבד" # Only in old-style levels.
|
tome_read_only_spells: "כישופים לקריאה בלבד" # Only in old-style levels.
|
||||||
|
@ -294,11 +294,11 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
time_current: ":זמו נוכחי"
|
time_current: ":זמו נוכחי"
|
||||||
time_total: ":שמן מקסימלי"
|
time_total: ":שמן מקסימלי"
|
||||||
time_goto: ":לך ל"
|
time_goto: ":לך ל"
|
||||||
# non_user_code_problem_title: "Unable to Load Level"
|
non_user_code_problem_title: "טעינת שלב נכשלה"
|
||||||
# infinite_loop_title: "Infinite Loop Detected"
|
infinite_loop_title: "לופ אינסופי זוהה"
|
||||||
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
||||||
# check_dev_console: "You can also open the developer console to see what might be going wrong."
|
# check_dev_console: "You can also open the developer console to see what might be going wrong."
|
||||||
# check_dev_console_link: "(instructions)"
|
check_dev_console_link: "(הוראות)"
|
||||||
infinite_loop_try_again: "נסה שוב"
|
infinite_loop_try_again: "נסה שוב"
|
||||||
infinite_loop_reset_level: "התחל שלב מחדש"
|
infinite_loop_reset_level: "התחל שלב מחדש"
|
||||||
infinite_loop_comment_out: ".הפוך את הקוד שלי להערה"
|
infinite_loop_comment_out: ".הפוך את הקוד שלי להערה"
|
||||||
|
@ -310,7 +310,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
tip_think_solution: ".תחשוב על הפתרון, לא על הבעיה"
|
tip_think_solution: ".תחשוב על הפתרון, לא על הבעיה"
|
||||||
tip_theory_practice: "תיאורטית, אין הבדל בין התאוריה לאימון. אבל באימון, יש. - יוגי ברה"
|
tip_theory_practice: "תיאורטית, אין הבדל בין התאוריה לאימון. אבל באימון, יש. - יוגי ברה"
|
||||||
tip_error_free: "יש שתי דרכים לכתוב תוכנות בלי אף תקלה; רק השלישית עובדת. - אלן פרליס"
|
tip_error_free: "יש שתי דרכים לכתוב תוכנות בלי אף תקלה; רק השלישית עובדת. - אלן פרליס"
|
||||||
# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra"
|
tip_debugging_program: "אם ניפוי הוא התהליך של הסרת באגים, אז תכנות חייב להיות התהליך של לשים אותם -. אדגר ו. דיקסטרא"
|
||||||
tip_forums: "!לך לפורומים וספר לנו מה אתה חושב"
|
tip_forums: "!לך לפורומים וספר לנו מה אתה חושב"
|
||||||
tip_baby_coders: ".בעתיד, אפילו תינוקות יהיו כשפי על"
|
tip_baby_coders: ".בעתיד, אפילו תינוקות יהיו כשפי על"
|
||||||
tip_morale_improves: ".הטעינה תמשיך עד שהמורל ישתפר"
|
tip_morale_improves: ".הטעינה תמשיך עד שהמורל ישתפר"
|
||||||
|
@ -320,13 +320,13 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
tip_great_responsibility: "עם כישרון גדול בתכנות באה גם אחריות דיבאגינג גדולה."
|
tip_great_responsibility: "עם כישרון גדול בתכנות באה גם אחריות דיבאגינג גדולה."
|
||||||
tip_munchkin: "אם לא תאכל את הירקות, מאצ'קין יבוא אליך בלילה כשאתה ישן."
|
tip_munchkin: "אם לא תאכל את הירקות, מאצ'קין יבוא אליך בלילה כשאתה ישן."
|
||||||
tip_binary: "יש רק 10 אנשים בעולם: כאלה שמבינים בינארית וכאלה שלא."
|
tip_binary: "יש רק 10 אנשים בעולם: כאלה שמבינים בינארית וכאלה שלא."
|
||||||
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
|
tip_commitment_yoda: "מתכנת חייב להיות עם המחויבות העמוקה ביותר, עם המחשבה הרצינית ביותר. ~ יודה"
|
||||||
tip_no_try: "תעשה. או אל תעשה. אין לנסות - יודה"
|
tip_no_try: "תעשה. או אל תעשה. אין לנסות - יודה"
|
||||||
tip_patience: "עליך להיות סבלני, פאדאוואן צעיר - יודה"
|
tip_patience: "עליך להיות סבלני, פאדאוואן צעיר - יודה"
|
||||||
# tip_documented_bug: "A documented bug is not a bug; it is a feature."
|
tip_documented_bug: "באג מתועד הוא לא באג; הוא בונוס שבא עם התוכנה." #My personal translation
|
||||||
tip_impossible: "זה תמיד נראה בלתי אפשרי עד שזה נעשה. - נלסון מנדלה"
|
tip_impossible: "זה תמיד נראה בלתי אפשרי עד שזה נעשה. - נלסון מנדלה"
|
||||||
tip_talk_is_cheap: "דיבור זה זול. תראה לי את הקוד - לינוס טורבאלדס"
|
tip_talk_is_cheap: "דיבור זה זול. תראה לי את הקוד - לינוס טורבאלדס"
|
||||||
# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay"
|
tip_first_language: "הדבר ההרסני ביותר שאי פעם תלמד הוא שפת התכנות הראשונה שלך. - אלן קיי"
|
||||||
tip_hardware_problem: "ש: כמה מתכנתים צריך כדי להחליף נורה? ת: אפס, זו בכלל בעיה בחומרה."
|
tip_hardware_problem: "ש: כמה מתכנתים צריך כדי להחליף נורה? ת: אפס, זו בכלל בעיה בחומרה."
|
||||||
# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
|
# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
|
||||||
# tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
|
# tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
|
||||||
|
@ -415,7 +415,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
feature4: "!בחינם כל חודש <strong>3500 אבני חן</strong>"
|
feature4: "!בחינם כל חודש <strong>3500 אבני חן</strong>"
|
||||||
feature5: "הדרכות וידאו"
|
feature5: "הדרכות וידאו"
|
||||||
feature6: "תמיכת מייל בעדיפות ראשונה"
|
feature6: "תמיכת מייל בעדיפות ראשונה"
|
||||||
# feature7: "Private <strong>Clans</strong>"
|
feature7: "פרטיים <strong>שבטים</strong>"
|
||||||
free: "חינם"
|
free: "חינם"
|
||||||
month: "חודש"
|
month: "חודש"
|
||||||
subscribe_title: "רכוש מנוי"
|
subscribe_title: "רכוש מנוי"
|
||||||
|
@ -508,8 +508,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
# health_1: "Gains"
|
# health_1: "Gains"
|
||||||
# health_2: "of listed"
|
# health_2: "of listed"
|
||||||
# health_3: "armor health."
|
# health_3: "armor health."
|
||||||
# speed_1: "Moves at"
|
speed_1: "זז במהירות של"
|
||||||
# speed_2: "meters per second."
|
speed_2: "מטרים לשנייה."
|
||||||
available_for_purchase: "ניתן לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
available_for_purchase: "ניתן לרכישה" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
||||||
level_to_unlock: ":שלב כדי לפתוח" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
level_to_unlock: ":שלב כדי לפתוח" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
||||||
restricted_to_certain_heroes: ".רק גיבורים מסויימים יכולים לשחק בשלב זה"
|
restricted_to_certain_heroes: ".רק גיבורים מסויימים יכולים לשחק בשלב זה"
|
||||||
|
@ -525,7 +525,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
action_radius: "רדיוס"
|
action_radius: "רדיוס"
|
||||||
action_duration: "משך זמן"
|
action_duration: "משך זמן"
|
||||||
example: "דוגמה"
|
example: "דוגמה"
|
||||||
ex: "למשל" # Abbreviation of "example"
|
ex: "כגון" # Abbreviation of "example"
|
||||||
current_value: "ערך נוכחי"
|
current_value: "ערך נוכחי"
|
||||||
default_value: "ערך רגיל"
|
default_value: "ערך רגיל"
|
||||||
parameters: "פרמטרים"
|
parameters: "פרמטרים"
|
||||||
|
@ -679,7 +679,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
cla_url: "CLA"
|
cla_url: "CLA"
|
||||||
cla_suffix: "."
|
cla_suffix: "."
|
||||||
cla_agree: "אני מסכים"
|
cla_agree: "אני מסכים"
|
||||||
# owner_approve: "An owner will need to approve it before your changes will become visible."
|
owner_approve: "אישור בעלים יתבקשת לפני שהשינויים יחולו."
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "צור קשר"
|
contact_us: "צור קשר"
|
||||||
|
@ -697,7 +697,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
where_reply: "?איפה אנחנו אמורים להגיב"
|
where_reply: "?איפה אנחנו אמורים להגיב"
|
||||||
send: "שלח מייל"
|
send: "שלח מייל"
|
||||||
contact_candidate: "צור קשר עם נציג" # Deprecated
|
contact_candidate: "צור קשר עם נציג" # Deprecated
|
||||||
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
|
recruitment_reminder: "השתמש בטופס זה כדי להגיע למועמדים שאתה מעוניין לראיין. זכור כי CodeCombat גובה 15% מהשכר בשנה הראשונה.התשלום מתבצע בעת שכירת העובדים ויוחזר במשך 90 ימים אם העובד לא יישאר מועסק. משרה חלקית, עובדים מרוחקים, עובדי חוזה הם חינם, כמו גם מתמחה." # Deprecated
|
||||||
|
|
||||||
account_settings:
|
account_settings:
|
||||||
title: "הגדרות חשבון"
|
title: "הגדרות חשבון"
|
||||||
|
@ -707,7 +707,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
picture_tab: "תמונה"
|
picture_tab: "תמונה"
|
||||||
delete_account_tab: "מחק את חשבונך"
|
delete_account_tab: "מחק את חשבונך"
|
||||||
wrong_email: "כתובת מייל שגויה."
|
wrong_email: "כתובת מייל שגויה."
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "סיסמא שגוייה"
|
||||||
upload_picture: "העלה תמונה"
|
upload_picture: "העלה תמונה"
|
||||||
delete_this_account: "מחק את חשבון זה לתמיד"
|
delete_this_account: "מחק את חשבון זה לתמיד"
|
||||||
god_mode: "מצב אל"
|
god_mode: "מצב אל"
|
||||||
|
@ -717,7 +717,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
new_password: "סיסמה חדשה"
|
new_password: "סיסמה חדשה"
|
||||||
new_password_verify: "חזור על הסיסמה שנית"
|
new_password_verify: "חזור על הסיסמה שנית"
|
||||||
type_in_email: "הזן את כתובת המייל שלך על מנת לבצע את המחיקה" # {change}
|
type_in_email: "הזן את כתובת המייל שלך על מנת לבצע את המחיקה" # {change}
|
||||||
# type_in_password: "Also, type in your password."
|
type_in_password: "גםת הזן את סיסמתך."
|
||||||
email_subscriptions: "הרשמויות אימייל"
|
email_subscriptions: "הרשמויות אימייל"
|
||||||
email_subscriptions_none: ".אין מנויי מייל"
|
email_subscriptions_none: ".אין מנויי מייל"
|
||||||
email_announcements: "הודעות"
|
email_announcements: "הודעות"
|
||||||
|
@ -739,8 +739,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
password_mismatch: "סיסמאות לא זהות"
|
password_mismatch: "סיסמאות לא זהות"
|
||||||
password_repeat: ".אנא חזור על הסיסמא"
|
password_repeat: ".אנא חזור על הסיסמא"
|
||||||
job_profile: "פרופיל עבודה" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
|
job_profile: "פרופיל עבודה" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
|
||||||
# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
|
job_profile_approved: "פרופיל העבודה שלך אושר על ידי CodeCombat. מעסיקים יוכלו לראות את הפרופיל עד שאתה או מסמן אותו כ 'לא פעיל' או אם הוא לא השתנה במשך ארבעה שבועות."
|
||||||
# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
|
job_profile_explanation: "היי! מלא את זה, ואנו ניצור איתך קשר על מציאת עבודה כמפתח תוכנה."
|
||||||
sample_profile: "פרופיל לדוגמה"
|
sample_profile: "פרופיל לדוגמה"
|
||||||
view_profile: "צפה בפרופיל שלך"
|
view_profile: "צפה בפרופיל שלך"
|
||||||
|
|
||||||
|
@ -748,7 +748,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
keyboard_shortcuts: "קיצורי מקשים"
|
keyboard_shortcuts: "קיצורי מקשים"
|
||||||
space: "Space"
|
space: "Space"
|
||||||
enter: "Enter"
|
enter: "Enter"
|
||||||
# press_enter: "press enter"
|
press_enter: "לחץ enter"
|
||||||
escape: "Escape"
|
escape: "Escape"
|
||||||
shift: "Shift"
|
shift: "Shift"
|
||||||
run_code: ".הרץ קוד נוכחי"
|
run_code: ".הרץ קוד נוכחי"
|
||||||
|
@ -783,49 +783,49 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
social_hipchat: "CodeCombat הציבורי של HipChat room שוחח בצ'אט איתנו ב"
|
social_hipchat: "CodeCombat הציבורי של HipChat room שוחח בצ'אט איתנו ב"
|
||||||
contribute_to_the_project: "תרום לפרוייקט"
|
contribute_to_the_project: "תרום לפרוייקט"
|
||||||
|
|
||||||
# clans:
|
clans:
|
||||||
# clan: "Clan"
|
clan: "שבט" #NOTE: "clans" translation in hebrew (חמולה) sounds rude and has a lot of negative meanings associated to it. use of the word "tribe" ("שבט") is preferred.
|
||||||
# clans: "Clans"
|
clans: "שבטים"
|
||||||
# new_name: "New clan name"
|
new_name: "שם שבט חדש"
|
||||||
# new_description: "New clan description"
|
new_description: "תיאור שבט חדש"
|
||||||
# make_private: "Make clan private"
|
make_private: "הפוך שבט לפרטי"
|
||||||
# subs_only: "subscribers only"
|
subs_only: "מנויים בלבד"
|
||||||
# create_clan: "Create New Clan"
|
create_clan: "צור שבט חדש"
|
||||||
# private_preview: "Preview"
|
private_preview: "צפה" #"Preview" translted as "watch"
|
||||||
# public_clans: "Public Clans"
|
public_clans: "שבטים פתוחים" #"public clans" translation sounds unnatural when translated literally "open clans" is a preferred translation
|
||||||
# my_clans: "My Clans"
|
my_clans: "השבטים שלי"
|
||||||
# clan_name: "Clan Name"
|
clan_name: "שם השבט"
|
||||||
# name: "Name"
|
name: "שם"
|
||||||
# chieftain: "Chieftain"
|
chieftain: "צ'יף(מנהיג)"
|
||||||
# type: "Type"
|
type: "סוג"
|
||||||
# edit_clan_name: "Edit Clan Name"
|
edit_clan_name: "ערוך את שם השבט"
|
||||||
# edit_clan_description: "Edit Clan Description"
|
edit_clan_description: "ערוך את תיאור השבט"
|
||||||
# edit_name: "edit name"
|
edit_name: "ערוך שם"
|
||||||
# edit_description: "edit description"
|
edit_description: "ערוך תיאור"
|
||||||
# private: "(private)"
|
private: "(פרטי)"
|
||||||
# summary: "Summary"
|
summary: "תקציר"
|
||||||
# average_level: "Average Level"
|
average_level: "רמה ממוצעת"
|
||||||
# average_achievements: "Average Achievements"
|
average_achievements: "מס' הישגם ממוצע"
|
||||||
# delete_clan: "Delete Clan"
|
delete_clan: "מחק שבט"
|
||||||
# leave_clan: "Leave Clan"
|
leave_clan: "עזוב שבט"
|
||||||
# join_clan: "Join Clan"
|
join_clan: "הצטרף לשבט"
|
||||||
# invite_1: "Invite:"
|
invite_1: "הזמן:"
|
||||||
# invite_2: "*Invite players to this Clan by sending them this link."
|
invite_2: "*הזמן שחקנים לשבט באמצעות שליחת הקישור הזה."
|
||||||
# members: "Members"
|
members: "חברים"
|
||||||
# progress: "Progress"
|
progress: "התקדמות"
|
||||||
# not_started_1: "not started"
|
not_started_1: "לא הותחל"
|
||||||
# started_1: "started"
|
started_1: "הותחל"
|
||||||
# complete_1: "complete"
|
complete_1: "סויים"
|
||||||
# exp_levels: "Expand levels"
|
exp_levels: "הרחב שלבים"
|
||||||
# rem_hero: "Remove Hero"
|
rem_hero: "הסר גיבור"
|
||||||
# status: "Status"
|
status: "סטטוס"
|
||||||
# complete_2: "Complete"
|
complete_2: "סויים"
|
||||||
# started_2: "Started"
|
started_2: "הותחל"
|
||||||
# not_started_2: "Not Started"
|
not_started_2: "לא הותחל"
|
||||||
# view_solution: "Click to view solution."
|
view_solution: "לחץ כדי לראות פתרונות."
|
||||||
# latest_achievement: "Latest Achievement"
|
latest_achievement: "הישגים עדכניים"
|
||||||
# playtime: "Playtime"
|
playtime: "זמן משחק"
|
||||||
# last_played: "Last played"
|
last_played: "שיחק לאחרונה"
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "כשף על"
|
archmage_title: "כשף על"
|
||||||
|
@ -884,7 +884,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
level_tab_thangs_all: "הכל"
|
level_tab_thangs_all: "הכל"
|
||||||
level_tab_thangs_conditions: "תנאים התחלתיים"
|
level_tab_thangs_conditions: "תנאים התחלתיים"
|
||||||
level_tab_thangs_add: "הוסף ת'אנגס"
|
level_tab_thangs_add: "הוסף ת'אנגס"
|
||||||
# level_tab_thangs_search: "Search thangs"
|
level_tab_thangs_search: "חפש ת'אנגס"
|
||||||
add_components: "הוסף מרכיבים"
|
add_components: "הוסף מרכיבים"
|
||||||
component_configs: "קבע תצורת מרכיבים"
|
component_configs: "קבע תצורת מרכיבים"
|
||||||
config_thang: "לחץ פעמיים כדי לשנות ת'אנג"
|
config_thang: "לחץ פעמיים כדי לשנות ת'אנג"
|
||||||
|
@ -1078,7 +1078,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
|
||||||
no_achievements: ".עדיין לא השגת אף הישג"
|
no_achievements: ".עדיין לא השגת אף הישג"
|
||||||
favorite_prefix: " שפה מועדפת היא"
|
favorite_prefix: " שפה מועדפת היא"
|
||||||
favorite_postfix: "."
|
favorite_postfix: "."
|
||||||
# not_member_of_clans: "Not a member of any clans yet."
|
not_member_of_clans: "לא חבר באף שבט."
|
||||||
|
|
||||||
achievements:
|
achievements:
|
||||||
last_earned: "Last Earned"
|
last_earned: "Last Earned"
|
||||||
|
|
|
@ -175,7 +175,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
|
||||||
submitter: "Autore"
|
submitter: "Autore"
|
||||||
submitted: "Data creazione"
|
submitted: "Data creazione"
|
||||||
commit_msg: "Messaggio di commit"
|
commit_msg: "Messaggio di commit"
|
||||||
# review: "Review"
|
review: "Revisiona"
|
||||||
version_history: "Cronologia versioni"
|
version_history: "Cronologia versioni"
|
||||||
version_history_for: "Cronologia versioni per: "
|
version_history_for: "Cronologia versioni per: "
|
||||||
select_changes: "Scegli due versioni per vedere la differenza."
|
select_changes: "Scegli due versioni per vedere la differenza."
|
||||||
|
@ -193,10 +193,10 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
|
||||||
password: "Password"
|
password: "Password"
|
||||||
message: "Messaggio"
|
message: "Messaggio"
|
||||||
code: "Codice"
|
code: "Codice"
|
||||||
# ladder: "Ladder"
|
ladder: "Scala"
|
||||||
when: "Quando"
|
when: "Quando"
|
||||||
opponent: "Avversario"
|
opponent: "Avversario"
|
||||||
# rank: "Rank"
|
rank: "Classifica"
|
||||||
score: "Punteggio"
|
score: "Punteggio"
|
||||||
win: "Vittoria"
|
win: "Vittoria"
|
||||||
loss: "Sconfitta"
|
loss: "Sconfitta"
|
||||||
|
@ -265,7 +265,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
|
||||||
victory_experience_gained: "Punti XP guadagnati"
|
victory_experience_gained: "Punti XP guadagnati"
|
||||||
victory_gems_gained: "Gemme guadagnate"
|
victory_gems_gained: "Gemme guadagnate"
|
||||||
victory_new_item: "Nuovo oggetto"
|
victory_new_item: "Nuovo oggetto"
|
||||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
victory_viking_code_school: "Fumi sacri, era un livello duro quello che hai passato! Se non sei già uno sviluppatore, dovresti esserlo. Sei appena stato raccomandato per entrare nella Viking Code School, dove potrai raggiungere il prossimo livello di conoscenza e diventare uno sviluppatore web professionale in 14 settimane."
|
||||||
victory_become_a_viking: "Diventa un Vichingo"
|
victory_become_a_viking: "Diventa un Vichingo"
|
||||||
guide_title: "Guida"
|
guide_title: "Guida"
|
||||||
tome_minion_spells: "Incantesimi dei tuoi seguaci" # Only in old-style levels.
|
tome_minion_spells: "Incantesimi dei tuoi seguaci" # Only in old-style levels.
|
||||||
|
@ -296,14 +296,14 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
|
||||||
time_goto: "Vai a:"
|
time_goto: "Vai a:"
|
||||||
non_user_code_problem_title: "Impossibile caricare livello"
|
non_user_code_problem_title: "Impossibile caricare livello"
|
||||||
infinite_loop_title: "Ciclo infinito rilevato"
|
infinite_loop_title: "Ciclo infinito rilevato"
|
||||||
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
infinite_loop_description: "Il programma iniziale per costruire il mondo non ha mai finito di girare. O è molto lento o è in un ciclo infinito. O ci potrebbe essere un bug. Puoi provare a lasciarlo girare o farlo ripartire. Se non funziona, per favore avvertici."
|
||||||
check_dev_console: "Puoi anche aprire la console sviluppatore per vedere cosa potrebbe non funzionare."
|
check_dev_console: "Puoi anche aprire la console sviluppatore per vedere cosa potrebbe non funzionare."
|
||||||
check_dev_console_link: "(istruzioni)"
|
check_dev_console_link: "(istruzioni)"
|
||||||
infinite_loop_try_again: "Riprova"
|
infinite_loop_try_again: "Riprova"
|
||||||
infinite_loop_reset_level: "Riavvia livello"
|
infinite_loop_reset_level: "Riavvia livello"
|
||||||
infinite_loop_comment_out: "Commenta il codice"
|
infinite_loop_comment_out: "Commenta il codice"
|
||||||
tip_toggle_play: "Scambia play/pausa con Ctrl+P."
|
tip_toggle_play: "Scambia play/pausa con Ctrl+P."
|
||||||
# tip_scrub_shortcut: "Use Ctrl+[ and Ctrl+] to rewind and fast-forward."
|
tip_scrub_shortcut: "Usa Ctrl+[ e Ctrl+] per tornare indietro o avanzare rapidamente."
|
||||||
tip_guide_exists: "Clicca sulla Guida, nel menù di gioco (in alto nella pagina), per informazioni utili."
|
tip_guide_exists: "Clicca sulla Guida, nel menù di gioco (in alto nella pagina), per informazioni utili."
|
||||||
tip_open_source: "CodeCombat è 100% open source!"
|
tip_open_source: "CodeCombat è 100% open source!"
|
||||||
tip_beta_launch: "CodeCombat è stato lanciato in beta nell'ottobre 2013."
|
tip_beta_launch: "CodeCombat è stato lanciato in beta nell'ottobre 2013."
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
module.exports = nativeDescription: "polski", englishDescription: "Polish", translation:
|
module.exports = nativeDescription: "polski", englishDescription: "Polish", translation:
|
||||||
home:
|
home:
|
||||||
slogan: "Naucz się programowania grając"
|
slogan: "Naucz się programowania grając"
|
||||||
no_ie: "CodeCombat nie działa na Internet Explorer 8 lub starszym. Przepraszamy!" # Warning that only shows up in IE8 and older
|
no_ie: "CodeCombat nie działa na Internet Explorer 8 i starszych. Przepraszamy!" # Warning that only shows up in IE8 and older
|
||||||
no_mobile: "CodeCombat nie został zaprojektowany dla urządzeń przenośnych więc może nie działać!" # Warning that shows up on mobile devices
|
no_mobile: "CodeCombat nie został zaprojektowany dla urządzeń przenośnych, więc mogą występować pewne problemy w jego działaniu!" # Warning that shows up on mobile devices
|
||||||
play: "Graj" # The big play button that opens up the campaign view.
|
play: "Graj" # The big play button that opens up the campaign view.
|
||||||
old_browser: "Wygląda na to, że twoja przeglądarka jest zbyt stara, by obsłużyć CodeCombat. Wybacz!" # Warning that shows up on really old Firefox/Chrome/Safari
|
old_browser: "Wygląda na to, że twoja przeglądarka jest zbyt stara, by obsłużyć CodeCombat. Wybacz!" # Warning that shows up on really old Firefox/Chrome/Safari
|
||||||
old_browser_suffix: "Możesz spróbowac mimo tego, ale prawdopodobnie gra nie będzie działać."
|
old_browser_suffix: "Mimo tego możesz spróbowac, ale prawdopodobnie gra nie będzie działać."
|
||||||
# ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval."
|
ipad_browser: "Zła wiadomość: CodeCombat nie działa na przeglądarce w iPadzie. Dobra wiadomość: nasza aplikacja na iPada czeka na akceptację od Apple."
|
||||||
campaign: "Kampania"
|
campaign: "Kampania"
|
||||||
for_beginners: "Dla początkujących"
|
for_beginners: "Dla początkujących"
|
||||||
# multiplayer: "Multiplayer" # Not currently shown on home page
|
multiplayer: "Multiplayer" # Not currently shown on home page
|
||||||
for_developers: "Dla developerów" # Not currently shown on home page.
|
for_developers: "Dla developerów" # Not currently shown on home page.
|
||||||
# or_ipad: "Or download for iPad"
|
or_ipad: "Albo ściągnij na swojego iPada"
|
||||||
|
|
||||||
nav:
|
nav:
|
||||||
play: "Poziomy" # The top nav bar entry where players choose which levels to play
|
play: "Poziomy" # The top nav bar entry where players choose which levels to play
|
||||||
|
@ -52,14 +52,14 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
spectate: "Oglądaj" # Ladder page
|
spectate: "Oglądaj" # Ladder page
|
||||||
players: "graczy" # Hover over a level on /play
|
players: "graczy" # Hover over a level on /play
|
||||||
hours_played: "rozegranych godzin" # Hover over a level on /play
|
hours_played: "rozegranych godzin" # Hover over a level on /play
|
||||||
# items: "Items" # Tooltip on item shop button from /play
|
items: "Przedmioty" # Tooltip on item shop button from /play
|
||||||
unlock: "Odblokuj" # For purchasing items and heroes
|
unlock: "Odblokuj" # For purchasing items and heroes
|
||||||
confirm: "Potwierdź"
|
confirm: "Potwierdź"
|
||||||
# owned: "Owned" # For items you own
|
owned: "Posiadane" # For items you own
|
||||||
locked: "Zablokowane"
|
locked: "Zablokowane"
|
||||||
# purchasable: "Purchasable" # For a hero you unlocked but haven't purchased
|
purchasable: "Można kupić" # For a hero you unlocked but haven't purchased
|
||||||
available: "Dostępny"
|
available: "Dostępny"
|
||||||
# skills_granted: "Skills Granted" # Property documentation details
|
skills_granted: "Zdobyte umiejętności" # Property documentation details
|
||||||
heroes: "Bohaterowie" # Tooltip on hero shop button from /play
|
heroes: "Bohaterowie" # Tooltip on hero shop button from /play
|
||||||
achievements: "Osiągnięcia" # Tooltip on achievement list button from /play
|
achievements: "Osiągnięcia" # Tooltip on achievement list button from /play
|
||||||
account: "Konto" # Tooltip on account button from /play
|
account: "Konto" # Tooltip on account button from /play
|
||||||
|
@ -67,27 +67,27 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
poll: "Ankieta" # Tooltip on poll button from /play
|
poll: "Ankieta" # Tooltip on poll button from /play
|
||||||
next: "Dalej" # Go from choose hero to choose inventory before playing a level
|
next: "Dalej" # Go from choose hero to choose inventory before playing a level
|
||||||
change_hero: "Wybierz bohatera" # Go back from choose inventory to choose hero
|
change_hero: "Wybierz bohatera" # Go back from choose inventory to choose hero
|
||||||
# choose_inventory: "Equip Items"
|
choose_inventory: "Załóż przedmioty"
|
||||||
buy_gems: "Kup klejnoty"
|
buy_gems: "Kup klejnoty"
|
||||||
# subscription_required: "Subscription Required"
|
subscription_required: "Wymagana subskrypcja"
|
||||||
older_campaigns: "Starsze kampanie"
|
older_campaigns: "Starsze kampanie"
|
||||||
anonymous: "Anonimowy gracz"
|
anonymous: "Anonimowy gracz"
|
||||||
level_difficulty: "Poziom trudności: "
|
level_difficulty: "Poziom trudności: "
|
||||||
campaign_beginner: "Kampania dla początkujących"
|
campaign_beginner: "Kampania dla początkujących"
|
||||||
awaiting_levels_adventurer_prefix: "Wydajemy pięć poziomów na tydzień." # {change}
|
awaiting_levels_adventurer_prefix: "Wydajemy pięć poziomów na tydzień." # {change}
|
||||||
awaiting_levels_adventurer: "Zapisz się jako Podróżnik"
|
awaiting_levels_adventurer: "Zapisz się jako Podróżnik,"
|
||||||
awaiting_levels_adventurer_suffix: "aby jako pierwszy grać nowe poziomy."
|
awaiting_levels_adventurer_suffix: "aby jako pierwszy grać w nowe poziomy."
|
||||||
adjust_volume: "Dopasuj głośność"
|
adjust_volume: "Dopasuj głośność"
|
||||||
choose_your_level: "Wybierz poziom" # The rest of this section is the old play view at /play-old and isn't very important.
|
choose_your_level: "Wybierz poziom" # The rest of this section is the old play view at /play-old and isn't very important.
|
||||||
adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów lub omówić poziom na "
|
adventurer_prefix: "Możesz wybrać jeden z poniższych poziomów lub omówić poziom na "
|
||||||
adventurer_forum: "forum Podróżników"
|
adventurer_forum: "forum Podróżników"
|
||||||
adventurer_suffix: "."
|
adventurer_suffix: "."
|
||||||
# campaign_old_beginner: "Old Beginner Campaign"
|
campaign_old_beginner: "Stara kampania nowicjusza"
|
||||||
campaign_old_beginner_description: "... w której nauczysz się magii programowania"
|
campaign_old_beginner_description: "... w której nauczysz się magii programowania"
|
||||||
campaign_dev: "Losowe trudniejsze poziomy"
|
campaign_dev: "Losowe trudniejsze poziomy"
|
||||||
campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego."
|
campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego."
|
||||||
campaign_multiplayer: "Pola walki dla wielu graczy"
|
campaign_multiplayer: "Kampania dla wielu graczy"
|
||||||
campaign_multiplayer_description: "... w których konkurujesz z innymi graczami."
|
campaign_multiplayer_description: "... w której konkurujesz z innymi graczami."
|
||||||
campaign_player_created: "Stworzone przez graczy"
|
campaign_player_created: "Stworzone przez graczy"
|
||||||
campaign_player_created_description: "... w których walczysz przeciwko dziełom <a href=\"/contribute#artisan\">Czarodziejów Rzemieślników</a>"
|
campaign_player_created_description: "... w których walczysz przeciwko dziełom <a href=\"/contribute#artisan\">Czarodziejów Rzemieślników</a>"
|
||||||
campaign_classic_algorithms: "Algorytmy klasyczne"
|
campaign_classic_algorithms: "Algorytmy klasyczne"
|
||||||
|
@ -95,13 +95,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
||||||
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
||||||
|
|
||||||
# share_progress_modal:
|
share_progress_modal:
|
||||||
# blurb: "You’re making great progress! Tell your parent how much you've learned with CodeCombat."
|
blurb: "Robisz coraz to większe postępy! Pokaż swoim rodzicom jak wiele nauczyłeś się z CodeCombat."
|
||||||
# email_invalid: "Email address invalid."
|
email_invalid: "Błędny adres e-mail."
|
||||||
# form_blurb: "Enter your parent's email below and we’ll show them!"
|
form_blurb: "Wpisz adres email swich rodziców, a my ich o tym poinformujemy!"
|
||||||
# form_label: "Email Address"
|
form_label: "Adres email"
|
||||||
# placeholder: "email address"
|
placeholder: "adres email"
|
||||||
# title: "Excellent Work, Apprentice"
|
title: "Wspaniała robota, Adepcie"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
sign_up: "Stwórz konto"
|
sign_up: "Stwórz konto"
|
||||||
|
@ -109,12 +109,12 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
logging_in: "Logowanie..."
|
logging_in: "Logowanie..."
|
||||||
log_out: "Wyloguj się"
|
log_out: "Wyloguj się"
|
||||||
forgot_password: "Nie pamiętasz hasła?"
|
forgot_password: "Nie pamiętasz hasła?"
|
||||||
# authenticate_gplus: "Authenticate G+"
|
authenticate_gplus: "Autoryzuj G+"
|
||||||
# load_profile: "Load G+ Profile"
|
load_profile: "Wczytaj Profil G+"
|
||||||
# finishing: "Finishing"
|
finishing: "Kończenie"
|
||||||
# sign_in_with_facebook: "Sign in with Facebook"
|
sign_in_with_facebook: "Saloguj się używając Facebooka"
|
||||||
# sign_in_with_gplus: "Sign in with G+"
|
sign_in_with_gplus: "Zaloguj się używając G+"
|
||||||
# signup_switch: "Want to create an account?"
|
signup_switch: "Chcesz stworzyć konto?"
|
||||||
|
|
||||||
signup:
|
signup:
|
||||||
email_announcements: "Otrzymuj powiadomienia na e-mail"
|
email_announcements: "Otrzymuj powiadomienia na e-mail"
|
||||||
|
@ -128,7 +128,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
recover:
|
recover:
|
||||||
recover_account_title: "Odzyskaj konto"
|
recover_account_title: "Odzyskaj konto"
|
||||||
send_password: "Wyślij hasło tymczasowe"
|
send_password: "Wyślij hasło tymczasowe"
|
||||||
# recovery_sent: "Recovery email sent."
|
recovery_sent: "Email do dozyskania hasła został wysłany."
|
||||||
|
|
||||||
items:
|
items:
|
||||||
primary: "Główne"
|
primary: "Główne"
|
||||||
|
@ -160,7 +160,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
unwatch: "Nie obserwuj"
|
unwatch: "Nie obserwuj"
|
||||||
submit_patch: "Prześlij łatkę"
|
submit_patch: "Prześlij łatkę"
|
||||||
submit_changes: "Prześlij zmiany"
|
submit_changes: "Prześlij zmiany"
|
||||||
# save_changes: "Save Changes"
|
save_changes: "Zapisz zmiany"
|
||||||
|
|
||||||
general:
|
general:
|
||||||
and: "i"
|
and: "i"
|
||||||
|
@ -175,7 +175,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
submitter: "Przesyłający"
|
submitter: "Przesyłający"
|
||||||
submitted: "Przesłano"
|
submitted: "Przesłano"
|
||||||
commit_msg: "Wiadomość do commitu"
|
commit_msg: "Wiadomość do commitu"
|
||||||
# review: "Review"
|
review: "Recenzja"
|
||||||
version_history: "Historia wersji"
|
version_history: "Historia wersji"
|
||||||
version_history_for: "Historia wersji dla: "
|
version_history_for: "Historia wersji dla: "
|
||||||
select_changes: "Zaznacz dwie zmiany poniżej aby zobaczyć różnice."
|
select_changes: "Zaznacz dwie zmiany poniżej aby zobaczyć różnice."
|
||||||
|
@ -183,7 +183,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
undo_shortcut: "(Ctrl+Z)"
|
undo_shortcut: "(Ctrl+Z)"
|
||||||
redo_prefix: "Ponów"
|
redo_prefix: "Ponów"
|
||||||
redo_shortcut: "(Ctrl+Shift+Z)"
|
redo_shortcut: "(Ctrl+Shift+Z)"
|
||||||
# play_preview: "Play preview of current level"
|
play_preview: "Odtwórz podgląd obecnego poziomu"
|
||||||
result: "Wynik"
|
result: "Wynik"
|
||||||
results: "Wyniki"
|
results: "Wyniki"
|
||||||
description: "Opis"
|
description: "Opis"
|
||||||
|
@ -243,9 +243,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
failing: "Niepowodzenie"
|
failing: "Niepowodzenie"
|
||||||
action_timeline: "Oś czasu"
|
action_timeline: "Oś czasu"
|
||||||
click_to_select: "Kliknij jednostkę, by ją zaznaczyć."
|
click_to_select: "Kliknij jednostkę, by ją zaznaczyć."
|
||||||
# control_bar_multiplayer: "Multiplayer"
|
control_bar_multiplayer: "Multiplayer"
|
||||||
# control_bar_join_game: "Join Game"
|
control_bar_join_game: "Dołącz do gry"
|
||||||
# reload: "Reload"
|
reload: "Wczytaj ponownie"
|
||||||
reload_title: "Przywrócić cały kod?"
|
reload_title: "Przywrócić cały kod?"
|
||||||
reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?"
|
reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?"
|
||||||
reload_confirm: "Przywróć cały kod"
|
reload_confirm: "Przywróć cały kod"
|
||||||
|
@ -256,24 +256,24 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
victory_sign_up_poke: "Chcesz zapisać swój kod? Stwórz bezpłatne konto!"
|
victory_sign_up_poke: "Chcesz zapisać swój kod? Stwórz bezpłatne konto!"
|
||||||
victory_rate_the_level: "Oceń poziom: " # Only in old-style levels.
|
victory_rate_the_level: "Oceń poziom: " # Only in old-style levels.
|
||||||
victory_return_to_ladder: "Powrót do drabinki"
|
victory_return_to_ladder: "Powrót do drabinki"
|
||||||
victory_play_continue: "Kontynuuj"
|
victory_play_continue: "Dalej"
|
||||||
# victory_saving_progress: "Saving Progress"
|
victory_saving_progress: "Zapisywanie postępów"
|
||||||
victory_go_home: "Powrót do strony głównej" # Only in old-style levels.
|
victory_go_home: "Powrót do strony głównej" # Only in old-style levels.
|
||||||
victory_review: "Powiedz nam coś więcej!" # Only in old-style levels.
|
victory_review: "Powiedz nam coś więcej!" # Only in old-style levels.
|
||||||
victory_hour_of_code_done: "Skończyłeś już?"
|
victory_hour_of_code_done: "Skończyłeś już?"
|
||||||
victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodu."
|
victory_hour_of_code_done_yes: "Tak, skończyłem moją Godzinę Kodu."
|
||||||
victory_experience_gained: "Doświadczenie zdobyte"
|
victory_experience_gained: "Doświadczenie zdobyte"
|
||||||
victory_gems_gained: "Klejnoty zdobyte"
|
victory_gems_gained: "Klejnoty zdobyte"
|
||||||
# victory_new_item: "New Item"
|
victory_new_item: "Nowy przedmiot"
|
||||||
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
|
||||||
# victory_become_a_viking: "Become a Viking"
|
victory_become_a_viking: "Zostań wikingiem"
|
||||||
guide_title: "Przewodnik"
|
guide_title: "Przewodnik"
|
||||||
tome_minion_spells: "Czary twojego podopiecznego" # Only in old-style levels.
|
tome_minion_spells: "Czary twojego podopiecznego" # Only in old-style levels.
|
||||||
tome_read_only_spells: "Czary tylko do odczytu" # Only in old-style levels.
|
tome_read_only_spells: "Czary tylko do odczytu" # Only in old-style levels.
|
||||||
tome_other_units: "Inne jednostki" # Only in old-style levels.
|
tome_other_units: "Inne jednostki" # Only in old-style levels.
|
||||||
# tome_cast_button_run: "Run"
|
tome_cast_button_run: "Uruchom"
|
||||||
# tome_cast_button_running: "Running"
|
tome_cast_button_running: "Uruchomiono"
|
||||||
# tome_cast_button_ran: "Ran"
|
tome_cast_button_ran: "Uruchomiono"
|
||||||
tome_submit_button: "Prześlij"
|
tome_submit_button: "Prześlij"
|
||||||
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
||||||
# tome_select_method: "Select a Method"
|
# tome_select_method: "Select a Method"
|
||||||
|
@ -283,7 +283,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
tome_your_skills: "Twoje umiejętności"
|
tome_your_skills: "Twoje umiejętności"
|
||||||
tome_help: "Pomoc"
|
tome_help: "Pomoc"
|
||||||
# tome_current_method: "Current Method"
|
# tome_current_method: "Current Method"
|
||||||
# hud_continue_short: "Continue"
|
hud_continue_short: "Kontynuuj"
|
||||||
code_saved: "Kod zapisano"
|
code_saved: "Kod zapisano"
|
||||||
skip_tutorial: "Pomiń (esc)"
|
skip_tutorial: "Pomiń (esc)"
|
||||||
keyboard_shortcuts: "Skróty klawiszowe"
|
keyboard_shortcuts: "Skróty klawiszowe"
|
||||||
|
@ -294,11 +294,11 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
time_current: "Teraz:"
|
time_current: "Teraz:"
|
||||||
time_total: "Maksymalnie:"
|
time_total: "Maksymalnie:"
|
||||||
time_goto: "Idź do:"
|
time_goto: "Idź do:"
|
||||||
# non_user_code_problem_title: "Unable to Load Level"
|
non_user_code_problem_title: "Błąd podczas ładowania poziomu"
|
||||||
# infinite_loop_title: "Infinite Loop Detected"
|
infinite_loop_title: "Wykryto niekończącą się pętlę"
|
||||||
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
||||||
# check_dev_console: "You can also open the developer console to see what might be going wrong."
|
# check_dev_console: "You can also open the developer console to see what might be going wrong."
|
||||||
# check_dev_console_link: "(instructions)"
|
check_dev_console_link: "(instrukcje)"
|
||||||
infinite_loop_try_again: "Próbuj ponownie"
|
infinite_loop_try_again: "Próbuj ponownie"
|
||||||
infinite_loop_reset_level: "Resetuj poziom"
|
infinite_loop_reset_level: "Resetuj poziom"
|
||||||
infinite_loop_comment_out: "Comment Out My Code"
|
infinite_loop_comment_out: "Comment Out My Code"
|
||||||
|
@ -355,13 +355,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
save_load_tab: "Zapisz/Wczytaj"
|
save_load_tab: "Zapisz/Wczytaj"
|
||||||
options_tab: "Opcje"
|
options_tab: "Opcje"
|
||||||
guide_tab: "Przewodnik"
|
guide_tab: "Przewodnik"
|
||||||
# guide_video_tutorial: "Video Tutorial"
|
guide_video_tutorial: "Wideo poradnik"
|
||||||
guide_tips: "Wskazówki"
|
guide_tips: "Wskazówki"
|
||||||
multiplayer_tab: "Multiplayer"
|
multiplayer_tab: "Multiplayer"
|
||||||
auth_tab: "Zarejestruj się"
|
auth_tab: "Zarejestruj się"
|
||||||
inventory_caption: "Wyposaż swojego bohatera"
|
inventory_caption: "Wyposaż swojego bohatera"
|
||||||
choose_hero_caption: "Wybierz bohatera, język"
|
choose_hero_caption: "Wybierz bohatera, język"
|
||||||
# save_load_caption: "... and view history"
|
save_load_caption: "... i przejrzyj historię"
|
||||||
options_caption: "Ustaw opcje"
|
options_caption: "Ustaw opcje"
|
||||||
guide_caption: "Dokumenty i wskazówki"
|
guide_caption: "Dokumenty i wskazówki"
|
||||||
multiplayer_caption: "Graj ze znajomymi!"
|
multiplayer_caption: "Graj ze znajomymi!"
|
||||||
|
@ -369,30 +369,30 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
|
|
||||||
leaderboard:
|
leaderboard:
|
||||||
leaderboard: "Najlepsze wyniki"
|
leaderboard: "Najlepsze wyniki"
|
||||||
# view_other_solutions: "View Leaderboards"
|
view_other_solutions: "Pokaż tablicę wyników"
|
||||||
scores: "Wyniki"
|
scores: "Wyniki"
|
||||||
# top_players: "Top Players by"
|
top_players: "Najlepsi gracze"
|
||||||
day: "Dziś"
|
day: "Dziś"
|
||||||
# week: "This Week"
|
week: "W tym tygodniu"
|
||||||
# all: "All-Time"
|
all: "Zawsze"
|
||||||
time: "Czas"
|
time: "Czas"
|
||||||
damage_taken: "Obrażenia otrzymane"
|
damage_taken: "Obrażenia otrzymane"
|
||||||
damage_dealt: "Obrażenia zadane"
|
damage_dealt: "Obrażenia zadane"
|
||||||
# difficulty: "Difficulty"
|
difficulty: "Trudność"
|
||||||
gold_collected: "Złoto zebrane"
|
gold_collected: "Złoto zebrane"
|
||||||
|
|
||||||
inventory:
|
inventory:
|
||||||
# choose_inventory: "Equip Items"
|
choose_inventory: "Załóż przedmioty"
|
||||||
# equipped_item: "Equipped"
|
equipped_item: "Założone"
|
||||||
required_purchase_title: "Wymagane"
|
required_purchase_title: "Wymagane"
|
||||||
available_item: "Dostępne"
|
available_item: "Dostępne"
|
||||||
# restricted_title: "Restricted"
|
restricted_title: "Zabronione"
|
||||||
# should_equip: "(double-click to equip)"
|
should_equip: "(kliknij podwójnie, aby założyć)"
|
||||||
# equipped: "(equipped)"
|
equipped: "(założone)"
|
||||||
locked: "(zablokowane)"
|
locked: "(zablokowane)"
|
||||||
restricted: "(niedostępne na tym poziomie)"
|
restricted: "(zabronione)"
|
||||||
# equip: "Equip"
|
equip: "Załóż"
|
||||||
# unequip: "Unequip"
|
unequip: "Zdejmij"
|
||||||
|
|
||||||
# buy_gems:
|
# buy_gems:
|
||||||
# few_gems: "A few gems"
|
# few_gems: "A few gems"
|
||||||
|
@ -407,17 +407,17 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
# recovered: "Previous gems purchase recovered. Please refresh the page."
|
# recovered: "Previous gems purchase recovered. Please refresh the page."
|
||||||
# price: "x3500 / mo"
|
# price: "x3500 / mo"
|
||||||
|
|
||||||
# subscribe:
|
subscribe:
|
||||||
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
|
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
|
||||||
# feature1: "100+ basic levels across 4 worlds"
|
# feature1: "100+ basic levels across 4 worlds"
|
||||||
# feature2: "10 powerful <strong>new heroes</strong> with unique skills!"
|
# feature2: "10 powerful <strong>new heroes</strong> with unique skills!"
|
||||||
# feature3: "70+ bonus levels"
|
# feature3: "70+ bonus levels"
|
||||||
# feature4: "<strong>3500 bonus gems</strong> every month!"
|
# feature4: "<strong>3500 bonus gems</strong> every month!"
|
||||||
# feature5: "Video tutorials"
|
feature5: "Poradniki wideo"
|
||||||
# feature6: "Premium email support"
|
# feature6: "Premium email support"
|
||||||
# feature7: "Private <strong>Clans</strong>"
|
feature7: "Prywatne <strong>Klany</strong>"
|
||||||
# free: "Free"
|
free: "Za darmo"
|
||||||
# month: "month"
|
month: "miesięcznie"
|
||||||
# subscribe_title: "Subscribe"
|
# subscribe_title: "Subscribe"
|
||||||
# unsubscribe: "Unsubscribe"
|
# unsubscribe: "Unsubscribe"
|
||||||
# confirm_unsubscribe: "Confirm Unsubscribe"
|
# confirm_unsubscribe: "Confirm Unsubscribe"
|
||||||
|
@ -481,38 +481,38 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
programming_language: "Język programowania"
|
programming_language: "Język programowania"
|
||||||
programming_language_description: "Którego języka programowania chcesz używać?"
|
programming_language_description: "Którego języka programowania chcesz używać?"
|
||||||
default: "domyślny"
|
default: "domyślny"
|
||||||
# experimental: "Experimental"
|
experimental: "Eksperymentalny"
|
||||||
python_blurb: "Prosty ale potężny."
|
python_blurb: "Prosty ale potężny."
|
||||||
javascript_blurb: "Język internetu."
|
javascript_blurb: "Język internetu."
|
||||||
coffeescript_blurb: "Przyjemniejsza składnia JavaScript."
|
coffeescript_blurb: "Przyjemniejsza składnia JavaScript."
|
||||||
clojure_blurb: "Nowoczesny Lisp."
|
clojure_blurb: "Nowoczesny Lisp."
|
||||||
lua_blurb: "Język skryptowy gier."
|
lua_blurb: "Język skryptowy gier."
|
||||||
io_blurb: "Prosty lecz nieznany."
|
io_blurb: "Prosty lecz nieznany."
|
||||||
# status: "Status"
|
status: "Status"
|
||||||
hero_type: "Typ"
|
hero_type: "Typ"
|
||||||
# weapons: "Weapons"
|
weapons: "Bronie"
|
||||||
# weapons_warrior: "Swords - Short Range, No Magic"
|
weapons_warrior: "Miecze - Krótki zasięg, Brak magii"
|
||||||
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
|
weapons_ranger: "Kusze, Pistolety - Daleki zasięg, Brak magii"
|
||||||
# weapons_wizard: "Wands, Staffs - Long Range, Magic"
|
weapons_wizard: "Różdżki, Laski - Daleki zasięg, Magia"
|
||||||
# attack: "Damage" # Can also translate as "Attack"
|
attack: "Obrażenia" # Can also translate as "Attack"
|
||||||
# health: "Health"
|
health: "Życie"
|
||||||
speed: "Szybkość"
|
speed: "Szybkość"
|
||||||
# regeneration: "Regeneration"
|
regeneration: "Regenaracja"
|
||||||
range: "Zasięg" # As in "attack or visual range"
|
range: "Zasięg" # As in "attack or visual range"
|
||||||
# blocks: "Blocks" # As in "this shield blocks this much damage"
|
blocks: "Blok" # As in "this shield blocks this much damage"
|
||||||
# backstab: "Backstab" # As in "this dagger does this much backstab damage"
|
# backstab: "Backstab" # As in "this dagger does this much backstab damage"
|
||||||
skills: "Umiejętności"
|
skills: "Umiejętności"
|
||||||
attack_1: "Zadaje"
|
attack_1: "Zadaje"
|
||||||
# attack_2: "of listed"
|
# attack_2: "of listed"
|
||||||
# attack_3: "weapon damage."
|
# attack_3: "weapon damage."
|
||||||
# health_1: "Gains"
|
health_1: "Zdobywa"
|
||||||
# health_2: "of listed"
|
# health_2: "of listed"
|
||||||
# health_3: "armor health."
|
# health_3: "armor health."
|
||||||
# speed_1: "Moves at"
|
speed_1: "Idzie do"
|
||||||
# speed_2: "meters per second."
|
speed_2: "metrów na sekundę."
|
||||||
# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
||||||
# level_to_unlock: "Level to unlock:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
level_to_unlock: "Musisz odblokować poziom:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
||||||
# restricted_to_certain_heroes: "Only certain heroes can play this level."
|
restricted_to_certain_heroes: "Tylko nieliczni bohaterowie mogą brać udział w tym poziomie."
|
||||||
|
|
||||||
skill_docs:
|
skill_docs:
|
||||||
# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
|
# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
|
||||||
|
@ -528,13 +528,13 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
ex: "np." # Abbreviation of "example"
|
ex: "np." # Abbreviation of "example"
|
||||||
current_value: "Aktualna wartość"
|
current_value: "Aktualna wartość"
|
||||||
default_value: "Domyślna wartość"
|
default_value: "Domyślna wartość"
|
||||||
# parameters: "Parameters"
|
parameters: "Parametry"
|
||||||
# returns: "Returns"
|
returns: "Zwraca"
|
||||||
# granted_by: "Granted by"
|
granted_by: "Zdobyte dzięki:"
|
||||||
|
|
||||||
save_load:
|
save_load:
|
||||||
granularity_saved_games: "Zapisano"
|
granularity_saved_games: "Zapisano"
|
||||||
# granularity_change_history: "History"
|
granularity_change_history: "Historia"
|
||||||
|
|
||||||
options:
|
options:
|
||||||
general_options: "Opcje ogólne" # Check out the Options tab in the Game Menu while playing a level
|
general_options: "Opcje ogólne" # Check out the Options tab in the Game Menu while playing a level
|
||||||
|
@ -582,12 +582,12 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
michael_title: "Programista"
|
michael_title: "Programista"
|
||||||
# michael_blurb: "Sys Admin"
|
# michael_blurb: "Sys Admin"
|
||||||
matt_title: "Programista" # {change}
|
matt_title: "Programista" # {change}
|
||||||
# matt_blurb: "Bicyclist"
|
matt_blurb: "Rowerzysta"
|
||||||
# cat_title: "Chief Artisan"
|
# cat_title: "Chief Artisan"
|
||||||
# cat_blurb: "Airbender"
|
# cat_blurb: "Airbender"
|
||||||
# josh_title: "Game Designer"
|
# josh_title: "Game Designer"
|
||||||
josh_blurb: "Podłoga to lawa"
|
josh_blurb: "Podłoga to lawa"
|
||||||
# jose_title: "Music"
|
jose_title: "Muzyka"
|
||||||
# jose_blurb: "Taking Off"
|
# jose_blurb: "Taking Off"
|
||||||
# retrostyle_title: "Illustration"
|
# retrostyle_title: "Illustration"
|
||||||
# retrostyle_blurb: "RetroStyle Games"
|
# retrostyle_blurb: "RetroStyle Games"
|
||||||
|
@ -679,7 +679,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
cla_url: "umowę licencyjną dla współtwórców (CLA)"
|
cla_url: "umowę licencyjną dla współtwórców (CLA)"
|
||||||
cla_suffix: "."
|
cla_suffix: "."
|
||||||
cla_agree: "AKCEPTUJĘ"
|
cla_agree: "AKCEPTUJĘ"
|
||||||
# owner_approve: "An owner will need to approve it before your changes will become visible."
|
owner_approve: "Przed pojawieniem się zmian, właściciel musi je zatwierdzić."
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "Kontakt z CodeCombat"
|
contact_us: "Kontakt z CodeCombat"
|
||||||
|
@ -687,16 +687,16 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
forum_prefix: "W sprawach ogólnych, skorzystaj z "
|
forum_prefix: "W sprawach ogólnych, skorzystaj z "
|
||||||
forum_page: "naszego forum"
|
forum_page: "naszego forum"
|
||||||
forum_suffix: "."
|
forum_suffix: "."
|
||||||
# faq_prefix: "There's also a"
|
faq_prefix: "Jest też"
|
||||||
faq: "FAQ"
|
faq: "FAQ"
|
||||||
# subscribe_prefix: "If you need help figuring out a level, please"
|
# subscribe_prefix: "If you need help figuring out a level, please"
|
||||||
# subscribe: "buy a CodeCombat subscription"
|
# subscribe: "buy a CodeCombat subscription"
|
||||||
# subscribe_suffix: "and we'll be happy to help you with your code."
|
# subscribe_suffix: "and we'll be happy to help you with your code."
|
||||||
# subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support."
|
# subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support."
|
||||||
# screenshot_included: "Screenshot included."
|
# screenshot_included: "Screenshot included."
|
||||||
# where_reply: "Where should we reply?"
|
where_reply: "Gdzie mamy odpisać?"
|
||||||
send: "Wyślij wiadomość"
|
send: "Wyślij wiadomość"
|
||||||
# contact_candidate: "Contact Candidate" # Deprecated
|
contact_candidate: "Kontakt z kandydatem" # Deprecated
|
||||||
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
|
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
|
||||||
|
|
||||||
account_settings:
|
account_settings:
|
||||||
|
@ -707,7 +707,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
picture_tab: "Zdjęcie"
|
picture_tab: "Zdjęcie"
|
||||||
delete_account_tab: "Usuń swoje konto"
|
delete_account_tab: "Usuń swoje konto"
|
||||||
wrong_email: "Błędny e-mail"
|
wrong_email: "Błędny e-mail"
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "Błędne zdjęcie"
|
||||||
upload_picture: "Wgraj zdjęcie"
|
upload_picture: "Wgraj zdjęcie"
|
||||||
delete_this_account: "Usuń to konto całkowicie"
|
delete_this_account: "Usuń to konto całkowicie"
|
||||||
# god_mode: "God Mode"
|
# god_mode: "God Mode"
|
||||||
|
@ -716,8 +716,8 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
admin: "Administrator"
|
admin: "Administrator"
|
||||||
new_password: "Nowe hasło"
|
new_password: "Nowe hasło"
|
||||||
new_password_verify: "Zweryfikuj"
|
new_password_verify: "Zweryfikuj"
|
||||||
# type_in_email: "Type in your email to confirm account deletion."
|
type_in_email: "Wpisz swój email, aby potwierdzić usunięcie konta."
|
||||||
# type_in_password: "Also, type in your password."
|
type_in_password: "Wpisz również swoje hasło."
|
||||||
email_subscriptions: "Powiadomienia email"
|
email_subscriptions: "Powiadomienia email"
|
||||||
email_subscriptions_none: "Brak powiadomień e-mail."
|
email_subscriptions_none: "Brak powiadomień e-mail."
|
||||||
email_announcements: "Ogłoszenia"
|
email_announcements: "Ogłoszenia"
|
||||||
|
@ -748,10 +748,10 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
keyboard_shortcuts: "Skróty klawiszowe"
|
keyboard_shortcuts: "Skróty klawiszowe"
|
||||||
space: "Spacja"
|
space: "Spacja"
|
||||||
enter: "Enter"
|
enter: "Enter"
|
||||||
# press_enter: "press enter"
|
press_enter: "naciśnij enter"
|
||||||
# escape: "Escape"
|
escape: "Escape"
|
||||||
shift: "Shift"
|
shift: "Shift"
|
||||||
# run_code: "Run current code."
|
run_code: "Uruchom obecny kod."
|
||||||
run_real_time: "Uruchom \"na żywo\"."
|
run_real_time: "Uruchom \"na żywo\"."
|
||||||
continue_script: "Kontynuuj ostatni skrypt."
|
continue_script: "Kontynuuj ostatni skrypt."
|
||||||
# skip_scripts: "Skip past all skippable scripts."
|
# skip_scripts: "Skip past all skippable scripts."
|
||||||
|
@ -783,49 +783,49 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
# social_hipchat: "Chat with us in the public CodeCombat HipChat room"
|
# social_hipchat: "Chat with us in the public CodeCombat HipChat room"
|
||||||
# contribute_to_the_project: "Contribute to the project"
|
# contribute_to_the_project: "Contribute to the project"
|
||||||
|
|
||||||
# clans:
|
clans:
|
||||||
# clan: "Clan"
|
clan: "Klan"
|
||||||
# clans: "Clans"
|
clans: "Klany"
|
||||||
# new_name: "New clan name"
|
new_name: "Nazwa nowego klanu"
|
||||||
# new_description: "New clan description"
|
new_description: "Opis nowego klanu"
|
||||||
# make_private: "Make clan private"
|
make_private: "Stwórz prywatny klan"
|
||||||
# subs_only: "subscribers only"
|
subs_only: "tylko subskrybenci"
|
||||||
# create_clan: "Create New Clan"
|
create_clan: "Stwórz nowy klan"
|
||||||
# private_preview: "Preview"
|
private_preview: "Podgląd"
|
||||||
# public_clans: "Public Clans"
|
public_clans: "Publiczne klany"
|
||||||
# my_clans: "My Clans"
|
my_clans: "Moje klany"
|
||||||
# clan_name: "Clan Name"
|
clan_name: "Nazwa klanu"
|
||||||
# name: "Name"
|
name: "Nazwa"
|
||||||
# chieftain: "Chieftain"
|
chieftain: "Dowódca"
|
||||||
# type: "Type"
|
type: "Typ"
|
||||||
# edit_clan_name: "Edit Clan Name"
|
edit_clan_name: "Edytuj nazwe klanu"
|
||||||
# edit_clan_description: "Edit Clan Description"
|
edit_clan_description: "Edytuj opis klanu"
|
||||||
# edit_name: "edit name"
|
edit_name: "edytuj nazwe"
|
||||||
# edit_description: "edit description"
|
edit_description: "edytuj opis"
|
||||||
# private: "(private)"
|
private: "(prywatny)"
|
||||||
# summary: "Summary"
|
summary: "Podsumowanie"
|
||||||
# average_level: "Average Level"
|
average_level: "Średni poziom"
|
||||||
# average_achievements: "Average Achievements"
|
average_achievements: "Średnio osiągnięć"
|
||||||
# delete_clan: "Delete Clan"
|
delete_clan: "Usuń klan"
|
||||||
# leave_clan: "Leave Clan"
|
leave_clan: "Opuść klan"
|
||||||
# join_clan: "Join Clan"
|
join_clan: "Dołacz do klanu"
|
||||||
# invite_1: "Invite:"
|
invite_1: "Zaproszenie:"
|
||||||
# invite_2: "*Invite players to this Clan by sending them this link."
|
invite_2: "*Zaproś nowe osoby do klanu wysyłając im ten link."
|
||||||
# members: "Members"
|
members: "Członkowie"
|
||||||
# progress: "Progress"
|
progress: "Postęp"
|
||||||
# not_started_1: "not started"
|
not_started_1: "nierozpoczęty"
|
||||||
# started_1: "started"
|
started_1: "rozpoczęty"
|
||||||
# complete_1: "complete"
|
complete_1: "ukończony"
|
||||||
# exp_levels: "Expand levels"
|
# exp_levels: "Expand levels"
|
||||||
# rem_hero: "Remove Hero"
|
rem_hero: "Usuń bohatera"
|
||||||
# status: "Status"
|
status: "Status"
|
||||||
# complete_2: "Complete"
|
# complete_2: "Complete"
|
||||||
# started_2: "Started"
|
# started_2: "Started"
|
||||||
# not_started_2: "Not Started"
|
# not_started_2: "Not Started"
|
||||||
# view_solution: "Click to view solution."
|
# view_solution: "Click to view solution."
|
||||||
# latest_achievement: "Latest Achievement"
|
# latest_achievement: "Latest Achievement"
|
||||||
# playtime: "Playtime"
|
playtime: "Czas gyr"
|
||||||
# last_played: "Last played"
|
last_played: "Ostatnio grany"
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "Arcymag"
|
archmage_title: "Arcymag"
|
||||||
|
@ -857,9 +857,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
back: "Wstecz"
|
back: "Wstecz"
|
||||||
revert: "Przywróć"
|
revert: "Przywróć"
|
||||||
revert_models: "Przywróć wersję"
|
revert_models: "Przywróć wersję"
|
||||||
# pick_a_terrain: "Pick A Terrain"
|
pick_a_terrain: "Wybierz teren"
|
||||||
dungeon: "Loch"
|
dungeon: "Loch"
|
||||||
# indoor: "Indoor"
|
indoor: "Wnętrze"
|
||||||
desert: "Pustynia"
|
desert: "Pustynia"
|
||||||
grassy: "Trawa"
|
grassy: "Trawa"
|
||||||
small: "Mały"
|
small: "Mały"
|
||||||
|
@ -889,8 +889,8 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
# component_configs: "Component Configurations"
|
# component_configs: "Component Configurations"
|
||||||
# config_thang: "Double click to configure a thang"
|
# config_thang: "Double click to configure a thang"
|
||||||
delete: "Usuń"
|
delete: "Usuń"
|
||||||
# duplicate: "Duplicate"
|
duplicate: "Powiel"
|
||||||
# stop_duplicate: "Stop Duplicate"
|
stop_duplicate: "Przestań powielać"
|
||||||
rotate: "Obróć"
|
rotate: "Obróć"
|
||||||
level_settings_title: "Ustawienia"
|
level_settings_title: "Ustawienia"
|
||||||
level_component_tab_title: "Aktualne komponenty"
|
level_component_tab_title: "Aktualne komponenty"
|
||||||
|
@ -931,14 +931,14 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
tasks: "Zadania"
|
tasks: "Zadania"
|
||||||
# clear_storage: "Clear your local changes"
|
# clear_storage: "Clear your local changes"
|
||||||
# add_system_title: "Add Systems to Level"
|
# add_system_title: "Add Systems to Level"
|
||||||
# done_adding: "Done Adding"
|
done_adding: "Zakończono dodawanie"
|
||||||
|
|
||||||
article:
|
article:
|
||||||
edit_btn_preview: "Podgląd"
|
edit_btn_preview: "Podgląd"
|
||||||
edit_article_title: "Edytuj artykuł"
|
edit_article_title: "Edytuj artykuł"
|
||||||
|
|
||||||
# polls:
|
polls:
|
||||||
# priority: "Priority"
|
priority: "Priorytet"
|
||||||
|
|
||||||
contribute:
|
contribute:
|
||||||
page_title: "Współpraca"
|
page_title: "Współpraca"
|
||||||
|
@ -1019,7 +1019,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
games_simulated_for: "Gry symulowane dla Ciebie:"
|
games_simulated_for: "Gry symulowane dla Ciebie:"
|
||||||
games_simulated: "Gier zasymulowanych"
|
games_simulated: "Gier zasymulowanych"
|
||||||
games_played: "Gier rozegranych"
|
games_played: "Gier rozegranych"
|
||||||
# ratio: "Ratio"
|
ratio: "Proporcje"
|
||||||
leaderboard: "Tabela rankingowa"
|
leaderboard: "Tabela rankingowa"
|
||||||
battle_as: "Walcz jako "
|
battle_as: "Walcz jako "
|
||||||
summary_your: "Twój "
|
summary_your: "Twój "
|
||||||
|
@ -1033,7 +1033,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
rank_failed: "Błąd oceniania"
|
rank_failed: "Błąd oceniania"
|
||||||
rank_being_ranked: "Aktualnie oceniane gry"
|
rank_being_ranked: "Aktualnie oceniane gry"
|
||||||
rank_last_submitted: "przesłano "
|
rank_last_submitted: "przesłano "
|
||||||
# help_simulate: "Help simulate games?"
|
help_simulate: "Pomóc w symulowaniu gier?"
|
||||||
code_being_simulated: "Twój nowy kod jest aktualnie symulowany przez innych graczy w celu oceny. W miarę pojawiania sie nowych pojedynków, nastąpi odświeżenie."
|
code_being_simulated: "Twój nowy kod jest aktualnie symulowany przez innych graczy w celu oceny. W miarę pojawiania sie nowych pojedynków, nastąpi odświeżenie."
|
||||||
no_ranked_matches_pre: "Brak ocenionych pojedynków dla drużyny "
|
no_ranked_matches_pre: "Brak ocenionych pojedynków dla drużyny "
|
||||||
no_ranked_matches_post: " ! Zagraj przeciwko kilku oponentom i wróc tutaj, aby uzyskać ocenę gry."
|
no_ranked_matches_post: " ! Zagraj przeciwko kilku oponentom i wróc tutaj, aby uzyskać ocenę gry."
|
||||||
|
@ -1066,29 +1066,29 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
|
|
||||||
user:
|
user:
|
||||||
stats: "Statystyki"
|
stats: "Statystyki"
|
||||||
# singleplayer_title: "Singleplayer Levels"
|
singleplayer_title: "Poziomy jednoosobowe"
|
||||||
# multiplayer_title: "Multiplayer Levels"
|
multiplayer_title: "Poziomy multiplayer"
|
||||||
achievements_title: "Osiągnięcia"
|
achievements_title: "Osiągnięcia"
|
||||||
# last_played: "Last Played"
|
last_played: "Ostatnio grany"
|
||||||
status: "Status"
|
status: "Status"
|
||||||
status_completed: "Ukończono"
|
status_completed: "Ukończono"
|
||||||
status_unfinished: "Nie ukończono"
|
status_unfinished: "Nie ukończono"
|
||||||
# no_singleplayer: "No Singleplayer games played yet."
|
no_singleplayer: "Nie rozegrał żadnej gry jednoosobowej."
|
||||||
# no_multiplayer: "No Multiplayer games played yet."
|
no_multiplayer: "Nie rozegrał żadnej gry multiplayer."
|
||||||
# no_achievements: "No Achievements earned yet."
|
no_achievements: "Nie zdobył żadnych osiągnięć."
|
||||||
favorite_prefix: "Ulubiony język to "
|
favorite_prefix: "Ulubiony język to "
|
||||||
# favorite_postfix: "."
|
favorite_postfix: "."
|
||||||
# not_member_of_clans: "Not a member of any clans yet."
|
not_member_of_clans: "Nie jest członkiem żadnego klanu."
|
||||||
|
|
||||||
# achievements:
|
achievements:
|
||||||
# last_earned: "Last Earned"
|
last_earned: "Ostatnio zdobyty"
|
||||||
# amount_achieved: "Amount"
|
amount_achieved: "Ilość"
|
||||||
# achievement: "Achievement"
|
achievement: "Osiągnięcie"
|
||||||
# category_contributor: "Contributor"
|
# category_contributor: "Contributor"
|
||||||
# category_ladder: "Ladder"
|
# category_ladder: "Ladder"
|
||||||
# category_level: "Level"
|
category_level: "Poziom"
|
||||||
# category_miscellaneous: "Miscellaneous"
|
# category_miscellaneous: "Miscellaneous"
|
||||||
# category_levels: "Levels"
|
category_levels: "Poziomy"
|
||||||
# category_undefined: "Uncategorized"
|
# category_undefined: "Uncategorized"
|
||||||
# current_xp_prefix: ""
|
# current_xp_prefix: ""
|
||||||
# current_xp_postfix: " in total"
|
# current_xp_postfix: " in total"
|
||||||
|
@ -1145,9 +1145,9 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
# unknown: "Unknown error."
|
# unknown: "Unknown error."
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
# sessions: "Sessions"
|
sessions: "Sesje"
|
||||||
# your_sessions: "Your Sessions"
|
your_sessions: "Twoje sesje"
|
||||||
# level: "Level"
|
level: "Poziom"
|
||||||
# social_network_apis: "Social Network APIs"
|
# social_network_apis: "Social Network APIs"
|
||||||
# facebook_status: "Facebook Status"
|
# facebook_status: "Facebook Status"
|
||||||
# facebook_friends: "Facebook Friends"
|
# facebook_friends: "Facebook Friends"
|
||||||
|
@ -1184,38 +1184,38 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
|
||||||
# user_remarks: "User Remarks"
|
# user_remarks: "User Remarks"
|
||||||
versions: "Wersje"
|
versions: "Wersje"
|
||||||
items: "Przedmioty"
|
items: "Przedmioty"
|
||||||
# hero: "Hero"
|
hero: "Bohater"
|
||||||
heroes: "Bohaterowie"
|
heroes: "Bohaterowie"
|
||||||
achievement: "Osiągnięcie"
|
achievement: "Osiągnięcie"
|
||||||
# clas: "CLAs"
|
# clas: "CLAs"
|
||||||
# play_counts: "Play Counts"
|
# play_counts: "Play Counts"
|
||||||
# feedback: "Feedback"
|
feedback: "Wsparcie"
|
||||||
# payment_info: "Payment Info"
|
# payment_info: "Payment Info"
|
||||||
campaigns: "Kampanie"
|
campaigns: "Kampanie"
|
||||||
poll: "Ankieta"
|
poll: "Ankieta"
|
||||||
user_polls_record: "Historia oddanych głosów"
|
user_polls_record: "Historia oddanych głosów"
|
||||||
|
|
||||||
# concepts:
|
concepts:
|
||||||
# advanced_strings: "Advanced Strings"
|
# advanced_strings: "Advanced Strings"
|
||||||
# algorithms: "Algorithms"
|
algorithms: "Algorytmy"
|
||||||
# arguments: "Arguments"
|
arguments: "Argumenty"
|
||||||
# arithmetic: "Arithmetic"
|
arithmetic: "Arytmetyka"
|
||||||
# arrays: "Arrays"
|
arrays: "Tablice"
|
||||||
# basic_syntax: "Basic Syntax"
|
basic_syntax: "Podstawy składni"
|
||||||
# boolean_logic: "Boolean Logic"
|
boolean_logic: "Algebra Boole'a"
|
||||||
# break_statements: "Break Statements"
|
# break_statements: "Break Statements"
|
||||||
# classes: "Classes"
|
classes: "Klasy"
|
||||||
# for_loops: "For Loops"
|
for_loops: "Pętle for"
|
||||||
# functions: "Functions"
|
functions: "Funkcje"
|
||||||
# if_statements: "If Statements"
|
if_statements: "Wyrażenia warunkowe"
|
||||||
# input_handling: "Input Handling"
|
# input_handling: "Input Handling"
|
||||||
# math_operations: "Math Operations"
|
# math_operations: "Math Operations"
|
||||||
# object_literals: "Object Literals"
|
# object_literals: "Object Literals"
|
||||||
# strings: "Strings"
|
strings: "Ciągi znaków"
|
||||||
# variables: "Variables"
|
variables: "Zmienne"
|
||||||
# vectors: "Vectors"
|
vectors: "Wektory"
|
||||||
# while_loops: "Loops"
|
while_loops: "Pętle"
|
||||||
# recursion: "Recursion"
|
recursion: "Rekurencja"
|
||||||
|
|
||||||
delta:
|
delta:
|
||||||
added: "Dodano"
|
added: "Dodano"
|
||||||
|
|
|
@ -64,7 +64,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
achievements: "Conquistas" # Tooltip on achievement list button from /play
|
achievements: "Conquistas" # Tooltip on achievement list button from /play
|
||||||
account: "Conta" # Tooltip on account button from /play
|
account: "Conta" # Tooltip on account button from /play
|
||||||
settings: "Configurações" # Tooltip on settings button from /play
|
settings: "Configurações" # Tooltip on settings button from /play
|
||||||
# poll: "Poll" # Tooltip on poll button from /play
|
poll: "Enquete" # Tooltip on poll button from /play
|
||||||
next: "Próximo" # Go from choose hero to choose inventory before playing a level
|
next: "Próximo" # Go from choose hero to choose inventory before playing a level
|
||||||
change_hero: "Alterar Herói" # Go back from choose inventory to choose hero
|
change_hero: "Alterar Herói" # Go back from choose inventory to choose hero
|
||||||
choose_inventory: "Equipar Itens"
|
choose_inventory: "Equipar Itens"
|
||||||
|
@ -347,8 +347,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
tip_hate_computers: "As pessoas realmente pensam porque odeiam computadores. O que eles realmente odeiam são programadores ruins. - Larry Niven"
|
tip_hate_computers: "As pessoas realmente pensam porque odeiam computadores. O que eles realmente odeiam são programadores ruins. - Larry Niven"
|
||||||
tip_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!"
|
tip_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!"
|
||||||
tip_recurse: "Para iterar é humano, para recursão, é divino. - L. Peter Deutsch"
|
tip_recurse: "Para iterar é humano, para recursão, é divino. - L. Peter Deutsch"
|
||||||
# tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus"
|
tip_free_your_mind: "Você tem que deixar isso tudo passar, Neo. O medo, a dúvida e a descrença. Liberte sua mente - Morpheus"
|
||||||
# tip_strong_opponents: "Even the strongest of opponents always has a weakness. - Itachi Uchiha"
|
tip_strong_opponents: "Mesmo o mais forte dos adversários tem sua fraqueza. - Itachi Uchiha"
|
||||||
|
|
||||||
game_menu:
|
game_menu:
|
||||||
inventory_tab: "Inventário"
|
inventory_tab: "Inventário"
|
||||||
|
@ -621,8 +621,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
# private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
|
# private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
|
||||||
# private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
|
# private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
|
||||||
# private_clans_3: "."
|
# private_clans_3: "."
|
||||||
# who_for_title: "Who is CodeCombat for?"
|
who_for_title: "Para quem é indicado o CodeCombat?"
|
||||||
# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed."
|
who_for_1: "Nós recomendamos CodeCombat para estudantes a partir de 9 anos de idade. Nenhuma experiência anterior em programação é necessária."
|
||||||
# who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
|
# who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
|
||||||
# material_title: "How much material is there?"
|
# material_title: "How much material is there?"
|
||||||
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
|
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
|
||||||
|
@ -707,7 +707,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
picture_tab: "Foto"
|
picture_tab: "Foto"
|
||||||
delete_account_tab: "Excluir sua conta"
|
delete_account_tab: "Excluir sua conta"
|
||||||
wrong_email: "E-mail incorreto"
|
wrong_email: "E-mail incorreto"
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "Senha Incorreta"
|
||||||
upload_picture: "Enviar uma foto"
|
upload_picture: "Enviar uma foto"
|
||||||
delete_this_account: "Excluir essa conta definitivamente"
|
delete_this_account: "Excluir essa conta definitivamente"
|
||||||
god_mode: "Modo Deus"
|
god_mode: "Modo Deus"
|
||||||
|
@ -717,7 +717,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
new_password: "Nova Senha"
|
new_password: "Nova Senha"
|
||||||
new_password_verify: "Confirmação"
|
new_password_verify: "Confirmação"
|
||||||
type_in_email: "Digite seu e-mail para confirmar a exclusão" # {change}
|
type_in_email: "Digite seu e-mail para confirmar a exclusão" # {change}
|
||||||
# type_in_password: "Also, type in your password."
|
type_in_password: "Digite sua senha."
|
||||||
email_subscriptions: "Assinaturas para Notícias por Email"
|
email_subscriptions: "Assinaturas para Notícias por Email"
|
||||||
email_subscriptions_none: "Sem Assinaturas de Email"
|
email_subscriptions_none: "Sem Assinaturas de Email"
|
||||||
email_announcements: "Notícias"
|
email_announcements: "Notícias"
|
||||||
|
@ -748,7 +748,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
keyboard_shortcuts: "Atalhos do Teclado"
|
keyboard_shortcuts: "Atalhos do Teclado"
|
||||||
space: "Espaço"
|
space: "Espaço"
|
||||||
enter: "Enter"
|
enter: "Enter"
|
||||||
# press_enter: "press enter"
|
press_enter: "pressione enter"
|
||||||
escape: "Esc"
|
escape: "Esc"
|
||||||
shift: "Shift"
|
shift: "Shift"
|
||||||
run_code: "Rodar código atual."
|
run_code: "Rodar código atual."
|
||||||
|
@ -853,7 +853,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
thang_title: "Editor de Thang"
|
thang_title: "Editor de Thang"
|
||||||
level_title: "Editor de Nível"
|
level_title: "Editor de Nível"
|
||||||
achievement_title: "Editor de Conquistas"
|
achievement_title: "Editor de Conquistas"
|
||||||
# poll_title: "Poll Editor"
|
poll_title: "Editor de Enquete"
|
||||||
back: "Voltar"
|
back: "Voltar"
|
||||||
revert: "Reverter"
|
revert: "Reverter"
|
||||||
revert_models: "Reverter Modelos"
|
revert_models: "Reverter Modelos"
|
||||||
|
@ -884,7 +884,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
level_tab_thangs_all: "Tudo"
|
level_tab_thangs_all: "Tudo"
|
||||||
level_tab_thangs_conditions: "Condições de Início"
|
level_tab_thangs_conditions: "Condições de Início"
|
||||||
level_tab_thangs_add: "Adicionar Thangs"
|
level_tab_thangs_add: "Adicionar Thangs"
|
||||||
# level_tab_thangs_search: "Search thangs"
|
level_tab_thangs_search: "Buscar thangs"
|
||||||
add_components: "Adicionar componentes"
|
add_components: "Adicionar componentes"
|
||||||
component_configs: "Configurações de componente"
|
component_configs: "Configurações de componente"
|
||||||
config_thang: "Duplo-clique para configurar uma thang"
|
config_thang: "Duplo-clique para configurar uma thang"
|
||||||
|
@ -915,13 +915,13 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
|
||||||
new_level_title_login: "Faça login para Criar um Novo Nível"
|
new_level_title_login: "Faça login para Criar um Novo Nível"
|
||||||
new_achievement_title: "Criar Nova Conquista"
|
new_achievement_title: "Criar Nova Conquista"
|
||||||
new_achievement_title_login: "Faça login para Criar uma Nova Conquista"
|
new_achievement_title_login: "Faça login para Criar uma Nova Conquista"
|
||||||
# new_poll_title: "Create a New Poll"
|
new_poll_title: "Criar uma nova enquete"
|
||||||
# new_poll_title_login: "Log In to Create a New Poll"
|
new_poll_title_login: "Faça login para criar uma nova enquete"
|
||||||
article_search_title: "Procurar Artigos Aqui"
|
article_search_title: "Procurar Artigos Aqui"
|
||||||
thang_search_title: "Procurar Tipos de Thang Aqui"
|
thang_search_title: "Procurar Tipos de Thang Aqui"
|
||||||
level_search_title: "Procurar Níveis Aqui"
|
level_search_title: "Procurar Níveis Aqui"
|
||||||
achievement_search_title: "Buscar Conquistas"
|
achievement_search_title: "Buscar Conquistas"
|
||||||
# poll_search_title: "Search Polls"
|
poll_search_title: "Buscar enquetes"
|
||||||
read_only_warning2: "Nota: você não pode salvar suas edições aqui pois não está logado."
|
read_only_warning2: "Nota: você não pode salvar suas edições aqui pois não está logado."
|
||||||
no_achievements: "Nenhuma conquista foi adicionada para esse nível ainda."
|
no_achievements: "Nenhuma conquista foi adicionada para esse nível ainda."
|
||||||
achievement_query_misc: "Conquista chave desligada dos variados"
|
achievement_query_misc: "Conquista chave desligada dos variados"
|
||||||
|
|
|
@ -613,11 +613,11 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
||||||
sub_includes_6: "3500 gemas de bónus todos os meses"
|
sub_includes_6: "3500 gemas de bónus todos os meses"
|
||||||
sub_includes_7: "Clãs Privados"
|
sub_includes_7: "Clãs Privados"
|
||||||
monitor_progress_title: "Como é que acompanho o progresso dos estudantes?"
|
monitor_progress_title: "Como é que acompanho o progresso dos estudantes?"
|
||||||
# monitor_progress_1: "Student progress can be monitored by creating a"
|
monitor_progress_1: "O progresso dos estudantes pode ser acompanhado ao criares um"
|
||||||
# monitor_progress_2: "for your class."
|
monitor_progress_2: "para a tua turma."
|
||||||
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the"
|
monitor_progress_3: "Para adicionares um estudante, envia-lhe a ligação de convite para o teu Clã, a qual podes encontrar através da página dos"
|
||||||
# monitor_progress_4: "page."
|
monitor_progress_4: ", ao acederes ao teu."
|
||||||
# monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page."
|
monitor_progress_5: "Depois de ele se juntar, verás um resumo do progresso do estudante na tua página do Clã."
|
||||||
private_clans_1: "Os Clãs Privados garantem privacidade e informações sobre o progresso de cada estudante superiores."
|
private_clans_1: "Os Clãs Privados garantem privacidade e informações sobre o progresso de cada estudante superiores."
|
||||||
private_clans_2: "Para criares um Clã privado, marca a caixa 'Tornar o clã privado' aquando da criação de um"
|
private_clans_2: "Para criares um Clã privado, marca a caixa 'Tornar o clã privado' aquando da criação de um"
|
||||||
private_clans_3: "."
|
private_clans_3: "."
|
||||||
|
@ -626,7 +626,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
||||||
who_for_2: "O CodeCombat foi pensado de forma a ser apelativo tanto para rapazes como para raparigas."
|
who_for_2: "O CodeCombat foi pensado de forma a ser apelativo tanto para rapazes como para raparigas."
|
||||||
material_title: "Quanto material há?"
|
material_title: "Quanto material há?"
|
||||||
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
|
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
|
||||||
# material_1: "Approximately 25 hours of free content and an additional 15 hours of subscriber content."
|
material_1: "Aproximadamente 25 horas de conteúdo gratuito e 15 horas adicionais de conteúdo para subscritores."
|
||||||
concepts_title: "Que conceitos são abordados?"
|
concepts_title: "Que conceitos são abordados?"
|
||||||
how_much_title: "Quanto custa uma subscrição mensal?"
|
how_much_title: "Quanto custa uma subscrição mensal?"
|
||||||
how_much_1: "Uma"
|
how_much_1: "Uma"
|
||||||
|
@ -869,7 +869,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
||||||
generate_terrain: "Gerar Terreno"
|
generate_terrain: "Gerar Terreno"
|
||||||
more: "Mais"
|
more: "Mais"
|
||||||
wiki: "Wiki"
|
wiki: "Wiki"
|
||||||
live_chat: "Chat Ao Vivo"
|
live_chat: "Chat ao Vivo"
|
||||||
thang_main: "Principal"
|
thang_main: "Principal"
|
||||||
thang_spritesheets: "Spritesheets"
|
thang_spritesheets: "Spritesheets"
|
||||||
thang_colors: "Cores"
|
thang_colors: "Cores"
|
||||||
|
@ -1195,32 +1195,32 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
||||||
poll: "Votações"
|
poll: "Votações"
|
||||||
user_polls_record: "Histórico das Votações"
|
user_polls_record: "Histórico das Votações"
|
||||||
|
|
||||||
# concepts:
|
concepts:
|
||||||
# advanced_strings: "Advanced Strings"
|
advanced_strings: "'Strings' Avançadas"
|
||||||
# algorithms: "Algorithms"
|
algorithms: "Algoritmos"
|
||||||
# arguments: "Arguments"
|
arguments: "Argumentos"
|
||||||
# arithmetic: "Arithmetic"
|
arithmetic: "Aritmética"
|
||||||
# arrays: "Arrays"
|
arrays: "'Arrays'"
|
||||||
# basic_syntax: "Basic Syntax"
|
basic_syntax: "Sintaxe Básica"
|
||||||
# boolean_logic: "Boolean Logic"
|
boolean_logic: "Lógica 'Boolean'"
|
||||||
# break_statements: "Break Statements"
|
break_statements: "Declarações 'Break'"
|
||||||
# classes: "Classes"
|
classes: "Classes"
|
||||||
# for_loops: "For Loops"
|
for_loops: "'For Loops'"
|
||||||
# functions: "Functions"
|
functions: "Funções"
|
||||||
# if_statements: "If Statements"
|
if_statements: "Declarações 'If'"
|
||||||
# input_handling: "Input Handling"
|
input_handling: "Manuseamento de 'Input'"
|
||||||
# math_operations: "Math Operations"
|
math_operations: "Operações Matemáticas"
|
||||||
# object_literals: "Object Literals"
|
object_literals: "'Object Literals'"
|
||||||
# strings: "Strings"
|
strings: "'Strings'"
|
||||||
# variables: "Variables"
|
variables: "Variáveis"
|
||||||
# vectors: "Vectors"
|
vectors: "Vetores"
|
||||||
# while_loops: "Loops"
|
while_loops: "'Loops'"
|
||||||
# recursion: "Recursion"
|
recursion: "Recursão"
|
||||||
|
|
||||||
delta:
|
delta:
|
||||||
added: "Adicionados/as"
|
added: "Adicionado"
|
||||||
modified: "Modificados/as"
|
modified: "Modificado"
|
||||||
deleted: "Eliminados/as"
|
deleted: "Eliminado"
|
||||||
moved_index: "Índice Movido"
|
moved_index: "Índice Movido"
|
||||||
text_diff: "Diferença de Texto"
|
text_diff: "Diferença de Texto"
|
||||||
merge_conflict_with: "FUNDIR CONFLITO COM"
|
merge_conflict_with: "FUNDIR CONFLITO COM"
|
||||||
|
@ -1402,19 +1402,19 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
|
||||||
# education_duration: "Dates"
|
# education_duration: "Dates"
|
||||||
education_duration_help: "Quando?"
|
education_duration_help: "Quando?"
|
||||||
education_description: "Descrição"
|
education_description: "Descrição"
|
||||||
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
|
education_description_help: "Destaca algo sobre esta experiência educacional. (140 carateres; opcional)"
|
||||||
# our_notes: "CodeCombat's Notes"
|
# our_notes: "CodeCombat's Notes"
|
||||||
# remarks: "Remarks"
|
# remarks: "Remarks"
|
||||||
projects: "Projetos"
|
projects: "Projetos"
|
||||||
projects_header: "Adiciona 3 projetos"
|
projects_header: "Adiciona 3 projetos"
|
||||||
# projects_header_2: "Projects (Top 3)"
|
projects_header_2: "Projetos (Top 3)"
|
||||||
# projects_blurb: "Highlight your projects to amaze employers."
|
# projects_blurb: "Highlight your projects to amaze employers."
|
||||||
project_name: "Nome do Projeto"
|
project_name: "Nome do Projeto"
|
||||||
# project_name_help: "What was the project called?"
|
project_name_help: "Qual era o nome do projeto?"
|
||||||
project_description: "Descrição"
|
project_description: "Descrição"
|
||||||
project_description_help: "Descreve o projeto em poucas palavras."
|
project_description_help: "Descreve o projeto em poucas palavras."
|
||||||
project_picture: "Imagem"
|
project_picture: "Imagem"
|
||||||
# project_picture_help: "Upload a 230x115px or larger image showing off the project."
|
project_picture_help: "Faz upload de uma imagem 230x115px ou maior que mostre o projeto."
|
||||||
project_link: "Ligação"
|
project_link: "Ligação"
|
||||||
project_link_help: "Ligação para o projeto."
|
project_link_help: "Ligação para o projeto."
|
||||||
player_code: "Código do Jogador"
|
player_code: "Código do Jogador"
|
||||||
|
|
|
@ -92,8 +92,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>。"
|
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>。"
|
||||||
campaign_classic_algorithms: "经典算法"
|
campaign_classic_algorithms: "经典算法"
|
||||||
campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法"
|
campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法"
|
||||||
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
campaign_old_multiplayer: "(过时的)旧的多人竞技场"
|
||||||
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
campaign_old_multiplayer_description: "一个文明时代的遗迹。没有模拟运行这些老的、英雄少的多人竞技场。"
|
||||||
|
|
||||||
share_progress_modal:
|
share_progress_modal:
|
||||||
blurb: "你的进度真快!快告诉其他人你从CodeCombat学到了什么!" # {change}
|
blurb: "你的进度真快!快告诉其他人你从CodeCombat学到了什么!" # {change}
|
||||||
|
@ -160,7 +160,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
unwatch: "取消关注"
|
unwatch: "取消关注"
|
||||||
submit_patch: "提交补丁"
|
submit_patch: "提交补丁"
|
||||||
submit_changes: "提交更新"
|
submit_changes: "提交更新"
|
||||||
# save_changes: "Save Changes"
|
save_changes: "保存更新"
|
||||||
|
|
||||||
general:
|
general:
|
||||||
and: "与"
|
and: "与"
|
||||||
|
@ -296,7 +296,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
time_goto: "跳到:"
|
time_goto: "跳到:"
|
||||||
non_user_code_problem_title: "不能读入关卡"
|
non_user_code_problem_title: "不能读入关卡"
|
||||||
infinite_loop_title: "有无限循环"
|
infinite_loop_title: "有无限循环"
|
||||||
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
infinite_loop_description: "建立世界的初始代码永远不会运行完毕。这可能是真的运行的很慢或者陷入了一个死循环。又或者可能存在bug。您可以尝试再次运行该代码,或者将代码重置为默认状态。如果仍旧解决不了,请让告诉我们。"
|
||||||
check_dev_console: "你也可以打开开发者界面看一下有什么可能出错了。"
|
check_dev_console: "你也可以打开开发者界面看一下有什么可能出错了。"
|
||||||
check_dev_console_link: "(说明)"
|
check_dev_console_link: "(说明)"
|
||||||
infinite_loop_try_again: "请重试"
|
infinite_loop_try_again: "请重试"
|
||||||
|
@ -347,7 +347,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
tip_hate_computers: "那些认为他们讨厌电脑的人,其实他们讨厌的是垃圾程序编写员。- Larry Niven"
|
tip_hate_computers: "那些认为他们讨厌电脑的人,其实他们讨厌的是垃圾程序编写员。- Larry Niven"
|
||||||
tip_open_source_contribute: "你可以帮助「CodeCombat」提高!"
|
tip_open_source_contribute: "你可以帮助「CodeCombat」提高!"
|
||||||
tip_recurse: "迭代为人,递归为神 - L. Peter Deutsch"
|
tip_recurse: "迭代为人,递归为神 - L. Peter Deutsch"
|
||||||
# tip_free_your_mind: "You have to let it all go, Neo. Fear, doubt, and disbelief. Free your mind. - Morpheus"
|
tip_free_your_mind: "丢掉一切私心杂念,丢掉害怕、疑问和拒信,解放你的思想。 - Morpheus"
|
||||||
tip_strong_opponents: "即使是最强大的对手也是有弱点的. - Itachi Uchiha"
|
tip_strong_opponents: "即使是最强大的对手也是有弱点的. - Itachi Uchiha"
|
||||||
|
|
||||||
game_menu:
|
game_menu:
|
||||||
|
@ -405,7 +405,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
prompt_body: "还需要更多吗?"
|
prompt_body: "还需要更多吗?"
|
||||||
prompt_button: "进入商店"
|
prompt_button: "进入商店"
|
||||||
recovered: "之前购买的宝石已恢复。请刷新页面。"
|
recovered: "之前购买的宝石已恢复。请刷新页面。"
|
||||||
# price: "x3500 / mo"
|
price: "x3500 / 月"
|
||||||
|
|
||||||
subscribe:
|
subscribe:
|
||||||
comparison_blurb: "亲,订阅CodeCombat,大力的提升你的技能!"
|
comparison_blurb: "亲,订阅CodeCombat,大力的提升你的技能!"
|
||||||
|
@ -450,31 +450,31 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
unlock_help_videos: "订阅后才可以解锁视频教学哦!"
|
unlock_help_videos: "订阅后才可以解锁视频教学哦!"
|
||||||
personal_sub: "个人订阅" # Accounts Subscription View below
|
personal_sub: "个人订阅" # Accounts Subscription View below
|
||||||
loading_info: "正在读入订阅内容..."
|
loading_info: "正在读入订阅内容..."
|
||||||
# managed_by: "Managed by"
|
managed_by: "管理"
|
||||||
# will_be_cancelled: "Will be cancelled on"
|
will_be_cancelled: "将被取消"
|
||||||
# currently_free: "You currently have a free subscription"
|
currently_free: "您目前有一个免费订阅"
|
||||||
# currently_free_until: "You currently have a free subscription until"
|
currently_free_until: "您目前有一个免费订阅,直到"
|
||||||
# was_free_until: "You had a free subscription until"
|
was_free_until: "您有过一个免费订阅,直到"
|
||||||
# managed_subs: "Managed Subscriptions"
|
managed_subs: "管理订阅"
|
||||||
# managed_subs_desc: "Add subscriptions for other players (students, children, etc.)"
|
managed_subs_desc: "为其他玩家(学生、儿童等)添加订阅。"
|
||||||
# managed_subs_desc_2: "Recipients must have a CodeCombat account associated with the email address you provide."
|
managed_subs_desc_2: "收件人必须有一个与您提供的电子邮件地址相关联的codecombat帐户。"
|
||||||
# group_discounts: "Group discounts"
|
group_discounts: "团购价"
|
||||||
# group_discounts_1: "We also offer group discounts for bulk subscriptions."
|
group_discounts_1: "我们还为批量订阅提供团购价"
|
||||||
# group_discounts_1st: "1st subscription"
|
group_discounts_1st: "1个订阅"
|
||||||
group_discounts_full: "全价"
|
group_discounts_full: "全价"
|
||||||
# group_discounts_2nd: "Subscriptions 2-11"
|
group_discounts_2nd: "2-11个订阅"
|
||||||
group_discounts_20: "八折"
|
group_discounts_20: "八折"
|
||||||
# group_discounts_12th: "Subscriptions 12+"
|
group_discounts_12th: "12+个订阅"
|
||||||
group_discounts_40: "六折"
|
group_discounts_40: "六折"
|
||||||
# subscribing: "Subscribing..."
|
subscribing: "订阅中..."
|
||||||
# recipient_emails_placeholder: "Enter email address to subscribe, one per line."
|
recipient_emails_placeholder: "请输入电子邮件地址来订阅,每行一个。"
|
||||||
subscribe_users: "订阅用户"
|
subscribe_users: "订阅用户"
|
||||||
# users_subscribed: "Users subscribed:"
|
users_subscribed: "用户订阅:"
|
||||||
# no_users_subscribed: "No users subscribed, please double check your email addresses."
|
no_users_subscribed: "没有用户订阅,请仔细检查您的电子邮件地址。"
|
||||||
# current_recipients: "Current Recipients"
|
current_recipients: "当前收件人"
|
||||||
# unsubscribing: "Unsubscribing..."
|
unsubscribing: "取消订阅中..."
|
||||||
# subscribe_prepaid: "Click Subscribe to use prepaid code"
|
subscribe_prepaid: "点击订阅来使用预付费代码"
|
||||||
# using_prepaid: "Using prepaid code for monthly subscription"
|
using_prepaid: "使用预付费代码进行每月订阅"
|
||||||
|
|
||||||
choose_hero:
|
choose_hero:
|
||||||
choose_hero: "请选择您的英雄"
|
choose_hero: "请选择您的英雄"
|
||||||
|
@ -502,13 +502,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
blocks: "格挡" # As in "this shield blocks this much damage"
|
blocks: "格挡" # As in "this shield blocks this much damage"
|
||||||
backstab: "背刺" # As in "this dagger does this much backstab damage"
|
backstab: "背刺" # As in "this dagger does this much backstab damage"
|
||||||
skills: "技能"
|
skills: "技能"
|
||||||
# attack_1: "Deals"
|
attack_1: "交易"
|
||||||
# attack_2: "of listed"
|
attack_2: "列表"
|
||||||
attack_3: "武器攻击力."
|
attack_3: "武器攻击力."
|
||||||
# health_1: "Gains"
|
health_1: "收益"
|
||||||
# health_2: "of listed"
|
health_2: "列表"
|
||||||
health_3: "装备血量."
|
health_3: "装备血量."
|
||||||
# speed_1: "Moves at"
|
speed_1: "移动速度"
|
||||||
speed_2: "米每秒."
|
speed_2: "米每秒."
|
||||||
available_for_purchase: "可以购买" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
available_for_purchase: "可以购买" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
||||||
level_to_unlock: "未解锁关卡:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
level_to_unlock: "未解锁关卡:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
||||||
|
@ -588,57 +588,57 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
josh_title: "游戏设计师"
|
josh_title: "游戏设计师"
|
||||||
josh_blurb: "地面是熔岩"
|
josh_blurb: "地面是熔岩"
|
||||||
jose_title: "音乐"
|
jose_title: "音乐"
|
||||||
# jose_blurb: "Taking Off"
|
jose_blurb: "放轻松"
|
||||||
# retrostyle_title: "Illustration"
|
retrostyle_title: "插画师"
|
||||||
# retrostyle_blurb: "RetroStyle Games"
|
retrostyle_blurb: "复古风格的游戏"
|
||||||
|
|
||||||
teachers:
|
teachers:
|
||||||
title: "CodeCombat给教师的说明"
|
title: "CodeCombat给教师的说明"
|
||||||
intro_1: "CodeCombat 是一个教编程的网上游戏。学生会用编程语言写代码。"
|
intro_1: "CodeCombat 是一个教编程的网上游戏。学生会用编程语言写代码。"
|
||||||
intro_2: "无需经验!"
|
intro_2: "无需经验!"
|
||||||
free_title: "要多少钱?"
|
free_title: "要多少钱?"
|
||||||
# cost_china: "CodeCombat in China is free for the first five levels, after which it costs $9.99 USD per month for access to our other 140+ levels on our exclusive China servers."
|
cost_china: "CodeCombat的前5个关卡在中国是免费的,在这之后需花费每月9.99美元来访问我们架设在中国专属服务器上的140多个关卡。"
|
||||||
# free_1: "There are 100+ FREE levels which cover every concept."
|
free_1: "有100多个覆盖了所有理论的免费关卡。"
|
||||||
# free_2: "A monthly subscription provides access to video tutorials and extra practice levels."
|
free_2: "包月订阅可以访问视频教程和额外的练习关卡。"
|
||||||
teacher_subs_title: "教师可免费订阅!"
|
teacher_subs_title: "教师可免费订阅!"
|
||||||
teacher_subs_1: "请联系" # {change}
|
teacher_subs_1: "请联系" # {change}
|
||||||
# teacher_subs_2: "Teacher Survey"
|
teacher_subs_2: "教师调查"
|
||||||
# teacher_subs_3: "to set up your subscription."
|
teacher_subs_3: "建立您的订阅。"
|
||||||
# sub_includes_title: "What is included in the subscription?"
|
sub_includes_title: "订阅里包含了什么内容?"
|
||||||
# sub_includes_1: "In addition to the 100+ basic levels, students with a monthly subscription get access to these additional features:"
|
sub_includes_1: "除了100多个基础关卡,学生包月订阅还可以使用这些附加功能:"
|
||||||
sub_includes_2: "超过60个练习关卡" # {change}
|
sub_includes_2: "超过60个练习关卡" # {change}
|
||||||
sub_includes_3: "视频教学"
|
sub_includes_3: "视频教学"
|
||||||
# sub_includes_4: "Premium email support"
|
sub_includes_4: "优质的电子邮件支持"
|
||||||
# sub_includes_5: "10 new heroes with unique skills to master"
|
sub_includes_5: "10个具有独特技能的新英雄"
|
||||||
sub_includes_6: "每月享有3500额外宝石"
|
sub_includes_6: "每月享有3500额外宝石"
|
||||||
# sub_includes_7: "Private Clans"
|
sub_includes_7: "私有团队"
|
||||||
# monitor_progress_title: "How do I monitor student progress?"
|
monitor_progress_title: "我要如何查看学生的进度?"
|
||||||
# monitor_progress_1: "Student progress can be monitored by creating a"
|
monitor_progress_1: "要查看学生的进度,可以通过建立一个"
|
||||||
# monitor_progress_2: "for your class."
|
monitor_progress_2: "在你的课程。"
|
||||||
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the"
|
monitor_progress_3: "为了添加一个学生,可以给他们发送一个你的团队的邀请链接,这个在"
|
||||||
# monitor_progress_4: "page."
|
monitor_progress_4: "页面。"
|
||||||
# monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page."
|
monitor_progress_5: "当他们加入之后,你可以在你的团队页面看到这些学生的进度汇总。"
|
||||||
# private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
|
private_clans_1: "私有团队为每个学生增加了隐私和详细的进度信息。"
|
||||||
# private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
|
private_clans_2: "为了添加一个私有团队,可以勾选'私有团队'复选框,在你建立一个"
|
||||||
# private_clans_3: "."
|
private_clans_3: "。"
|
||||||
# who_for_title: "Who is CodeCombat for?"
|
who_for_title: "谁是CodeCombat的使用对象呢?"
|
||||||
# who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed."
|
who_for_1: "我们建议让9岁及以上的学生使用CodeCombat。无需任何编程经验。"
|
||||||
# who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
|
who_for_2: "我们设计CodeCombat来吸引男生女生。"
|
||||||
# material_title: "How much material is there?"
|
material_title: "这里有多少素材呢?"
|
||||||
# material_china: "Approximately 40 hours of gameplay spread over 170+ subscriber-only levels so far."
|
material_china: "约40小时的游戏时间和目前为止超过170个的订阅关卡。"
|
||||||
# material_1: "Approximately 25 hours of free content and an additional 15 hours of subscriber content."
|
material_1: "大约25个小时的免费内容和额外的15个小时的订阅内容。"
|
||||||
# concepts_title: "What concepts are covered?"
|
concepts_title: "包括了哪些理论知识?"
|
||||||
how_much_title: "每月的订阅费用是多少?"
|
how_much_title: "每月的订阅费用是多少?"
|
||||||
how_much_1: ""
|
how_much_1: ""
|
||||||
how_much_2: "每月订阅"
|
how_much_2: "每月订阅"
|
||||||
how_much_3: "每月$9.99, 并可随时要求退款."
|
how_much_3: "每月$9.99, 并可随时要求退款."
|
||||||
how_much_4: "另外,团体购买者将享受折扣优惠"
|
how_much_4: "另外,团体购买者将享受折扣优惠"
|
||||||
# how_much_5: "We accept discounted one-time purchases and yearly subscription purchases for groups, such as a class or school. Please contact"
|
how_much_5: "我们接受一次性的打折购买以及每年订阅的团体,比如班级或者学校。请联系"
|
||||||
# how_much_6: "for more details."
|
how_much_6: "来获取详情。"
|
||||||
# more_info_title: "Where can I find more information?"
|
more_info_title: "我可以在哪里找到更多信息?"
|
||||||
# more_info_1: "Our"
|
more_info_1: "我们的"
|
||||||
# more_info_2: "teachers forum"
|
more_info_2: "教师论坛"
|
||||||
# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat."
|
more_info_3: "是个与其他使用CodeCombat的教育工作者联系的良好平台。"
|
||||||
sys_requirements_title: "系统需求"
|
sys_requirements_title: "系统需求"
|
||||||
sys_requirements_1: "因为CodeCombat是个游戏,它对于电脑的要求很高以运行的顺畅。我们已经优化过他以便让他能在每一个最新浏览器或是比较旧的电脑跑得顺畅,所以每一个人都能享受CodeCombat带来的乐趣。如上,为了使你顺利的完成Hour of Code的学习,我们建议你:" # {change}
|
sys_requirements_1: "因为CodeCombat是个游戏,它对于电脑的要求很高以运行的顺畅。我们已经优化过他以便让他能在每一个最新浏览器或是比较旧的电脑跑得顺畅,所以每一个人都能享受CodeCombat带来的乐趣。如上,为了使你顺利的完成Hour of Code的学习,我们建议你:" # {change}
|
||||||
sys_requirements_2: "使用最新版本的Chrome或是Firefox." # {change}
|
sys_requirements_2: "使用最新版本的Chrome或是Firefox." # {change}
|
||||||
|
@ -679,7 +679,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
cla_url: "贡献者许可协议"
|
cla_url: "贡献者许可协议"
|
||||||
cla_suffix: "。"
|
cla_suffix: "。"
|
||||||
cla_agree: "我同意"
|
cla_agree: "我同意"
|
||||||
# owner_approve: "An owner will need to approve it before your changes will become visible."
|
owner_approve: "你所做出的修改必须经拥有者确认才能生效。"
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "联系我们"
|
contact_us: "联系我们"
|
||||||
|
@ -707,7 +707,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
picture_tab: "图片"
|
picture_tab: "图片"
|
||||||
delete_account_tab: "删除账户"
|
delete_account_tab: "删除账户"
|
||||||
wrong_email: "错误的邮箱地址"
|
wrong_email: "错误的邮箱地址"
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "密码错误"
|
||||||
upload_picture: "上传一张图片"
|
upload_picture: "上传一张图片"
|
||||||
delete_this_account: "永久删除账户"
|
delete_this_account: "永久删除账户"
|
||||||
god_mode: "上帝模式"
|
god_mode: "上帝模式"
|
||||||
|
@ -717,7 +717,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
new_password: "新密码"
|
new_password: "新密码"
|
||||||
new_password_verify: "核实"
|
new_password_verify: "核实"
|
||||||
type_in_email: "输入你的邮箱地址来确认删除" # {change}
|
type_in_email: "输入你的邮箱地址来确认删除" # {change}
|
||||||
# type_in_password: "Also, type in your password."
|
type_in_password: "同样的,输入你的密码。"
|
||||||
email_subscriptions: "邮箱订阅"
|
email_subscriptions: "邮箱订阅"
|
||||||
email_subscriptions_none: "取消订阅"
|
email_subscriptions_none: "取消订阅"
|
||||||
email_announcements: "通知"
|
email_announcements: "通知"
|
||||||
|
@ -748,7 +748,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
keyboard_shortcuts: "快捷键"
|
keyboard_shortcuts: "快捷键"
|
||||||
space: "空格"
|
space: "空格"
|
||||||
enter: "回车"
|
enter: "回车"
|
||||||
# press_enter: "press enter"
|
press_enter: "按回车键"
|
||||||
escape: "Esc"
|
escape: "Esc"
|
||||||
shift: "Shift"
|
shift: "Shift"
|
||||||
run_code: "运行当前代码"
|
run_code: "运行当前代码"
|
||||||
|
@ -884,7 +884,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
level_tab_thangs_all: "所有"
|
level_tab_thangs_all: "所有"
|
||||||
level_tab_thangs_conditions: "启动条件"
|
level_tab_thangs_conditions: "启动条件"
|
||||||
level_tab_thangs_add: "增加物体"
|
level_tab_thangs_add: "增加物体"
|
||||||
# level_tab_thangs_search: "Search thangs"
|
level_tab_thangs_search: "查找物体"
|
||||||
add_components: "添加组件"
|
add_components: "添加组件"
|
||||||
component_configs: "组件配置"
|
component_configs: "组件配置"
|
||||||
config_thang: "双击配置一个thang"
|
config_thang: "双击配置一个thang"
|
||||||
|
@ -931,7 +931,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
tasks: "任务"
|
tasks: "任务"
|
||||||
# clear_storage: "Clear your local changes"
|
# clear_storage: "Clear your local changes"
|
||||||
# add_system_title: "Add Systems to Level"
|
# add_system_title: "Add Systems to Level"
|
||||||
# done_adding: "Done Adding"
|
done_adding: "添加完毕"
|
||||||
|
|
||||||
article:
|
article:
|
||||||
edit_btn_preview: "预览"
|
edit_btn_preview: "预览"
|
||||||
|
@ -1078,7 +1078,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
no_achievements: "还未得到任何成就。"
|
no_achievements: "还未得到任何成就。"
|
||||||
favorite_prefix: "最喜爱的语言是 "
|
favorite_prefix: "最喜爱的语言是 "
|
||||||
favorite_postfix: "。"
|
favorite_postfix: "。"
|
||||||
# not_member_of_clans: "Not a member of any clans yet."
|
not_member_of_clans: "还不是任何一个团队里的成员。"
|
||||||
|
|
||||||
achievements:
|
achievements:
|
||||||
last_earned: "最近取得的"
|
last_earned: "最近取得的"
|
||||||
|
@ -1104,7 +1104,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
payments: "支付方式"
|
payments: "支付方式"
|
||||||
purchased: "已购买"
|
purchased: "已购买"
|
||||||
subscription: "订阅"
|
subscription: "订阅"
|
||||||
# invoices: "Invoices"
|
invoices: "票据"
|
||||||
service_apple: "设备:苹果"
|
service_apple: "设备:苹果"
|
||||||
service_web: "设备:网页"
|
service_web: "设备:网页"
|
||||||
paid_on: "支付"
|
paid_on: "支付"
|
||||||
|
@ -1184,7 +1184,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
|
||||||
user_remarks: "用户备注"
|
user_remarks: "用户备注"
|
||||||
versions: "版本"
|
versions: "版本"
|
||||||
items: "物品"
|
items: "物品"
|
||||||
# hero: "Hero"
|
hero: "英雄"
|
||||||
heroes: "英雄"
|
heroes: "英雄"
|
||||||
achievement: "成就"
|
achievement: "成就"
|
||||||
clas: "CLAs"
|
clas: "CLAs"
|
||||||
|
|
|
@ -50,14 +50,14 @@ module.exports = class Level extends CocoModel
|
||||||
|
|
||||||
denormalize: (supermodel, session, otherSession) ->
|
denormalize: (supermodel, session, otherSession) ->
|
||||||
o = $.extend true, {}, @attributes
|
o = $.extend true, {}, @attributes
|
||||||
if o.thangs and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
if o.thangs and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
for levelThang in o.thangs
|
for levelThang in o.thangs
|
||||||
@denormalizeThang(levelThang, supermodel, session, otherSession)
|
@denormalizeThang(levelThang, supermodel, session, otherSession)
|
||||||
o
|
o
|
||||||
|
|
||||||
denormalizeThang: (levelThang, supermodel, session, otherSession) ->
|
denormalizeThang: (levelThang, supermodel, session, otherSession) ->
|
||||||
levelThang.components ?= []
|
levelThang.components ?= []
|
||||||
isHero = /Hero Placeholder/.test levelThang.id
|
isHero = /Hero Placeholder/.test(levelThang.id) and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
||||||
if isHero and otherSession
|
if isHero and otherSession
|
||||||
# If it's a hero and there's another session, find the right session for it.
|
# If it's a hero and there's another session, find the right session for it.
|
||||||
# If there is no other session (playing against default code, or on single player), clone all placeholders.
|
# If there is no other session (playing against default code, or on single player), clone all placeholders.
|
||||||
|
|
|
@ -57,7 +57,7 @@ _.extend CampaignSchema.properties, {
|
||||||
i18n: { type: 'object', format: 'hidden' }
|
i18n: { type: 'object', format: 'hidden' }
|
||||||
requiresSubscription: { type: 'boolean' }
|
requiresSubscription: { type: 'boolean' }
|
||||||
replayable: { type: 'boolean' }
|
replayable: { type: 'boolean' }
|
||||||
type: {'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop']}
|
type: {'enum': ['ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']}
|
||||||
slug: { type: 'string', format: 'hidden' }
|
slug: { type: 'string', format: 'hidden' }
|
||||||
original: { type: 'string', format: 'hidden' }
|
original: { type: 'string', format: 'hidden' }
|
||||||
adventurer: { type: 'boolean' }
|
adventurer: { type: 'boolean' }
|
||||||
|
|
|
@ -293,7 +293,7 @@ _.extend LevelSchema.properties,
|
||||||
icon: {type: 'string', format: 'image-file', title: 'Icon'}
|
icon: {type: 'string', format: 'image-file', title: 'Icon'}
|
||||||
banner: {type: 'string', format: 'image-file', title: 'Banner'}
|
banner: {type: 'string', format: 'image-file', title: 'Banner'}
|
||||||
goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
|
goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
|
||||||
type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop'])
|
type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'])
|
||||||
terrain: c.terrainString
|
terrain: c.terrainString
|
||||||
showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
|
showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
|
||||||
requiresSubscription: {title: 'Requires Subscription', description: 'Whether this level is available to subscribers only.', type: 'boolean'}
|
requiresSubscription: {title: 'Requires Subscription', description: 'Whether this level is available to subscribers only.', type: 'boolean'}
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
#course-details-view
|
#course-details-view
|
||||||
|
|
||||||
|
.member-header
|
||||||
|
cursor: pointer
|
||||||
|
display: inline-block
|
||||||
|
padding: 2px
|
||||||
|
|
||||||
.textarea-emails
|
.textarea-emails
|
||||||
width: 50%
|
width: 50%
|
||||||
|
|
||||||
|
@ -13,6 +18,7 @@
|
||||||
|
|
||||||
.progress-header
|
.progress-header
|
||||||
margin-right: 14px
|
margin-right: 14px
|
||||||
|
cursor: pointer
|
||||||
|
|
||||||
.progress-key
|
.progress-key
|
||||||
cursor: default
|
cursor: default
|
||||||
|
@ -51,6 +57,19 @@
|
||||||
background-color: blanchedalmond
|
background-color: blanchedalmond
|
||||||
font-size: 10pt
|
font-size: 10pt
|
||||||
|
|
||||||
|
.level-progression-concepts
|
||||||
|
color: #317EAC
|
||||||
|
font-size: 12pt
|
||||||
|
font-weight: bold
|
||||||
|
margin-top: 8px
|
||||||
|
margin-bottom: 4px
|
||||||
|
|
||||||
|
.level-progression-levels
|
||||||
|
color: #317EAC
|
||||||
|
font-size: 12pt
|
||||||
|
font-weight: bold
|
||||||
|
margin-top: 8px
|
||||||
|
|
||||||
.progress-level-cell
|
.progress-level-cell
|
||||||
display: inline-block
|
display: inline-block
|
||||||
white-space: nowrap
|
white-space: nowrap
|
||||||
|
|
|
@ -1,18 +1,31 @@
|
||||||
#course-info-view
|
#course-info-view
|
||||||
|
|
||||||
|
.btn-enroll
|
||||||
|
margin-top: 20px
|
||||||
|
|
||||||
.center
|
.center
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
||||||
|
.caption-text
|
||||||
|
font-size: 14px
|
||||||
|
|
||||||
|
.concepts-container
|
||||||
|
width: 200px
|
||||||
|
|
||||||
.contact-container
|
.contact-container
|
||||||
margin-top: 20px
|
margin-top: 20px
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
||||||
.info-container
|
.info-container
|
||||||
margin: 0% 10%
|
margin: 0% 10%
|
||||||
|
font-size: 18px
|
||||||
|
|
||||||
|
.monitoring-img-container
|
||||||
|
margin-top: 10px
|
||||||
|
|
||||||
.praise-quote
|
.praise-quote
|
||||||
font-size: 24px
|
font-size: 24px
|
||||||
font-style: italic
|
font-style: italic
|
||||||
|
|
||||||
.praise-source
|
.progress-container
|
||||||
font-size: 16px
|
font-size: 20px
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -62,7 +62,6 @@ block footer
|
||||||
a(href='http://blog.codecombat.com/', data-i18n="nav.blog")
|
a(href='http://blog.codecombat.com/', data-i18n="nav.blog")
|
||||||
a(href='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
|
a(href='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
|
||||||
a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
|
a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
|
||||||
a(href="/play-old", data-i18n="play.older_campaigns") Older Campaigns
|
|
||||||
if me.isAdmin()
|
if me.isAdmin()
|
||||||
a(href='/admin', data-i18n="nav.admin") Admin
|
a(href='/admin', data-i18n="nav.admin") Admin
|
||||||
|
|
||||||
|
|
|
@ -4,120 +4,156 @@ block content
|
||||||
|
|
||||||
//- DO NOT localize / i18n
|
//- DO NOT localize / i18n
|
||||||
|
|
||||||
|
div TODO: fix ugly tabs
|
||||||
|
div TODO: aggregate student progress
|
||||||
|
div TODO: student level progress popups
|
||||||
div
|
div
|
||||||
span *UNDER CONSTRUCTION, send feedback to
|
span *UNDER CONSTRUCTION, send feedback to
|
||||||
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
||||||
div
|
div
|
||||||
input.student-view-checkbox(type='checkbox')
|
input.student-mode-checkbox(type='checkbox', checked=studentMode)
|
||||||
span.spl Student view
|
span.spl Student view
|
||||||
div TODO: fix ugly tabs
|
|
||||||
div TODO: level concepts, status, working play button
|
|
||||||
div TODO: student view
|
|
||||||
div TODO: aggregate student progress
|
|
||||||
div TODO: student level progress popups
|
|
||||||
div TODO: student concept progress
|
|
||||||
div(style='border-bottom: 1px solid black;')
|
div(style='border-bottom: 1px solid black;')
|
||||||
|
|
||||||
h1= course.title
|
h1= course.title
|
||||||
p= course.description
|
p= course.description
|
||||||
p
|
//- p
|
||||||
strong Concepts:
|
//- strong Concepts:
|
||||||
ul
|
//- ul
|
||||||
each topic in course.topics
|
//- each concept in courseConcepts
|
||||||
li= topic
|
//- li(data-i18n="concepts." + concept)
|
||||||
strong= course.duration
|
//- strong= course.duration
|
||||||
|
|
||||||
h3 Your Class
|
if !studentMode
|
||||||
.form-group
|
p
|
||||||
select.form-control.select-session
|
.form-group
|
||||||
each instance in instances
|
span.spr Select your class
|
||||||
option= instance.name
|
select.form-control.select-session
|
||||||
span.spl
|
each instance in instances
|
||||||
button.btn.btn-xs.edit-class-name-btn edit class name
|
option= instance.name
|
||||||
|
|
||||||
|
h3= instance.name
|
||||||
|
if !studentMode
|
||||||
|
span.spl
|
||||||
|
button.btn.btn-xs.edit-class-name-btn edit class name
|
||||||
|
|
||||||
p
|
p
|
||||||
if instance.description
|
if instance.description
|
||||||
span= instance.description
|
span= instance.description
|
||||||
span.spl
|
if !studentMode
|
||||||
button.btn.btn-xs.edit-description-btn edit class description
|
span.spl
|
||||||
else
|
button.btn.btn-xs.edit-description-btn edit class description
|
||||||
|
else if !studentMode
|
||||||
div
|
div
|
||||||
button.btn.btn-xs.edit-description-btn add class description
|
button.btn.btn-xs.edit-description-btn add class description
|
||||||
|
|
||||||
.form-group
|
if !studentMode
|
||||||
span Class programming language:
|
.form-group
|
||||||
select.spl.form-control.select-language
|
span.spr Select language
|
||||||
option(value="Python") Python
|
select.form-control.select-language
|
||||||
option(value="JavaScript") JavaScript
|
option(value="Python") Python
|
||||||
option(value="All Languages") All Languages
|
option(value="JavaScript") JavaScript
|
||||||
|
option(value="All Languages") All Languages
|
||||||
|
|
||||||
div(role='tabpanel')
|
div(role='tabpanel')
|
||||||
ul.nav.nav-tabs(role='tablist')
|
ul.nav.nav-tabs(role='tablist')
|
||||||
li.active(role='presentation')
|
if !studentMode
|
||||||
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Students
|
li.active(role='presentation')
|
||||||
li(role='presentation')
|
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Students
|
||||||
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
|
li(role='presentation')
|
||||||
|
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
|
||||||
li(role='presentation')
|
li(role='presentation')
|
||||||
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels
|
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels
|
||||||
|
|
||||||
.tab-content
|
.tab-content
|
||||||
.tab-pane.active#progress(role='tabpanel')
|
if !studentMode
|
||||||
if instance.students
|
.tab-pane.active#progress(role='tabpanel')
|
||||||
table.table.table-condensed
|
if instance.students
|
||||||
thead
|
table.table.table-condensed
|
||||||
tr
|
thead
|
||||||
th
|
|
||||||
th
|
|
||||||
span.progress-header Progress
|
|
||||||
span.progress-key.progress-key-complete complete
|
|
||||||
span.progress-key.progress-key-started started
|
|
||||||
span.progress-key not started
|
|
||||||
if maxLastStartedIndex > 30
|
|
||||||
input.expand-progress-checkbox(type='checkbox')
|
|
||||||
span.spl.expand-progress-label(data-i18n="clans.exp_levels") Expand levels
|
|
||||||
tbody
|
|
||||||
each student in instance.students
|
|
||||||
tr
|
tr
|
||||||
td
|
th
|
||||||
a= student
|
span.member-header.spr Name
|
||||||
td.progress-cell
|
if memberSort === 'nameAsc'
|
||||||
- var i = 0
|
span.member-header.glyphicon.glyphicon-chevron-up
|
||||||
each level in course.levels
|
else if memberSort === 'nameDesc'
|
||||||
if i <= userLevelStateMap[student].lastCompletedIndex
|
span.member-header.glyphicon.glyphicon-chevron-down
|
||||||
span.progress-level-cell.progress-level-cell-complete #{i + 1}
|
th
|
||||||
if showExpandedProgress || i === 0 || i === course.levels.length - 1
|
span.progress-header.spr Progress
|
||||||
span.spl #{level}
|
if memberSort === 'progressAsc'
|
||||||
else if i <= userLevelStateMap[student].lastStartedIndex
|
span.progress-header.glyphicon.glyphicon-chevron-up
|
||||||
span.progress-level-cell.progress-level-cell-started #{i + 1}
|
else if memberSort === 'progressDesc'
|
||||||
if showExpandedProgress || i === 1 || i === userLevelStateMap[student].lastStartedIndex
|
span.progress-header.glyphicon.glyphicon-chevron-down
|
||||||
span.spl #{level}
|
else
|
||||||
else
|
span(style='padding-left:16px;')
|
||||||
span.progress-level-cell.level-progression-level-not-started #{i + 1}
|
span.progress-key.progress-key-complete complete
|
||||||
if showExpandedProgress || i === 1 || i === userLevelStateMap[student].lastStartedIndex
|
span.progress-key.progress-key-started started
|
||||||
span.spl #{level}
|
span.progress-key not started
|
||||||
if i === maxLastStartedIndex
|
if maxLastStartedIndex > 30
|
||||||
- break
|
input.expand-progress-checkbox(type='checkbox')
|
||||||
- i++
|
span.spl.expand-progress-label(data-i18n="clans.exp_levels") Expand levels
|
||||||
|
tbody
|
||||||
|
each student in instance.students
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
a= student
|
||||||
|
td.progress-cell
|
||||||
|
.level-progression-concepts Concepts
|
||||||
|
each concept in courseConcepts
|
||||||
|
if userConceptsMap[student] && userConceptsMap[student][concept] === 'complete'
|
||||||
|
span.spr.progress-level-cell.progress-level-cell-complete(data-i18n="concepts." + concept)
|
||||||
|
else if userConceptsMap[student] && userConceptsMap[student][concept] === 'started'
|
||||||
|
span.spr.progress-level-cell.progress-level-cell-started(data-i18n="concepts." + concept)
|
||||||
|
else
|
||||||
|
span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept)
|
||||||
|
|
||||||
.tab-pane#invite(role='tabpanel')
|
.level-progression-levels Levels
|
||||||
p Invite students to join this class.
|
- var i = 0
|
||||||
if course.title !== 'Introduction to Computer Science'
|
each level in course.levels
|
||||||
p Student unlock code: #{instance.code}
|
if userLevelStateMap[student][level] === 'complete'
|
||||||
p Class capacity: 34/50
|
span.progress-level-cell.progress-level-cell-complete #{i + 1}
|
||||||
textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line")
|
if showExpandedProgress || i === 0 || i === course.levels.length - 1
|
||||||
div
|
span.spl #{level}
|
||||||
button.btn.btn-success.btn-invite Send Invites
|
else if userLevelStateMap[student][level] === 'started'
|
||||||
|
span.progress-level-cell.progress-level-cell-started #{i + 1} #{level}
|
||||||
.tab-pane#levels(role='tabpanel')
|
else
|
||||||
table.table.table-condensed
|
span.progress-level-cell.level-progression-level-not-started #{i + 1}
|
||||||
thead
|
if showExpandedProgress || i === 0
|
||||||
tr
|
span.spl #{level}
|
||||||
th Level
|
- i++
|
||||||
th
|
|
||||||
tbody
|
.tab-pane#invite(role='tabpanel')
|
||||||
each level in course.levels
|
p Invite students to join this class.
|
||||||
tr
|
if course.title !== 'Introduction to Computer Science'
|
||||||
td
|
p Student unlock code: #{instance.code}
|
||||||
spa= level
|
p Class capacity: 34/50
|
||||||
td
|
textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line")
|
||||||
button.btn.btn-success Play
|
div
|
||||||
|
button.btn.btn-success.btn-invite Send Invites
|
||||||
|
|
||||||
|
.tab-pane#levels(role='tabpanel')
|
||||||
|
+levels-tab
|
||||||
|
else
|
||||||
|
.tab-pane.active#levels(role='tabpanel')
|
||||||
|
+levels-tab
|
||||||
|
|
||||||
|
mixin levels-tab
|
||||||
|
table.table.table-striped.table-condensed
|
||||||
|
thead
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
th Status
|
||||||
|
th Level
|
||||||
|
th Concepts
|
||||||
|
tbody
|
||||||
|
- var student = instance.students[0]
|
||||||
|
each level in course.levels
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
button.btn.btn-success.btn-play-level(data-level=level) Play
|
||||||
|
td= userLevelStateMap[student][level]
|
||||||
|
td= level
|
||||||
|
td
|
||||||
|
each concept in courseConcepts
|
||||||
|
if levelConceptsMap[level] && levelConceptsMap[level][concept]
|
||||||
|
span.spr.progress-level-cell.level-progression-level-not-started(data-i18n="concepts." + concept)
|
||||||
|
|
|
@ -4,42 +4,77 @@ block content
|
||||||
|
|
||||||
//- DO NOT localize / i18n
|
//- DO NOT localize / i18n
|
||||||
|
|
||||||
|
div TODO: course-specific gameplay screenshots
|
||||||
|
div TODO: update images, add captions
|
||||||
div
|
div
|
||||||
span *UNDER CONSTRUCTION, send feedback to
|
span *UNDER CONSTRUCTION, send feedback to
|
||||||
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
||||||
div TODO: update images, add captions
|
|
||||||
div TODO: Add real marketing copy.
|
|
||||||
div(style='border-bottom: 1px solid black; margin-bottom: 20px')
|
div(style='border-bottom: 1px solid black; margin-bottom: 20px')
|
||||||
|
|
||||||
|
|
||||||
.well.info-container
|
.info-container
|
||||||
h1.center= course.title
|
h1.center= course.title
|
||||||
|
|
||||||
p.center.gameplay-img-container
|
p.center.gameplay-img-container
|
||||||
img(src='/images/pages/about/coco_comic.jpg' width='700')
|
img(src='/images/pages/courses/102_info.png' width='800')
|
||||||
|
div.center.caption-text TODO: Add caption
|
||||||
p= course.description
|
p= course.description
|
||||||
|
|
||||||
|
h1.center Learn More in Less Time
|
||||||
|
p
|
||||||
|
span.spr Your students will learn
|
||||||
|
strong.spr more computer science
|
||||||
|
span.spr material in
|
||||||
|
strong.spr less time
|
||||||
|
span with CodeCombat!
|
||||||
|
p
|
||||||
|
span.spr In about
|
||||||
|
strong.spr #{course.duration} hours
|
||||||
|
span.spr your students will work through
|
||||||
|
strong.spr #{course.levels.length} lessons
|
||||||
|
span and cover these high-level topics:
|
||||||
p
|
p
|
||||||
span There is approximately
|
ul
|
||||||
strong.spl 5 hours
|
each topic in course.topics
|
||||||
span.spl of content.
|
li= topic
|
||||||
|
|
||||||
h3 Topics
|
|
||||||
ul
|
|
||||||
each topic in course.topics
|
|
||||||
li= topic
|
|
||||||
|
|
||||||
|
h1.center No Experience Necesssary
|
||||||
p
|
p
|
||||||
div.praise-quote "#{praise.quote}"
|
strong.spr No outside experience
|
||||||
div.praise-source - #{praise.source}
|
span is needed for students to complete this course. They will pick up where the left off from the previous CodeCombat course.
|
||||||
|
p
|
||||||
|
strong.spr Teachers do not need programming experience
|
||||||
|
span to administer this course. Your students will learn on their own.
|
||||||
|
p
|
||||||
|
span.spr There are built-in
|
||||||
|
strong.spr help videos, level guides, tool tips
|
||||||
|
span to explain everything to your students.
|
||||||
|
p
|
||||||
|
span.spr Use
|
||||||
|
strong.spr student progress monitoring
|
||||||
|
span to match up stronger students with those that need a little extra help!
|
||||||
|
|
||||||
h3 Extras
|
h1.center Monitor Student Progress
|
||||||
p There are help videos and premium email support
|
|
||||||
p.center.monitoring-img-container
|
p.center.monitoring-img-container
|
||||||
img(src='/images/pages/clans/dashboard_preview.png' width='700')
|
img(src='/images/pages/clans/dashboard_preview.png' width='700')
|
||||||
p There is detailed student progress monitoring.
|
div.center.caption-text TODO: Add caption
|
||||||
|
p.progress-container
|
||||||
|
ul
|
||||||
|
li
|
||||||
|
strong Track concepts
|
||||||
|
span.spl learned by each student
|
||||||
|
li Track levels completed for each student
|
||||||
|
li
|
||||||
|
span See your students'
|
||||||
|
strong.spl solutions
|
||||||
|
li Sort students by name or progress
|
||||||
|
|
||||||
|
h1.center Teachers Love CodeCombat!
|
||||||
|
p
|
||||||
|
div.praise-quote "#{praise.quote}"
|
||||||
|
div.caption-text - #{praise.source}
|
||||||
|
|
||||||
p.center
|
p.center
|
||||||
button.btn.btn-info.btn-lg.btn-enroll(data-course-id="#{courseID}") Enroll
|
button.btn.btn-info.btn-lg.btn-enroll(data-course-id="#{courseID}") Enroll Now
|
||||||
|
|
||||||
p.contact-container
|
p.contact-container
|
||||||
span For more information, please contact
|
span For more information, please contact
|
||||||
|
|
|
@ -11,7 +11,7 @@ mixin deltaPanel(delta, conflict)
|
||||||
if delta.action === 'deleted'
|
if delta.action === 'deleted'
|
||||||
strong(data-i18n="delta.deleted") Deleted
|
strong(data-i18n="delta.deleted") Deleted
|
||||||
if delta.action === 'moved-index'
|
if delta.action === 'moved-index'
|
||||||
strong(data-i18n="delta.modified_array") Moved Index
|
strong(data-i18n="delta.moved_index") Moved Index
|
||||||
if delta.action === 'text-diff'
|
if delta.action === 'text-diff'
|
||||||
strong(data-i18n="delta.text_diff") Text Diff
|
strong(data-i18n="delta.text_diff") Text Diff
|
||||||
span
|
span
|
||||||
|
@ -45,4 +45,4 @@ mixin deltaPanel(delta, conflict)
|
||||||
+deltaPanel(delta)
|
+deltaPanel(delta)
|
||||||
if !deltas.length
|
if !deltas.length
|
||||||
alert.alert-warning(data-i18n="delta.no_changes") No changes
|
alert.alert-warning(data-i18n="delta.no_changes") No changes
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
a(href="/")
|
a(href="/")
|
||||||
img#small-nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
|
img#small-nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
|
||||||
|
|
||||||
if campaign
|
if campaign
|
||||||
.map
|
.map
|
||||||
.gradient.horizontal-gradient.top-gradient
|
.gradient.horizontal-gradient.top-gradient
|
||||||
|
@ -39,9 +39,9 @@ if campaign
|
||||||
a.spr(href="/contribute/adventurer")
|
a.spr(href="/contribute/adventurer")
|
||||||
strong(data-i18n="play.awaiting_levels_adventurer") Sign up as an Adventurer
|
strong(data-i18n="play.awaiting_levels_adventurer") Sign up as an Adventurer
|
||||||
span.spl(data-i18n="play.awaiting_levels_adventurer_suffix") to be the first to play new levels.
|
span.spl(data-i18n="play.awaiting_levels_adventurer_suffix") to be the first to play new levels.
|
||||||
if level.concepts && level.concepts.length
|
if level.displayConcepts && level.displayConcepts.length
|
||||||
p
|
p
|
||||||
for concept in level.concepts
|
for concept in level.displayConcepts
|
||||||
kbd(data-i18n="concepts." + concept)
|
kbd(data-i18n="concepts." + concept)
|
||||||
|
|
||||||
if !level.disabled && !level.locked
|
if !level.disabled && !level.locked
|
||||||
|
@ -101,7 +101,7 @@ else
|
||||||
// button.btn.settings(data-toggle='coco-modal', data-target='play/modal/PlaySettingsModal', data-i18n="[title]play.settings")
|
// button.btn.settings(data-toggle='coco-modal', data-target='play/modal/PlaySettingsModal', data-i18n="[title]play.settings")
|
||||||
if me.get('anonymous', true)
|
if me.get('anonymous', true)
|
||||||
button.btn.settings(data-toggle='coco-modal', data-target='core/AuthModal', data-i18n="[title]play.settings")
|
button.btn.settings(data-toggle='coco-modal', data-target='core/AuthModal', data-i18n="[title]play.settings")
|
||||||
|
|
||||||
.user-status.header-font
|
.user-status.header-font
|
||||||
.user-status-line
|
.user-status-line
|
||||||
span.gem.gem-30
|
span.gem.gem-30
|
||||||
|
|
|
@ -10,30 +10,6 @@ if docs.length === 1
|
||||||
div
|
div
|
||||||
!= docs[0].html
|
!= docs[0].html
|
||||||
|
|
||||||
if (!me.isPremium() || me.isAdmin()) && (me.get('preferredLanguage') || 'en-US').substr(0, 2) == 'en'
|
|
||||||
hr
|
|
||||||
h3 Want more programming lessons?
|
|
||||||
ul
|
|
||||||
li
|
|
||||||
strong
|
|
||||||
a(class="resource-link", data-resource="breakout-mentors", href='http://breakoutmentors.com/?referral=codecombat') Breakout Mentors
|
|
||||||
| : Personalized code mentoring for kids from Stanford and UC Berkeley mentors, online or in person.
|
|
||||||
li
|
|
||||||
strong
|
|
||||||
a(class="resource-link", data-resource="ostraining", href='https://www.ostraining.com/codecombat/') OSTraining
|
|
||||||
| : Watch over 2600 videos on how to make great websites with Wordpress, Drupal, Joomla, and more.
|
|
||||||
li
|
|
||||||
strong
|
|
||||||
a(class="resource-link", data-resource="one-month", href='http://mbsy.co/bVRtZ') One Month
|
|
||||||
| : Learn any tech skill in 30 days with just 15 minutes a day.
|
|
||||||
li
|
|
||||||
strong
|
|
||||||
a(class="resource-link", data-resource="code-school", href='http://mbsy.co/bVRsR') Code School
|
|
||||||
| : Learn web technologies with video lessons, coding challenges, and screencasts.
|
|
||||||
li
|
|
||||||
strong
|
|
||||||
a(class="resource-link", data-resource="pluralsight", href='http://shrsl.com/?~81i5') Pluralsight
|
|
||||||
| : Unlock new tech skills with over 3000 online courses.
|
|
||||||
else
|
else
|
||||||
ul.nav.nav-tabs
|
ul.nav.nav-tabs
|
||||||
for doc in docs
|
for doc in docs
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
app = require 'core/application'
|
app = require 'core/application'
|
||||||
RootView = require 'views/core/RootView'
|
RootView = require 'views/core/RootView'
|
||||||
template = require 'templates/courses/mock1/course-details'
|
template = require 'templates/courses/mock1/course-details'
|
||||||
|
CocoCollection = require 'collections/CocoCollection'
|
||||||
|
Campaign = require 'models/Campaign'
|
||||||
|
|
||||||
module.exports = class CourseDetailsView extends RootView
|
module.exports = class CourseDetailsView extends RootView
|
||||||
id: 'course-details-view'
|
id: 'course-details-view'
|
||||||
|
@ -9,40 +11,120 @@ module.exports = class CourseDetailsView extends RootView
|
||||||
events:
|
events:
|
||||||
'change .expand-progress-checkbox': 'onExpandedProgressCheckbox'
|
'change .expand-progress-checkbox': 'onExpandedProgressCheckbox'
|
||||||
'change .select-session': 'onChangeSession'
|
'change .select-session': 'onChangeSession'
|
||||||
|
'change .student-mode-checkbox': 'onChangeStudent'
|
||||||
|
'click .btn-play-level': 'onClickPlayLevel'
|
||||||
'click .edit-class-name-btn': 'onClickEditClassName'
|
'click .edit-class-name-btn': 'onClickEditClassName'
|
||||||
'click .edit-description-btn': 'onClickEditClassDescription'
|
'click .edit-description-btn': 'onClickEditClassDescription'
|
||||||
|
'click .member-header': 'onClickMemberHeader'
|
||||||
|
'click .progress-header': 'onClickProgressHeader'
|
||||||
|
|
||||||
constructor: (options, @courseID) ->
|
constructor: (options, @courseID) ->
|
||||||
super options
|
super options
|
||||||
@initData()
|
@initData()
|
||||||
|
|
||||||
|
destroy: ->
|
||||||
|
@stopListening?()
|
||||||
|
|
||||||
getRenderData: ->
|
getRenderData: ->
|
||||||
context = super()
|
context = super()
|
||||||
|
context.conceptsProgression = @conceptsProgression ? []
|
||||||
context.course = @course ? {}
|
context.course = @course ? {}
|
||||||
|
context.courseConcepts = @courseConcepts ? []
|
||||||
context.instance = @instances?[@currentInstanceIndex] ? {}
|
context.instance = @instances?[@currentInstanceIndex] ? {}
|
||||||
context.instances = @instances ? []
|
context.instances = @instances ? []
|
||||||
|
context.levelConceptsMap = @levelConceptsMap ? {}
|
||||||
context.maxLastStartedIndex = @maxLastStartedIndex ? 0
|
context.maxLastStartedIndex = @maxLastStartedIndex ? 0
|
||||||
|
context.memberSort = @memberSort
|
||||||
|
context.userConceptsMap = @userConceptsMap ? {}
|
||||||
context.userLevelStateMap = @userLevelStateMap ? {}
|
context.userLevelStateMap = @userLevelStateMap ? {}
|
||||||
context.showExpandedProgress = @maxLastStartedIndex <= 30 or @showExpandedProgress
|
context.showExpandedProgress = @course.levels.length <= 30 or @showExpandedProgress
|
||||||
|
context.studentMode = @options.studentMode ? false
|
||||||
context
|
context
|
||||||
|
|
||||||
initData: ->
|
initData: ->
|
||||||
|
@memberSort = 'nameAsc'
|
||||||
mockData = require 'views/courses/mock1/CoursesMockData'
|
mockData = require 'views/courses/mock1/CoursesMockData'
|
||||||
@course = mockData.courses[@courseID]
|
@course = mockData.courses[@courseID]
|
||||||
@currentInstanceIndex = 0
|
@currentInstanceIndex = 0
|
||||||
@instances = mockData.instances
|
@instances = mockData.instances
|
||||||
@updateLevelMaps()
|
@updateLevelMaps()
|
||||||
|
|
||||||
|
@campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign, comparator:'_id' })
|
||||||
|
@listenTo @campaigns, 'sync', @onCampaignSync
|
||||||
|
@supermodel.loadModel @campaigns, 'clan', cache: false
|
||||||
|
|
||||||
updateLevelMaps: ->
|
updateLevelMaps: ->
|
||||||
|
@levelMap = {}
|
||||||
|
@levelMap[level] = true for level in @course.levels
|
||||||
@userLevelStateMap = {}
|
@userLevelStateMap = {}
|
||||||
@maxLastStartedIndex = -1
|
@maxLastStartedIndex = -1
|
||||||
for student in @instances?[@currentInstanceIndex].students
|
for student in @instances?[@currentInstanceIndex].students
|
||||||
|
@userLevelStateMap[student] = {}
|
||||||
lastCompletedIndex = _.random(0, @course.levels.length)
|
lastCompletedIndex = _.random(0, @course.levels.length)
|
||||||
|
for i in [0..lastCompletedIndex]
|
||||||
|
@userLevelStateMap[student][@course.levels[i]] = 'complete'
|
||||||
lastStartedIndex = lastCompletedIndex + 1
|
lastStartedIndex = lastCompletedIndex + 1
|
||||||
@userLevelStateMap[student] =
|
@userLevelStateMap[student][@course.levels[lastStartedIndex]] = 'started'
|
||||||
lastCompletedIndex: lastCompletedIndex
|
|
||||||
lastStartedIndex: lastStartedIndex
|
|
||||||
@maxLastStartedIndex = lastStartedIndex if lastStartedIndex > @maxLastStartedIndex
|
@maxLastStartedIndex = lastStartedIndex if lastStartedIndex > @maxLastStartedIndex
|
||||||
|
@sortMembers()
|
||||||
|
|
||||||
|
sortMembers: ->
|
||||||
|
# Progress sort precedence: most completed concepts, most started concepts, most levels, name sort
|
||||||
|
instance = @instances?[@currentInstanceIndex] ? {}
|
||||||
|
return if _.isEmpty(instance)
|
||||||
|
switch @memberSort
|
||||||
|
when "nameDesc"
|
||||||
|
instance.students.sort (a, b) -> b.localeCompare(a)
|
||||||
|
when "progressAsc"
|
||||||
|
instance.students.sort (a, b) =>
|
||||||
|
for level in @course.levels
|
||||||
|
if @userLevelStateMap[a][level] isnt 'complete' and @userLevelStateMap[b][level] is 'complete'
|
||||||
|
return -1
|
||||||
|
else if @userLevelStateMap[a][level] is 'complete' and @userLevelStateMap[b][level] isnt 'complete'
|
||||||
|
return 1
|
||||||
|
0
|
||||||
|
when "progressDesc"
|
||||||
|
instance.students.sort (a, b) =>
|
||||||
|
for level in @course.levels
|
||||||
|
if @userLevelStateMap[a][level] isnt 'complete' and @userLevelStateMap[b][level] is 'complete'
|
||||||
|
return 1
|
||||||
|
else if @userLevelStateMap[a][level] is 'complete' and @userLevelStateMap[b][level] isnt 'complete'
|
||||||
|
return -1
|
||||||
|
0
|
||||||
|
else
|
||||||
|
instance.students.sort (a, b) -> a.localeCompare(b)
|
||||||
|
|
||||||
|
onCampaignSync: ->
|
||||||
|
return unless @campaigns.loaded
|
||||||
|
@conceptsProgression = []
|
||||||
|
@courseConcepts = []
|
||||||
|
@levelConceptsMap = {}
|
||||||
|
@levelNameSlugMap = {}
|
||||||
|
@userConceptsMap = {}
|
||||||
|
for campaign in @campaigns.models
|
||||||
|
continue if campaign.get('slug') is 'auditions'
|
||||||
|
for levelID, level of campaign.get('levels')
|
||||||
|
@levelNameSlugMap[level.name] = level.slug
|
||||||
|
if level.concepts?
|
||||||
|
for concept in level.concepts
|
||||||
|
@conceptsProgression.push concept unless concept in @conceptsProgression
|
||||||
|
continue unless @levelMap[level.name]
|
||||||
|
@courseConcepts.push concept unless concept in @courseConcepts
|
||||||
|
@levelConceptsMap[level.name] ?= {}
|
||||||
|
@levelConceptsMap[level.name][concept] = true
|
||||||
|
for student in @instances?[@currentInstanceIndex].students
|
||||||
|
@userConceptsMap[student] ?= {}
|
||||||
|
if @userLevelStateMap[student][level.name] is 'complete'
|
||||||
|
@userConceptsMap[student][concept] = 'complete'
|
||||||
|
else if @userLevelStateMap[student][level.name] is 'started'
|
||||||
|
@userConceptsMap[student][concept] ?= 'started'
|
||||||
|
@courseConcepts.sort (a, b) => if @conceptsProgression.indexOf(a) < @conceptsProgression.indexOf(b) then -1 else 1
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onChangeStudent: (e) ->
|
||||||
|
@options.studentMode = $('.student-mode-checkbox').prop('checked')
|
||||||
|
@render?()
|
||||||
|
$('.student-mode-checkbox').attr('checked', @options.studentMode)
|
||||||
|
|
||||||
onChangeSession: (e) ->
|
onChangeSession: (e) ->
|
||||||
@showExpandedProgress = false
|
@showExpandedProgress = false
|
||||||
|
@ -50,6 +132,7 @@ module.exports = class CourseDetailsView extends RootView
|
||||||
for val, index in @instances when val.name is newSessionValue
|
for val, index in @instances when val.name is newSessionValue
|
||||||
@currentInstanceIndex = index
|
@currentInstanceIndex = index
|
||||||
@updateLevelMaps()
|
@updateLevelMaps()
|
||||||
|
@onCampaignSync()
|
||||||
@render?()
|
@render?()
|
||||||
|
|
||||||
onExpandedProgressCheckbox: (e) ->
|
onExpandedProgressCheckbox: (e) ->
|
||||||
|
@ -63,3 +146,22 @@ module.exports = class CourseDetailsView extends RootView
|
||||||
|
|
||||||
onClickEditClassDescription: (e) ->
|
onClickEditClassDescription: (e) ->
|
||||||
alert 'TODO: Popup for editing description for this course session'
|
alert 'TODO: Popup for editing description for this course session'
|
||||||
|
|
||||||
|
onClickMemberHeader: (e) ->
|
||||||
|
@memberSort = if @memberSort is 'nameAsc' then 'nameDesc' else 'nameAsc'
|
||||||
|
@sortMembers()
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onClickProgressHeader: (e) ->
|
||||||
|
@memberSort = if @memberSort is 'progressAsc' then 'progressDesc' else 'progressAsc'
|
||||||
|
@sortMembers()
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onClickPlayLevel: (e) ->
|
||||||
|
levelName = $(e.target).data('level')
|
||||||
|
levelSlug = @levelNameSlugMap[levelName]
|
||||||
|
Backbone.Mediator.publish 'router:navigate', {
|
||||||
|
route: "/play/level/#{levelSlug}"
|
||||||
|
viewClass: 'views/play/level/PlayLevelView'
|
||||||
|
viewArgs: [{}, levelSlug]
|
||||||
|
}
|
||||||
|
|
|
@ -25,64 +25,64 @@ data.courses = [
|
||||||
{
|
{
|
||||||
title: 'Introduction to Computer Science'
|
title: 'Introduction to Computer Science'
|
||||||
description: 'Learn basic syntax, while loops, and the CodeCombat learning environment.'
|
description: 'Learn basic syntax, while loops, and the CodeCombat learning environment.'
|
||||||
topics: ['Basic syntax', 'Strings', 'While Loops']
|
topics: ['Basic Syntax', 'Strings', 'Loops']
|
||||||
duration: '1 hour of material'
|
duration: 1
|
||||||
levels: ['Dungeons of Kithgard', 'Gems in the Deep', 'Shadow Guard', 'Kounter Kithwise', 'Crawlways of Kithgard', 'Enemy Mine', 'Illusory Interruption', 'Forgetful Gemsmith', 'Signs and Portents', 'Favorable Odds', 'True Names', 'The Prisoner', 'Banefire', 'The Raised Sword', 'Haunted Kithmaze', 'Riddling Kithmaze', 'Descending Further', 'The Second Kithmaze', 'Dread Door', 'Cupboards of Kithgard', 'Hack and Dash']
|
levels: ['Dungeons of Kithgard', 'Gems in the Deep', 'Shadow Guard', 'Kounter Kithwise', 'Crawlways of Kithgard', 'Enemy Mine', 'Illusory Interruption', 'Forgetful Gemsmith', 'Signs and Portents', 'Favorable Odds', 'True Names', 'The Prisoner', 'Banefire', 'The Raised Sword', 'Haunted Kithmaze', 'Riddling Kithmaze', 'Descending Further', 'The Second Kithmaze', 'Dread Door', 'Cupboards of Kithgard', 'Hack and Dash']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 102'
|
title: 'Computer Science 102'
|
||||||
description: 'Add parameters, if statements, and some other stuff.'
|
description: 'Computer Science 102 introduces Arguments, Variables, If Statements, and Arithmetic.'
|
||||||
topics: ['Variables', 'Booleans', 'If Statements', 'Arithmetic']
|
topics: ['Arguments', 'Variables', 'If Statements', 'Arithmetic']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Known Enemy', 'Master of Names', 'Lowly Kithmen', 'Closing the Distance', 'Tactical Strike', 'The Final Kithmaze', 'The Gauntlet', 'Radiant Aura', 'Kithgard Gates', 'Destroying Angel', 'Deadly Dungeon Rescue', 'Kithgard Brawl', 'Cavern Survival', 'Breakout', 'Attack Wisely!', 'Kithgard Mastery', 'Kithgard Apprentice', 'Long Kithmaze', 'Boom! and Bust', 'Defense of Plainswood', 'Winding Trail', 'Thumb Biter', 'Gems or Death', 'Backwoods Ambush', 'Patrol Buster', 'Endangered Burl', 'Village Guard', 'Thornbush Farm', 'Back to Back', 'Ogre Encampment', 'Woodland Cleaver', 'Shield Rush', 'Peasant Protection', 'Munchkin Swarm']
|
levels: ['Known Enemy', 'Master of Names', 'Lowly Kithmen', 'Closing the Distance', 'Tactical Strike', 'The Final Kithmaze', 'The Gauntlet', 'Radiant Aura', 'Kithgard Gates', 'Destroying Angel', 'Deadly Dungeon Rescue', 'Kithgard Brawl', 'Cavern Survival', 'Breakout', 'Attack Wisely!', 'Kithgard Mastery', 'Kithgard Apprentice', 'Long Kithmaze', 'Boom! and Bust', 'Defense of Plainswood', 'Winding Trail', 'Thumb Biter', 'Gems or Death', 'Backwoods Ambush', 'Patrol Buster', 'Endangered Burl', 'Village Guard', 'Thornbush Farm', 'Back to Back', 'Ogre Encampment', 'Woodland Cleaver', 'Shield Rush', 'Peasant Protection', 'Munchkin Swarm']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 103'
|
title: 'Computer Science 103'
|
||||||
description: 'Learn how to handle input.'
|
description: 'Learn how to handle input.'
|
||||||
topics: ['If Statements', 'Arithmetic', 'Input Handling']
|
topics: ['If Statements', 'Arithmetic', 'Input Handling']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Munchkin Harvest', 'Swift Dagger', 'Shrapnel', 'Arcane Ally', 'Touch of Death', 'Bonemender', 'Coinucopia', 'Copper Meadows', 'Drop the Flag', 'Deadly Pursuit', 'Rich Forager', 'Siege of Stonehold', 'Multiplayer Treasure Grove', 'Dueling Grounds', 'Backwoods Brawl', 'Backwoods Treasure', 'Range Finder', 'Stillness in Motion', 'The Agrippa Defense', 'Storming the Towers of Areth', 'Hold the Forest Pass', 'Hold for Reinforcements', 'Storming the Farmhouse', 'Wild Horses', 'Boulder Woods', 'Unfair Support', 'Tactical Timing', 'Apocalypse', 'Doom Glade', 'Defend the Garrison', 'Lost Viking', 'Forest Flower Grove', 'The Dunes', 'The Mighty Sand Yak', 'Oasis', 'Sarven Road', 'Sarven Gaps', 'Thunderhooves', 'Medical Attention', 'The Great Yak Stampede', 'Minesweeper', 'Sarven Sentry', 'Keeping Time']
|
levels: ['Munchkin Harvest', 'Swift Dagger', 'Shrapnel', 'Arcane Ally', 'Touch of Death', 'Bonemender', 'Coinucopia', 'Copper Meadows', 'Drop the Flag', 'Deadly Pursuit', 'Rich Forager', 'Siege of Stonehold', 'Multiplayer Treasure Grove', 'Dueling Grounds', 'Backwoods Brawl', 'Backwoods Treasure', 'Range Finder', 'Stillness in Motion', 'The Agrippa Defense', 'Storming the Towers of Areth', 'Hold the Forest Pass', 'Hold for Reinforcements', 'Storming the Farmhouse', 'Wild Horses', 'Boulder Woods', 'Unfair Support', 'Tactical Timing', 'Apocalypse', 'Doom Glade', 'Defend the Garrison', 'Lost Viking', 'Forest Flower Grove', 'The Dunes', 'The Mighty Sand Yak', 'Oasis', 'Sarven Road', 'Sarven Gaps', 'Thunderhooves', 'Medical Attention', 'The Great Yak Stampede', 'Minesweeper', 'Sarven Sentry', 'Keeping Time']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 104'
|
title: 'Computer Science 104'
|
||||||
description: 'Time to tackle arrays and some pvp stuff.'
|
description: 'Time to tackle arrays and some pvp stuff.'
|
||||||
topics: ['Arrays', 'Break Statements']
|
topics: ['Loops', 'Break Statements', 'Arrays']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Hoarding Gold', 'Decoy Drill', 'Yakstraction', 'Sarven Brawl', 'Desert Combat', 'Dust', 'Sarven Rescue', 'Sacred Statue', 'Mirage Maker', 'Sarven Savior', 'Odd Sandstorm', 'Lurkers', 'Preferential Treatment', 'Sarven Shepherd', 'Shine Getter', 'The Trials', 'Mad Maxer', 'Mad Maxer Strikes Back', 'Mad Maxer Sells Out', 'Mad Maxer Gets Greedy', 'Mad Maxer: Redemption', 'Sarven Treasure', 'Harrowland', 'Sarven Siege', 'Clash of Clones', 'Sand Snakes', 'Crag Tag']
|
levels: ['Hoarding Gold', 'Decoy Drill', 'Yakstraction', 'Sarven Brawl', 'Desert Combat', 'Dust', 'Sarven Rescue', 'Sacred Statue', 'Mirage Maker', 'Sarven Savior', 'Odd Sandstorm', 'Lurkers', 'Preferential Treatment', 'Sarven Shepherd', 'Shine Getter', 'The Trials', 'Mad Maxer', 'Mad Maxer Strikes Back', 'Mad Maxer Sells Out', 'Mad Maxer Gets Greedy', 'Mad Maxer: Redemption', 'Sarven Treasure', 'Harrowland', 'Sarven Siege', 'Clash of Clones', 'Sand Snakes', 'Crag Tag']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 105'
|
title: 'Computer Science 105'
|
||||||
description: 'Time to tackle arrays and some PVP.'
|
description: 'Time to tackle arrays and some PVP.'
|
||||||
topics: ['Arrays', 'Break Statements', 'Object Literals']
|
topics: ['Break Statements', 'Arrays', 'Object Literals']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Slalom', 'Black Diamond', 'Treasure Cave', 'Ogre Gorge Gouger', 'Dance-Off', 'Alpine Rally', 'Cloudrip Commander', 'Mountain Mercenaries']
|
levels: ['Slalom', 'Black Diamond', 'Treasure Cave', 'Ogre Gorge Gouger', 'Dance-Off', 'Alpine Rally', 'Cloudrip Commander', 'Mountain Mercenaries']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 106'
|
title: 'Computer Science 106'
|
||||||
description: 'For loops!'
|
description: 'For loops!'
|
||||||
topics: ['Break Statements', 'Object Literals', 'For loops']
|
topics: ['Break Statements', 'Object Literals', 'For loops']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Timber Guard', 'Hunting Party', 'Zoo Keeper', 'Cloudrip Brawl', 'Cloudrip Treasure', 'Cloudrip Siege', 'Noble Sacrifice', 'Zero Sum', 'Borrowed Sword', 'Protect and Serve']
|
levels: ['Timber Guard', 'Hunting Party', 'Zoo Keeper', 'Cloudrip Brawl', 'Cloudrip Treasure', 'Cloudrip Siege', 'Noble Sacrifice', 'Zero Sum', 'Borrowed Sword', 'Protect and Serve']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 107'
|
title: 'Computer Science 107'
|
||||||
description: 'Functions!'
|
description: 'Functions!'
|
||||||
topics: ['Object Literals', 'For loops', 'Functions']
|
topics: ['Object Literals', 'For loops', 'Functions']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Vital Powers', 'Timber Turncoat', 'Restless Dead', 'Ring Bearer', 'The Two Flowers', 'The Geometry of Flowers', 'Mountain Flower Grove', 'Hunters and Prey', 'Library Tactician']
|
levels: ['Vital Powers', 'Timber Turncoat', 'Restless Dead', 'Ring Bearer', 'The Two Flowers', 'The Geometry of Flowers', 'Mountain Flower Grove', 'Hunters and Prey', 'Library Tactician']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 108'
|
title: 'Computer Science 108'
|
||||||
description: 'Maths.'
|
description: 'Maths.'
|
||||||
topics: ['For loops', 'Functions', 'Math Operations']
|
topics: ['For loops', 'Functions', 'Math Operations']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Steelclaw Gap', 'Pesky Yaks', 'Mixed Unit Tactics', 'Sowing Fire', 'Reaping Fire', 'Toil and Trouble', 'What in Carnation', 'Misty Island Mine', 'Raiders of the Long Dark', 'Grim Determination', 'Deadly Discs', "Summit's Gate"]
|
levels: ['Steelclaw Gap', 'Pesky Yaks', 'Mixed Unit Tactics', 'Sowing Fire', 'Reaping Fire', 'Toil and Trouble', 'What in Carnation', 'Misty Island Mine', 'Raiders of the Long Dark', 'Grim Determination', 'Deadly Discs', "Summit's Gate"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Computer Science 109'
|
title: 'Computer Science 109'
|
||||||
description: 'Vectors and strings.'
|
description: 'Vectors and strings.'
|
||||||
topics: ['Vectors', 'Advanced Strings']
|
topics: ['Vectors', 'Advanced Strings']
|
||||||
duration: '5 hours of material'
|
duration: 5
|
||||||
levels: ['Circle Walking', 'Skating Away', 'Kelvintaph Crusader', 'Kelvintaph Burgler', 'Ice Soccer', 'Razorfray']
|
levels: ['Circle Walking', 'Skating Away', 'Kelvintaph Crusader', 'Kelvintaph Burgler', 'Ice Soccer', 'Razorfray']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -47,7 +47,6 @@ module.exports = class WorldSelectModal extends ModalView
|
||||||
canvases.attr('width', currentView.$el.width()*.8-70)
|
canvases.attr('width', currentView.$el.width()*.8-70)
|
||||||
canvases.attr('height', currentView.$el.height()*.6)
|
canvases.attr('height', currentView.$el.height()*.6)
|
||||||
@surface = new Surface @world, normalCanvas, webGLCanvas, {
|
@surface = new Surface @world, normalCanvas, webGLCanvas, {
|
||||||
wizards: false
|
|
||||||
paths: false
|
paths: false
|
||||||
grid: true
|
grid: true
|
||||||
navigateToSelection: false
|
navigateToSelection: false
|
||||||
|
|
|
@ -46,7 +46,7 @@ module.exports = class LevelThangEditView extends CocoView
|
||||||
level: @level
|
level: @level
|
||||||
world: @world
|
world: @world
|
||||||
|
|
||||||
if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then options.thangType = thangType
|
if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then options.thangType = thangType
|
||||||
|
|
||||||
@thangComponentEditView = new ThangComponentsEditView options
|
@thangComponentEditView = new ThangComponentsEditView options
|
||||||
@listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged
|
@listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged
|
||||||
|
|
|
@ -202,7 +202,6 @@ module.exports = class ThangsTabView extends CocoView
|
||||||
webGLCanvas = $('canvas#webgl-surface', @$el)
|
webGLCanvas = $('canvas#webgl-surface', @$el)
|
||||||
normalCanvas = $('canvas#normal-surface', @$el)
|
normalCanvas = $('canvas#normal-surface', @$el)
|
||||||
@surface = new Surface @world, normalCanvas, webGLCanvas, {
|
@surface = new Surface @world, normalCanvas, webGLCanvas, {
|
||||||
wizards: false
|
|
||||||
paths: false
|
paths: false
|
||||||
coords: true
|
coords: true
|
||||||
grid: true
|
grid: true
|
||||||
|
@ -583,14 +582,14 @@ module.exports = class ThangsTabView extends CocoView
|
||||||
if batchInsert
|
if batchInsert
|
||||||
if thangType.get('name') is 'Hero Placeholder'
|
if thangType.get('name') is 'Hero Placeholder'
|
||||||
thangID = 'Hero Placeholder'
|
thangID = 'Hero Placeholder'
|
||||||
return if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or @getThangByID(thangID)
|
return if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']) or @getThangByID(thangID)
|
||||||
else
|
else
|
||||||
thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}"
|
thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}"
|
||||||
else
|
else
|
||||||
thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID)
|
thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID)
|
||||||
if @cloneSourceThang
|
if @cloneSourceThang
|
||||||
components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components
|
components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components
|
||||||
else if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
else if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
components = [] # Load them all from default ThangType Components
|
components = [] # Load them all from default ThangType Components
|
||||||
else
|
else
|
||||||
components = _.cloneDeep thangType.get('components') ? []
|
components = _.cloneDeep thangType.get('components') ? []
|
||||||
|
|
|
@ -139,5 +139,5 @@ oldArenas = [
|
||||||
|
|
||||||
campaigns = [
|
campaigns = [
|
||||||
{id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: heroArenas}
|
{id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: heroArenas}
|
||||||
{id: 'old_multiplayer', name: '(Deprecated) Old Multiplayer Arenas', description: 'Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas.', levels: oldArenas}
|
#{id: 'old_multiplayer', name: '(Deprecated) Old Multiplayer Arenas', description: 'Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas.', levels: oldArenas}
|
||||||
]
|
]
|
||||||
|
|
|
@ -264,6 +264,7 @@ module.exports = class CampaignView extends RootView
|
||||||
level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete']
|
level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete']
|
||||||
level.locked = false if @editorMode
|
level.locked = false if @editorMode
|
||||||
level.locked = false if @campaign?.get('name') is 'Auditions'
|
level.locked = false if @campaign?.get('name') is 'Auditions'
|
||||||
|
level.locked = false if @campaign?.get('name') is 'Intro'
|
||||||
level.locked = false if me.isInGodMode()
|
level.locked = false if me.isInGodMode()
|
||||||
level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete']
|
level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete']
|
||||||
level.disabled = false if me.isInGodMode()
|
level.disabled = false if me.isInGodMode()
|
||||||
|
@ -275,6 +276,11 @@ module.exports = class CampaignView extends RootView
|
||||||
if level.unlocksHero
|
if level.unlocksHero
|
||||||
level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or [])
|
level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or [])
|
||||||
level.hidden = level.locked
|
level.hidden = level.locked
|
||||||
|
if level.concepts?.length
|
||||||
|
level.displayConcepts = level.concepts
|
||||||
|
maxConcepts = 6
|
||||||
|
if level.displayConcepts.length > maxConcepts
|
||||||
|
level.displayConcepts = level.displayConcepts.slice -maxConcepts
|
||||||
level
|
level
|
||||||
|
|
||||||
countLevels: (levels) ->
|
countLevels: (levels) ->
|
||||||
|
@ -348,7 +354,7 @@ module.exports = class CampaignView extends RootView
|
||||||
@particleMan.attach @$el.find('.map')
|
@particleMan.attach @$el.find('.map')
|
||||||
for level in @campaign.renderedLevels ? {}
|
for level in @campaign.renderedLevels ? {}
|
||||||
particleKey = ['level', @terrain]
|
particleKey = ['level', @terrain]
|
||||||
particleKey.push level.type if level.type and level.type isnt 'hero'
|
particleKey.push level.type if level.type and not (level.type in ['hero', 'course'])
|
||||||
particleKey.push 'replayable' if level.replayable
|
particleKey.push 'replayable' if level.replayable
|
||||||
particleKey.push 'premium' if level.requiresSubscription
|
particleKey.push 'premium' if level.requiresSubscription
|
||||||
particleKey.push 'gate' if level.slug in ['kithgard-gates', 'siege-of-stonehold', 'clash-of-clones', 'summits-gate']
|
particleKey.push 'gate' if level.slug in ['kithgard-gates', 'siege-of-stonehold', 'clash-of-clones', 'summits-gate']
|
||||||
|
@ -468,7 +474,7 @@ module.exports = class CampaignView extends RootView
|
||||||
levelElement = $(e.target).parents('.level-info-container')
|
levelElement = $(e.target).parents('.level-info-container')
|
||||||
levelSlug = levelElement.data('level-slug')
|
levelSlug = levelElement.data('level-slug')
|
||||||
level = _.find _.values(@campaign.get('levels')), slug: levelSlug
|
level = _.find _.values(@campaign.get('levels')), slug: levelSlug
|
||||||
if level.type is 'hero-ladder'
|
if level.type in ['hero-ladder', 'course-ladder']
|
||||||
Backbone.Mediator.publish 'router:navigate', route: "/play/ladder/#{levelSlug}", viewClass: 'views/ladder/LadderView', viewArgs: [{supermodel: @supermodel}, levelSlug]
|
Backbone.Mediator.publish 'router:navigate', route: "/play/ladder/#{levelSlug}", viewClass: 'views/ladder/LadderView', viewArgs: [{supermodel: @supermodel}, levelSlug]
|
||||||
else
|
else
|
||||||
@showLeaderboard levelSlug
|
@showLeaderboard levelSlug
|
||||||
|
|
|
@ -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}
|
|
||||||
]
|
|
|
@ -119,19 +119,6 @@ module.exports = class SpectateLevelView extends RootView
|
||||||
@register()
|
@register()
|
||||||
@controlBar.setBus(@bus)
|
@controlBar.setBus(@bus)
|
||||||
@surface.showLevel()
|
@surface.showLevel()
|
||||||
if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'])
|
|
||||||
if me.id isnt @session.get 'creator'
|
|
||||||
@surface.createOpponentWizard
|
|
||||||
id: @session.get('creator')
|
|
||||||
name: @session.get('creatorName')
|
|
||||||
team: @session.get('team')
|
|
||||||
levelSlug: @level.get('slug')
|
|
||||||
|
|
||||||
@surface.createOpponentWizard
|
|
||||||
id: @otherSession.get('creator')
|
|
||||||
name: @otherSession.get('creatorName')
|
|
||||||
team: @otherSession.get('team')
|
|
||||||
levelSlug: @level.get('slug')
|
|
||||||
|
|
||||||
grabLevelLoaderData: ->
|
grabLevelLoaderData: ->
|
||||||
@session = @levelLoader.session
|
@session = @levelLoader.session
|
||||||
|
@ -207,7 +194,7 @@ module.exports = class SpectateLevelView extends RootView
|
||||||
initSurface: ->
|
initSurface: ->
|
||||||
webGLSurface = $('canvas#webgl-surface', @$el)
|
webGLSurface = $('canvas#webgl-surface', @$el)
|
||||||
normalSurface = $('canvas#normal-surface', @$el)
|
normalSurface = $('canvas#normal-surface', @$el)
|
||||||
@surface = new Surface @world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, wizards: @level.get('type', true) is 'ladder', playerNames: @findPlayerNames()
|
@surface = new Surface @world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, playerNames: @findPlayerNames()
|
||||||
worldBounds = @world.getBounds()
|
worldBounds = @world.getBounds()
|
||||||
bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}]
|
bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}]
|
||||||
@surface.camera.setBounds(bounds)
|
@surface.camera.setBounds(bounds)
|
||||||
|
|
|
@ -35,7 +35,7 @@ module.exports = class ControlBarView extends CocoView
|
||||||
@spectateGame = options.spectateGame ? false
|
@spectateGame = options.spectateGame ? false
|
||||||
@observing = options.session.get('creator') isnt me.id
|
@observing = options.session.get('creator') isnt me.id
|
||||||
super options
|
super options
|
||||||
if @level.get('type') in ['hero-ladder'] and me.isAdmin()
|
if @level.get('type') in ['hero-ladder', 'course-ladder'] and me.isAdmin()
|
||||||
@isMultiplayerLevel = true
|
@isMultiplayerLevel = true
|
||||||
@multiplayerStatusManager = new MultiplayerStatusManager @levelID, @onMultiplayerStateChanged
|
@multiplayerStatusManager = new MultiplayerStatusManager @levelID, @onMultiplayerStateChanged
|
||||||
if @level.get 'replayable'
|
if @level.get 'replayable'
|
||||||
|
@ -59,7 +59,7 @@ module.exports = class ControlBarView extends CocoView
|
||||||
super c
|
super c
|
||||||
c.worldName = @worldName
|
c.worldName = @worldName
|
||||||
c.multiplayerEnabled = @session.get('multiplayer')
|
c.multiplayerEnabled = @session.get('multiplayer')
|
||||||
c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder']
|
c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder', 'course-ladder']
|
||||||
if c.isMultiplayerLevel = @isMultiplayerLevel
|
if c.isMultiplayerLevel = @isMultiplayerLevel
|
||||||
c.multiplayerStatus = @multiplayerStatusManager?.status
|
c.multiplayerStatus = @multiplayerStatusManager?.status
|
||||||
if @level.get 'replayable'
|
if @level.get 'replayable'
|
||||||
|
@ -71,22 +71,27 @@ module.exports = class ControlBarView extends CocoView
|
||||||
c.spectateGame = @spectateGame
|
c.spectateGame = @spectateGame
|
||||||
c.observing = @observing
|
c.observing = @observing
|
||||||
@homeViewArgs = [{supermodel: if @hasReceivedMemoryWarning then null else @supermodel}]
|
@homeViewArgs = [{supermodel: if @hasReceivedMemoryWarning then null else @supermodel}]
|
||||||
if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder']
|
if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder', 'course-ladder']
|
||||||
levelID = @level.get('slug').replace /\-tutorial$/, ''
|
levelID = @level.get('slug').replace /\-tutorial$/, ''
|
||||||
@homeLink = c.homeLink = '/play/ladder/' + levelID
|
@homeLink = '/play/ladder/' + levelID
|
||||||
@homeViewClass = 'views/ladder/LadderView'
|
@homeViewClass = 'views/ladder/LadderView'
|
||||||
@homeViewArgs.push levelID
|
@homeViewArgs.push levelID
|
||||||
else if @level.get('type', true) in ['hero', 'hero-coop']
|
else if @level.get('type', true) in ['hero', 'hero-coop']
|
||||||
@homeLink = c.homeLink = '/play'
|
@homeLink = '/play'
|
||||||
@homeViewClass = 'views/play/CampaignView'
|
@homeViewClass = 'views/play/CampaignView'
|
||||||
campaign = @level.get 'campaign'
|
campaign = @level.get 'campaign'
|
||||||
@homeLink += '/' + campaign
|
@homeLink += '/' + campaign
|
||||||
@homeViewArgs.push campaign
|
@homeViewArgs.push campaign
|
||||||
else if @level.get('type', true) in ['campaign']
|
else if @level.get('type', true) in ['course', 'course-ladder']
|
||||||
@homeLink = c.homeLink = '/play-old'
|
@homeLink = '/courses/mock1'
|
||||||
@homeViewClass = 'views/MainPlayView'
|
@homeViewClass = 'views/courses/mock1/CourseDetailsView'
|
||||||
|
#campaign = @level.get 'campaign'
|
||||||
|
#@homeLink += '/' + campaign
|
||||||
|
#@homeViewArgs.push campaign
|
||||||
|
@homeLink += '/' + '0'
|
||||||
|
@homeViewArgs.push '0'
|
||||||
else
|
else
|
||||||
@homeLink = c.homeLink = '/'
|
@homeLink = '/'
|
||||||
@homeViewClass = 'views/HomeView'
|
@homeViewClass = 'views/HomeView'
|
||||||
c.editorLink = "/editor/level/#{@level.get('slug')}"
|
c.editorLink = "/editor/level/#{@level.get('slug')}"
|
||||||
c.homeLink = @homeLink
|
c.homeLink = @homeLink
|
||||||
|
|
|
@ -109,7 +109,6 @@ module.exports = class LevelPlaybackView extends CocoView
|
||||||
@togglePlaybackControls false
|
@togglePlaybackControls false
|
||||||
Backbone.Mediator.publish 'playback:real-time-playback-started', {}
|
Backbone.Mediator.publish 'playback:real-time-playback-started', {}
|
||||||
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'real-time-playback-start', volume: 1
|
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'real-time-playback-start', volume: 1
|
||||||
Backbone.Mediator.publish 'level:set-letterbox', on: true if @options.level.get('type', true) is ['hero'] # not with flags...?
|
|
||||||
|
|
||||||
onRealTimeMultiplayerCast: (e) ->
|
onRealTimeMultiplayerCast: (e) ->
|
||||||
@realTime = true
|
@realTime = true
|
||||||
|
|
|
@ -180,7 +180,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
@session = @levelLoader.session
|
@session = @levelLoader.session
|
||||||
@world = @levelLoader.world
|
@world = @levelLoader.world
|
||||||
@level = @levelLoader.level
|
@level = @levelLoader.level
|
||||||
@$el.addClass 'hero' if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
@$el.addClass 'hero' if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
@$el.addClass 'flags' if _.any(@world.thangs, (t) -> (t.programmableProperties and 'findFlags' in t.programmableProperties) or t.inventory?.flag) or @level.get('slug') is 'sky-span'
|
@$el.addClass 'flags' if _.any(@world.thangs, (t) -> (t.programmableProperties and 'findFlags' in t.programmableProperties) or t.inventory?.flag) or @level.get('slug') is 'sky-span'
|
||||||
# TODO: Update terminology to always be opponentSession or otherSession
|
# TODO: Update terminology to always be opponentSession or otherSession
|
||||||
# TODO: E.g. if it's always opponent right now, then variable names should be opponentSession until we have coop play
|
# TODO: E.g. if it's always opponent right now, then variable names should be opponentSession until we have coop play
|
||||||
|
@ -280,7 +280,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session})
|
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session})
|
||||||
@setupManager.open()
|
@setupManager.open()
|
||||||
|
|
||||||
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder']
|
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder', 'course-ladder']
|
||||||
|
|
||||||
onLoaded: ->
|
onLoaded: ->
|
||||||
_.defer => @onLevelLoaderLoaded()
|
_.defer => @onLevelLoaderLoaded()
|
||||||
|
@ -310,7 +310,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
initSurface: ->
|
initSurface: ->
|
||||||
webGLSurface = $('canvas#webgl-surface', @$el)
|
webGLSurface = $('canvas#webgl-surface', @$el)
|
||||||
normalSurface = $('canvas#normal-surface', @$el)
|
normalSurface = $('canvas#normal-surface', @$el)
|
||||||
@surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, wizards: not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']), observing: @observing, playerNames: @findPlayerNames())
|
@surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, observing: @observing, playerNames: @findPlayerNames())
|
||||||
worldBounds = @world.getBounds()
|
worldBounds = @world.getBounds()
|
||||||
bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}]
|
bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}]
|
||||||
@surface.camera.setBounds(bounds)
|
@surface.camera.setBounds(bounds)
|
||||||
|
@ -332,9 +332,6 @@ module.exports = class PlayLevelView extends RootView
|
||||||
if window.currentModal and not window.currentModal.destroyed and window.currentModal.constructor isnt VictoryModal
|
if window.currentModal and not window.currentModal.destroyed and window.currentModal.constructor isnt VictoryModal
|
||||||
return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @
|
return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @
|
||||||
@surface.showLevel()
|
@surface.showLevel()
|
||||||
if @otherSession and not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'])
|
|
||||||
# TODO: colorize name and cloud by team, colorize wizard by user's color config
|
|
||||||
@surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team'), levelSlug: @level.get('slug'), codeLanguage: @otherSession.get('submittedCodeLanguage')
|
|
||||||
if @isEditorPreview or @observing
|
if @isEditorPreview or @observing
|
||||||
@loadingView.startUnveiling()
|
@loadingView.startUnveiling()
|
||||||
@loadingView.unveil()
|
@loadingView.unveil()
|
||||||
|
@ -370,7 +367,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
return if @alreadyLoadedState
|
return if @alreadyLoadedState
|
||||||
@alreadyLoadedState = true
|
@alreadyLoadedState = true
|
||||||
state = @originalSessionState
|
state = @originalSessionState
|
||||||
if not @level or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
if not @level or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: true
|
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: true
|
||||||
Backbone.Mediator.publish 'tome:select-primary-sprite', {}
|
Backbone.Mediator.publish 'tome:select-primary-sprite', {}
|
||||||
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false
|
Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false
|
||||||
|
@ -424,7 +421,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
onDonePressed: -> @showVictory()
|
onDonePressed: -> @showVictory()
|
||||||
|
|
||||||
onShowVictory: (e) ->
|
onShowVictory: (e) ->
|
||||||
$('#level-done-button').show() unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
$('#level-done-button').show() unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
@showVictory() if e.showModal
|
@showVictory() if e.showModal
|
||||||
return if @victorySeen
|
return if @victorySeen
|
||||||
@victorySeen = true
|
@victorySeen = true
|
||||||
|
@ -439,10 +436,10 @@ module.exports = class PlayLevelView extends RootView
|
||||||
application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID
|
application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID
|
||||||
|
|
||||||
showVictory: ->
|
showVictory: ->
|
||||||
return if @isEditorPreview and @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
|
return if @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
|
||||||
@endHighlight()
|
@endHighlight()
|
||||||
options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning}
|
options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning}
|
||||||
ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then HeroVictoryModal else VictoryModal
|
ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then HeroVictoryModal else VictoryModal
|
||||||
victoryModal = new ModalClass(options)
|
victoryModal = new ModalClass(options)
|
||||||
@openModalView(victoryModal)
|
@openModalView(victoryModal)
|
||||||
if me.get('anonymous')
|
if me.get('anonymous')
|
||||||
|
@ -538,7 +535,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
|
|
||||||
onSubmissionComplete: =>
|
onSubmissionComplete: =>
|
||||||
return if @destroyed
|
return if @destroyed
|
||||||
return if @isEditorPreview and @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
|
return if @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
|
||||||
# TODO: Show a victory dialog specific to hero-ladder level
|
# TODO: Show a victory dialog specific to hero-ladder level
|
||||||
if @goalManager.checkOverallStatus() is 'success' and not @options.realTimeMultiplayerSessionID?
|
if @goalManager.checkOverallStatus() is 'success' and not @options.realTimeMultiplayerSessionID?
|
||||||
showModalFn = -> Backbone.Mediator.publish 'level:show-victory', showModal: true
|
showModalFn = -> Backbone.Mediator.publish 'level:show-victory', showModal: true
|
||||||
|
|
|
@ -11,6 +11,7 @@ LadderSubmissionView = require 'views/play/common/LadderSubmissionView'
|
||||||
AudioPlayer = require 'lib/AudioPlayer'
|
AudioPlayer = require 'lib/AudioPlayer'
|
||||||
User = require 'models/User'
|
User = require 'models/User'
|
||||||
utils = require 'core/utils'
|
utils = require 'core/utils'
|
||||||
|
Level = require 'models/Level'
|
||||||
|
|
||||||
module.exports = class HeroVictoryModal extends ModalView
|
module.exports = class HeroVictoryModal extends ModalView
|
||||||
id: 'hero-victory-modal'
|
id: 'hero-victory-modal'
|
||||||
|
@ -44,6 +45,9 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
@previousXP = me.get 'points', true
|
@previousXP = me.get 'points', true
|
||||||
@previousLevel = me.level()
|
@previousLevel = me.level()
|
||||||
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory'
|
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory'
|
||||||
|
if @level.get('type', true) is 'course' and nextLevel = @level.get('nextLevel')
|
||||||
|
@nextLevel = new Level().setURL "/db/level/#{nextLevel.original}/version/#{nextLevel.majorVersion}"
|
||||||
|
@nextLevel = @supermodel.loadModel(@nextLevel, 'level').model
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
clearInterval @sequentialAnimationInterval
|
clearInterval @sequentialAnimationInterval
|
||||||
|
@ -68,7 +72,8 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
for thangTypeOriginal in thangTypeOriginals
|
for thangTypeOriginal in thangTypeOriginals
|
||||||
thangType = new ThangType()
|
thangType = new ThangType()
|
||||||
thangType.url = "/db/thang.type/#{thangTypeOriginal}/version"
|
thangType.url = "/db/thang.type/#{thangTypeOriginal}/version"
|
||||||
thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers', 'i18n']
|
#thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers', 'i18n'] # This is what we need, but the PlayHeroesModal needs more, and so we load more to fill up the supermodel.
|
||||||
|
thangType.project = ['original', 'rasterIcon', 'name', 'slug', 'soundTriggers', 'featureImages', 'gems', 'heroClass', 'description', 'components', 'extendedName', 'unlockLevelName', 'i18n']
|
||||||
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
|
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
|
||||||
|
|
||||||
@newEarnedAchievements = []
|
@newEarnedAchievements = []
|
||||||
|
@ -132,7 +137,7 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
|
|
||||||
c.thangTypes = @thangTypes
|
c.thangTypes = @thangTypes
|
||||||
c.me = me
|
c.me = me
|
||||||
c.readyToRank = @level.get('type', true) is 'hero-ladder' and @session.readyToRank()
|
c.readyToRank = @level.get('type', true) in ['hero-ladder', 'course-ladder'] and @session.readyToRank()
|
||||||
c.level = @level
|
c.level = @level
|
||||||
c.i18n = utils.i18n
|
c.i18n = utils.i18n
|
||||||
|
|
||||||
|
@ -152,7 +157,7 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
# Show the "I'm done" button between 30 - 120 minutes if they definitely came from Hour of Code
|
# Show the "I'm done" button between 30 - 120 minutes if they definitely came from Hour of Code
|
||||||
c.showHourOfCodeDoneButton = me.get('hourOfCode') and showDone
|
c.showHourOfCodeDoneButton = me.get('hourOfCode') and showDone
|
||||||
|
|
||||||
c.showLeaderboard = @level.get('scoreTypes')?.length > 0
|
c.showLeaderboard = @level.get('scoreTypes')?.length > 0 and @level.get('type', true) isnt 'course'
|
||||||
|
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
@ -187,7 +192,7 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
panel.queue(-> complete())
|
panel.queue(-> complete())
|
||||||
@animationComplete = not @animatedPanels.length
|
@animationComplete = not @animatedPanels.length
|
||||||
complete() if @animationComplete
|
complete() if @animationComplete
|
||||||
if @level.get('type', true) is 'hero-ladder'
|
if @level.get('type', true) in ['hero-ladder', 'course-ladder']
|
||||||
@ladderSubmissionView = new LadderSubmissionView session: @session, level: @level
|
@ladderSubmissionView = new LadderSubmissionView session: @session, level: @level
|
||||||
@insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view')
|
@insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view')
|
||||||
|
|
||||||
|
@ -332,6 +337,13 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
{'kithgard-gates': 'forest', 'kithgard-mastery': 'forest', 'siege-of-stonehold': 'desert', 'clash-of-clones': 'mountain'}[@level.get('slug')] or @level.get 'campaign' # Much easier to just keep this updated than to dynamically figure it out.
|
{'kithgard-gates': 'forest', 'kithgard-mastery': 'forest', 'siege-of-stonehold': 'desert', 'clash-of-clones': 'mountain'}[@level.get('slug')] or @level.get 'campaign' # Much easier to just keep this updated than to dynamically figure it out.
|
||||||
|
|
||||||
getNextLevelLink: ->
|
getNextLevelLink: ->
|
||||||
|
if @level.get('type', true) is 'course' and nextLevel = @level.get('nextLevel')
|
||||||
|
# need to do something more complicated to load its slug
|
||||||
|
console.log 'have @nextLevel', @nextLevel, 'from nextLevel', nextLevel
|
||||||
|
return "/play/level/#{@nextLevel.get('slug')}"
|
||||||
|
else if @level.get('type', true) is 'course'
|
||||||
|
# TODO: figure out which course it is
|
||||||
|
return '/courses/mock1/0'
|
||||||
link = '/play'
|
link = '/play'
|
||||||
nextCampaign = @getNextLevelCampaign()
|
nextCampaign = @getNextLevelCampaign()
|
||||||
link += '/' + nextCampaign
|
link += '/' + nextCampaign
|
||||||
|
@ -345,7 +357,17 @@ module.exports = class HeroVictoryModal extends ModalView
|
||||||
justBeatLevel: @level
|
justBeatLevel: @level
|
||||||
supermodel: if @options.hasReceivedMemoryWarning then null else @supermodel
|
supermodel: if @options.hasReceivedMemoryWarning then null else @supermodel
|
||||||
_.merge options, extraOptions if extraOptions
|
_.merge options, extraOptions if extraOptions
|
||||||
navigationEvent = route: nextLevelLink, viewClass: require('views/play/CampaignView'), viewArgs: [options, @getNextLevelCampaign()]
|
if @level.get('type', true) is 'course' and @nextLevel
|
||||||
|
viewClass = require 'views/play/level/PlayLevelView'
|
||||||
|
viewArgs = [options, @nextLevel.get('slug')]
|
||||||
|
else if @level.get('type', true) is 'course'
|
||||||
|
options.studentMode = true
|
||||||
|
viewClass = require 'views/courses/mock1/CourseDetailsView'
|
||||||
|
viewArgs = [options, '0']
|
||||||
|
else
|
||||||
|
viewClass = require 'views/play/CampaignView'
|
||||||
|
viewArgs = [options, @getNextLevelCampaign()]
|
||||||
|
navigationEvent = route: nextLevelLink, viewClass: viewClass, viewArgs: viewArgs
|
||||||
if @level.get('slug') is 'lost-viking' and not (me.get('age') in ['0-13', '14-17'])
|
if @level.get('slug') is 'lost-viking' and not (me.get('age') in ['0-13', '14-17'])
|
||||||
@showOffer navigationEvent
|
@showOffer navigationEvent
|
||||||
else
|
else
|
||||||
|
|
|
@ -48,7 +48,7 @@ module.exports = class CastButtonView extends CocoView
|
||||||
super()
|
super()
|
||||||
@castButton = $('.cast-button', @$el)
|
@castButton = $('.cast-button', @$el)
|
||||||
spell.view?.createOnCodeChangeHandlers() for spellKey, spell of @spells
|
spell.view?.createOnCodeChangeHandlers() for spellKey, spell of @spells
|
||||||
if @options.level.get('hidesSubmitUntilRun') or @options.level.get('hidesRealTimePlayback')
|
if @options.level.get('hidesSubmitUntilRun') or @options.level.get 'hidesRealTimePlayback'
|
||||||
@$el.find('.submit-button').hide() # Hide Submit for the first few until they run it once.
|
@$el.find('.submit-button').hide() # Hide Submit for the first few until they run it once.
|
||||||
if @options.session.get('state')?.complete and @options.level.get 'hidesRealTimePlayback'
|
if @options.session.get('state')?.complete and @options.level.get 'hidesRealTimePlayback'
|
||||||
@$el.find('.done-button').show()
|
@$el.find('.done-button').show()
|
||||||
|
@ -72,7 +72,7 @@ module.exports = class CastButtonView extends CocoView
|
||||||
@updateReplayability()
|
@updateReplayability()
|
||||||
|
|
||||||
onDoneButtonClick: (e) ->
|
onDoneButtonClick: (e) ->
|
||||||
return if @getQueryVariable('dev') and @level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
|
return if @options.level.hasLocalChanges() # Don't award achievements when beating level changed in level editor
|
||||||
@options.session.recordScores @world.scores, @options.level
|
@options.session.recordScores @world.scores, @options.level
|
||||||
Backbone.Mediator.publish 'level:show-victory', showModal: true
|
Backbone.Mediator.publish 'level:show-victory', showModal: true
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ module.exports = class Spell
|
||||||
writable = @permissions.readwrite.length > 0
|
writable = @permissions.readwrite.length > 0
|
||||||
skipProtectAPI = @skipProtectAPI or not writable
|
skipProtectAPI = @skipProtectAPI or not writable
|
||||||
problemContext = @createProblemContext thang
|
problemContext = @createProblemContext thang
|
||||||
includeFlow = (@levelType in ['hero', 'hero-ladder', 'hero-coop']) and not skipProtectAPI
|
includeFlow = (@levelType in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']) and not skipProtectAPI
|
||||||
aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: includeFlow, problemContext: problemContext
|
aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: includeFlow, problemContext: problemContext
|
||||||
aether = new Aether aetherOptions
|
aether = new Aether aetherOptions
|
||||||
if @worker
|
if @worker
|
||||||
|
@ -189,7 +189,7 @@ module.exports = class Spell
|
||||||
return true if @spectateView # Use transpiled code for both teams if we're just spectating.
|
return true if @spectateView # Use transpiled code for both teams if we're just spectating.
|
||||||
return true if @isEnemySpell() # Use transpiled for enemy spells.
|
return true if @isEnemySpell() # Use transpiled for enemy spells.
|
||||||
# Players without permissions can't view the raw code.
|
# Players without permissions can't view the raw code.
|
||||||
return false if @observing and @levelType is 'hero'
|
return false if @observing and @levelType in ['hero', 'course']
|
||||||
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
|
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
|
||||||
false
|
false
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ module.exports = class SpellListEntryView extends CocoView
|
||||||
context
|
context
|
||||||
|
|
||||||
createMethodSignature: ->
|
createMethodSignature: ->
|
||||||
return @spell.name if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
return @spell.name if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
parameters = (@spell.parameters or []).slice()
|
parameters = (@spell.parameters or []).slice()
|
||||||
if @spell.language in ['python', 'lua']
|
if @spell.language in ['python', 'lua']
|
||||||
parameters.unshift 'self'
|
parameters.unshift 'self'
|
||||||
|
|
|
@ -107,7 +107,7 @@ module.exports = class SpellPaletteEntryView extends CocoView
|
||||||
Backbone.Mediator.publish 'tome:palette-pin-toggled', entry: @, pinned: @popoverPinned
|
Backbone.Mediator.publish 'tome:palette-pin-toggled', entry: @, pinned: @popoverPinned
|
||||||
|
|
||||||
onClick: (e) =>
|
onClick: (e) =>
|
||||||
if true or @options.level.get('type', true) is 'hero'
|
if true or @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
# Jiggle instead of pin for hero levels
|
# Jiggle instead of pin for hero levels
|
||||||
# Actually, do it all the time, because we recently busted the pin CSS. TODO: restore pinning
|
# Actually, do it all the time, because we recently busted the pin CSS. TODO: restore pinning
|
||||||
jigglyPopover = $('.spell-palette-popover.popover')
|
jigglyPopover = $('.spell-palette-popover.popover')
|
||||||
|
|
|
@ -161,7 +161,7 @@ module.exports = class SpellPaletteView extends CocoView
|
||||||
else
|
else
|
||||||
propStorage =
|
propStorage =
|
||||||
'this': ['apiProperties', 'apiMethods']
|
'this': ['apiProperties', 'apiMethods']
|
||||||
if not (@options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or not @options.programmable
|
if not (@options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']) or not @options.programmable
|
||||||
@organizePalette propStorage, allDocs, excludedDocs
|
@organizePalette propStorage, allDocs, excludedDocs
|
||||||
else
|
else
|
||||||
@organizePaletteHero propStorage, allDocs, excludedDocs
|
@organizePaletteHero propStorage, allDocs, excludedDocs
|
||||||
|
@ -203,7 +203,7 @@ module.exports = class SpellPaletteView extends CocoView
|
||||||
if tabbify and _.find @entries, ((entry) -> entry.doc.owner isnt 'this')
|
if tabbify and _.find @entries, ((entry) -> entry.doc.owner isnt 'this')
|
||||||
@entryGroups = _.groupBy @entries, groupForEntry
|
@entryGroups = _.groupBy @entries, groupForEntry
|
||||||
else
|
else
|
||||||
i18nKey = if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then 'play_level.tome_your_skills' else 'play_level.tome_available_spells'
|
i18nKey = if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then 'play_level.tome_your_skills' else 'play_level.tome_available_spells'
|
||||||
defaultGroup = $.i18n.t i18nKey
|
defaultGroup = $.i18n.t i18nKey
|
||||||
@entryGroups = {}
|
@entryGroups = {}
|
||||||
@entryGroups[defaultGroup] = @entries
|
@entryGroups[defaultGroup] = @entries
|
||||||
|
|
|
@ -518,7 +518,7 @@ module.exports = class SpellView extends CocoView
|
||||||
@createToolbarView()
|
@createToolbarView()
|
||||||
|
|
||||||
createDebugView: ->
|
createDebugView: ->
|
||||||
return if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] # We'll turn this on later, maybe, but not yet.
|
return if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] # We'll turn this on later, maybe, but not yet.
|
||||||
@debugView = new SpellDebugView ace: @ace, thang: @thang, spell:@spell
|
@debugView = new SpellDebugView ace: @ace, thang: @thang, spell:@spell
|
||||||
@$el.append @debugView.render().$el.hide()
|
@$el.append @debugView.render().$el.hide()
|
||||||
|
|
||||||
|
@ -993,7 +993,7 @@ module.exports = class SpellView extends CocoView
|
||||||
markerRange.end = @aceDoc.createAnchor markerRange.end
|
markerRange.end = @aceDoc.createAnchor markerRange.end
|
||||||
markerRange.id = @aceSession.addMarker markerRange, clazz, markerType
|
markerRange.id = @aceSession.addMarker markerRange, clazz, markerType
|
||||||
@markerRanges.push markerRange
|
@markerRanges.push markerRange
|
||||||
if false and executedRows[start.row] and @decoratedGutter[start.row] isnt clazz
|
if executedRows[start.row] and @decoratedGutter[start.row] isnt clazz
|
||||||
@aceSession.removeGutterDecoration start.row, @decoratedGutter[start.row] if @decoratedGutter[start.row] isnt ''
|
@aceSession.removeGutterDecoration start.row, @decoratedGutter[start.row] if @decoratedGutter[start.row] isnt ''
|
||||||
@aceSession.addGutterDecoration start.row, clazz
|
@aceSession.addGutterDecoration start.row, clazz
|
||||||
@decoratedGutter[start.row] = clazz
|
@decoratedGutter[start.row] = clazz
|
||||||
|
|
|
@ -60,7 +60,7 @@ module.exports = class TomeView extends CocoView
|
||||||
@worker = @createWorker()
|
@worker = @createWorker()
|
||||||
programmableThangs = _.filter @options.thangs, (t) -> t.isProgrammable and t.programmableMethods
|
programmableThangs = _.filter @options.thangs, (t) -> t.isProgrammable and t.programmableMethods
|
||||||
@createSpells programmableThangs, programmableThangs[0]?.world # Do before spellList, thangList, and castButton
|
@createSpells programmableThangs, programmableThangs[0]?.world # Do before spellList, thangList, and castButton
|
||||||
unless @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
|
unless @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder']
|
||||||
@spellList = @insertSubView new SpellListView spells: @spells, supermodel: @supermodel, level: @options.level
|
@spellList = @insertSubView new SpellListView spells: @spells, supermodel: @supermodel, level: @options.level
|
||||||
@castButton = @insertSubView new CastButtonView spells: @spells, level: @options.level, session: @options.session
|
@castButton = @insertSubView new CastButtonView spells: @spells, level: @options.level, session: @options.session
|
||||||
@teamSpellMap = @generateTeamSpellMap(@spells)
|
@teamSpellMap = @generateTeamSpellMap(@spells)
|
||||||
|
@ -192,7 +192,7 @@ module.exports = class TomeView extends CocoView
|
||||||
@castButton?.$el.hide()
|
@castButton?.$el.hide()
|
||||||
|
|
||||||
onSpriteSelected: (e) ->
|
onSpriteSelected: (e) ->
|
||||||
return if @spellView and @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] # Never deselect the hero in the Tome.
|
return if @spellView and @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] # Never deselect the hero in the Tome.
|
||||||
thang = e.thang
|
thang = e.thang
|
||||||
spellName = e.spellName
|
spellName = e.spellName
|
||||||
@spellList?.$el.hide()
|
@spellList?.$el.hide()
|
||||||
|
|
|
@ -34,7 +34,7 @@ module.exports = class GameMenuModal extends ModalView
|
||||||
submenus = ['guide', 'options', 'save-load', 'multiplayer']
|
submenus = ['guide', 'options', 'save-load', 'multiplayer']
|
||||||
submenus = _.without submenus, 'guide' unless docs.specificArticles?.length or docs.generalArticles?.length
|
submenus = _.without submenus, 'guide' unless docs.specificArticles?.length or docs.generalArticles?.length
|
||||||
submenus = _.without submenus, 'save-load' unless me.isAdmin() or /https?:\/\/localhost/.test(window.location.href)
|
submenus = _.without submenus, 'save-load' unless me.isAdmin() or /https?:\/\/localhost/.test(window.location.href)
|
||||||
submenus = _.without submenus, 'multiplayer' unless me.isAdmin() or @level?.get('type') in ['ladder', 'hero-ladder']
|
submenus = _.without submenus, 'multiplayer' unless me.isAdmin() or @level?.get('type') in ['ladder', 'hero-ladder', 'course-ladder']
|
||||||
@includedSubmenus = submenus
|
@includedSubmenus = submenus
|
||||||
context.showTab = @options.showTab ? submenus[0]
|
context.showTab = @options.showTab ? submenus[0]
|
||||||
context.submenus = submenus
|
context.submenus = submenus
|
||||||
|
@ -43,7 +43,7 @@ module.exports = class GameMenuModal extends ModalView
|
||||||
'guide': 'list'
|
'guide': 'list'
|
||||||
'save-load': 'floppy-disk'
|
'save-load': 'floppy-disk'
|
||||||
'multiplayer': 'globe'
|
'multiplayer': 'globe'
|
||||||
context.showsChooseHero = @options.levelID not in ['zero-sum']
|
context.showsChooseHero = (@level?.get('type') not in ['course', 'course-ladder']) and (@options.levelID not in ['zero-sum'])
|
||||||
context
|
context
|
||||||
|
|
||||||
afterRender: ->
|
afterRender: ->
|
||||||
|
|
|
@ -15,7 +15,6 @@ module.exports = class LevelGuideView extends CocoView
|
||||||
|
|
||||||
events:
|
events:
|
||||||
'click .start-subscription-button': 'clickSubscribe'
|
'click .start-subscription-button': 'clickSubscribe'
|
||||||
'click .resource-link': 'clickResourceLink'
|
|
||||||
|
|
||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
@levelSlug = options.level.get('slug')
|
@levelSlug = options.level.get('slug')
|
||||||
|
@ -78,13 +77,6 @@ module.exports = class LevelGuideView extends CocoView
|
||||||
@openModalView new SubscribeModal()
|
@openModalView new SubscribeModal()
|
||||||
window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'help video clicked', level: level
|
window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'help video clicked', level: level
|
||||||
|
|
||||||
clickResourceLink: (e) ->
|
|
||||||
e.preventDefault()
|
|
||||||
resource = $(e.target).data 'resource'
|
|
||||||
url = $(e.target).attr 'href'
|
|
||||||
window.tracker?.trackEvent 'Click resource', category: 'Resources', source: 'guide', level: @levelSlug, resource: resource
|
|
||||||
window.open url, '_blank'
|
|
||||||
|
|
||||||
clickTab: (e) =>
|
clickTab: (e) =>
|
||||||
@$el.find('li.active').removeClass('active')
|
@$el.find('li.active').removeClass('active')
|
||||||
@playSound 'guide-tab-switch'
|
@playSound 'guide-tab-switch'
|
||||||
|
|
|
@ -27,7 +27,7 @@ module.exports = class MultiplayerView extends CocoView
|
||||||
@levelID = @level?.get 'slug'
|
@levelID = @level?.get 'slug'
|
||||||
@session = options.session
|
@session = options.session
|
||||||
@listenTo @session, 'change:multiplayer', @updateLinkSection
|
@listenTo @session, 'change:multiplayer', @updateLinkSection
|
||||||
@watchRealTimeSessions() if @level?.get('type') in ['hero-ladder'] and me.isAdmin()
|
@watchRealTimeSessions() if @level?.get('type') in ['hero-ladder', 'course-ladder'] and me.isAdmin()
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
@realTimeSessions?.off 'add', @onRealTimeSessionAdded
|
@realTimeSessions?.off 'add', @onRealTimeSessionAdded
|
||||||
|
@ -42,12 +42,12 @@ module.exports = class MultiplayerView extends CocoView
|
||||||
c.team = @session.get 'team'
|
c.team = @session.get 'team'
|
||||||
c.levelSlug = @levelID
|
c.levelSlug = @levelID
|
||||||
# For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet.
|
# For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet.
|
||||||
if @level?.get('type') in ['ladder', 'hero-ladder']
|
if @level?.get('type') in ['ladder', 'hero-ladder', 'course-ladder']
|
||||||
c.ladderGame = true
|
c.ladderGame = true
|
||||||
c.readyToRank = @session?.readyToRank()
|
c.readyToRank = @session?.readyToRank()
|
||||||
|
|
||||||
# Real-time multiplayer stuff
|
# Real-time multiplayer stuff
|
||||||
if @level?.get('type') in ['hero-ladder'] and me.isAdmin()
|
if @level?.get('type') in ['hero-ladder', 'course-ladder'] and me.isAdmin()
|
||||||
c.levelID = @session.get('levelID')
|
c.levelID = @session.get('levelID')
|
||||||
c.realTimeSessions = @realTimeSessions
|
c.realTimeSessions = @realTimeSessions
|
||||||
c.currentRealTimeSession = @currentRealTimeSession if @currentRealTimeSession
|
c.currentRealTimeSession = @currentRealTimeSession if @currentRealTimeSession
|
||||||
|
@ -78,7 +78,7 @@ module.exports = class MultiplayerView extends CocoView
|
||||||
updateLinkSection: ->
|
updateLinkSection: ->
|
||||||
multiplayer = @$el.find('#multiplayer').prop('checked')
|
multiplayer = @$el.find('#multiplayer').prop('checked')
|
||||||
la = @$el.find('#link-area')
|
la = @$el.find('#link-area')
|
||||||
la.toggle if @level?.get('type') in ['ladder', 'hero-ladder'] then false else Boolean(multiplayer)
|
la.toggle if @level?.get('type') in ['ladder', 'hero-ladder', 'course-ladder'] then false else Boolean(multiplayer)
|
||||||
true
|
true
|
||||||
|
|
||||||
onHidden: ->
|
onHidden: ->
|
||||||
|
|
|
@ -1,11 +1,21 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Original content copyright (c) 2014 dpen2000 licensed under the MIT license
|
# Original content copyright (c) 2014 dpen2000 licensed under the MIT license
|
||||||
|
|
||||||
|
# Set default ulimits
|
||||||
|
cat <<- EOF > /tmp/limits.conf
|
||||||
|
* soft nofile 10000
|
||||||
|
* hard nofile 10000
|
||||||
|
EOF
|
||||||
|
sudo mv /tmp/limits.conf /etc/security/limits.conf
|
||||||
|
sudo chown root:root /etc/security/limits.conf
|
||||||
|
|
||||||
|
#Install required software
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install python-software-properties git
|
sudo apt-get -y install python-software-properties git
|
||||||
sudo add-apt-repository -y ppa:chris-lea/node.js
|
sudo add-apt-repository -y ppa:chris-lea/node.js
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install nodejs
|
sudo apt-get -y install nodejs
|
||||||
sudo apt-get -y install g++ make
|
sudo apt-get -y install g++ make
|
||||||
mkdir /vagrant/node_modules
|
mkdir /vagrant/node_modules
|
||||||
sudo mkdir /node_modules
|
sudo mkdir /node_modules
|
||||||
sudo chown vagrant:vagrant /node_modules
|
sudo chown vagrant:vagrant /node_modules
|
||||||
|
|
|
@ -720,17 +720,9 @@ sendNextStepsEmail = (user, now, daysAgo) ->
|
||||||
isKid = not isAdult # Assume kid if not specified
|
isKid = not isAdult # Assume kid if not specified
|
||||||
offers =
|
offers =
|
||||||
'app-academy': isAdult and isVeryFast
|
'app-academy': isAdult and isVeryFast
|
||||||
'designlab': isAdult and Math.random() < 0.25
|
|
||||||
'tealeaf-academy': isAdult and isFast
|
|
||||||
'talent-buddy': isAdult and Math.random() < 0.25
|
|
||||||
'coding-campus': isAdult and Math.random() < 0.25 # TODO: geodetect UT and give priority
|
|
||||||
'viking': isAdult and isFast
|
'viking': isAdult and isFast
|
||||||
'maker-square': isAdult and isFast
|
nAdditionalOffers = Math.max 0, 1 - _.filter(offers).length
|
||||||
'the-firehose-project': isAdult and isFast
|
possibleAdditionalOffers = ['bloc', 'tuts-plus', 'thinkful']
|
||||||
#'mv-code-club': isKid # TODO: geodetect, get landing page URL
|
|
||||||
'breakout-mentors': isKid
|
|
||||||
nAdditionalOffers = Math.max 0, 4 - _.filter(offers).length
|
|
||||||
possibleAdditionalOffers = ['ostraining', 'code-school', 'one-month', 'pluralsight']
|
|
||||||
for offer in _.sample possibleAdditionalOffers, nAdditionalOffers
|
for offer in _.sample possibleAdditionalOffers, nAdditionalOffers
|
||||||
offers[offer] = true
|
offers[offer] = true
|
||||||
if user.isPremium()
|
if user.isPremium()
|
||||||
|
|
Loading…
Reference in a new issue