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