diff --git a/app/assets/images/level/code_editor_error_background.png b/app/assets/images/level/code_editor_error_background.png
index d2551e07f..b6fbc72ea 100644
Binary files a/app/assets/images/level/code_editor_error_background.png and b/app/assets/images/level/code_editor_error_background.png differ
diff --git a/app/assets/images/level/code_editor_error_background_arrow.png b/app/assets/images/level/code_editor_error_background_arrow.png
new file mode 100644
index 000000000..bb2396a69
Binary files /dev/null and b/app/assets/images/level/code_editor_error_background_arrow.png differ
diff --git a/app/assets/images/pages/base/background.jpg b/app/assets/images/pages/base/background.jpg
new file mode 100644
index 000000000..c924faf89
Binary files /dev/null and b/app/assets/images/pages/base/background.jpg differ
diff --git a/app/assets/images/pages/base/background_texture.png b/app/assets/images/pages/base/background_texture.png
deleted file mode 100644
index 6521dea8b..000000000
Binary files a/app/assets/images/pages/base/background_texture.png and /dev/null differ
diff --git a/app/assets/images/pages/base/logo.png b/app/assets/images/pages/base/logo.png
index 0972de488..e7a97eb3c 100644
Binary files a/app/assets/images/pages/base/logo.png and b/app/assets/images/pages/base/logo.png differ
diff --git a/app/assets/images/pages/base/nav_background.png b/app/assets/images/pages/base/nav_background.png
new file mode 100644
index 000000000..d9df28f57
Binary files /dev/null and b/app/assets/images/pages/base/nav_background.png differ
diff --git a/app/assets/images/pages/base/play_button.png b/app/assets/images/pages/base/play_button.png
new file mode 100644
index 000000000..7d4c74966
Binary files /dev/null and b/app/assets/images/pages/base/play_button.png differ
diff --git a/app/assets/images/pages/base/repeat-tile.png b/app/assets/images/pages/base/repeat-tile.png
deleted file mode 100644
index 16186dbee..000000000
Binary files a/app/assets/images/pages/base/repeat-tile.png and /dev/null differ
diff --git a/app/assets/images/pages/base/sky_repeater.png b/app/assets/images/pages/base/sky_repeater.png
deleted file mode 100644
index 824fb83f8..000000000
Binary files a/app/assets/images/pages/base/sky_repeater.png and /dev/null differ
diff --git a/app/assets/images/pages/game-menu/slot-icons.png b/app/assets/images/pages/game-menu/slot-icons.png
index 590e8d09c..b7ad722b1 100644
Binary files a/app/assets/images/pages/game-menu/slot-icons.png and b/app/assets/images/pages/game-menu/slot-icons.png differ
diff --git a/app/assets/images/pages/home/app_store_badge.svg b/app/assets/images/pages/home/app_store_badge.svg
new file mode 100644
index 000000000..0fe477c56
--- /dev/null
+++ b/app/assets/images/pages/home/app_store_badge.svg
@@ -0,0 +1,129 @@
+
+
+
+
diff --git a/app/assets/images/pages/home/campaign.jpg b/app/assets/images/pages/home/campaign.jpg
deleted file mode 100755
index df135c9a4..000000000
Binary files a/app/assets/images/pages/home/campaign.jpg and /dev/null differ
diff --git a/app/assets/images/pages/home/campaign_notext.jpg b/app/assets/images/pages/home/campaign_notext.jpg
deleted file mode 100644
index fa7d3c37f..000000000
Binary files a/app/assets/images/pages/home/campaign_notext.jpg and /dev/null differ
diff --git a/app/assets/images/pages/home/front_screenshot_01.png b/app/assets/images/pages/home/front_screenshot_01.png
deleted file mode 100644
index 86bdfd01e..000000000
Binary files a/app/assets/images/pages/home/front_screenshot_01.png and /dev/null differ
diff --git a/app/assets/images/pages/home/language_background_small.png b/app/assets/images/pages/home/language_background_small.png
deleted file mode 100644
index 32063a954..000000000
Binary files a/app/assets/images/pages/home/language_background_small.png and /dev/null differ
diff --git a/app/assets/images/pages/home/language_beta_sticker.png b/app/assets/images/pages/home/language_beta_sticker.png
deleted file mode 100644
index fb24c3d12..000000000
Binary files a/app/assets/images/pages/home/language_beta_sticker.png and /dev/null differ
diff --git a/app/assets/images/pages/home/language_js.png b/app/assets/images/pages/home/language_js.png
deleted file mode 100644
index 9da73cf33..000000000
Binary files a/app/assets/images/pages/home/language_js.png and /dev/null differ
diff --git a/app/assets/images/pages/home/language_python.png b/app/assets/images/pages/home/language_python.png
deleted file mode 100644
index 71f23d4ad..000000000
Binary files a/app/assets/images/pages/home/language_python.png and /dev/null differ
diff --git a/app/assets/images/pages/home/multiplayer.jpg b/app/assets/images/pages/home/multiplayer.jpg
deleted file mode 100755
index 38590f3fa..000000000
Binary files a/app/assets/images/pages/home/multiplayer.jpg and /dev/null differ
diff --git a/app/assets/images/pages/home/play_button.png b/app/assets/images/pages/home/play_button.png
new file mode 100644
index 000000000..7d4c74966
Binary files /dev/null and b/app/assets/images/pages/home/play_button.png differ
diff --git a/app/assets/images/pages/home/play_img.png b/app/assets/images/pages/home/play_img.png
deleted file mode 100644
index ffdad8dca..000000000
Binary files a/app/assets/images/pages/home/play_img.png and /dev/null differ
diff --git a/app/assets/images/pages/home/video_border.png b/app/assets/images/pages/home/video_border.png
deleted file mode 100644
index b07b2f2eb..000000000
Binary files a/app/assets/images/pages/home/video_border.png and /dev/null differ
diff --git a/app/assets/images/pages/home/wizard.png b/app/assets/images/pages/home/wizard.png
deleted file mode 100644
index f31990f6a..000000000
Binary files a/app/assets/images/pages/home/wizard.png and /dev/null differ
diff --git a/app/assets/images/pages/home/multiplayer_notext.jpg b/app/assets/images/pages/play/ladder/multiplayer_notext.jpg
similarity index 100%
rename from app/assets/images/pages/home/multiplayer_notext.jpg
rename to app/assets/images/pages/play/ladder/multiplayer_notext.jpg
diff --git a/app/assets/images/pages/play/map_dungeon.jpg b/app/assets/images/pages/play/map_dungeon.jpg
index 99cb97aec..2f5af9992 100644
Binary files a/app/assets/images/pages/play/map_dungeon.jpg and b/app/assets/images/pages/play/map_dungeon.jpg differ
diff --git a/app/assets/main.html b/app/assets/main.html
index 24b1c18f2..2b468e27f 100644
--- a/app/assets/main.html
+++ b/app/assets/main.html
@@ -43,8 +43,6 @@
-
-
diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index f12c213ef..8c50abf28 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -330,6 +330,8 @@ 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'
+ continue # No team colors for heroes on single-player levels
for component in thang.components
if team = component.config?.team
@thangTypeTeams[thang.thangType] ?= []
diff --git a/app/lib/LevelOptions.coffee b/app/lib/LevelOptions.coffee
index e80605cd8..efd5b6220 100644
--- a/app/lib/LevelOptions.coffee
+++ b/app/lib/LevelOptions.coffee
@@ -108,6 +108,7 @@ module.exports = LevelOptions =
hidesSay: true
hidesCodeToolbar: true
hidesRealTimePlayback: true
+ moveRightLoopSnippet: true
requiredGear: {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
restrictedGear: {feet: 'leather-boots'}
requiredCode: ['loop']
@@ -123,6 +124,7 @@ module.exports = LevelOptions =
hidesSay: true
hidesCodeToolbar: true
hidesRealTimePlayback: true
+ moveRightLoopSnippet: true
requiredGear: {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
restrictedGear: {feet: 'leather-boots'}
'dread-door':
@@ -186,7 +188,7 @@ module.exports = LevelOptions =
hidesCodeToolbar: true
hidesRealTimePlayback: true
requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'tarnished-bronze-breastplate', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
- restrictedGear: {feet: 'leather-boots'}
+ restrictedGear: {feet: 'leather-boots', 'right-hand': 'crude-builders-hammer'}
suspectCode: [{name: 'lone-find-nearest-enemy', pattern: /^[ ]*(self|this|@)?[:.]?findNearestEnemy()/m}]
'kithgard-gates':
hidesSay: true
@@ -261,6 +263,7 @@ module.exports = LevelOptions =
'bonemender':
requiredGear: {waist: 'leather-belt', 'programming-book': 'programmaticon-ii', eyes: 'wooden-glasses', 'right-hand': 'enchanted-stick', 'left-hand': 'book-of-life-i', wrists: 'sundial-wristwatch'}
restrictedGear: {'left-hand': 'unholy-tome-i'}
+ requiredCode: ['canCast']
'coinucopia':
requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', 'programming-book': 'programmaticon-ii', flag: 'basic-flags'}
diff --git a/app/lib/sprites/SpriteBuilder.coffee b/app/lib/sprites/SpriteBuilder.coffee
index 91ee6a07e..dde680984 100644
--- a/app/lib/sprites/SpriteBuilder.coffee
+++ b/app/lib/sprites/SpriteBuilder.coffee
@@ -96,6 +96,8 @@ module.exports = class SpriteBuilder
shape.graphics.lf shapeData.lf...
else if shapeData.fc?
shape.graphics.f @colorMap[shapeKey] or shapeData.fc
+ else if shapeData.rf?
+ shape.graphics.rf shapeData.rf...
if shapeData.ls?
shape.graphics.ls shapeData.ls...
else if shapeData.sc?
diff --git a/app/lib/sprites/SpriteParser.coffee b/app/lib/sprites/SpriteParser.coffee
index 408664220..361dc8411 100644
--- a/app/lib/sprites/SpriteParser.coffee
+++ b/app/lib/sprites/SpriteParser.coffee
@@ -52,7 +52,7 @@ module.exports = class SpriteParser
container.bounds[0] -= @width / 2
container.bounds[1] -= @height / 2
[shapeKeys, localShapes] = @getShapesFromBlock container, source
- localContainers = @getContainersFromMovieClip container, source
+ localContainers = @getContainersFromMovieClip container, source, true # Added true because anya attack was breaking, but might break other imports
addChildArgs = @getAddChildCallArguments container, source
instructions = []
for bn in addChildArgs
@@ -248,9 +248,13 @@ module.exports = class SpriteParser
if fillCall.callee.property.name is 'lf'
linearGradientFillSource = @subSourceFromRange fillCall.parent.range, source
linearGradientFill = @grabFunctionArguments linearGradientFillSource.replace(/.*?lf\(/, 'lf('), true
+ else if fillCall.callee.property.name is 'rf'
+ radialGradientFillSource = @subSourceFromRange fillCall.parent.range, source
+ radialGradientFill = @grabFunctionArguments radialGradientFillSource.replace(/.*?lf\(/, 'lf('), true
else
fillColor = fillCall.arguments[0]?.value ? null
- console.error 'What is this?! Not a fill!' unless fillCall.callee.property.name is 'f'
+ callName = fillCall.callee.property.name
+ console.error 'What is this?! Not a fill!', callName unless callName is 'f'
strokeCall = node.parent.parent.parent.parent
if strokeCall.object.callee.property.name is 'ls'
linearGradientStrokeSource = @subSourceFromRange strokeCall.parent.range, source
@@ -301,6 +305,7 @@ module.exports = class SpriteParser
shape.ss = strokeStyle if strokeStyle
shape.fc = fillColor if fillColor
shape.lf = linearGradientFill if linearGradientFill
+ shape.rf = radialGradientFill if radialGradientFill
shape.ls = linearGradientStroke if linearGradientStroke
if name.search('shape') isnt -1 and shape.fc is 'rgba(0,0,0,0.451)' and not shape.ss and not shape.sc
console.log 'Skipping a shadow', name, shape, 'because we\'re doing shadows separately now.'
diff --git a/app/lib/surface/Camera.coffee b/app/lib/surface/Camera.coffee
index 7848828e3..7b27eb740 100644
--- a/app/lib/surface/Camera.coffee
+++ b/app/lib/surface/Camera.coffee
@@ -285,7 +285,7 @@ module.exports = class Camera extends CocoClass
@currentTarget = target
viewportDifference = @updateViewports target
if viewportDifference > 0.1 # Roughly 0.1 pixel difference in what we can see
- Backbone.Mediator.publish 'camera:zoom-updated', camera: @, zoom: @zoom, surfaceViewport: @surfaceViewport
+ Backbone.Mediator.publish 'camera:zoom-updated', camera: @, zoom: @zoom, surfaceViewport: @surfaceViewport, minZoom: @minZoom
boundTarget: (pos, zoom) ->
# Given an {x, y} in Surface coordinates, return one that will keep our viewport on the Surface.
diff --git a/app/lib/surface/Lank.coffee b/app/lib/surface/Lank.coffee
index 16d76032d..7e4bb6a1f 100644
--- a/app/lib/surface/Lank.coffee
+++ b/app/lib/surface/Lank.coffee
@@ -104,7 +104,8 @@ module.exports = Lank = class Lank extends CocoClass
@sprite.destroy?()
if parent = @sprite.parent
parent.removeChild @sprite
- parent.addChild newSprite
+ if parent.spriteSheet is newSprite.spriteSheet
+ parent.addChild newSprite
# get the lank to update things
for prop in ['lastPos', 'currentRootAction']
@@ -691,6 +692,11 @@ module.exports = Lank = class Lank extends CocoClass
return true if /^attack /.test m
return true if /^Repeating loop/.test m
return true if /^findNearestEnemy/.test m
+ @previouslySaidMessages ?= {}
+ t0 = @previouslySaidMessages[m] ? 0
+ t1 = new Date()
+ @previouslySaidMessages[m] = t1
+ return true if t1 - t0 < 5 * 1000
false
playSounds: (withDelay=true, volume=1.0) ->
diff --git a/app/lib/surface/LayerAdapter.coffee b/app/lib/surface/LayerAdapter.coffee
index 6e8fa5c93..4689ae926 100644
--- a/app/lib/surface/LayerAdapter.coffee
+++ b/app/lib/surface/LayerAdapter.coffee
@@ -95,12 +95,13 @@ module.exports = LayerAdapter = class LayerAdapter extends CocoClass
if aLank = a.lank
if aThang = aLank.thang
aPos = aThang.pos
- if aThang.health < 0
+ if aThang.health < 0 and aThang.pos.z <= aThang.depth / 2
+ # Nice for not being knee deep in the dead, just not nice for ogres flying behind trees when exploded
--az
if bLank = b.lank
if bThang = bLank.thang
bPos = bThang.pos
- if bThang.health < 0
+ if bThang.health < 0 and bThang.pos.z <= bThang.depth / 2
--bz
if az is bz
return 0 unless aPos and bPos
diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee
index 195dab4b2..dfd0f35f2 100644
--- a/app/lib/surface/Surface.coffee
+++ b/app/lib/surface/Surface.coffee
@@ -384,6 +384,11 @@ module.exports = Surface = class Surface extends CocoClass
if @ended
@setPaused false
@surfaceZoomPauseTimeout = _.delay (=> @setPaused true), 3000
+ @zoomedIn = e.zoom > e.minZoom * 1.1
+ @updateGrabbability()
+
+ updateGrabbability: ->
+ @webGLCanvas.toggleClass 'grabbable', @zoomedIn and not @playing and not @disabled
onDisableControls: (e) ->
return if e.controls and not ('surface' in e.controls)
@@ -400,6 +405,7 @@ module.exports = Surface = class Surface extends CocoClass
setDisabled: (@disabled) ->
@lankBoss.disabled = @disabled
+ @updateGrabbability()
onSetPlaying: (e) ->
@playing = (e ? {}).playing ? true
@@ -408,6 +414,7 @@ module.exports = Surface = class Surface extends CocoClass
@currentFrame = 1 # Go back to the beginning (but not frame 0, that frame is weird)
if @fastForwardingToFrame and not @playing
@fastForwardingToFrame = null
+ @updateGrabbability()
onSetTime: (e) ->
toFrame = @currentFrame
diff --git a/app/lib/world/thang.coffee b/app/lib/world/thang.coffee
index 6ce13df66..0c7721081 100644
--- a/app/lib/world/thang.coffee
+++ b/app/lib/world/thang.coffee
@@ -173,6 +173,8 @@ module.exports = class Thang
getLankOptions: ->
colorConfigs = @teamColors or @world?.getTeamColors() or {}
options = {colorConfig: {}}
+ if @id is 'Hero Placeholder' and not @world.getThangByID 'Hero Placeholder 1'
+ return options # No team colors for heroes on single-player levels
if @team and teamColor = colorConfigs[@team]
options.colorConfig.team = teamColor
if @color and color = @grabColorConfig @color
diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee
index 44afe6448..fcd3d0421 100644
--- a/app/locale/ar.coffee
+++ b/app/locale/ar.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
for_beginners: "للمبتدئين"
multiplayer: "متعدد اللاعبين" # Not currently shown on home page
for_developers: "للمطوّرين" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "إلعب" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
amount_achieved: "مبلغ"
achievement: "الإنجاز"
category_contributor: "مساهم"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "متنوعة"
category_levels: "مستويات"
category_undefined: "غير مصنف"
diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee
index de3108a77..a6f44ba04 100644
--- a/app/locale/bg.coffee
+++ b/app/locale/bg.coffee
@@ -4,12 +4,13 @@ module.exports = nativeDescription: "български език", englishDescri
no_ie: "CodeCombat не работи под Internet Explorer 8 или по-стари версии. Съжалявам!" # Warning that only shows up in IE8 and older
no_mobile: "CodeCombat не е направен за мобилни устройства и може да не работи!" # Warning that shows up on mobile devices
play: "Играй" # The big play button that just starts playing a level
- old_browser: "О, не! Браузърът ти е твърде стар за CodeCombat. Съжалявам!" #"Uh oh, your browser is too old to run CodeCombat. Sorry!" # Warning that shows up on really old Firefox/Chrome/Safari
- old_browser_suffix: "Все пак можеш да опиваш, но най-вероятно няма да проработи." # "You can try anyway, but it probably won't work."
+ old_browser: "О, не! Браузърът ти е твърде стар за CodeCombat. Съжалявам!" # Warning that shows up on really old Firefox/Chrome/Safari
+ old_browser_suffix: "Все пак можеш да опиваш, но най-вероятно няма да проработи."
# campaign: "Campaign"
- for_beginners: "За начинаещи" # "For Beginners"
+ for_beginners: "За начинаещи"
# multiplayer: "Multiplayer" # Not currently shown on home page
- for_developers: "За разработчици" # "For Developers" # Not currently shown on home page.
+ for_developers: "За разработчици" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Нива" # The top nav bar entry where players choose which levels to play
@@ -23,12 +24,12 @@ module.exports = nativeDescription: "български език", englishDescri
# code: "Code"
# admin: "Admin" # Only shows up when you are an admin
home: "Начало"
- contribute: "Допринеси" # "Contribute"
+ contribute: "Допринеси"
# legal: "Legal"
about: "За нас"
contact: "Контакти"
- twitter_follow: "Започни да следиш" # "Follow"
- teachers: "Учители" # "Teachers"
+ twitter_follow: "Започни да следиш"
+ teachers: "Учители"
modal:
close: "Затвори"
@@ -39,19 +40,19 @@ module.exports = nativeDescription: "български език", englishDescri
diplomat_suggestion:
title: "Помогни да преведем CodeCombat!" # This shows up when a player switches to a non-English language using the language selector.
- sub_heading: "Имаме нужда от твоите езикови познания!" # "We need your language skills."
+ sub_heading: "Имаме нужда от твоите езикови познания!"
pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Bulgarian but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Bulgarian."
missing_translations: "Until we can translate everything into Bulgarian, you'll see English when Bulgarian isn't available."
learn_more: "Научи повече за това как да станеш Дипломат"
- subscribe_as_diplomat: "Стани дипломат" # "Subscribe as a Diplomat"
+ subscribe_as_diplomat: "Стани дипломат"
play:
# play_as: "Play As" # Ladder page
# spectate: "Spectate" # Ladder page
# players: "players" # Hover over a level on /play
# hours_played: "hours played" # Hover over a level on /play
- items: "Предмети" # "Items" # Tooltip on item shop button from /play
- unlock: "Отключи" # "Unlock" # For purchasing items and heroes
+ items: "Предмети" # Tooltip on item shop button from /play
+ unlock: "Отключи" # For purchasing items and heroes
confirm: "Потвърди"
# owned: "Owned" # For items you own
locked: "Заключено"
@@ -64,27 +65,27 @@ module.exports = nativeDescription: "български език", englishDescri
# next: "Next" # Go from choose hero to choose inventory before playing a level
# change_hero: "Change Hero" # Go back from choose inventory to choose hero
# choose_inventory: "Equip Items"
- buy_gems: "Купи скъпоценни камъни" # "Buy Gems"
- older_campaigns: "Предишни капмании" # "Older Campaigns"
- anonymous: "Анонимен играч" # "Anonymous Player"
- level_difficulty: "Трудност" # "Difficulty: "
- campaign_beginner: "Кампания за начинаещи" # "Beginner Campaign"
+ buy_gems: "Купи скъпоценни камъни"
+ older_campaigns: "Предишни капмании"
+ anonymous: "Анонимен играч"
+ level_difficulty: "Трудност"
+ campaign_beginner: "Кампания за начинаещи"
# awaiting_levels_adventurer_prefix: "We release five levels per week."
- awaiting_levels_adventurer: "Стани Приключенец" # "Sign up as an Adventurer"
- awaiting_levels_adventurer_suffix: "за да бъдеш първият, който играе нови нива." # "to be the first to play new levels."
+ awaiting_levels_adventurer: "Стани Приключенец"
+ awaiting_levels_adventurer_suffix: "за да бъдеш първият, който играе нови нива."
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_forum: "Приключенският форум"
# adventurer_suffix: "."
- campaign_old_beginner: "Предишни кампании за начинаещи" # "Old Beginner Campaign"
+ campaign_old_beginner: "Предишни кампании за начинаещи"
# campaign_old_beginner_description: "... in which you learn the wizardry of programming."
- campaign_dev: "Случайни трудни нива" # "Random Harder Levels"
+ campaign_dev: "Случайни трудни нива"
# 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 Artisan Wizards."
- campaign_classic_algorithms: "Класически алгоритми" # "Classic Algorithms"
+ campaign_classic_algorithms: "Класически алгоритми"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# campaign_forest: "Forest Campaign"
# campaign_dungeon: "Dungeon Campaign"
@@ -115,13 +116,13 @@ module.exports = nativeDescription: "български език", englishDescri
recover:
recover_account_title: "Възстанови Акаунт"
send_password: "Изпрати парола за възстановяване"
- recovery_sent: "Писмото за възстановяване на парола е изпратено." # "Recovery email sent."
+ recovery_sent: "Писмото за възстановяване на парола е изпратено."
# items:
# primary: "Primary"
# secondary: "Secondary"
# armor: "Armor"
- accessories: "Аксесоари" # "Accessories"
+# accessories: "Accessories"
# misc: "Misc"
# books: "Books"
@@ -145,11 +146,11 @@ module.exports = nativeDescription: "български език", englishDescri
general:
and: "и"
name: "Име"
- date: "Дата" # "Date"
+ date: "Дата"
# body: "Body"
version: "Версия"
# commit_msg: "Commit Message"
- version_history: "Предишни версии" # "Version History"
+ version_history: "Предишни версии"
# version_history_for: "Version History for: "
# result: "Result"
results: "Резултати"
@@ -157,7 +158,7 @@ module.exports = nativeDescription: "български език", englishDescri
or: "или"
# subject: "Subject"
email: "Email"
- password: "Парола" # "Password"
+ password: "Парола"
message: "Съобщение"
# code: "Code"
# ladder: "Ladder"
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "български език", englishDescri
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "български език", englishDescri
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "български език", englishDescri
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -405,10 +429,10 @@ module.exports = nativeDescription: "български език", englishDescri
# cla_prefix: "To save changes, first you must agree to our"
# cla_url: "CLA"
# cla_suffix: "."
- cla_agree: "СЪГЛАСЕН СЪМ" # "I AGREE"
+# cla_agree: "I AGREE"
# contact:
- contact_us: "Свържи се с CodeCombat" # "Contact CodeCombat"
+# contact_us: "Contact CodeCombat"
# welcome: "Good to hear from you! Use this form to send us email. "
# contribute_prefix: "If you're interested in contributing, check out our "
# contribute_page: "contribute page"
@@ -430,17 +454,17 @@ module.exports = nativeDescription: "български език", englishDescri
# password_tab: "Password"
# emails_tab: "Emails"
# admin: "Admin"
- new_password: "Нова парола" # "New Password"
+# new_password: "New Password"
# new_password_verify: "Verify"
# email_subscriptions: "Email Subscriptions"
# email_subscriptions_none: "No Email Subscriptions."
- email_announcements: "Съобщения" # "Announcements"
+# email_announcements: "Announcements"
# email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
- email_notifications: "Известия" # "Notifications"
+# email_notifications: "Notifications"
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
# email_any_notes: "Any Notifications"
# email_any_notes_description: "Disable to stop all activity notification emails."
- email_news: "Новини" # "News"
+# email_news: "News"
# email_recruit_notes: "Job Opportunities"
# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job."
# contributor_emails: "Contributor Class Emails"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "български език", englishDescri
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee
index a8828d10f..b4062a62b 100644
--- a/app/locale/ca.coffee
+++ b/app/locale/ca.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
for_beginners: "Per a principiants"
multiplayer: "Multijugador" # Not currently shown on home page
for_developers: "Per a Desenvolupadors" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Nivells" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
failing: "Fallant"
action_timeline: "Cronologia d'accions"
# 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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Escull el teu heroi"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# blocks: "Blocks" # As in "this shield blocks this much damage"
skills: "Habilitats"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Desats"
granularity_change_history: "Historial"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
amount_achieved: "Cantitat"
achievement: "Triomf"
category_contributor: "Contribuidor"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Miscel·lània"
category_levels: "Nivells"
category_undefined: "Sense categoria"
diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee
index 0f55bdc94..3f3af785d 100644
--- a/app/locale/cs.coffee
+++ b/app/locale/cs.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Úrovně" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# failing: "Failing"
action_timeline: "Časová osa"
click_to_select: "Vyberte kliknutím."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Znovunačíst veškerý kód?"
reload_really: "Opravdu chcete resetovat tuto úroveň do počátečního stavu?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/da.coffee b/app/locale/da.coffee
index 24149009a..9632260a0 100644
--- a/app/locale/da.coffee
+++ b/app/locale/da.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
for_beginners: "For Begyndere"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "For Udviklere" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Spil" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# failing: "Failing"
action_timeline: "Handlingstidslinje"
click_to_select: "Klik på en enhed for at vælge"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Genindlæs alt kode?"
reload_really: "Er du sikker på at du ønsker at genindlæse denne bane helt fra begyndelsen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee
index eefe6fe44..cca647469 100644
--- a/app/locale/de-AT.coffee
+++ b/app/locale/de-AT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
for_beginners: "Für Anfänger"
multiplayer: "Mehrspieler" # Not currently shown on home page
for_developers: "Für Entwickler" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Spielen" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
# failing: "Failing"
action_timeline: "Aktionszeitstrahl"
click_to_select: "Klicke auf eine Einheit, um sie auszuwählen."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Gesamten Code neu laden?"
reload_really: "Bist Du sicher, dass Du das Level neu beginnen willst?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Wähle deinen Helden"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Gespeichert"
granularity_change_history: "Historie"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
amount_achieved: "Anzahl"
achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Sonstiges"
category_levels: "Level"
category_undefined: "ohne Kategorie"
diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee
index bca160b09..3ada8310f 100644
--- a/app/locale/de-CH.coffee
+++ b/app/locale/de-CH.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
for_beginners: "Für Afänger"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Für Entwickler" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
failing: "Fehler"
action_timeline: "Aktionsziitleiste"
click_to_select: "Klick uf e Einheit zum sie uswähle."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "De ganze Code neu lade?"
reload_really: "Bisch sicher du willsch level neu lade bis zrugg zum Afang?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee
index 09be531d0..12ea5069e 100644
--- a/app/locale/de-DE.coffee
+++ b/app/locale/de-DE.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
for_beginners: "Für Anfänger"
multiplayer: "Mehrspieler" # Not currently shown on home page
for_developers: "Für Entwickler" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Spielen" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
failing: "Fehlgeschlagen"
action_timeline: "Aktionszeitstrahl"
click_to_select: "Klicke auf eine Einheit, um sie auszuwählen."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
reload: "Neu laden"
reload_title: "Gesamten Code neu laden?"
reload_really: "Bist Du sicher, dass Du das Level neu beginnen willst?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
few_gems: "Ein paar Edelsteine"
pile_gems: "Stapel von Edelsteinen"
chest_gems: "Kiste von Edelsteinen"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Wähle deinen Helden"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
blocks: "Blockieren" # As in "this shield blocks this much damage"
skills: "Fähigkeiten"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Gespeichert"
granularity_change_history: "Historie"
@@ -587,7 +611,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
page_title: "Mitwirken"
character_classes_title: "Charakter Klassen"
introduction_desc_intro: "Wir haben hohe Erwartungen für CodeCombat."
-# introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, "
+# introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, "
introduction_desc_github_url: "CodeCombat ist komplett OpenSource"
# introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours."
introduction_desc_ending: "Wir hoffen du nimmst an unserer Party teil!"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
amount_achieved: "Anzahl"
achievement: "Achievement"
category_contributor: "Mitwirkender"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Sonstiges"
category_levels: "Level"
category_undefined: "ohne Kategorie"
diff --git a/app/locale/el.coffee b/app/locale/el.coffee
index ab50ce914..1a75aff2c 100644
--- a/app/locale/el.coffee
+++ b/app/locale/el.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
for_beginners: "Για αρχάριους"
multiplayer: "Πολλαπλοί Παίκτες" # Not currently shown on home page
for_developers: "Για προγραμματιστές" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Επίπεδα" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
# failing: "Failing"
action_timeline: "Χρονοδιάγραμμα δράσης"
click_to_select: "Κάντε κλικ σε μια μονάδα για να το επιλέξετε."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Ανανέωση όλου του κωδικά;"
reload_really: "Είστε σίγουροι ότι θέλετε να φορτώσετε αυτό το επίπεδο από την αρχή;"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee
index caeba616e..9550bac2b 100644
--- a/app/locale/en-AU.coffee
+++ b/app/locale/en-AU.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee
index a94ec00b4..9231d7c1a 100644
--- a/app/locale/en-GB.coffee
+++ b/app/locale/en-GB.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee
index ddfc418ae..440d59d2b 100644
--- a/app/locale/en-US.coffee
+++ b/app/locale/en-US.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index d18e02d86..987e29bdb 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -10,6 +10,7 @@
for_beginners: "For Beginners"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "For Developers" # Not currently shown on home page.
+ or_ipad: "Or download for iPad"
nav:
play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -350,6 +351,24 @@
blocks: "Blocks" # As in "this shield blocks this much damage"
skills: "Skills"
+ skill_docs:
+ writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+ read_only: "read-only"
+ action_name: "name"
+ action_cooldown: "Takes"
+ action_specific_cooldown: "Cooldown"
+ action_damage: "Damage"
+ action_range: "Range"
+ action_radius: "Radius"
+ action_duration: "Duration"
+ example: "Example"
+ ex: "ex" # Abbreviation of "example"
+ current_value: "Current Value"
+ default_value: "Default value"
+ parameters: "Parameters"
+ returns: "Returns"
+ granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Saved"
granularity_change_history: "History"
diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee
index 3e83a46a4..c10af814c 100644
--- a/app/locale/es-419.coffee
+++ b/app/locale/es-419.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
for_beginners: "Para Principiantes"
multiplayer: "Multijugador" # Not currently shown on home page
for_developers: "Para Desarrolladores" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Jugar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
failing: "Fallando"
action_timeline: "Cronologia de Accion"
click_to_select: "Has click en una unidad para seleccionarla."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "¿Recargar Todo el Código?"
reload_really: "¿Estás seguro de que quieres empezar este nivel desde el principio?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Elige tu héroe"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Almacenado"
granularity_change_history: "Historia"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee
index f6536648f..94cb3e038 100644
--- a/app/locale/es-ES.coffee
+++ b/app/locale/es-ES.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
for_beginners: "Para principiantes"
multiplayer: "Multijugador" # Not currently shown on home page
for_developers: "Para programadores" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Jugar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
failing: "Fallando"
action_timeline: "Cronología de Acción"
click_to_select: "Click en una unidad para seleccionarla"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "¿Recargar todo el código?"
reload_really: "¿Estas seguro que quieres reiniciar el nivel?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Selecciona tu Heroe"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
# blocks: "Blocks" # As in "this shield blocks this much damage"
skills: "Habilidades"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Salvado"
granularity_change_history: "Historia"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
amount_achieved: "Cantidad"
achievement: "Logro"
category_contributor: "Contribuidor"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Miscelanea"
category_levels: "Niveles"
category_undefined: "Sin categorizar"
diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee
index 126cf153e..91556148a 100644
--- a/app/locale/fa.coffee
+++ b/app/locale/fa.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "سطوح" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee
index 1ac382a95..200e5e610 100644
--- a/app/locale/fi.coffee
+++ b/app/locale/fi.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee
index 1acbd3846..6ba8ff7ef 100644
--- a/app/locale/fr.coffee
+++ b/app/locale/fr.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
for_beginners: "Pour débutants"
multiplayer: "Multijoueurs" # Not currently shown on home page
for_developers: "Pour développeurs" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Jouer" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
failing: "Échec"
action_timeline: "Action sur la ligne de temps"
click_to_select: "Clique sur une unité pour la sélectionner."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Recharger tout le code?"
reload_really: "Êtes-vous sûr de vouloir recharger ce niveau et retourner au début?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Choisissez votre Héro"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
# blocks: "Blocks" # As in "this shield blocks this much damage"
skills: "Compétences"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Sauvegardé"
granularity_change_history: "Historique"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
amount_achieved: "Quantité"
achievement: "Succès"
category_contributor: "Contributeur"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Divers"
category_levels: "Niveaux"
category_undefined: "Non classé"
diff --git a/app/locale/gl.coffee b/app/locale/gl.coffee
index f5e87f1aa..18a0ec771 100644
--- a/app/locale/gl.coffee
+++ b/app/locale/gl.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
for_beginners: "Para principiantes"
multiplayer: "Multixogador" # Not currently shown on home page
for_developers: "Para programadores" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Xogar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
failing: "Fallando"
action_timeline: "Cronoloxía de Acción"
click_to_select: "Preme nunha unidade para seleccionala"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Recargar todo o código?"
reload_really: "Estás seguro que queres reiniciar o nivel?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Selecciona o teu Heroe"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
# blocks: "Blocks" # As in "this shield blocks this much damage"
skills: "Habilidades"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Gardado"
granularity_change_history: "Historia"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
amount_achieved: "Cantidade"
achievement: "Logro"
category_contributor: "Contribuidor"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Miscelánea"
category_levels: "Niveis"
category_undefined: "Sen categorizar"
diff --git a/app/locale/he.coffee b/app/locale/he.coffee
index 09e3914d9..20d669e2b 100644
--- a/app/locale/he.coffee
+++ b/app/locale/he.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
for_beginners: "למתחילים"
multiplayer: "רב-משתתפים" # Not currently shown on home page
for_developers: "למומחים" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "שלבים" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee
index 7f6018cb6..6f2b67f4d 100644
--- a/app/locale/hi.coffee
+++ b/app/locale/hi.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee
index 5ff8c447e..d87e401e8 100644
--- a/app/locale/hu.coffee
+++ b/app/locale/hu.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
for_beginners: "Kezdőknek"
# multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Fejlesztőknek" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Játék" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
# failing: "Failing"
action_timeline: "Akció - Idővonal"
click_to_select: "Kattints egy egységre, hogy kijelöld!"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Újra kezded mindet?"
reload_really: "Biztos vagy benne, hogy előlről szeretnéd kezdeni az egész pályát?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/id.coffee b/app/locale/id.coffee
index 67b838a8f..be6888644 100644
--- a/app/locale/id.coffee
+++ b/app/locale/id.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/it.coffee b/app/locale/it.coffee
index b1e261777..11bb86072 100644
--- a/app/locale/it.coffee
+++ b/app/locale/it.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
for_beginners: "Per Principianti"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Per Sviluppatori" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Livelli" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
# failing: "Failing"
action_timeline: "Barra temporale delle azioni"
click_to_select: "Clicca un'unità per selezionarla."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
reload: "Ricarica"
reload_title: "Ricarica tutto il codice?"
reload_really: "Sei sicuro di voler ricominciare il livello?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Salvato"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee
index 8ea8ac26c..e1b04fe7e 100644
--- a/app/locale/ja.coffee
+++ b/app/locale/ja.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
for_beginners: "初心者向け"
multiplayer: "マルチプレイヤー" # Not currently shown on home page
for_developers: "開発者向け" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "ゲームスタート" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# failing: "Failing"
action_timeline: "アクション・タイムライン"
click_to_select: "ユニットを左クリックで選択してください"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "コードを再読み込ますか?"
reload_really: "レベルをリセットします。よろしいですか?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee
index ba5b8aaec..44383efbc 100644
--- a/app/locale/ko.coffee
+++ b/app/locale/ko.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
for_beginners: "초보자용"
multiplayer: "멀티플레이어" # Not currently shown on home page
for_developers: "개발자용" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "레벨" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
failing: "다시 한번 더 도전해보세요."
action_timeline: "액션 타임라인"
click_to_select: "유닛을 선택하기 위해서 유닛을 마우스로 클릭하세요."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "모든 코드가 다시 로딩 되었나요?"
reload_really: "모든 레벨 초기화합니다. 확실한가요?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee
index 905d27914..f4074d540 100644
--- a/app/locale/lt.coffee
+++ b/app/locale/lt.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee
index d0db7a9e9..6d52afcad 100644
--- a/app/locale/ms.coffee
+++ b/app/locale/ms.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Mula" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee
index c53b55eef..89be9a4cf 100644
--- a/app/locale/nb.coffee
+++ b/app/locale/nb.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
for_beginners: "For Begynnere"
multiplayer: "Flerspiller" # Not currently shown on home page
for_developers: "For Utviklere" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Spill" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# failing: "Failing"
action_timeline: "Hendelsestidslinje"
click_to_select: "Klikk på en enhet for å velge den."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Laste All Koden på Nytt?"
reload_really: "Er du sikker på at du vil laste dette nivået på nytt, tilbake til begynnelsen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee
index 4e73d27ac..8663012cb 100644
--- a/app/locale/nl-BE.coffee
+++ b/app/locale/nl-BE.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
for_beginners: "Voor Beginners"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Voor ontwikkelaars" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
# failing: "Failing"
action_timeline: "Actie tijdlijn"
click_to_select: "Klik op een eenheid om deze te selecteren."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Alle Code Herladen?"
reload_really: "Weet je zeker dat je dit level tot het begin wilt herladen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee
index ec4bc3a19..83b7668dc 100644
--- a/app/locale/nl-NL.coffee
+++ b/app/locale/nl-NL.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
for_beginners: "Voor Beginners"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Voor ontwikkelaars" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
# failing: "Failing"
action_timeline: "Actie tijdlijn"
click_to_select: "Klik op een eenheid om deze te selecteren."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Alle Code Herladen?"
reload_really: "Weet je zeker dat je dit level tot het begin wilt herladen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee
index 0fb22f26b..227eaeaf9 100644
--- a/app/locale/nn.coffee
+++ b/app/locale/nn.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/no.coffee b/app/locale/no.coffee
index c5c38a972..fae0aa831 100644
--- a/app/locale/no.coffee
+++ b/app/locale/no.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Spill" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# failing: "Failing"
action_timeline: "Hendelsestidslinje"
click_to_select: "Klikk på en enhet for å velge den."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Laste all koden på nytt?"
reload_really: "Er du sikker på at du vil laste dette nivået på nytt, tilbake til begynnelsen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee
index 649dcf229..b5cd7f9a8 100644
--- a/app/locale/pl.coffee
+++ b/app/locale/pl.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
for_beginners: "Dla początkujących"
# 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"
nav:
play: "Graj" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
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"
reload_title: "Przywrócić cały kod?"
reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 96d0a148a..62db838e7 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
for_beginners: "Para Iniciantes"
multiplayer: "Multijogador" # Not currently shown on home page
for_developers: "Para Desenvolvedores" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Jogar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
failing: "Falta"
action_timeline: "Linha do Tempo das Ações"
click_to_select: "Clique em um personagem para selecioná-lo."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Recarregar Todo o Código?"
reload_really: "Você tem certeza que quer reiniciar o estágio?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Escolha seu Herói"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Salvo"
granularity_change_history: "Histórico"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
amount_achieved: "Montante"
achievement: "Conquista"
category_contributor: "Cotribuidor"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Diversos"
category_levels: "Níveis"
category_undefined: "Sem categoria"
diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee
index bca9a067f..fcdd20cc1 100644
--- a/app/locale/pt-PT.coffee
+++ b/app/locale/pt-PT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
for_beginners: "Para Iniciantes"
multiplayer: "Multijogador" # Not currently shown on home page
for_developers: "Para Programadores" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Níveis" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
failing: "A falhar"
action_timeline: "Linha do Tempo de Ações"
click_to_select: "Clica numa unidade para selecioná-la."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
reload: "Recarregar"
reload_title: "Recarregar o Código Todo?"
reload_really: "Tens a certeza que queres recarregar este nível de volta ao início?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
few_gems: "Algumas gemas"
pile_gems: "Pilha de gemas"
chest_gems: "Arca de gemas"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Escolhe o Teu Herói"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
blocks: "Bloqueia" # As in "this shield blocks this much damage"
skills: "Habilidades"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Guardados"
granularity_change_history: "Histórico"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
amount_achieved: "Quantidade"
achievement: "Conquista"
category_contributor: "Contribuidor"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Vários"
category_levels: "Níveis"
category_undefined: "Sem Categoria"
diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee
index ec75be948..034341a82 100644
--- a/app/locale/ro.coffee
+++ b/app/locale/ro.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
for_beginners: "Pentru Începători"
multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Pentru dezvoltatori" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Nivele" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
failing: "Eşec"
action_timeline: "Timeline-ul acțiunii"
click_to_select: "Apasă pe o unitate pentru a o selecta."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Reîncarcă tot codul?"
reload_really: "Ești sigur că vrei să reîncarci nivelul de la început?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee
index a0c9f6b89..ac89842c0 100644
--- a/app/locale/ru.coffee
+++ b/app/locale/ru.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
for_beginners: "Новичкам"
multiplayer: "Мультиплеер" # Not currently shown on home page
for_developers: "Разработчикам" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Уровни" # The top nav bar entry where players choose which levels to play
@@ -64,7 +65,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
next: "Выбрать" # Go from choose hero to choose inventory before playing a level
change_hero: "Выбрать героя" # Go back from choose inventory to choose hero
choose_inventory: "Выбрать предметы"
-# buy_gems: "Buy Gems"
+ buy_gems: "Купить самоцветы"
older_campaigns: "Старые кампании"
anonymous: "Неизвестный игрок"
level_difficulty: "Сложность: "
@@ -172,7 +173,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
medium: "Нормально"
hard: "Сложно"
player: "Игрок"
-# player_level: "Level" # Like player level 5, not like level: Dungeons of Kithgard
+ player_level: "Уровень" # Like player level 5, not like level: Dungeons of Kithgard
units:
second: "секунда"
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
failing: "Неудача"
action_timeline: "График действий"
click_to_select: "Выберите персонажа, щёлкнув на нём"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
reload: "Перезагрузить"
reload_title: "Перезагрузить код полностью?"
reload_really: "Вы уверены, что хотите начать уровень сначала?"
@@ -315,17 +318,20 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
# equip: "Equip"
# unequip: "Unequip"
-# buy_gems:
-# few_gems: "A few gems"
-# pile_gems: "Pile of gems"
-# chest_gems: "Chest of gems"
+ buy_gems:
+ few_gems: "Немного самоцветов"
+ pile_gems: "Кучка самоцветов"
+ chest_gems: "Сундук с самоцветами"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Выберите героя"
programming_language: "Язык программирования"
programming_language_description: "Какой язык программирования вы хотите использовать?"
-# default: "Default"
-# experimental: "Experimental"
+ default: "По умолчанию"
+ experimental: "Экспериментальный"
python_blurb: "Пусть простой, но мощный, Python - прекрасный язык программирования общего применения."
javascript_blurb: "Язык для Сети."
coffeescript_blurb: "Улучшенный синтаксис JavaScript."
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
blocks: "Блокирует" # As in "this shield blocks this much damage"
skills: "Умения"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Сохранено"
granularity_change_history: "История"
@@ -647,9 +671,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
diplomat_launch_url: "запуска в октябре"
diplomat_introduction_suf: "было то, что есть значительная заинтересованность в CodeCombat в других странах! Мы создаём корпус переводчиков, стремящихся превратить один набор слов в другой набор слов для максимальной доступности CodeCombat по всему миру. Если вы любите видеть контент до официального выхода и получать эти уровни для ваших соотечественников как можно скорее, этот класс для вас."
diplomat_attribute_1: "Свободное владение английским языком и языком, на который вы хотели бы переводить. При передаче сложных идей важно иметь сильную хватку в обоих!"
-# diplomat_i18n_page_prefix: "You can start translating our levels by going to our"
-# diplomat_i18n_page: "translations page"
-# diplomat_i18n_page_suffix: ", or our interface and website on GitHub."
+ diplomat_i18n_page_prefix: "Вы можете начать переводить уровни, посетив нашу"
+ diplomat_i18n_page: "страницу переводчиков"
+ diplomat_i18n_page_suffix: ", или перевести наш интерфейс и сайт на GitHub."
diplomat_join_pref_github: "Найдите файл локализации вашего языка "
diplomat_github_url: "на GitHub"
diplomat_join_suf_github: ", отредактируйте его онлайн и отправьте запрос на подтверждение изменений. Кроме того, установите флажок ниже, чтобы быть в курсе новых разработок интернационализации!"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
amount_achieved: "Количество"
achievement: "Достижение"
category_contributor: "Помощь"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "Помощь"
category_levels: "Уровни"
category_undefined: "Неопределено"
diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee
index eaa896a1b..69a11569f 100644
--- a/app/locale/sk.coffee
+++ b/app/locale/sk.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
for_beginners: "Pre začiatočníkov"
# multiplayer: "Multiplayer" # Not currently shown on home page
for_developers: "Pre vývojárov" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Hraj" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee
index eff85a426..578d8f577 100644
--- a/app/locale/sl.coffee
+++ b/app/locale/sl.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee
index 02afb1fe1..5ff0ec565 100644
--- a/app/locale/sr.coffee
+++ b/app/locale/sr.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Нивои" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# failing: "Failing"
action_timeline: "Временска линија акције"
click_to_select: "Кликни на јединицу да је селектујеш"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Поновно учитавање целог кода?"
reload_really: "Да ли сте сигурни да желите да кренете ниво испочетка?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee
index 2af6e59db..9304d9878 100644
--- a/app/locale/sv.coffee
+++ b/app/locale/sv.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
for_beginners: "För nybörjare"
multiplayer: "Flera spelare" # Not currently shown on home page
for_developers: "För utvecklare" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Spela" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# failing: "Failing"
action_timeline: "Händelse-tidslinje"
click_to_select: "Klicka på en enhet för att välja den."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Ladda om all kod?"
reload_really: "Är du säker på att du vill ladda om nivån från början?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/th.coffee b/app/locale/th.coffee
index da645d672..95b7eace7 100644
--- a/app/locale/th.coffee
+++ b/app/locale/th.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "เล่น" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee
index 3a0150c9b..9c75fda6f 100644
--- a/app/locale/tr.coffee
+++ b/app/locale/tr.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
for_beginners: "Yeni Başlayanlar için"
multiplayer: "Çoklu-oyuncu Kipi" # Not currently shown on home page
for_developers: "Geliştiriciler için" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Oyna" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
failing: "Başarısız"
action_timeline: "Eylem Çizelgesi"
click_to_select: "Birimi seçmek için üzerine tıklayın."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Tüm kod yeniden yüklensin mi?"
reload_really: "Bu seviyeyi en baştan yüklemek istediğinizden emin misiniz?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "Kahramanınızı Seçin"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
# blocks: "Blocks" # As in "this shield blocks this much damage"
skills: "Yetenekler"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "Kaydedildi"
granularity_change_history: "Geçmiş"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee
index b3adc204e..b192d9d28 100644
--- a/app/locale/uk.coffee
+++ b/app/locale/uk.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
for_beginners: "Для новачків"
multiplayer: "Командна гра" # Not currently shown on home page
for_developers: "Для розробників" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Грати" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "українська мова", englishDesc
# failing: "Failing"
action_timeline: "Лінія часу"
click_to_select: "Клікніть на юніті, щоб обрати його."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Перезавантажити весь код?"
reload_really: "Ви впевнені, що хочете перезавантажити цей рівень і почати спочатку?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "українська мова", englishDesc
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "українська мова", englishDesc
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "українська мова", englishDesc
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee
index 590159202..aca26620b 100644
--- a/app/locale/ur.coffee
+++ b/app/locale/ur.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee
index c04c63d10..abf72134d 100644
--- a/app/locale/vi.coffee
+++ b/app/locale/vi.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
for_beginners: "Dành cho người bắt đầu chơi"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "Các cấp độ" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# failing: "Failing"
# action_timeline: "Action Timeline"
click_to_select: "Kích vào đơn vị để chọn nó."
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "Tải lại tất cả mã?"
# reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee
index 119db945c..6da6959ee 100644
--- a/app/locale/zh-HANS.coffee
+++ b/app/locale/zh-HANS.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
for_beginners: "适合初学者"
multiplayer: "多人游戏" # Not currently shown on home page
for_developers: "适合开发者" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "关卡选择" # The top nav bar entry where players choose which levels to play
@@ -55,7 +56,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
confirm: "确认"
owned: "已拥有" # For items you own
locked: "需解锁"
- available: "可用" # Available
+ available: "可用"
skills_granted: "获得技能" # Property documentation details
heroes: "英雄" # Tooltip on hero shop button from /play
achievements: "成就" # Tooltip on achievement list button from /play
@@ -64,14 +65,14 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
next: "下一步" # Go from choose hero to choose inventory before playing a level
change_hero: "重新选择英雄" # Go back from choose inventory to choose hero
choose_inventory: "装备道具"
- buy_gems: "购买宝石" # Buy Gems
+ buy_gems: "购买宝石"
older_campaigns: "旧的战役"
anonymous: "匿名玩家"
level_difficulty: "难度:"
campaign_beginner: "新手作战"
awaiting_levels_adventurer_prefix: "我们每周开放五个关卡"
- awaiting_levels_adventurer: "注册成为冒险家" #"Sign up as an Adventurer"
- awaiting_levels_adventurer_suffix: "来优先尝试新关卡" #to be the first to play new levels."
+ awaiting_levels_adventurer: "注册成为冒险家"
+ awaiting_levels_adventurer_suffix: "来优先尝试新关卡"
choose_your_level: "选择关卡" # The rest of this section is the old play view at /play-old and isn't very important.
adventurer_prefix: "你可以选择以下任意关卡,或者讨论以上的关卡。到"
adventurer_forum: "冒险者论坛"
@@ -86,8 +87,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 技术指导."
campaign_classic_algorithms: "经典算法"
campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法"
- campaign_forest: "森林战役" #Forest Campaign"
- campaign_dungeon: "地牢战役" #Dungeon Campaign"
+ campaign_forest: "森林战役"
+ campaign_dungeon: "地牢战役"
login:
sign_up: "注册"
@@ -95,10 +96,10 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
logging_in: "正在登录"
log_out: "登出"
recover: "找回账户"
- authenticate_gplus: "使用 G+ 授权"#Authenticate G+"
- load_profile: "载入 G+ 档案" # Load G+ Profile"
- load_email: "载入 G+ 电子邮件" #Load G+ Email"
- finishing: "完成..." #Finishing"
+ authenticate_gplus: "使用 G+ 授权"
+ load_profile: "载入 G+ 档案"
+ load_email: "载入 G+ 电子邮件"
+ finishing: "完成..."
signup:
create_account_title: "创建一个账户来保存进度"
@@ -118,8 +119,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
recovery_sent: "找回账户邮件已发送."
items:
- primary: "右手"#"Primary"
- secondary: "左手"#Secondary"
+ primary: "右手"
+ secondary: "左手"
armor: "盔甲"
accessories: "配饰"
misc: "辅助道具"
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
failing: "失败"
action_timeline: "行动时间轴"
click_to_select: "点击选择一个单元。"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
reload: "重载"
reload_title: "重载所有代码?"
reload_really: "确定重载这一关,返回开始处吗?"
@@ -315,10 +318,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
equip: "装备"
unequip: "取消装备"
- buy_gems:
+ buy_gems:
few_gems: "几个宝石"
pile_gems: "一堆宝石"
chest_gems: "一箱宝石"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
choose_hero:
choose_hero: "请选择您的英雄"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
blocks: "格挡" # As in "this shield blocks this much damage"
skills: "技能"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
save_load:
granularity_saved_games: "保存"
granularity_change_history: "历史记录"
@@ -698,7 +722,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
rank_last_submitted: "已提交"
help_simulate: "模拟游戏需要帮助?"
code_being_simulated: "你的新代码正在被其他玩家模拟评分。这个将会刷新,作为一个新游戏开始。"
- # no_ranked_matches_pre: "No ranked matches for the "
+# no_ranked_matches_pre: "No ranked matches for the "
# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked."
choose_opponent: "选择一个对手"
select_your_language: "选择你使用的语言!"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
amount_achieved: "数量"
achievement: "成就"
category_contributor: "贡献"
+# category_ladder: "Ladder"
+# category_level: "Level"
category_miscellaneous: "其他"
category_levels: "等级"
category_undefined: "未分类"
diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee
index 40cf88b64..37412d438 100644
--- a/app/locale/zh-HANT.coffee
+++ b/app/locale/zh-HANT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "開始遊戲" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
# failing: "Failing"
action_timeline: "行動時間軸"
click_to_select: "點擊選擇一個單元。"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "重新載入程式碼?"
reload_really: "確定重設所有的程式碼?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
amount_achieved: "數量"
achievement: "成就"
category_contributor: "貢獻者"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
category_levels: "等級"
category_undefined: "未定義"
diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee
index 0a1e2d0ba..df7a82580 100644
--- a/app/locale/zh-WUU-HANS.coffee
+++ b/app/locale/zh-WUU-HANS.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer" # Not currently shown on home page
# for_developers: "For Developers" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
# nav:
# play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# failing: "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?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee
index c2af01631..5cd0c9b1e 100644
--- a/app/locale/zh-WUU-HANT.coffee
+++ b/app/locale/zh-WUU-HANT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
for_beginners: "適合學起頭個人"
multiplayer: "聚隊打遊戲" # Not currently shown on home page
for_developers: "適合開發個人" # Not currently shown on home page.
+# or_ipad: "Or download for iPad"
nav:
play: "遊戲開來" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# failing: "Failing"
action_timeline: "行動時間橛"
click_to_select: "點選一個單位。"
+# control_bar_multiplayer: "Multiplayer"
+# control_bar_join_game: "Join Game"
# reload: "Reload"
reload_title: "轉讀取全部個代碼?"
reload_really: "準定轉讀取箇關,回轉到扣起頭?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# few_gems: "A few gems"
# pile_gems: "Pile of gems"
# chest_gems: "Chest of gems"
+# purchasing: "Purchasing..."
+# declined: "Your card was declined"
+# retrying: "Server error, retrying."
# choose_hero:
# choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# blocks: "Blocks" # As in "this shield blocks this much damage"
# skills: "Skills"
+# skill_docs:
+# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+# read_only: "read-only"
+# action_name: "name"
+# action_cooldown: "Takes"
+# action_specific_cooldown: "Cooldown"
+# action_damage: "Damage"
+# action_range: "Range"
+# action_radius: "Radius"
+# action_duration: "Duration"
+# example: "Example"
+# ex: "ex" # Abbreviation of "example"
+# current_value: "Current Value"
+# default_value: "Default value"
+# parameters: "Parameters"
+# returns: "Returns"
+# granted_by: "Granted by"
+
# save_load:
# granularity_saved_games: "Saved"
# granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# amount_achieved: "Amount"
# achievement: "Achievement"
# category_contributor: "Contributor"
+# category_ladder: "Ladder"
+# category_level: "Level"
# category_miscellaneous: "Miscellaneous"
# category_levels: "Levels"
# category_undefined: "Uncategorized"
diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee
index fa11b19d6..b47473e09 100644
--- a/app/models/ThangType.coffee
+++ b/app/models/ThangType.coffee
@@ -389,7 +389,12 @@ module.exports = class ThangType extends CocoModel
props = props.concat config.programmableSnippets
for stat, value of stats when not value?
stats[stat] = name: stat, display: '???'
- props: props, stats: stats
+ statKeys = _.keys(stats)
+ statKeys.sort()
+ props.sort()
+ sortedStats = {}
+ sortedStats[key] = stats[key] for key in statKeys
+ props: props, stats: sortedStats
formatStatDisplay: (name, modifiers) ->
i18nKey = {
@@ -402,6 +407,7 @@ module.exports = class ThangType extends CocoModel
visualRange: 'range'
throwDamage: 'attack'
throwRange: 'range'
+ bashDamage: 'attack'
}[name]
if i18nKey
diff --git a/app/models/User.coffee b/app/models/User.coffee
index 526c0c752..07d1b83de 100644
--- a/app/models/User.coffee
+++ b/app/models/User.coffee
@@ -104,18 +104,7 @@ module.exports = class User extends CocoModel
when 2 then 'choice-explicit'
when 3 then 'choice-implicit'
@branchingGroup = 'choice-explicit' if me.isAdmin()
- @branchingGroup = 'no-practice' # paused A/B test
- #application.tracker.identify branchingGroup: @branchingGroup unless me.isAdmin() # paused A/B test
+ application.tracker.identify branchingGroup: @branchingGroup unless me.isAdmin()
@branchingGroup
- getCastButtonTextGroup: ->
- # Group 0 is original behavior
- unless @castButtonTextGroup?
- if me.isAdmin()
- @castButtonTextGroup = 0
- else
- @castButtonTextGroup = me.get('testGroupNumber') % 7
- application.tracker.identify castButtonTextGroup: @castButtonTextGroup
- @castButtonTextGroup
-
tiersByLevel = [-1, 0, 0.05, 0.14, 0.18, 0.32, 0.41, 0.5, 0.64, 0.82, 0.91, 1.04, 1.22, 1.35, 1.48, 1.65, 1.78, 1.96, 2.1, 2.24, 2.38, 2.55, 2.69, 2.86, 3.03, 3.16, 3.29, 3.42, 3.58, 3.74, 3.89, 4.04, 4.19, 4.32, 4.47, 4.64, 4.79, 4.96]
diff --git a/app/schemas/models/thang_type.coffee b/app/schemas/models/thang_type.coffee
index 5f9183745..b32713a6c 100644
--- a/app/schemas/models/thang_type.coffee
+++ b/app/schemas/models/thang_type.coffee
@@ -7,6 +7,7 @@ c.extendNamedProperties ThangTypeSchema # name first
ShapeObjectSchema = c.object {title: 'Shape'},
fc: {type: 'string', title: 'Fill Color'}
lf: {type: 'array', title: 'Linear Gradient Fill'}
+ rf: {type: 'array', title: 'Radial Gradient Fill'}
ls: {type: 'array', title: 'Linear Gradient Stroke'}
p: {type: 'string', title: 'Path'}
de: {type: 'array', title: 'Draw Ellipse'}
diff --git a/app/schemas/subscriptions/surface.coffee b/app/schemas/subscriptions/surface.coffee
index ba00491e5..4cca5321e 100644
--- a/app/schemas/subscriptions/surface.coffee
+++ b/app/schemas/subscriptions/surface.coffee
@@ -23,6 +23,7 @@ module.exports = # /app/lib/surface
camera: {type: 'object'}
zoom: {type: 'number', minimum: 0, exclusiveMinimum: true}
surfaceViewport: {type: 'object'}
+ minZoom: {type: 'number', minimum: 0, exclusiveMinimum: true}
'camera:set-camera': c.object {},
pos: c.object {required: ['x', 'y']},
diff --git a/app/schemas/subscriptions/tome.coffee b/app/schemas/subscriptions/tome.coffee
index 2d5d4a966..7cdcef7a0 100644
--- a/app/schemas/subscriptions/tome.coffee
+++ b/app/schemas/subscriptions/tome.coffee
@@ -126,6 +126,10 @@ module.exports =
codeFragment: {type: 'string'}
codeLanguage: {type: 'string'}
+ 'tome:suspect-code-fragment-deleted': c.object {title: 'Suspect Code Fragment Deleted', description: 'Published when a suspect code fragment is deleted from the sample code.', required: ['codeFragment']},
+ codeFragment: {type: 'string'}
+ codeLanguage: {type: 'string'}
+
'tome:winnability-updated': c.object {title: 'Winnability Updated', description: 'When we think we can now win (or can no longer win), we may want to emphasize the submit button versus the run button (or vice versa), so this fires when we get new goal states (even preloaded goal states) suggesting success or failure change.', required: ['winnable']},
winnable: {type: 'boolean'}
diff --git a/app/styles/bootstrap/_variables.scss b/app/styles/bootstrap/_variables.scss
index edb181e32..e2b5af123 100644
--- a/app/styles/bootstrap/_variables.scss
+++ b/app/styles/bootstrap/_variables.scss
@@ -44,7 +44,7 @@ $brand-info: $blueDark !default;
// Scaffolding
// -------------------------
-$body-bg: #2f261d;
+$body-bg: rgb(70,58,44);
$text-color: $gray !default;
// Links
diff --git a/app/styles/base.sass b/app/styles/common/common.sass
similarity index 79%
rename from app/styles/base.sass
rename to app/styles/common/common.sass
index 451e9bdca..9c70cd67f 100644
--- a/app/styles/base.sass
+++ b/app/styles/common/common.sass
@@ -1,9 +1,6 @@
@import "app/styles/bootstrap/variables"
@import "app/styles/mixins"
-html
- background-color: #2f261d
-
body
position: absolute !important
@@ -14,89 +11,9 @@ body
h1, h2, h3, h4, h5, h6
font-variant: small-caps
-.main-content-area
- box-shadow: 0px 0px 10px
- position: relative
- width: 1024px
- margin: 56px auto 0
- min-height: 600px
- padding: 14px 12px 5px 12px
- +box-sizing(border-box)
- +clearfix()
-
-#outer-content-wrapper
- background: #B4B4B4
-
-#outer-content-wrapper.show-background
- background: #8cc63f url(/images/pages/base/repeat-tile.png) top center
-
- #intermediate-content-wrapper
- background: url(/images/pages/base/sky_repeater.png) repeat-x
-
- #inner-content-wrapper
- background: url(/images/pages/base/background_texture.png) top center no-repeat
-
-#front-summary-points-left
- width: 250px
- margin: 0px 20px 10px 15px
-
-#front-summary-points-left p.lead
- margin-bottom: 5px
-
-#front-screenshot
- width: 710px
-
-.content
- width: 1024px
- margin: 0 auto
-
-.footer
- border-top: 1px solid black
- background-color: #2f261d
- p
- margin: 0
- padding-top: 10px
- padding-bottom: 10px
- text-align: center
-
- .mixpanel-badge, .firebase-badge
- width: 100px
- margin: 10px 10px 0px
-
-.footer-link-text a
- font-family: 'Open Sans Condensed', cursive
- font-variant: small-caps
- font-weight: normal
- font-size: 25px
- letter-spacing: 1px
- color: #ffffff
- cursor: pointer
- margin: 0px 10px
- &:hover
- color: $white
-
a
cursor: pointer
-.share-buttons, .partner-badges
- padding-bottom: 10px
- text-align: center
- @include opacity(0.75)
-
- &.fade-in
- @include opacity(0)
-
- &:hover, &:active
- @include opacity(1)
- @include transition(opacity .10s linear)
-
- .github-star-button
- margin-left: 20px
-
- &>div
- display: inline-block
- vertical-align: top
-
.error
left: 8px
diff --git a/app/styles/common/site-chrome.sass b/app/styles/common/site-chrome.sass
new file mode 100644
index 000000000..43cfd6087
--- /dev/null
+++ b/app/styles/common/site-chrome.sass
@@ -0,0 +1,225 @@
+@import "app/styles/bootstrap/variables"
+@import "app/styles/mixins"
+
+.site-chrome
+ background-color: white
+ &.show-background
+ background: url(/images/pages/base/background.jpg) top center no-repeat
+ background-color: rgb(150,202,68)
+ padding-top: 185px
+ max-width: 1920px
+ margin: 0 auto
+
+ //- Nav
+
+ #site-nav
+ position: absolute
+ background: url(/images/pages/base/nav_background.png) top center no-repeat
+ left: 0
+ top: 56px
+ right: 0
+ height: 144px
+ text-align: center
+ min-width: 1024px
+ z-index: 1
+
+ #nav-logo
+ position: absolute
+ margin-right: auto
+ margin-left: auto
+ left: 0
+ right: 0
+ top: -45px
+
+ #site-nav-links
+ position: absolute
+ bottom: 21px
+ left: 0
+ right: 0
+
+ a
+ color: rgb(158,135,119)
+ &:hover
+ color: $white
+
+ a, button, select
+ font-size: 18px
+ text-transform: uppercase
+ font-family: Open Sans Condensed
+ margin: 0 7px
+
+ button, select
+ position: relative
+ top: -3px
+ height: 32px
+ color: #444
+
+ .signup-button
+ background: red
+ color: white
+
+ .login-button
+ background: white
+ color: black
+
+ .language-dropdown
+ width: auto
+ display: inline-block
+
+ #site-nav-smooth-edge
+ position: absolute
+ left: 0
+ right: 0
+ bottom: 0
+ height: 5px
+
+
+ //- Account menu
+
+ .dropdown
+ .account-settings-image
+ width: 18px
+
+ .dropdown-menu
+ //left: auto // this busts it, not sure why it's in
+ width: 280px
+ padding: 0px
+ border-radius: 0px
+ font-family: Open Sans Condensed
+ font-variant: small-caps
+
+ > .user-dropdown-header
+ position: relative
+ background: #E4CF8C
+ height: 160px
+ padding: 10px
+ text-align: center
+ color: black
+ border-bottom: #32281e 1px solid
+ > a:hover
+ background-color: transparent
+ img
+ border: #e3be7a 8px solid
+ height: 98px // Includes the border
+ &:hover
+ box-shadow: 0 0 20px #e3be7a
+ > h3
+ margin-top: 10px
+ text-shadow: 2px 2px 3px white
+ color: #31281E
+ .user-level
+ position: absolute
+ top: 73px
+ right: 86px
+ color: gold
+ text-shadow: 1px 1px black, -1px -1px 0 black, 1px -1px 0 black, -1px 1px 0 black
+
+ .user-dropdown-body
+ color: black
+ padding: 15px
+ letter-spacing: 1px
+ font: 15px 'Helvetica Neue', Helvetica, Arial, sans-serif
+ +clearfix()
+
+ .user-dropdown-footer
+ padding: 10px
+ margin-left: 0px
+ font-size: 14px
+ +clearfix()
+
+ .btn-flat
+ border: #ddd 1px solid
+ border-radius: 0px
+ margin: 0px
+
+
+ //- Content
+
+ #site-content-area
+ background: rgb(240,229,199)
+ margin: 0 auto -20px
+ width: 1024px
+ border: 5px solid rgb(110,88,41)
+ padding: 20px 12px
+
+
+ //- Footer
+
+ #site-footer
+ width: 100%
+ height: 130px
+ position: relative
+ overflow: hidden
+
+ // Recycling the nav bar background as a rotated image
+ #footer-background
+ transform: rotate(180deg)
+ margin: 0 auto
+ display: block
+
+ #footer-links, #footer-credits
+ position: absolute
+ left: 0
+ right: 0
+ text-align: center
+
+ #footer-links
+ top: 20px
+ height: 45px
+ padding: 11px
+
+ a
+ color: rgb(158,135,119)
+ font-size: 18px
+ text-transform: uppercase
+ font-family: Open Sans Condensed
+ margin: 0 7px
+
+ &:hover
+ color: $white
+
+ .share-buttons
+ display: inline-block
+ position: relative
+ top: 3px
+ margin-left: 20px
+
+ .share-buttons, .partner-badges
+ padding-bottom: 10px
+ text-align: center
+ @include opacity(0.75)
+
+ &.fade-in
+ @include opacity(0)
+
+ &:hover, &:active
+ @include opacity(1)
+ @include transition(opacity .10s linear)
+
+ .github-star-button
+ margin-left: 20px
+
+ &>div
+ display: inline-block
+ vertical-align: top
+
+ #footer-credits
+ top: 79px
+ height: 50px
+ color: rgb(158,135,119)
+ font-size: 12px
+
+ > *
+ margin: 0 15px
+ width: 186px
+ display: inline-block
+
+ #footer-logo
+ width: 160px
+
+ & > span
+ position: relative
+ top: 8px
+
+ a
+ color: rgb(238,227,131)
diff --git a/app/styles/common/top_nav.sass b/app/styles/common/top_nav.sass
deleted file mode 100644
index 5457e9cf0..000000000
--- a/app/styles/common/top_nav.sass
+++ /dev/null
@@ -1,234 +0,0 @@
-@import "app/styles/bootstrap/variables"
-@import "app/styles/mixins"
-
-// This is still very blocky. Browser reflows? Investigate why.
-.open > .dropdown-menu
- animation-name: fadeAnimation
- animation-duration: .7s
- animation-iteration-count: 1
- animation-timing-function: ease
- animation-fill-mode: forwards
- -webkit-animation-name: fadeAnimation
- -webkit-animation-duration: .7s
- -webkit-animation-iteration-count: 1
- -webkit-animation-timing-function: ease
- -webkit-animation-fill-mode: backwards
- -moz-animation-name: fadeAnimation
- -moz-animation-duration: .7s
- -moz-animation-iteration-count: 1
- -moz-animation-timing-function: ease
- -moz-animation-fill-mode: forwards
-
-@keyframes fadeAnimation
- from
- opacity: 0
- top: 120%
- to
- opacity: 1
- top: 100%
-
-@-webkit-keyframes fadeAnimation
- from
- opacity: 0
- top: 120%
- to
- opacity: 1
- top: 100%
-
-a.disabled
- color: #5b5855
- text-decoration: none
- cursor: default
-
-#top-nav
- a.navbar-brand
- padding: 4px 20px 0px 20px
- margin-left: -20px
-
- .navbar-nav
- float: right
-
- .navbuttontext, .fancy-select .trigger
- font-size: 20px
- font-weight: 400
- letter-spacing: 1px
-
- .navbuttontext-account
- display: inline-block
- padding: 0 5px 0 0
- margin: 0 5px 0 0
- height: 18px
-
- .account-settings-image
- width: 18px
- height: 18px
- margin-right: 5px
-
- .glyphicon-user
- font-size: 16px
- margin-right: 5px
-
- .dropdown
- .dropdown-menu
- left: auto
- width: 280px
- padding: 0px
- border-radius: 0px
- font-family: Open Sans Condensed
- font-variant: small-caps
-
- > .user-dropdown-header
- position: relative
- background: #E4CF8C
- height: 160px
- padding: 10px
- text-align: center
- color: black
- border-bottom: #32281e 1px solid
- > a:hover
- background-color: transparent
- img
- border: #e3be7a 8px solid
- height: 98px // Includes the border
- &:hover
- box-shadow: 0 0 20px #e3be7a
- > h3
- margin-top: 10px
- text-shadow: 2px 2px 3px white
- color: #31281E
- .user-level
- position: absolute
- top: 73px
- right: 86px
- color: gold
- text-shadow: 1px 1px black, -1px -1px 0 black, 1px -1px 0 black, -1px 1px 0 black
-
- .user-dropdown-body
- color: black
- padding: 15px
- letter-spacing: 1px
- font: 15px 'Helvetica Neue', Helvetica, Arial, sans-serif
- +clearfix()
-
- .user-dropdown-footer
- padding: 10px
- margin-left: 0px
- font-size: 14px
- +clearfix()
-
- .btn-flat
- border: #ddd 1px solid
- border-radius: 0px
- margin: 0px
-
- .nav.navbar-link-text > li > a
- font-weight: normal
- font-size: 25px
- letter-spacing: 2px
- color: $white
- &:hover
- color: #f8e413
-
- .navbar-link-text > li > a:hover
- background: darken($body-bg, 3%)
-
- .btn, .btn-group, .fancy-select
- margin-top: 13px
-
- .nav-tabs > .active > a, .nav-tabs > .active > a:hover, .nav-tabs > .active > a:focus
- background-color: #eee
-
- .nav-tabs > li
- cursor: pointer
-
- font-size: 25px
- a:not(.btn)
- line-height: 25px
-
- .btn
- font-size: 20px
- padding: 4px 12px
-
- .btn, .fancy-select
- float: right
- margin-left: 10px
- line-height: 20px
-
- select
- opacity: 0
-
- .fancy-select
- .trigger
- padding: 5px 25px 3px 10px
- width: auto
- &:after
- top: 13px
- max-width: 140px
-
- div.fancy-select
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25)
- text-transform: none
-
- div.trigger
- background-color: #9d8f5a
- background-image: linear-gradient(to bottom, #a4955e, #948754)
- background-repeat: repeat-x
- border: 1px solid #cccccc
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25)
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05)
- color: white
- font-variant: small-caps
- &:after
- border-top-color: white
- &.open
- background-color: #8B7F51
- color: #ebebeb
- &:after
- border-top-color: #ebebeb
- ul.options
- max-height: 415px
- background-color: #9d8f5a
- right: 0
- left: auto
- overflow-x: hidden
- &.open
- top: 36px
- li
- color: #ebebeb
- padding: 8px 20px
-
- .navbar-toggle
- display: none
-
-@media only screen and (max-width: 768px)
- #top-nav
- display: inline
- button.navbar-toggle
- background: #483a2d
- border: 2px solid #2f261d
- display: inline-block
-
- span.icon-bar
- background: #F9E612
-
- a.navbar-brand
- padding: 4px 20px 0px 20px
- margin-left: 0
-
- .navbar-nav
- float: none
- margin: 0 0 20px 0
- overflow: visible
-
- .dropdown-menu
- background-color: white
- position: absolute
-
- .btn, .fancy-select
- margin-bottom: 10px
-
- .btn, .fancy-select
- float: none
-
- .fancy-select .options
- right: auto
diff --git a/app/styles/game-menu/game-menu-modal.sass b/app/styles/game-menu/game-menu-modal.sass
index 8d9c79203..2707d39b0 100644
--- a/app/styles/game-menu/game-menu-modal.sass
+++ b/app/styles/game-menu/game-menu-modal.sass
@@ -84,3 +84,9 @@
height: 514px
padding: 50px
overflow-y: scroll
+
+ ::-webkit-scrollbar
+ // So that the scrollbar doesn't go on top of the close button.
+ // Wish we could easily do this for Firefox.
+ display: none
+
diff --git a/app/styles/game-menu/inventory-modal.sass b/app/styles/game-menu/inventory-modal.sass
index e5220b91a..0714833ab 100644
--- a/app/styles/game-menu/inventory-modal.sass
+++ b/app/styles/game-menu/inventory-modal.sass
@@ -296,6 +296,9 @@ $itemSlotGridHeight: 70px
width: $itemSlotSize * 1.2
height: $itemSlotSize * 1.2
+ button
+ display: none
+
//- Available equipment
@@ -381,8 +384,9 @@ $itemSlotGridHeight: 70px
// display: inline
&.restricted
- background-color: rgba(255, 80, 67, 0.25)
+ background-color: rgba(190, 190, 190, 1)
cursor: default
+ @include filter(contrast(50%) brightness(100%))
//.item-view
// cursor: default
diff --git a/app/styles/home.sass b/app/styles/home.sass
index 7584a4eab..231778406 100644
--- a/app/styles/home.sass
+++ b/app/styles/home.sass
@@ -3,87 +3,57 @@
#home-view
- h1
+ #spacer
+ //height: 750px // No one could see this; let's shrink it as much as we can.
+ height: 606px
+
+ #play-button, #or-ipad, #apple-store-button, #slogan, .alert
text-align: center
- margin-top: 0
-
- .game-mode-wrapper
- position: relative
- margin-bottom: 60px
-
- img
- display: block
- margin: 0 auto
- @include transition(box-shadow .50s ease-in-out)
- border-radius: 11px
-
- text-shadow: 2px 2px 5px black
-
- h3
- color: $yellow
- position: absolute
- top: 10px
- left: 40px
- font-size: 70px
- margin-top: 0
-
- h4
- color: #e8d9c5
- position: absolute
- top: 75px
- left: 140px
- font-size: 30px
- margin-top: 0
-
- .play-text
- position: absolute
- right: 45px
- bottom: -25px
- color: $yellow
- font-size: 90px
- font-family: Open Sans Condensed
- font-variant: small-caps
- @include transition(color .25s ease-in-out)
-
- &:hover div, &.hovered div
- color: lighten($yellow, 20%)
- &:hover img, &.hovered img
- filter: brightness(1.2)
- -webkit-filter: brightness(1.2)
- box-shadow: 0 0 15px black
-
- .code-language-logo
- background-color: transparent
- background-repeat: no-repeat
- position: absolute
- right: 35px
- top: 15px
- width: 50px
- height: 50px
-
- &.inverted
- filter: invert(100%)
- -webkit-filter: invert(100%)
+ text-transform: uppercase
+ font-weight: bold
+ position: absolute
+ margin-right: auto
+ margin-left: auto
+ left: 0
+ right: 0
+ font-weight: bold
-@media only screen and (max-width: 768px)
- #home-view
- #site-slogan
- font-size: 30px
- margin-bottom: 30px
- .game-mode-wrapper
- width: 100%
- img
- width: 100%
- .play-text
- position: absolute
- right: 15px
- bottom: -15px
- color: $yellow
- font-size: 50px
- font-family: Open Sans Condensed
- font-variant: small-caps
- @include transition(color .10s linear)
-
- h1
+ #play-button
text-align: center
- margin-top: 0
+ padding-top: 170px
+ font-size: 50px
+ color: rgb(255,253,149)
+ text-shadow: 0 0 6px black,0 0 6px black,0 0 6px black,0 0 6px black, 0 0 6px black,0 0 6px black,0 0 6px black,0 0 6px black, 0 0 6px black,0 0 6px black,0 0 6px black,0 0 6px black, 0 0 6px black,0 0 6px black,0 0 6px black,0 0 6px black, 0 0 6px black,0 0 6px black,0 0 6px black,0 0 6px black
+ top: 308px
+ width: 218px
+ height: 219px
+ background-image: url(/images/pages/home/play_button.png)
+ background-position: 0 219px
+
+ &:hover
+ background-position: 0 0
+ color: rgb(230,180,75)
+ text-decoration: none
+
+ #or-ipad
+ top: 540px
+ color: rgb(119,101,84)
+ font-size: 17px
+ max-width: 211px
+
+ #apple-store-button
+ top: 593px
+ height: 63px
+
+ #slogan
+ top: 681px
+ height: 132px
+ width: 276px
+ padding: 15px
+ font-size: 28px
+ line-height: 32px
+ color: rgb(50,40,31)
+
+ .alert
+ top: 213px
+ border: 5px solid darkred
diff --git a/app/styles/play/level.sass b/app/styles/play/level.sass
index f3f69f0af..ae0ed4580 100644
--- a/app/styles/play/level.sass
+++ b/app/styles/play/level.sass
@@ -3,8 +3,6 @@
body.is-playing
background-color: black
- .footer
- background-color: black
$level-resize-transition-time: 0.5s
@@ -90,6 +88,16 @@ $level-resize-transition-time: 0.5s
z-index: 2
@include transition($level-resize-transition-time ease-out)
+ &.grabbable:not(.flag-color-selected)
+ cursor: -moz-grab
+ cursor: -webkit-grab
+ cursor: grab
+
+ &:active
+ cursor: -moz-grabbing
+ cursor: -webkit-grabbing
+ cursor: grabbing
+
&.flag-color-selected
cursor: crosshair
@@ -135,13 +143,6 @@ $level-resize-transition-time: 0.5s
&.btn-#{nth($tuple, 1)}
@include banner-button(nth($tuple, 2), #FFF)
- .footer .footer-link-text a
- @include opacity(0.75)
- @include transition(opacity .10s linear)
-
- &:hover, &:active
- @include opacity(1)
-
$GI: 0.5 // gradient intensity; can tweak this 0-1
.gradient
@@ -184,21 +185,34 @@ $level-resize-transition-time: 0.5s
height: 100%
width: 2%
- .footer
+ #play-footer
+ text-align: center
+ font-family: "Open Sans Condensed"
+ font-variant: small-caps
+ font-size: 25px
+ padding: 10px 0
+ @include transition(opacity .10s linear)
+ @include opacity(0.6)
+
+ &:hover
+ @include opacity(1)
+
+ a
+ @include opacity(0.75)
+ @include transition(opacity .10s linear)
+ color: white
+
+ &:hover, &:active
+ @include opacity(1)
+
@media screen and (min-aspect-ratio: 17/10)
display: none
- &:not(:hover)
- @include opacity(0.6)
-
.hour-of-code-explanation
margin-top: 5px
color: white
font-size: 12px
- &:not(:hover)
- @include opacity(0.75)
-
a
color: white
text-decoration: underline
@@ -239,7 +253,7 @@ body.ipad #level-view
height: 1024px * (589 / 924) + 50px
overflow: hidden
- #code-area, .footer, #thang-hud
+ #code-area, #play-footer, #thang-hud
display: none
#level-chat-view
diff --git a/app/styles/play/level/tome/spell_palette_entry.sass b/app/styles/play/level/tome/spell_palette_entry.sass
index fdda33886..62216d996 100644
--- a/app/styles/play/level/tome/spell_palette_entry.sass
+++ b/app/styles/play/level/tome/spell_palette_entry.sass
@@ -55,6 +55,23 @@ body:not(.dialogue-view-active)
// Only those popovers which are our direct children (spell documentation)
max-width: 600px
+ // Jiggle animation
+ // TODO: consolidate with problem_alert.sass jiggle
+ +keyframes(jiggle)
+ 0%
+ transform: rotate(0deg)
+ 25%
+ transform: rotate(1deg)
+ 50%
+ transform: rotate(0deg)
+ 75%
+ transform: rotate(-1deg)
+ 100%
+ transform: rotate(0deg)
+
+ &.jiggling
+ @include animation(jiggle .3s infinite)
+
&.pinned
left: auto !important
top: 50px !important
diff --git a/app/styles/play/modal/play-achievements-modal.sass b/app/styles/play/modal/play-achievements-modal.sass
index db553646e..089851d75 100644
--- a/app/styles/play/modal/play-achievements-modal.sass
+++ b/app/styles/play/modal/play-achievements-modal.sass
@@ -1,4 +1,8 @@
+@import "app/styles/mixins"
+
#play-achievements-modal
+ .modal-dialog
+ width: 800px
.modal-header
padding-bottom: 20px
@@ -16,6 +20,7 @@
position: relative
border: 2px solid rgb(75,75,75)
padding: 2px
+ @include opacity(0.75)
h3
margin: 0 0 0 50px
@@ -27,7 +32,7 @@
.panel-body
padding: 5px 150px 5px 5px
- border: 2px solid rgb(150,150,150)
+ //border: 2px solid rgb(150,150,150) // Chloe's suggestion to not have this
.created
position: absolute
@@ -43,6 +48,7 @@
background: rgb(50,40,33)
border: 5px solid rgb(26,21,17)
padding: 0
+ @include opacity(1)
h3
color: white
@@ -79,4 +85,4 @@
img
width: 12px
- height: 12px
\ No newline at end of file
+ height: 12px
diff --git a/app/styles/play/modal/play-heroes-modal.sass b/app/styles/play/modal/play-heroes-modal.sass
index f9c669f23..3138762ef 100644
--- a/app/styles/play/modal/play-heroes-modal.sass
+++ b/app/styles/play/modal/play-heroes-modal.sass
@@ -201,13 +201,13 @@ $heroCanvasHeight: 265px
&.attack .stat-progress-bar
- background: purple
+ background: #c32424
&.health .stat-progress-bar
- background: red
+ background: #0f802a
&.speed .stat-progress-bar
- background: green
+ background: #4d52ab
//- Carousel switch buttons
diff --git a/app/styles/play/world-map-view.sass b/app/styles/play/world-map-view.sass
index c412b6376..86658769a 100644
--- a/app/styles/play/world-map-view.sass
+++ b/app/styles/play/world-map-view.sass
@@ -265,21 +265,6 @@ $gameControlMargin: 30px
.tooltip
font-size: 24px
- .old-levels
- position: absolute
- bottom: 5%
- left: 1%
- z-index: 3
-
- a
- font-size: 24px
- color: #eee
- text-decoration: underline
-
- &:hover
- color: white
- text-shadow: 1px 1px 0px black
-
.user-status
position: absolute
bottom: 1%
@@ -322,6 +307,8 @@ body:not(.ipad) #world-map-view
.level-info-container
pointer-events: none
+
+
body.ipad #world-map-view
// iPad only supports up to Kithgard Gates for now.
.campaign-switch
diff --git a/app/styles/user/user_home.sass b/app/styles/user/user_home.sass
index 955294d69..8e80ca8fc 100644
--- a/app/styles/user/user_home.sass
+++ b/app/styles/user/user_home.sass
@@ -2,8 +2,6 @@
@import "app/styles/bootstrap/variables"
#user-home
- margin-top: 20px
-
.left-column
+make-sm-column(4)
diff --git a/app/templates/base.jade b/app/templates/base.jade
index 9bf6b1350..bfbd50258 100644
--- a/app/templates/base.jade
+++ b/app/templates/base.jade
@@ -1,81 +1,69 @@
-body
- #fb-root
- block header
- .nav.navbar.navbar-fixed-top#top-nav
- .content.clearfix
- .navbar-header
- button.navbar-toggle(type="button" data-toggle="collapse" data-target=".navbar-nav.collapse")
- span.sr-only Toggle navigation
- span.icon-bar
- span.icon-bar
- span.icon-bar
+block header
+ #site-nav
+ img#nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
+ div#site-nav-links
+ a(href="/")
+ span.glyphicon.glyphicon-home
+ a(href="/about", data-i18n="nav.about")
+ a(href='/play/ladder', data-i18n="home.multiplayer")
+ a(href='/community', data-i18n="nav.community")
+ a(href='http://blog.codecombat.com/', data-i18n="nav.blog")
+ a(href='http://discourse.codecombat.com/', data-i18n="nav.forum")
+
+ if me.get('anonymous') === false
+ span.dropdown
+ button.btn.btn-sm.header-font.dropdown-toggle(href="#", data-toggle="dropdown")
+ if me.get('photoURL')
+ img.account-settings-image(src=me.getPhotoURL(18), alt="")
+ else
+ i.glyphicon.glyphicon-user
+ span.spl.spr(data-i18n="nav.account" href="/account") Account
+ span.caret
+ ul.dropdown-menu(role="menu")
+ li.user-dropdown-header
+ span.user-level= me.level()
+ a(href="/user/#{me.getSlugOrID()}")
+ img.img-circle(src="#{me.getPhotoURL()}" alt="")
+ h3=me.displayName()
+ li.user-dropdown-body
+ .col-xs-4.text-center
+ a(href="/user/#{me.getSlugOrID()}" data-i18n="nav.profile") Profile
+ .col-xs-4.text-center
+ a(href="/user/#{me.getSlugOrID()}/stats" data-i18n="nav.stats") Stats
+ .col-xs-4.text-center
+ a.disabled(data-i18n="nav.code") Code
+ li.user-dropdown-footer
+ .pull-left
+ a.btn.btn-default.btn-flat(href="/account" data-i18n="nav.account") Account
+ .pull-right
+ button#logout-button.btn.btn-default.btn-flat(data-i18n="login.log_out") Log Out
+
+ else
+ button.btn.btn-sm.btn-primary.header-font.signup-button(data-i18n="login.sign_up")
+ button.btn.btn-sm.btn-default.header-font.login-button(data-i18n="login.log_in")
+ select.language-dropdown.form-control
+
- a.navbar-brand(href='/')
- img(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
+block outer_content
+ #site-content-area
+ block content
+ p If this is showing, you dun goofed
+ .achievement-corner
- ul(class='navbar-link-text').nav.navbar-nav.navbar-collapse.collapse
- if me.get('anonymous') === false
- li.dropdown
- button.btn.btn-primary.navbuttontext.header-font.dropdown-toggle(href="#", data-toggle="dropdown")
- if me.get('photoURL')
- img.account-settings-image(src=me.getPhotoURL(18), alt="")
- else
- i.glyphicon.glyphicon-user
- .navbuttontext-account(data-i18n="nav.account" href="/account") Account
- span.caret
- ul.dropdown-menu(role="menu")
- li.user-dropdown-header
- span.user-level= me.level()
- a(href="/user/#{me.getSlugOrID()}")
- img.img-circle(src="#{me.getPhotoURL()}" alt="")
- h3=me.displayName()
- li.user-dropdown-body
- .col-xs-4.text-center
- a(href="/user/#{me.getSlugOrID()}" data-i18n="nav.profile") Profile
- .col-xs-4.text-center
- a(href="/user/#{me.getSlugOrID()}/stats" data-i18n="nav.stats") Stats
- .col-xs-4.text-center
- a.disabled(data-i18n="nav.code") Code
- li.user-dropdown-footer
- .pull-left
- a.btn.btn-default.btn-flat(href="/account" data-i18n="nav.account") Account
- .pull-right
- button#logout-button.btn.btn-default.btn-flat(data-i18n="login.log_out") Log Out
- else
- li
- button.btn.btn-primary.navbuttontext.header-font.auth-button
- span(data-i18n="login.log_in") Log In
- span.spr.spl /
- span(data-i18n="login.sign_up") Create Account
- li
- select.language-dropdown
- block outer_content
- #outer-content-wrapper(class=showBackground ? 'show-background' : '')
- #intermediate-content-wrapper
- #inner-content-wrapper
- .main-content-area
- block content
- p If this is showing, you dun goofed
- .achievement-corner
+block footer
+ #site-footer
+ img#footer-background(src="/images/pages/base/nav_background.png")
+
+ #footer-links
+ a(href='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
+ a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
+ a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
+ a(href='/teachers', data-i18n="nav.teachers") Teachers
+ a(href="/play-old", data-i18n="play.older_campaigns") Older Campaigns
+ if me.isAdmin()
+ a(href='/admin', data-i18n="nav.admin") Admin
- block footer
- .footer.clearfix
- .content
- p.footer-link-text
- a(href='/', tabindex=-1, data-i18n="nav.home") Home
- a(href='/play/ladder', tabindex=-1, data-i18n="home.multiplayer") Multiplayer
- a(href='/community', tabindex=-1, data-i18n="nav.community") Community
- a(href='/contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
- a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
- a(href='/about', tabindex=-1, data-i18n="nav.about") About
- a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
- a(href='http://blog.codecombat.com/', data-i18n="nav.blog") Blog
- a(href='http://discourse.codecombat.com/', data-i18n="nav.forum") Forum
- a(href='/teachers', data-i18n="nav.teachers") Teachers
- if me.isAdmin()
- a(href='/admin', data-i18n="nav.admin") Admin
-
if usesSocialMedia
.share-buttons
if !isIE
@@ -84,9 +72,18 @@ body
if !isIE
a.twitter-follow-button(href="https://twitter.com/CodeCombat", data-show-count="true", data-show-screen-name="false", data-dnt="true", data-align="right", data-i18n="nav.twitter_follow") Follow
iframe.github-star-button(src="http://ghbtns.com/github-btn.html?user=codecombat&repo=codecombat&type=watch&count=true", allowtransparency="true", frameborder="0", scrolling="0", width="110", height="20")
-
- .partner-badges
- a.mixpanel-badge(href="https://mixpanel.com/f/partner")
- img(src="//cdn.mxpnl.com/site_media/images/partner/badge_light.png", alt="Mobile Analytics")
- a.firebase-bade(href="https://www.firebase.com/")
- img(src="/images/pages/base/firebase.png", alt="Powered by Firebase")
+
+ #footer-credits
+ a.mixpanel-badge(href="https://mixpanel.com/f/partner")
+ img(src="//cdn.mxpnl.com/site_media/images/partner/badge_light.png", alt="Mobile Analytics")
+ span
+ span © All Rights Reserved
+ br
+ span CodeCombat 2014
+ img#footer-logo(src="/images/pages/base/logo.png", alt="CodeCombat")
+ span
+ span Site Design by
+ br
+ a(href="http://www.fullyillustrated.com/") Fully Illustrated
+ a.firebase-bade(href="https://www.firebase.com/")
+ img(src="/images/pages/base/firebase.png", alt="Powered by Firebase")
diff --git a/app/templates/home.jade b/app/templates/home.jade
index 119032578..d28401a6a 100644
--- a/app/templates/home.jade
+++ b/app/templates/home.jade
@@ -1,12 +1,19 @@
extends /templates/base
-block content
+block outer_content
+ #spacer
+
+ a#play-button(href="/play", data-i18n="common.play")
- h1#site-slogan(data-i18n="home.slogan") Learn to Code by Playing a Game
+ //#or-ipad(data-i18n="home.or_ipad")
+
+ //img(src="/images/pages/home/app_store_badge.svg")#apple-store-button
+
+ #slogan(data-i18n="home.slogan")
.alert.alert-danger.lt-ie9
strong(data-i18n="home.no_ie") CodeCombat does not run in Internet Explorer 8 or older. Sorry!
-
+
if isMobile
.alert.alert-danger.mobile
strong(data-i18n="home.no_mobile") CodeCombat wasn't designed for mobile devices and may not work!
@@ -15,12 +22,4 @@ block content
strong(data-i18n="home.old_browser") Uh oh, your browser is too old to run CodeCombat. Sorry!
br
span(data-i18n="home.old_browser_suffix") You can try anyway, but it probably won't work.
-
- a#beginner-campaign(href="/play")
- div.game-mode-wrapper
- img(src="/images/pages/home/play_img.png").img-rounded
- h3(data-i18n="home.campaign") Campaign
- h4(data-i18n="home.for_beginners") For Beginners
- .play-text(data-i18n="home.play") Play
-
- .clearfix
+
\ No newline at end of file
diff --git a/app/templates/play/ladder_home.jade b/app/templates/play/ladder_home.jade
index a496919b8..4a12d7683 100644
--- a/app/templates/play/ladder_home.jade
+++ b/app/templates/play/ladder_home.jade
@@ -13,7 +13,7 @@ block content
if level.image
img.level-image(src="#{level.image}", alt="#{level.name}").img-rounded
else
- img.level-image(src="/images/pages/home/multiplayer_notext.jpg", alt="#{level.name}").img-rounded
+ img.level-image(src="/images/pages/play/ladder/multiplayer_notext.jpg", alt="#{level.name}").img-rounded
//h3= level.name + (level.disabled ? " (Coming soon!)" : "")
.overlay-text.level-difficulty
span(data-i18n="play.level_difficulty") Difficulty:
diff --git a/app/templates/play/level.jade b/app/templates/play/level.jade
index 78a4d3676..3c5b8d968 100644
--- a/app/templates/play/level.jade
+++ b/app/templates/play/level.jade
@@ -34,15 +34,14 @@
button.btn.btn-lg.btn-warning.banner.header-font#stop-real-time-playback-button(title="Stop real-time playback", data-i18n="play_level.skip") Skip
-.footer
- .content
- p(class='footer-link-text')
- a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
- if explainHourOfCode
- // Does not show up unless lang is en-US.
- div.hour-of-code-explanation
- | The 'Hour of Code' is a nationwide initiative by
- a(href="http://csedweek.org") Computer Science Education Week
- | and
- a(href="http://code.org") Code.org
- | to introduce millions of students to one hour of computer science and computer programming.
\ No newline at end of file
+#play-footer
+ p(class='footer-link-text')
+ a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
+ if explainHourOfCode
+ // Does not show up unless lang is en-US.
+ div.hour-of-code-explanation
+ | The 'Hour of Code' is a nationwide initiative by
+ a(href="http://csedweek.org") Computer Science Education Week
+ | and
+ a(href="http://code.org") Code.org
+ | to introduce millions of students to one hour of computer science and computer programming.
\ No newline at end of file
diff --git a/app/templates/play/level/tome/cast_button.jade b/app/templates/play/level/tome/cast_button.jade
index b63e0db13..77886e0df 100644
--- a/app/templates/play/level/tome/cast_button.jade
+++ b/app/templates/play/level/tome/cast_button.jade
@@ -1,11 +1,7 @@
button.btn.btn-lg.btn-illustrated.cast-button(title=castVerbose)
span(data-i18n="play_level.tome_run_button_ran") Ran
-button.btn.btn-lg.btn-illustrated.submit-button(title=castRealTimeVerbose)
- if testSubmitText != null && testSubmitText.length > 0
- span= testSubmitText
- else
- span(data-i18n="play_level.tome_submit_button") Submit
+button.btn.btn-lg.btn-illustrated.submit-button(title=castRealTimeVerbose, data-i18n="play_level.tome_submit_button") Submit
button.btn.btn-lg.btn-illustrated.done-button.secret
span(data-i18n="play_level.done") Done
diff --git a/app/templates/play/level/tome/spell_palette_entry_popover.jade b/app/templates/play/level/tome/spell_palette_entry_popover.jade
index bd10fc3dd..251d068ce 100644
--- a/app/templates/play/level/tome/spell_palette_entry_popover.jade
+++ b/app/templates/play/level/tome/spell_palette_entry_popover.jade
@@ -3,57 +3,71 @@ h4
| -
code.prop-type= doc.type == 'function' && doc.owner == 'this' ? 'method' : doc.type
if doc.type != 'function'
+ | (
if writable
- | (writable)
+ span(data-i18n="skill_docs.writable") writable
else
- | (read-only)
+ span(data-i18n="skill_docs.read_only") read-only
+ | )
.description
p!= marked(doc.description || 'Still undocumented, sorry.')
if cooldowns && (cooldowns.cooldown || cooldowns.specificCooldown)
p
span
- | #{cooldowns.type == 'spell' ? 'Spell' : 'Action'} name:
+ | #{cooldowns.type == 'spell' ? 'Spell' : 'Action'}
+ span.spl(data-i18n="skill_docs.action_name") name
+ span.spr :
code "#{cooldowns.name}"
| .
span.spl
- | Cooldown:
+ span(data-i18n="skill_docs.action_cooldown") Takes
+ span.spr :
code= cooldowns.cooldown
| s.
if cooldowns.specificCooldown
span.spl
- | Specific cooldown:
+ span(data-i18n="skill_docs.action_specific_cooldown") Cooldown
+ span.spr :
code= cooldowns.specificCooldown
| s.
if cooldowns.damage
span.spl
- | Damage:
+ span(data-i18n="skill_docs.action_damage") Damage
+ span.spr :
code= cooldowns.damage
| .
if cooldowns.range
span.spl
- | Range:
+ span(data-i18n="skill_docs.action_range") Range
+ span.spr :
code= cooldowns.range
| m.
if cooldowns.radius
span.spl
- | Radius:
+ span(data-i18n="skill_docs.action_radius") Radius
+ span.spr :
code= cooldowns.radius
| m.
if cooldowns.duration
span.spl
- | Duration:
+ span(data-i18n="skill_docs.action_duration") Duration
+ span.spr :
code= cooldowns.duration
| s.
if !selectedMethod
if doc.example
p.example
- strong Example:
+ strong
+ span(data-i18n="skill_docs.example") Example
+ | :
div!= marked("```\n" + doc.example + "```")
else if doc.type == 'function' && argumentExamples.length
p.example
- strong Example:
+ strong
+ span(data-i18n="skill_docs.example") Example
+ | :
div
if language == 'javascript'
code= doc.owner + '.' + doc.name + '(' + argumentExamples.join(', ') + ');'
@@ -70,36 +84,48 @@ if !selectedMethod
if (doc.type != 'function' && doc.type != 'snippet') || doc.name == 'now'
p.value
- strong Current Value:
+ strong
+ span(data-i18n="skill_docs.current_value") Current Value
+ span.spr :
pre
code.current-value(data-prop=doc.name)= value
if doc.args && doc.args.length
p.args
- strong Parameters:
+ strong
+ span(data-i18n="skill_docs.parameters") Parameters
+ span.spr :
for arg in doc.args
div
code= arg.name
- | :
+ span.spr :
code= arg.type
if arg.example
- | (ex:
+ | (
+ span(data-i18n="skill_docs.ex") ex
+ span.spr :
code= arg.example
| )
if arg.description
div!= marked(arg.description)
if arg.default
div
- em Default value:
+ em
+ span(data-i18n="skill_docs.default_value") Default value
+ span.spr :
code= arg.default
-
+
if doc.returns
p.returns
- strong Returns:
+ strong
+ span(data-i18n="skill_docs.returns") Returns
+ span.spr :
div
code= doc.returns.type
if doc.returns.example
- | (ex:
+ | (
+ span(data-i18n="skill_docs.ex") ex
+ span.spr :
code= doc.returns.example
| )
if doc.returns.description
@@ -107,7 +133,9 @@ if doc.returns
if item
p
- em Granted by #{item.get('name')}.
+ em
+ span.spr(data-i18n="skill_docs.granted_by") Granted by
+ | #{item.get('name')}.
if selectedMethod
p
diff --git a/app/templates/play/modal/item-details-view.jade b/app/templates/play/modal/item-details-view.jade
index a381fa3dd..3da543a79 100644
--- a/app/templates/play/modal/item-details-view.jade
+++ b/app/templates/play/modal/item-details-view.jade
@@ -23,7 +23,7 @@
h3.big-font(data-i18n="play.skills_granted")
for prop in props
p
- strong.big-font= prop.name
+ strong= prop.name
span.spr :
span!= prop.description
diff --git a/app/templates/play/world-map-view.jade b/app/templates/play/world-map-view.jade
index 10612fc5c..d516ef7e5 100644
--- a/app/templates/play/world-map-view.jade
+++ b/app/templates/play/world-map-view.jade
@@ -10,7 +10,7 @@
if !level.hidden
- var next = level.id == nextLevel || (!seenNext && levelStatusMap[level.id] != "complete" && !level.locked && !level.disabled && (!level.practice || me.getBranchingGroup() == 'all-practice'));
- seenNext = seenNext || next;
- div(style="left: #{level.x}%; bottom: #{level.y}%; background-color: #{level.color}", class="level" + (next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.id] || "", data-level-id=level.id, title=level.name)
+ div(style="left: #{level.x}%; bottom: #{level.y}%; background-color: #{level.color}", class="level" + (next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.id] || "", data-level-id=level.id, title=level.name + (level.disabled ? ' (Coming Soon to Adventurers)' : ''))
a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.id}", disabled=level.disabled, data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name)
div(style="left: #{level.x}%; bottom: #{level.y}%", class="level-shadow" + (next ? " next" : "") + " " + levelStatusMap[level.id] || "")
.level-info-container(data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name)
@@ -56,9 +56,6 @@
// a.btn.account(href="/user/#{me.getSlugOrID()}", data-i18n="[title]play.account")
// a.btn.settings(href='/account', data-i18n="[title]play.settings")
-.old-levels
- a(href="/play-old", data-i18n="play.older_campaigns").header-font Older Campaigns
-
.user-status.header-font
span.gem.gem-20
span#gems-count.spr= me.gems()
diff --git a/app/views/HomeView.coffee b/app/views/HomeView.coffee
index 7bc31c09e..e0997b7c8 100644
--- a/app/views/HomeView.coffee
+++ b/app/views/HomeView.coffee
@@ -11,7 +11,7 @@ module.exports = class HomeView extends RootView
template: template
events:
- 'click #beginner-campaign': 'onClickBeginnerCampaign'
+ 'click #play-button': 'onClickBeginnerCampaign'
constructor: ->
super()
diff --git a/app/views/admin/BaseView.coffee b/app/views/admin/BaseView.coffee
index ca58690c0..d70ca3a29 100644
--- a/app/views/admin/BaseView.coffee
+++ b/app/views/admin/BaseView.coffee
@@ -4,3 +4,4 @@ template = require 'templates/base'
module.exports = class BaseView extends RootView
id: 'base-view'
template: template
+ usesSocialMedia: true
diff --git a/app/views/game-menu/InventoryModal.coffee b/app/views/game-menu/InventoryModal.coffee
index 356adc24a..ba4b1cbf6 100644
--- a/app/views/game-menu/InventoryModal.coffee
+++ b/app/views/game-menu/InventoryModal.coffee
@@ -240,10 +240,13 @@ module.exports = class InventoryModal extends ModalView
me.set('spent', (me.get('spent') ? 0) + item.get('gems'))
#- ...then rerender key bits
- @requireLevelEquipment()
@itemGroups.lockedItems.remove(item)
- @sortItem(item)
- @renderSelectors("#unequipped", "#gems-count")
+ # Redo all item sorting to make sure that we don't clobber state changes since last render.
+ equipped = _.values @getCurrentEquipmentConfig()
+ @sortItem(item, equipped) for item in @items.models
+ @renderSelectors('#unequipped', '#gems-count')
+
+ @requireLevelEquipment()
@delegateEvents()
@setUpDraggableEventsForAvailableEquipment()
@itemDetailsView.setItem(item)
diff --git a/app/views/game-menu/MultiplayerView.coffee b/app/views/game-menu/MultiplayerView.coffee
index 8808c799d..0fb4c023f 100644
--- a/app/views/game-menu/MultiplayerView.coffee
+++ b/app/views/game-menu/MultiplayerView.coffee
@@ -24,6 +24,7 @@ module.exports = class MultiplayerView extends CocoView
constructor: (options) ->
super(options)
@level = options.level
+ @levelID = @level?.get 'slug'
@session = options.session
@listenTo @session, 'change:multiplayer', @updateLinkSection
@watchRealTimeSessions() if @level?.get('type') in ['hero-ladder']
@@ -39,7 +40,7 @@ module.exports = class MultiplayerView extends CocoView
c.joinLink = "#{document.location.href.replace(/\?.*/, '').replace('#', '')}?session=#{@session.id}"
c.multiplayer = @session.get 'multiplayer'
c.team = @session.get 'team'
- c.levelSlug = @level?.get 'slug'
+ 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']
c.ladderGame = true
@@ -71,7 +72,7 @@ module.exports = class MultiplayerView extends CocoView
e.target.select()
onGameSubmitted: (e) ->
- ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches"
+ ladderURL = "/play/ladder/#{@levelID}#my-matches"
Backbone.Mediator.publish 'router:navigate', route: ladderURL
updateLinkSection: ->
@@ -104,13 +105,14 @@ module.exports = class MultiplayerView extends CocoView
# @realTimeSessionsPlayers - Collection of player lists for active real-time multiplayer sessions
# @realTimeSessions - Active real-time multiplayer sessions
# @currentRealTimeSession - Our current real-time multiplayer session
+ #
+ # TODO: Ditch backfire and just use Firebase directly. Easier to debug, richer APIs (E.g. presence stuff).
watchRealTimeSessions: ->
# Setup monitoring of real-time multiplayer level sessions
@realTimeSessionsPlayers = {}
# TODO: only request sessions for this level, !team, etc.
- # TODO: move this to multiplayer_level_sessions/#{levelID}/
- @realTimeSessions = new RealTimeCollection('multiplayer_level_sessions/')
+ @realTimeSessions = new RealTimeCollection("multiplayer_level_sessions/#{@levelID}")
@realTimeSessions.on 'add', @onRealTimeSessionAdded
@realTimeSessions.each (rts) => @watchRealTimeSession rts
@@ -120,9 +122,9 @@ module.exports = class MultiplayerView extends CocoView
# console.log 'MultiplayerView watchRealTimeSession', rts
# Setup monitoring of players for given session
# TODO: verify we need this
- realTimeSession = new RealTimeModel('multiplayer_level_sessions/' + rts.id)
+ realTimeSession = new RealTimeModel("multiplayer_level_sessions/#{@levelID}/#{rts.id}")
realTimeSession.on 'change', @onRealTimeSessionChanged
- @realTimeSessionsPlayers[rts.id] = new RealTimeCollection('multiplayer_level_sessions/' + rts.id + '/players')
+ @realTimeSessionsPlayers[rts.id] = new RealTimeCollection("multiplayer_level_sessions/#{@levelID}/#{rts.id}/players")
@realTimeSessionsPlayers[rts.id].on 'add', @onRealTimePlayerAdded
@findCurrentRealTimeSession rts
@@ -133,7 +135,7 @@ module.exports = class MultiplayerView extends CocoView
@realTimeSessionsPlayers[rts.id].each (player) =>
if player.id is me.id and player.get('state') isnt 'left'
# console.log 'MultiplayerView found current real-time session', rts
- @currentRealTimeSession = new RealTimeModel('multiplayer_level_sessions/' + rts.id)
+ @currentRealTimeSession = new RealTimeModel("multiplayer_level_sessions/#{@levelID}/#{rts.id}")
@currentRealTimeSession.on 'change', @onCurrentRealTimeSessionChanged
# TODO: Is this necessary? Shouldn't everyone already know we joined a game at this point?
@@ -170,7 +172,7 @@ module.exports = class MultiplayerView extends CocoView
@currentRealTimeSession = @realTimeSessions.get(s.id)
@currentRealTimeSession.on 'change', @onCurrentRealTimeSessionChanged
# TODO: s.id === @currentRealTimeSession.id ?
- players = new RealTimeCollection('multiplayer_level_sessions/' + @currentRealTimeSession.id + '/players')
+ players = new RealTimeCollection("multiplayer_level_sessions/#{@levelID}/#{@currentRealTimeSession.id}/players")
players.create
id: me.id
state: 'coding'
diff --git a/app/views/i18n/I18NEditComponentView.coffee b/app/views/i18n/I18NEditComponentView.coffee
index 455b1a1aa..42fb3ac35 100644
--- a/app/views/i18n/I18NEditComponentView.coffee
+++ b/app/views/i18n/I18NEditComponentView.coffee
@@ -7,17 +7,17 @@ module.exports = class I18NEditComponentView extends I18NEditModelView
buildTranslationList: ->
lang = @selectedLanguage
-
+
propDocs = @model.get('propertyDocumentation')
-
+
for propDoc, propDocIndex in propDocs
-
+
#- Component property descriptions
if i18n = propDoc.i18n
path = ["propertyDocumentation", propDocIndex]
if _.isObject propDoc.description
- for progLang, description of propDoc
- @wrapRow "#{propDoc.name} description (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
+ for progLang, description of propDoc.description
+ @wrapRow "#{propDoc.name} description (#{progLang})", ['description', progLang], description, i18n[lang]?[progLang]?.description, path, 'markdown'
else if _.isString propDoc.description
@wrapRow "#{propDoc.name} description", ['description'], propDoc.description, i18n[lang]?.description, path, 'markdown'
if context = propDoc.context
@@ -29,8 +29,8 @@ module.exports = class I18NEditComponentView extends I18NEditModelView
path = ["propertyDocumentation", propDocIndex, "returns"]
d = propDoc.returns.description
if _.isObject d
- for progLang, description of d
- @wrapRow "#{propDoc.name} return val (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
+ for progLang, description of d.description
+ @wrapRow "#{propDoc.name} return val (#{progLang})", ['description', progLang], description, i18n[lang]?[progLang]?.description, path, 'markdown'
else if _.isString d
@wrapRow "#{propDoc.name} return val", ['description'], d, i18n[lang]?.description, path, 'markdown'
@@ -40,8 +40,7 @@ module.exports = class I18NEditComponentView extends I18NEditModelView
if i18n = argDoc.i18n
path = ["propertyDocumentation", propDocIndex, 'args', argIndex]
if _.isObject argDoc.description
- for progLang, description of argDoc
- @wrapRow "#{propDoc.name} arg description #{argDoc.name} (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
+ for progLang, description of argDoc.description
+ @wrapRow "#{propDoc.name} arg description #{argDoc.name} (#{progLang})", ['description', progLang], description, i18n[lang]?[progLang]?.description, path, 'markdown'
else if _.isString argDoc.description
@wrapRow "#{propDoc.name} arg description #{argDoc.name}", ['description'], argDoc.description, i18n[lang]?.description, path, 'markdown'
-
diff --git a/app/views/kinds/RootView.coffee b/app/views/kinds/RootView.coffee
index 48f24b938..4e69f0146 100644
--- a/app/views/kinds/RootView.coffee
+++ b/app/views/kinds/RootView.coffee
@@ -25,7 +25,8 @@ module.exports = class RootView extends CocoView
'click #logout-button': 'logoutAccount'
'change .language-dropdown': 'onLanguageChanged'
'click .toggle-fullscreen': 'toggleFullscreen'
- 'click .auth-button': 'onClickAuthButton'
+ 'click .signup-button': 'onClickSignupButton'
+ 'click .login-button': 'onClickLoginButton'
'click a': 'onClickAnchor'
'click button': 'toggleModal'
'click li': 'toggleModal'
@@ -54,11 +55,16 @@ module.exports = class RootView extends CocoView
subview = new WizardSettingsModal {}
@openModalView subview
- onClickAuthButton: ->
+ onClickSignupButton: ->
AuthModal = require 'views/modal/AuthModal'
- window.tracker?.trackEvent 'Homepage', Action: 'Auth Modal' if @id is 'home-view'
- @openModalView new AuthModal {}
-
+ window.tracker?.trackEvent 'Homepage', Action: 'Signup Modal' if @id is 'home-view'
+ @openModalView new AuthModal {mode: 'signup'}
+
+ onClickLoginButton: ->
+ AuthModal = require 'views/modal/AuthModal'
+ window.tracker?.trackEvent 'Homepage', Action: 'Login Modal' if @id is 'home-view'
+ @openModalView new AuthModal {mode: 'login'}
+
onClickAnchor: (e) ->
return if @destroyed
anchorText = e?.currentTarget?.text
@@ -84,11 +90,15 @@ module.exports = class RootView extends CocoView
getRenderData: ->
c = super()
- c.showBackground = @showBackground
c.usesSocialMedia = @usesSocialMedia
c
afterRender: ->
+ if @$el.find('#site-nav').length # hack...
+ @$el.addClass('site-chrome')
+ if @showBackground
+ @$el.addClass('show-background')
+
super(arguments...)
@chooseTab(location.hash.replace('#', '')) if location.hash
@buildLanguages()
@@ -110,12 +120,8 @@ module.exports = class RootView extends CocoView
buildLanguages: ->
$select = @$el.find('.language-dropdown').empty()
- if $select.hasClass('fancified')
- $select.parent().find('.options, .trigger').remove()
- $select.unwrap().removeClass('fancified')
preferred = me.get('preferredLanguage', true)
@addLanguagesToSelect($select, preferred)
- $select.fancySelect().parent().find('.trigger').addClass('header-font')
$('body').attr('lang', preferred)
addLanguagesToSelect: ($select, initialVal) ->
diff --git a/app/views/modal/AuthModal.coffee b/app/views/modal/AuthModal.coffee
index 6027b8a86..5f55f7e3d 100644
--- a/app/views/modal/AuthModal.coffee
+++ b/app/views/modal/AuthModal.coffee
@@ -27,6 +27,7 @@ module.exports = class AuthModal extends ModalView
constructor: (options) ->
@onNameChange = _.debounce @checkNameExists, 500
super options
+ @mode = options.mode if options.mode
getRenderData: ->
c = super()
diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee
index 099fcfc19..65ba2b01f 100644
--- a/app/views/play/WorldMapView.coffee
+++ b/app/views/play/WorldMapView.coffee
@@ -351,8 +351,8 @@ dungeon = [
id: 'shadow-guard'
original: '54174347844506ae0195a0b8'
description: 'Evade the Kithgard minion.'
- x: 41
- y: 13
+ x: 44
+ y: 11
nextLevels:
more_practice: 'kounter-kithwise'
continue: 'forgetful-gemsmith'
@@ -363,8 +363,8 @@ dungeon = [
id: 'kounter-kithwise'
original: '54527a6257e83800009730c7'
description: 'Practice your evasion skills with more guards.'
- x: 50
- y: 14
+ x: 55
+ y: 11
nextLevels:
#more_practice: 'crawlways-of-kithgard'
continue: 'forgetful-gemsmith'
@@ -388,8 +388,8 @@ dungeon = [
id: 'forgetful-gemsmith'
original: '544a98f62d002f0000fe331a'
description: 'Grab even more gems as you practice moving.'
- x: 63
- y: 13
+ x: 66
+ y: 11
nextLevels:
continue: 'true-names'
}
@@ -399,8 +399,8 @@ dungeon = [
id: 'true-names'
original: '541875da4c16460000ab990f'
description: 'Learn an enemy\'s true name to defeat it.'
- x: 74
- y: 14
+ x: 76
+ y: 13
nextLevels:
more_practice: 'favorable-odds'
continue: 'the-raised-sword'
@@ -472,8 +472,8 @@ dungeon = [
id: 'the-second-kithmaze'
original: '5418cf256bae62f707c7e1c3'
description: 'Many have tried, few have found their way through this maze.'
- x: 59
- y: 25
+ x: 58
+ y: 23
nextLevels:
continue: 'dread-door'
}
@@ -483,8 +483,8 @@ dungeon = [
id: 'dread-door'
original: '5418d40f4c16460000ab9ac2'
description: 'Behind a dread door lies a chest full of riches.'
- x: 60
- y: 34
+ x: 59
+ y: 32
nextLevels:
continue: 'known-enemy'
}
@@ -494,8 +494,8 @@ dungeon = [
id: 'known-enemy'
original: '5452adea57e83800009730ee'
description: 'Begin to use variables in your battles.'
- x: 68
- y: 42
+ x: 67
+ y: 39
nextLevels:
continue: 'master-of-names'
}
@@ -517,8 +517,8 @@ dungeon = [
id: 'lowly-kithmen'
original: '541b24511ccc8eaae19f3c1f'
description: 'Now that you can see them, they\'re everywhere!'
- x: 86
- y: 43
+ x: 85
+ y: 40
nextLevels:
continue: 'closing-the-distance'
skip_ahead: 'the-final-kithmaze'
@@ -553,8 +553,8 @@ dungeon = [
id: 'the-final-kithmaze'
original: '541b434e1ccc8eaae19f3c33'
description: 'To escape you must find your way through an Elder Kithman\'s maze.'
- x: 81.93
- y: 65.86
+ x: 83
+ y: 68
nextLevels:
more_practice: 'the-gauntlet'
continue: 'kithgard-gates'
@@ -842,8 +842,8 @@ forest = [
#nextLevels:
# continue: ''
disabled: not me.isAdmin()
- x: 77.54
- y: 25.94
+ x: 83.87
+ y: 18.89
}
{
name: 'Multiplayer Treasure Grove'
diff --git a/app/views/play/level/LevelFlagsView.coffee b/app/views/play/level/LevelFlagsView.coffee
index 485caa3b0..e49127726 100644
--- a/app/views/play/level/LevelFlagsView.coffee
+++ b/app/views/play/level/LevelFlagsView.coffee
@@ -33,6 +33,7 @@ module.exports = class LevelFlagsView extends CocoView
constructor: (options) ->
super options
+ @levelID = options.levelID
@world = options.world
onRealTimePlaybackStarted: (e) ->
@@ -84,7 +85,7 @@ module.exports = class LevelFlagsView extends CocoView
@world = @options.world = event.world
onJoinedMultiplayerGame: (e) ->
- @realTimeFlags = new RealTimeCollection('multiplayer_level_sessions/' + e.realTimeSessionID + '/flagHistory')
+ @realTimeFlags = new RealTimeCollection("multiplayer_level_sessions/#{@levelID}/#{e.realTimeSessionID}/flagHistory")
@realTimeFlags.on 'add', @onRealTimeMultiplayerFlagAdded
@realTimeFlags.on 'remove', @onRealTimeMultiplayerFlagRemoved
diff --git a/app/views/play/level/LevelHUDView.coffee b/app/views/play/level/LevelHUDView.coffee
index e2f5fcb5c..5df0c7e25 100644
--- a/app/views/play/level/LevelHUDView.coffee
+++ b/app/views/play/level/LevelHUDView.coffee
@@ -57,6 +57,7 @@ module.exports = class LevelHUDView extends CocoView
if not thang? and not @thang? then return
if thang? and @thang? and thang.id is @thang.id then return
if thang? and @hidesHUD and thang.id isnt 'Hero Placeholder' then return # Don't let them find the names of their opponents this way
+ return unless thang # Don't let them deselect anything, ever.
@thang = thang
@thangType = thangType
return unless @thang
diff --git a/app/views/play/level/LevelLoadingView.coffee b/app/views/play/level/LevelLoadingView.coffee
index 396123da9..10bbec9f0 100644
--- a/app/views/play/level/LevelLoadingView.coffee
+++ b/app/views/play/level/LevelLoadingView.coffee
@@ -13,6 +13,9 @@ module.exports = class LevelLoadingView extends CocoView
subscriptions:
'level:loaded': 'onLevelLoaded' # If Level loads after level loading view.
+ shortcuts:
+ 'enter': 'onEnterPressed'
+
afterRender: ->
super()
@$el.find('.tip.rare').remove() if _.random(1, 10) < 9
@@ -76,6 +79,11 @@ module.exports = class LevelLoadingView extends CocoView
return if @destroyed
@unveil()
+ onEnterPressed: (e) ->
+ return unless @shownReady and not @$el.hasClass 'unveiled'
+ @startUnveiling()
+ @onClickStartLevel()
+
unveil: ->
return if @$el.hasClass 'unveiled'
@$el.addClass 'unveiled'
diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee
index 3f0b759ae..436e5413a 100644
--- a/app/views/play/level/PlayLevelView.coffee
+++ b/app/views/play/level/PlayLevelView.coffee
@@ -4,6 +4,7 @@ template = require 'templates/play/level'
ThangType = require 'models/ThangType'
utils = require 'lib/utils'
storage = require 'lib/storage'
+{createAetherOptions} = require 'lib/aether_utils'
# tools
Surface = require 'lib/surface/Surface'
@@ -18,8 +19,6 @@ LevelComponent = require 'models/LevelComponent'
Article = require 'models/Article'
Camera = require 'lib/surface/Camera'
AudioPlayer = require 'lib/AudioPlayer'
-RealTimeModel = require 'models/RealTimeModel'
-RealTimeCollection = require 'collections/RealTimeCollection'
# subviews
LevelLoadingView = require './LevelLoadingView'
@@ -87,6 +86,7 @@ module.exports = class PlayLevelView extends RootView
shortcuts:
'ctrl+s': 'onCtrlS'
+ 'esc': 'onEscapePressed'
# Initial Setup #############################################################
@@ -217,8 +217,7 @@ module.exports = class PlayLevelView extends RootView
opponentSpells = opponentSpells.concat spells
if (not @session.get('teamSpells')) and @otherSession?.get('teamSpells')
@session.set('teamSpells', @otherSession.get('teamSpells'))
- # hero-ladder levels use code instead of transpiledCode
- opponentCode = @otherSession?.get('transpiledCode') or @otherSession?.get('code') or {}
+ opponentCode = @otherSession?.get('transpiledCode') or {}
myCode = @session.get('code') or {}
for spell in opponentSpells
[thang, spell] = spell.split '/'
@@ -251,7 +250,7 @@ module.exports = class PlayLevelView extends RootView
@insertSubView @tome = new TomeView levelID: @levelID, session: @session, otherSession: @otherSession, thangs: @world.thangs, supermodel: @supermodel, level: @level
@insertSubView new LevelPlaybackView session: @session, levelID: @levelID, level: @level
@insertSubView new GoalsView {}
- @insertSubView new LevelFlagsView world: @world if @$el.hasClass 'flags'
+ @insertSubView new LevelFlagsView levelID: @levelID, world: @world if @$el.hasClass 'flags'
@insertSubView new GoldView {}
@insertSubView new HUDView {level: @level}
@insertSubView new LevelDialogueView {level: @level}
@@ -289,7 +288,7 @@ module.exports = class PlayLevelView extends RootView
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session})
@setupManager.open()
- @onRealTimeMultiplayerLevelLoaded() if e.level.get('type') in ['hero-ladder']
+ @onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['hero-ladder']
onLoaded: ->
_.defer => @onLevelLoaderLoaded()
@@ -389,6 +388,10 @@ module.exports = class PlayLevelView extends RootView
onCtrlS: (e) ->
e.preventDefault()
+ onEscapePressed: (e) ->
+ return unless @$el.hasClass 'real-time'
+ Backbone.Mediator.publish 'playback:stop-real-time-playback', {}
+
onLevelReloadFromData: (e) ->
isReload = Boolean @world
@setLevel e.level, e.supermodel
@@ -571,7 +574,20 @@ module.exports = class PlayLevelView extends RootView
@onRealTimeMultiplayerLevelUnloaded()
super()
- # Real-time Multiplayer ######################################################
+ onIPadMemoryWarning: (e) ->
+ @hasReceivedMemoryWarning = true
+
+ onItemPurchased: (e) ->
+ heroConfig = @session.get('heroConfig') ? {}
+ inventory = heroConfig.inventory ? {}
+ slot = e.item.getAllowedSlots()[0]
+ if slot and not inventory[slot]
+ # Open up the inventory modal so they can equip the new item
+ @setupManager?.destroy()
+ @setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session, hadEverChosenHero: true})
+ @setupManager.open()
+
+ # Start Real-time Multiplayer ######################################################
#
# This view acts as a hub for the real-time multiplayer session for the current level.
#
@@ -590,147 +606,167 @@ module.exports = class PlayLevelView extends RootView
# Current real-time multiplayer session
# Internal multiplayer create/joined/left events
#
- # Real-time state variables:
- # @realTimePlayerStatus - User's real-time multiplayer state for this level
- # @realTimePlayerGameStatus - User's state for current real-time multiplayer game session
- # @realTimeSession - Current real-time multiplayer game session
- # @realTimeOpponent - Current real-time multiplayer opponent
- # @realTimePlayers - Real-time players for current real-time multiplayer game session
- # @realTimeSessionCollection - Collection of all real-time multiplayer sessions
+ # Real-time state variables.
+ # Each Ref is Firebase reference, and may have a matching Data suffixed variable with the latest data received.
+ # @realTimePlayerRef - User's real-time multiplayer player for this level
+ # @realTimePlayerGameRef - User's current real-time multiplayer player game session
+ # @realTimeSessionRef - Current real-time multiplayer game session
+ # @realTimeOpponentRef - Current real-time multiplayer opponent
+ # @realTimePlayersRef - Real-time players for current real-time multiplayer game session
# @options.realTimeMultiplayerSessionID - Need to continue an existing real-time multiplayer session
#
# TODO: Move this code to it's own file, or possibly the LevelBus
# TODO: Save settings somewhere reasonable
- # TODO: Ditch backfire and just use Firebase directly. Easier to debug, richer APIs (E.g. presence stuff).
+ multiplayerFireHost: 'https://codecombat.firebaseio.com/test/db/'
- onRealTimeMultiplayerLevelLoaded: ->
- return if @realTimePlayerStatus?
+ onRealTimeMultiplayerLevelLoaded: (session) ->
+ # console.log 'PlayLevelView onRealTimeMultiplayerLevelLoaded'
+ return if @realTimePlayerRef?
return if me.get('anonymous')
+ @realTimePlayerRef = new Firebase "#{@multiplayerFireHost}multiplayer_players/#{@levelID}/#{me.id}"
unless @options.realTimeMultiplayerSessionID?
- players = new RealTimeCollection('multiplayer_players/' + @levelID)
- players.create
- id: me.id
- name: me.get('name')
+ # TODO: Wait for name instead of using 'Anon', or try and update it later?
+ name = me.get('name') ? session.get('creatorName') ? 'Anon'
+ @realTimePlayerRef.set
+ id: me.id # TODO: is this redundant info necessary?
+ name: name
state: 'playing'
created: new Date().toISOString()
heartbeat: new Date().toISOString()
- @realTimePlayerStatus = new RealTimeModel('multiplayer_players/' + @levelID + '/' + me.id)
@timerMultiplayerHeartbeatID = setInterval @onRealTimeMultiplayerHeartbeat, 60 * 1000
@cleanupRealTimeSessions()
cleanupRealTimeSessions: ->
- @realTimeSessionCollection = new RealTimeCollection 'multiplayer_level_sessions'
- @realTimeSessionCollection.on 'add', @cleanupRealTimeSession
- @realTimeSessionCollection.each @cleanupRealTimeSession
-
- cleanupRealTimeSession: (session) =>
- return if @options.realTimeMultiplayerSessionID? and @options.realTimeMultiplayerSessionID is session.id
- if session.get('state') isnt 'finished'
- players = new RealTimeCollection 'multiplayer_level_sessions/' + session.id + '/players'
- players.each (player) =>
- if player.id is me.id
- p = new RealTimeModel 'multiplayer_level_sessions/' + session.id + '/players/' + me.id
- console.info 'Cleaning up previous real-time multiplayer session', session.id
- p.set 'state', 'left'
- session.set 'state', 'finished'
+ # console.log 'PlayLevelView cleanupRealTimeSessions'
+ # TODO: Reduce this call, possibly by username and dates
+ realTimeSessionCollection = new Firebase "#{@multiplayerFireHost}multiplayer_level_sessions/#{@levelID}"
+ realTimeSessionCollection.once 'value', (collectionSnapshot) =>
+ for multiplayerSessionID, multiplayerSession of collectionSnapshot.val()
+ continue if @options.realTimeMultiplayerSessionID? and @options.realTimeMultiplayerSessionID is multiplayerSessionID
+ continue unless multiplayerSession.state isnt 'finished'
+ player = realTimeSessionCollection.child "#{multiplayerSession.id}/players/#{me.id}"
+ player.once 'value', (playerSnapshot) =>
+ if playerSnapshot.val()
+ console.info 'Cleaning up previous real-time multiplayer session', multiplayerSessionID
+ player.update 'state': 'left'
+ multiplayerSessionRef = realTimeSessionCollection.child "#{multiplayerSessionID}"
+ multiplayerSessionRef.update 'state': 'finished'
onRealTimeMultiplayerLevelUnloaded: ->
# console.log 'PlayLevelView onRealTimeMultiplayerLevelUnloaded'
if @timerMultiplayerHeartbeatID?
clearInterval @timerMultiplayerHeartbeatID
@timerMultiplayerHeartbeatID = null
- if @realTimeSessionCollection?
- @realTimeSessionCollection.off 'add', @cleanupRealTimeSession
- @realTimeSessionCollection = null
# TODO: similar to game ending cleanup
- if @realTimeOpponent?
- @realTimeOpponent.off 'change', @onRealTimeOpponentChanged
- @realTimeOpponent = null
- if @realTimePlayers?
- @realTimePlayers.off 'add', @onRealTimePlayerAdded
- @realTimePlayers = null
- if @realTimeSession?
- @realTimeSession.off 'change', @onRealTimeSessionChanged
- @realTimeSession = null
- if @realTimePlayerGameStatus?
- @realTimePlayerGameStatus = null
- if @realTimePlayerStatus?
- @realTimePlayerStatus = null
+ if @realTimeOpponentRef?
+ @realTimeOpponentRef.off 'value', @onRealTimeOpponentChanged
+ @realTimeOpponentRef = null
+ if @realTimePlayersRef?
+ @realTimePlayersRef.off 'child_added', @onRealTimePlayerAdded
+ @realTimePlayersRef = null
+ if @realTimeSessionRef?
+ @realTimeSessionRef.off 'value', @onRealTimeSessionChanged
+ @realTimeSessionRef = null
+ if @realTimePlayerGameRef?
+ @realTimePlayerGameRef = null
+ if @realTimePlayerRef?
+ @realTimePlayerRef = null
onRealTimeMultiplayerHeartbeat: =>
- @realTimePlayerStatus.set 'heartbeat', new Date().toISOString() if @realTimePlayerStatus
+ # console.log 'PlayLevelView onRealTimeMultiplayerHeartbeat', @realTimePlayerRef
+ @realTimePlayerRef.update 'heartbeat': new Date().toISOString() if @realTimePlayerRef?
onRealTimeMultiplayerCreatedGame: (e) ->
+ # console.log 'PlayLevelView onRealTimeMultiplayerCreatedGame'
@joinRealTimeMultiplayerGame e
- @realTimePlayerGameStatus.set 'state', 'coding'
- @realTimePlayerStatus.set 'state', 'available'
+ @realTimePlayerGameRef.update 'state': 'coding'
+ @realTimePlayerRef.update 'state': 'available'
Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Waiting for opponent..'
- onRealTimeSessionChanged: (e) =>
- # console.log 'PlayLevelView onRealTimeSessionChanged', e
- if e.get('state') is 'finished'
+ onRealTimeSessionChanged: (snapshot) =>
+ # console.log 'PlayLevelView onRealTimeSessionChanged', snapshot.val()
+ @realTimeSessionData = snapshot.val()
+ if @realTimeSessionData?.state is 'finished'
@realTimeGameEnded()
Backbone.Mediator.publish 'real-time-multiplayer:left-game', {}
- onRealTimePlayerAdded: (e) =>
- # console.log 'PlayLevelView onRealTimePlayerAdded', e
+ onRealTimePlayerAdded: (snapshot) =>
+ # console.log 'PlayLevelView onRealTimePlayerAdded', snapshot.val()
# Assume game is full, game on
- if @realTimeSession.get('state') is 'creating'
- @realTimeSession.set 'state', 'coding'
- @realTimePlayerStatus.set 'state', 'unavailable'
- @realTimeOpponent = new RealTimeModel('multiplayer_level_sessions/' + @realTimeSession.id + '/players/' + e.id)
- @realTimeOpponent.on 'change', @onRealTimeOpponentChanged
- Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Playing against ' + e.get('name')
- else
- console.error 'PlayLevelView onRealTimePlayerAdded session in unexpected state', @realTimeSession.get('state')
+ data = snapshot.val()
+ if data? and data.id isnt me.id
+ @realTimeOpponentData = data
+ console.log 'PlayLevelView onRealTimePlayerAdded opponent', @realTimeOpponentData, @realTimePlayersData
+ @realTimePlayersData[@realTimeOpponentData.id] = @realTimeOpponentData
+ if @realTimeSessionData?.state is 'creating'
+ @realTimeSessionRef.update 'state': 'coding'
+ @realTimePlayerRef.update 'state': 'unavailable'
+ @realTimeOpponentRef = @realTimeSessionRef.child "players/#{@realTimeOpponentData.id}"
+ @realTimeOpponentRef.on 'value', @onRealTimeOpponentChanged
+ Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: "Playing against #{@realTimeOpponentData.name}"
- onRealTimeOpponentChanged: (e) =>
- # console.log 'PlayLevelView onRealTimeOpponentChanged', e
- switch @realTimeOpponent.get('state')
+ onRealTimeOpponentChanged: (snapshot) =>
+ # console.log 'PlayLevelView onRealTimeOpponentChanged', snapshot.val()
+ @realTimeOpponentData = snapshot.val()
+ switch @realTimeOpponentData?.state
when 'left'
console.info 'Real-time multiplayer opponent left the game'
- opponentID = @realTimeOpponent.id
+ opponentID = @realTimeOpponentData.id
@realTimeGameEnded()
Backbone.Mediator.publish 'real-time-multiplayer:left-game', userID: opponentID
when 'submitted'
# TODO: What should this message say?
- Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: @realTimeOpponent.get('name') + ' waiting for your code'
+ Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: "#{@realTimeOpponentData.name} waiting for your code"
joinRealTimeMultiplayerGame: (e) ->
- unless @realTimeSession?
- # TODO: Necessary for real-time multiplayer sessions?
+ # console.log 'PlayLevelView joinRealTimeMultiplayerGame', e
+ unless @realTimeSessionRef?
@session.set('submittedCodeLanguage', @session.get('codeLanguage'))
@session.save()
- @realTimeSession = new RealTimeModel 'multiplayer_level_sessions/' + e.realTimeSessionID
- @realTimeSession.on 'change', @onRealTimeSessionChanged
- @realTimePlayers = new RealTimeCollection 'multiplayer_level_sessions/' + e.realTimeSessionID + '/players'
- @realTimePlayers.on 'add', @onRealTimePlayerAdded
- @realTimePlayerGameStatus = new RealTimeModel 'multiplayer_level_sessions/' + e.realTimeSessionID + '/players/' + me.id
+ @realTimeSessionRef = new Firebase "#{@multiplayerFireHost}multiplayer_level_sessions/#{@levelID}/#{e.realTimeSessionID}"
+ @realTimePlayersRef = @realTimeSessionRef.child 'players'
+
+ # Look for opponent
+ @realTimeSessionRef.once 'value', (multiplayerSessionSnapshot) =>
+ if @realTimeSessionData = multiplayerSessionSnapshot.val()
+ @realTimePlayersRef.once 'value', (playsSnapshot) =>
+ if @realTimePlayersData = playsSnapshot.val()
+ for id, player of @realTimePlayersData
+ if id isnt me.id
+ @realTimeOpponentRef = @realTimeSessionRef.child "players/#{id}"
+ @realTimeOpponentRef.once 'value', (opponentSnapshot) =>
+ if @realTimeOpponentData = opponentSnapshot.val()
+ @updateTeam()
+ else
+ console.error 'Could not lookup multiplayer opponent data.'
+ @realTimeOpponentRef.on 'value', @onRealTimeOpponentChanged
+ Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Playing against ' + player.name
+ else
+ console.error 'Could not lookup multiplayer session players data.'
+ # TODO: need child_removed too?
+ @realTimePlayersRef.on 'child_added', @onRealTimePlayerAdded
+ else
+ console.error 'Could not lookup multiplayer session data.'
+ @realTimeSessionRef.on 'value', @onRealTimeSessionChanged
+
+ @realTimePlayerGameRef = @realTimeSessionRef.child "players/#{me.id}"
+
# TODO: Follow up in MultiplayerView to see if double joins can be avoided
# else
- # console.error 'Joining real-time multiplayer game with an existing @realTimeSession.'
+ # console.error 'Joining real-time multiplayer game with an existing @realTimeSessionRef.'
onRealTimeMultiplayerJoinedGame: (e) ->
- # console.log 'PlayLevelView onRealTimeMultiplayerJoinedGame', e
+ console.log 'PlayLevelView onRealTimeMultiplayerJoinedGame', e
@joinRealTimeMultiplayerGame e
- @realTimePlayerGameStatus.set 'state', 'coding'
- @realTimePlayerStatus.set 'state', 'unavailable'
- unless @realTimeOpponent?
- for id, player of @realTimeSession.get('players')
- if id isnt me.id
- @realTimeOpponent = new RealTimeModel 'multiplayer_level_sessions/' + e.realTimeSessionID + '/players/' + id
- @realTimeOpponent.on 'change', @onRealTimeOpponentChanged
- Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Playing against ' + player.name
- unless @realTimeOpponent?
- console.error 'Did not find an oppoonent in onRealTimeMultiplayerJoinedGame.'
- @updateTeam()
+ @realTimePlayerGameRef.update 'state': 'coding'
+ @realTimePlayerRef.update 'state': 'unavailable'
onRealTimeMultiplayerLeftGame: (e) ->
# console.log 'PlayLevelView onRealTimeMultiplayerLeftGame', e
if e.userID? and e.userID is me.id
- @realTimePlayerGameStatus.set 'state', 'left'
+ @realTimePlayerGameRef.update 'state': 'left'
@realTimeGameEnded()
realTimeMultiplayerContinueGame: (realTimeSessionID) ->
@@ -738,102 +774,112 @@ module.exports = class PlayLevelView extends RootView
Backbone.Mediator.publish 'real-time-multiplayer:joined-game', realTimeSessionID: realTimeSessionID
console.info 'Setting my game status to ready'
- @realTimePlayerGameStatus.set 'state', 'ready'
+ @realTimePlayerGameRef.update 'state': 'ready'
- if @realTimeOpponent.get('state') is 'ready'
+ if @realTimeOpponentData.state is 'ready'
@realTimeOpponentIsReady()
else
console.info 'Waiting for opponent to be ready'
- @realTimeOpponent.on 'change', @realTimeOpponentMaybeReady
+ @realTimeOpponentRef.on 'value', @realTimeOpponentMaybeReady
- realTimeOpponentMaybeReady: =>
+ realTimeOpponentMaybeReady: (snapshot) =>
# console.log 'PlayLevelView realTimeOpponentMaybeReady'
- if @realTimeOpponent.get('state') is 'ready'
- @realTimeOpponent.off 'change', @realTimeOpponentMaybeReady
- @realTimeOpponentIsReady()
+ if @realTimeOpponentData = snapshot.val()
+ if @realTimeOpponentData.state is 'ready'
+ @realTimeOpponentRef.off 'value', @realTimeOpponentMaybeReady
+ @realTimeOpponentIsReady()
realTimeOpponentIsReady: =>
console.info 'All real-time multiplayer players are ready!'
- @realTimeSession.set 'state', 'running'
- Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Battling ' + @realTimeOpponent.get('name')
+ @realTimeSessionRef.update 'state': 'running'
+ Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Battling ' + @realTimeOpponentData.name
Backbone.Mediator.publish 'tome:manual-cast', {realTime: true}
realTimeGameEnded: ->
- if @realTimeOpponent?
- @realTimeOpponent.off 'change', @onRealTimeOpponentChanged
- @realTimeOpponent = null
- if @realTimePlayers?
- @realTimePlayers.off 'add', @onRealTimePlayerAdded
- @realTimePlayers = null
- if @realTimeSession?
- @realTimeSession.off 'change', @onRealTimeSessionChanged
- @realTimeSession.set 'state', 'finished'
- @realTimeSession = null
- if @realTimePlayerGameStatus?
- @realTimePlayerGameStatus = null
- if @realTimePlayerStatus?
- @realTimePlayerStatus.set 'state', 'playing'
+ if @realTimeOpponentRef?
+ @realTimeOpponentRef.off 'value', @onRealTimeOpponentChanged
+ @realTimeOpponentRef = null
+ if @realTimePlayersRef?
+ @realTimePlayersRef.off 'child_added', @onRealTimePlayerAdded
+ @realTimePlayersRef = null
+ if @realTimeSessionRef?
+ @realTimeSessionRef.off 'value', @onRealTimeSessionChanged
+ @realTimeSessionRef.update 'state': 'finished'
+ @realTimeSessionRef = null
+ if @realTimePlayerGameRef?
+ @realTimePlayerGameRef = null
+ if @realTimePlayerRef?
+ @realTimePlayerRef.update 'state': 'playing'
Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: ''
onRealTimeMultiplayerCast: (e) ->
- # console.log 'PlayLevelView onRealTimeMultiplayerCast', e
- unless @realTimeSession
- console.error 'onRealTimeMultiplayerCast without a multiplayerSession'
+ # console.log 'PlayLevelView onRealTimeMultiplayerCast', @realTimeSessionData, @realTimePlayersData
+ unless @realTimeSessionRef?
+ console.error 'Real-time multiplayer cast without multiplayer session.'
+ return
+ unless @realTimeSessionData?
+ console.error 'Real-time multiplayer cast without multiplayer data.'
+ return
+ unless @realTimePlayersData?
+ console.error 'Real-time multiplayer cast without multiplayer players data.'
return
# Set submissionCount for created real-time multiplayer session
- if me.id is @realTimeSession.get('creator')
+ if me.id is @realTimeSessionData.creator
sessionState = @session.get('state')
if sessionState?
submissionCount = sessionState.submissionCount
console.info 'Setting multiplayer submissionCount to', submissionCount
- @realTimeSession.set 'submissionCount', submissionCount
+ @realTimeSessionRef.update 'submissionCount': submissionCount
else
console.error 'Failed to read sessionState in onRealTimeMultiplayerCast'
- players = new RealTimeCollection('multiplayer_level_sessions/' + @realTimeSession.id + '/players')
- myPlayer = opponentPlayer = null
- players.each (player) ->
- if player.id is me.id
- myPlayer = player
- else
- opponentPlayer = player
- if myPlayer
- console.info 'Submitting my code'
- @session.patch()
- myPlayer.set 'state', 'submitted'
+ console.info 'Submitting my code'
+ # Transpiling code copied from scripts/transpile.coffee
+ # TODO: Should this live somewhere else?
+ transpiledCode = {}
+ for thang, spells of @session.get('code')
+ transpiledCode[thang] = {}
+ for spellID, spell of spells
+ spellName = thang + '/' + spellID
+ continue if @session.get('teamSpells') and not (spellName in @session.get('teamSpells')[@session.get('team')])
+ # console.log "PlayLevelView Transpiling spell #{spellName}"
+ aetherOptions = createAetherOptions functionName: spellID, codeLanguage: @session.get('submittedCodeLanguage'), includeFlow: true
+ aether = new Aether aetherOptions
+ transpiledCode[thang][spellID] = aether.transpile spell
+ # console.log "PlayLevelView transpiled code", transpiledCode
+ @session.set 'transpiledCode', transpiledCode
+ @session.patch()
+ @realTimePlayerGameRef.update 'state': 'submitted'
+
+ console.info 'Other player is', @realTimeOpponentData.state
+ if @realTimeOpponentData.state in ['submitted', 'ready']
+ @realTimeOpponentSubmittedCode @realTimeOpponentData, @realTimePlayerGameData
else
- console.error 'Did not find my player in onRealTimeMultiplayerCast'
- if opponentPlayer
- # TODO: Shouldn't need nested opponentPlayer change listeners here
- state = opponentPlayer.get('state')
- console.info 'Other player is', state
- if state in ['submitted', 'ready']
- @realTimeOpponentSubmittedCode opponentPlayer, myPlayer
- else
- # Wait for opponent to submit their code
- Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Waiting for code from ' + @realTimeOpponent.get('name')
- opponentPlayer.on 'change', (e) =>
- state = opponentPlayer.get('state')
- if state in ['submitted', 'ready']
- @realTimeOpponentSubmittedCode opponentPlayer, myPlayer
- opponentPlayer.off 'change'
- else
- console.error 'Did not find opponent player in onRealTimeMultiplayerCast'
+ # Wait for opponent to submit their code
+ Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: "Waiting for code from #{@realTimeOpponentData.name}"
+ @realTimeOpponentRef.on 'value', @realTimeOpponentMaybeSubmitted
+
+ realTimeOpponentMaybeSubmitted: (snapshot) =>
+ if @realTimeOpponentData = snapshot.val()
+ if @realTimeOpponentData.state in ['submitted', 'ready']
+ @realTimeOpponentRef.off 'value', @realTimeOpponentMaybeSubmitted
+ @realTimeOpponentSubmittedCode @realTimeOpponentData, @realTimePlayerGameData
onRealTimeMultiplayerPlaybackEnded: ->
- if @realTimeSession?
- @realTimeSession.set 'state', 'coding'
- @realTimePlayers.each (player) -> player.set 'state', 'coding' if player.id is me.id
- if @realTimeOpponent?
- Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: 'Playing against ' + @realTimeOpponent.get('name')
+ # console.log 'PlayLevelView onRealTimeMultiplayerPlaybackEnded'
+ if @realTimeSessionRef?
+ @realTimeSessionRef.update 'state': 'coding'
+ @realTimePlayerGameRef.update 'state': 'coding'
+ if @realTimeOpponentData?
+ Backbone.Mediator.publish 'real-time-multiplayer:player-status', status: "Playing against #{@realTimeOpponentData.name}"
realTimeOpponentSubmittedCode: (opponentPlayer, myPlayer) =>
- # console.log 'PlayLevelView realTimeOpponentSubmittedCode', @realTimeSession.id, opponentPlayer.get('level_session')
+ # console.log 'PlayLevelView realTimeOpponentSubmittedCode', @realTimeSessionData.id, opponentPlayer.level_session
# Read submissionCount for joined real-time multiplayer session
- if me.id isnt @realTimeSession.get('creator')
+ if me.id isnt @realTimeSessionData.creator
sessionState = @session.get('state') ? {}
- newSubmissionCount = @realTimeSession.get 'submissionCount'
+ newSubmissionCount = @realTimeSessionData.submissionCount
if newSubmissionCount?
# TODO: This isn't always getting updated where the random seed generation uses it.
sessionState.submissionCount = parseInt newSubmissionCount
@@ -845,21 +891,21 @@ module.exports = class PlayLevelView extends RootView
Backbone.Mediator.publish 'router:navigate',
route: "/play/level/#{@levelID}"
viewClass: PlayLevelView
- viewArgs: [{supermodel: @supermodel, autoUnveil: true, realTimeMultiplayerSessionID: @realTimeSession.id, opponent: opponentPlayer.get('level_session'), team: @team}, @levelID]
+ viewArgs: [{supermodel: @supermodel, autoUnveil: true, realTimeMultiplayerSessionID: @realTimeSessionData.id, opponent: opponentPlayer.level_session, team: @team}, @levelID]
updateTeam: ->
# If not creator, and same team as creator, then switch teams
# TODO: Assumes there are only 'humans' and 'ogres'
- unless @realTimeOpponent?
- console.error 'Tried to switch teams without a real-time opponent.'
+ unless @realTimeOpponentData?
+ console.error 'Tried to switch teams without real-time multiplayer opponent data.'
return
- unless @realTimeSession?
- console.error 'Tried to switch teams without a real-time session.'
+ unless @realTimeSessionData?
+ console.error 'Tried to switch teams without real-time multiplayer session data.'
return
- return if me.id is @realTimeSession.get('creator')
+ return if me.id is @realTimeSessionData.creator
- oldTeam = @realTimeOpponent.get('team')
+ oldTeam = @realTimeOpponentData.team
return unless oldTeam is @session.get('team')
# Need to switch to other team
@@ -904,15 +950,4 @@ module.exports = class PlayLevelView extends RootView
# TODO: Don't hardcode spellName
Backbone.Mediator.publish 'level:select-sprite', thangID: sessionState.selected, spellName: 'plan'
- onIPadMemoryWarning: (e) ->
- @hasReceivedMemoryWarning = true
-
- onItemPurchased: (e) ->
- heroConfig = @session.get('heroConfig') ? {}
- inventory = heroConfig.inventory ? {}
- slot = e.item.getAllowedSlots()[0]
- if slot and not inventory[slot]
- # Open up the inventory modal so they can equip the new item
- @setupManager?.destroy()
- @setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session, hadEverChosenHero: true})
- @setupManager.open()
+# End Real-time Multiplayer ######################################################
diff --git a/app/views/play/level/tome/CastButtonView.coffee b/app/views/play/level/tome/CastButtonView.coffee
index 5ed174743..385c46edb 100644
--- a/app/views/play/level/tome/CastButtonView.coffee
+++ b/app/views/play/level/tome/CastButtonView.coffee
@@ -28,7 +28,6 @@ module.exports = class CastButtonView extends CocoView
@levelID = options.levelID
@castShortcut = '⇧↵'
@levelOptions = LevelOptions[@options.levelID] ? {}
- @initButtonTextABTest() unless @levelOptions.hidesRealTimePlayback
getRenderData: (context={}) ->
context = super context
@@ -38,8 +37,6 @@ module.exports = class CastButtonView extends CocoView
castRealTimeShortcutVerbose = (if @isMac() then 'Cmd' else 'Ctrl') + '+' + castShortcutVerbose
context.castVerbose = castShortcutVerbose + ': ' + $.i18n.t('keyboard_shortcuts.run_code')
context.castRealTimeVerbose = castRealTimeShortcutVerbose + ': ' + $.i18n.t('keyboard_shortcuts.run_real_time')
- # A/B test submit button text
- context.testSubmitText = @testButtonsText.submit if @testGroup? and @testGroup isnt 0
context
afterRender: ->
@@ -115,19 +112,14 @@ module.exports = class CastButtonView extends CocoView
, (castable) =>
Backbone.Mediator.publish 'tome:spell-has-changed-significantly-calculation', hasChangedSignificantly: castable
@castButton.toggleClass('castable', castable).toggleClass('casting', @casting)
-
- # A/B testing cast button text for en-US
- unless @testGroup? and @testGroup isnt 0
- if @casting
- castText = $.i18n.t('play_level.tome_cast_button_running')
- else if castable or true
- castText = $.i18n.t('play_level.tome_cast_button_run')
- unless @levelOptions.hidesRunShortcut # Hide for first few.
- castText += ' ' + @castShortcut
- else
- castText = $.i18n.t('play_level.tome_cast_button_ran')
+ if @casting
+ castText = $.i18n.t('play_level.tome_cast_button_running')
+ else if castable or true
+ castText = $.i18n.t('play_level.tome_cast_button_run')
+ unless @levelOptions.hidesRunShortcut # Hide for first few.
+ castText += ' ' + @castShortcut
else
- castText = @testButtonsText.run
+ castText = $.i18n.t('play_level.tome_cast_button_ran')
@castButton.text castText
#@castButton.prop 'disabled', not castable
@@ -147,25 +139,3 @@ module.exports = class CastButtonView extends CocoView
onLeftRealTimeMultiplayerGame: (e) ->
@inRealTimeMultiplayerSession = false
-
- # https://mixpanel.com/report/227350/segmentation/#action:segment,arb_event:'Saw%20Victory',bool_op:or,chart_type:bar,from_date:-9,segfilter:!((filter:(operand:!('Ogre%20Encampment'),operator:%3D%3D),property:level,selected_property_type:string,type:string),(property:castButtonTextGroup,selected_property_type:number,type:number)),segment_type:number,to_date:0,type:unique,unit:day
- initButtonTextABTest: ->
- return if me.isAdmin()
- return unless $.i18n.lng() is 'en-US'
- # A/B test buttons text
- # Only testing 'en-US' for simplicity and it accounts for a significant % of users
- # Test group 0 is existing behavior
- # Intentionally leaving out cast shortcut for test groups for simplicity
- @testGroup = me.getCastButtonTextGroup()
- @testButtonsText = switch @testGroup
- when 0 then run: 'Run/Running', submit: 'Submit'
- when 1 then run: 'Run', submit: 'Submit'
- when 2 then run: 'Test', submit: 'Submit'
- when 3 then run: 'Run', submit: 'Continue'
- when 4 then run: 'Test', submit: 'Continue'
- when 5 then run: 'Run', submit: 'Finish'
- when 6 then run: 'Test', submit: 'Finish'
- application.tracker?.trackEvent 'Cast Button',
- levelID: @levelID
- castButtonText: @testButtonsText.run + ' ' + @testButtonsText.submit
- castButtonTextGroup: @testGroup
diff --git a/app/views/play/level/tome/DocFormatter.coffee b/app/views/play/level/tome/DocFormatter.coffee
index ad00fb48f..6cc579d8b 100644
--- a/app/views/play/level/tome/DocFormatter.coffee
+++ b/app/views/play/level/tome/DocFormatter.coffee
@@ -100,6 +100,9 @@ module.exports = class DocFormatter
if val = obj[prop]
context = @doc.context
obj[prop] = val = utils.i18n obj, prop
+ # For multiplexed-by-both-code-and-spoken-language objects, now also get code language again.
+ if _.isObject val
+ obj[prop] = val = obj[prop]?[@options.language]
if @doc.i18n
spokenLanguage = me.get 'preferredLanguage'
while spokenLanguage
@@ -113,13 +116,18 @@ module.exports = class DocFormatter
obj[prop] = _.template val, context
catch e
console.error "Couldn't create docs template of", val, "\nwith context", context, "\nError:", e
+ obj[prop] = @replaceSpriteName obj[prop] # Do this before using the template, otherwise marked might get us first.
formatPopover: ->
content = popoverTemplate doc: @doc, language: @options.language, value: @formatValue(), marked: marked, argumentExamples: (arg.example or arg.default or arg.name for arg in @doc.args ? []), writable: @options.writable, selectedMethod: @options.selectedMethod, cooldowns: @inferCooldowns(), item: @options.item
owner = if @doc.owner is 'this' then @options.thang else window[@doc.owner]
- content = content.replace /#{spriteName}/g, @options.thang.type ? @options.thang.spriteName # Prefer type, and excluded the quotes we'd get with @formatValue
+ content = @replaceSpriteName content
content.replace /\#\{(.*?)\}/g, (s, properties) => @formatValue downTheChain(owner, properties.split('.'))
+ replaceSpriteName: (s) ->
+ # Prefer type, and excluded the quotes we'd get with @formatValue
+ s.replace /#{spriteName}/g, @options.thang.type ? @options.thang.spriteName
+
formatValue: (v) ->
return null if @doc.type is 'snippet'
return @options.thang.now() if @doc.name is 'now'
@@ -130,7 +138,7 @@ module.exports = class DocFormatter
else
v = window[@doc.owner][@doc.name] # grab Math or Vector
if @doc.type is 'number' and not _.isNaN v
- if v == Math.round v
+ if v is Math.round v
return v
if _.isNumber v
return v.toFixed 2
@@ -165,5 +173,7 @@ module.exports = class DocFormatter
return null unless action
cooldowns = cooldown: action.cooldown, specificCooldown: action.specificCooldown, name: actionName, type: type
for prop in ['range', 'radius', 'duration', 'damage']
- cooldowns[prop] = owner[_.string.camelize actionName + _.string.capitalize(prop)]
+ cooldowns[prop] = v = owner[_.string.camelize actionName + _.string.capitalize(prop)]
+ if _.isNumber(v) and v isnt Math.round v
+ cooldowns[prop] = v.toFixed 2
cooldowns
diff --git a/app/views/play/level/tome/ProblemAlertView.coffee b/app/views/play/level/tome/ProblemAlertView.coffee
index a94987bf7..3c268e1b2 100644
--- a/app/views/play/level/tome/ProblemAlertView.coffee
+++ b/app/views/play/level/tome/ProblemAlertView.coffee
@@ -88,8 +88,12 @@ module.exports = class ProblemAlertView extends CocoView
onWindowResize: (e) =>
# TODO: This all seems a little hacky
if @problem?
- @$el.css('left', $('#goals-view').outerWidth(true) + 'px')
- @$el.css('right', $('#code-area').outerWidth(true) + 'px')
+ levelContentWidth = $('.level-content').outerWidth(true)
+ goalsViewWidth = $('#goals-view').outerWidth(true)
+ codeAreaWidth = $('#code-area').outerWidth(true)
+ # problem alert view has 20px padding
+ @$el.css('max-width', levelContentWidth - codeAreaWidth - goalsViewWidth + 40 + 'px')
+ @$el.css('right', codeAreaWidth + 'px')
# 110px from top roughly aligns top of alert with top of first code line
# TODO: calculate this in a more dynamic, less sketchy way
diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee
index 1d7acdcd9..98e713dc3 100644
--- a/app/views/play/level/tome/Spell.coffee
+++ b/app/views/play/level/tome/Spell.coffee
@@ -185,7 +185,6 @@ module.exports = class Spell
shouldUseTranspiledCode: ->
# Determine whether this code has already been transpiled, or whether it's raw source needing transpilation.
- return false if @levelType is 'hero-ladder'
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.
diff --git a/app/views/play/level/tome/SpellPaletteEntryView.coffee b/app/views/play/level/tome/SpellPaletteEntryView.coffee
index a66d70131..80217af28 100644
--- a/app/views/play/level/tome/SpellPaletteEntryView.coffee
+++ b/app/views/play/level/tome/SpellPaletteEntryView.coffee
@@ -46,10 +46,12 @@ module.exports = class SpellPaletteEntryView extends CocoView
content: @docFormatter.formatPopover()
container: 'body'
template: @overridePopoverTemplate
- ).on 'show.bs.popover', =>
+ ).on 'shown.bs.popover', =>
Backbone.Mediator.publish 'tome:palette-hovered', thang: @thang, prop: @doc.name, entry: @
soundIndex = Math.floor(Math.random() * 4)
Backbone.Mediator.publish 'audio-player:play-sound', trigger: "spell-palette-entry-open-#{soundIndex}", volume: 0.75
+ popover = @$el.data('bs.popover')
+ popover?.$tip?.i18n()
onMouseEnter: (e) ->
# Make sure the doc has the updated Thang so it can regenerate its prop value
@@ -78,7 +80,14 @@ module.exports = class SpellPaletteEntryView extends CocoView
Backbone.Mediator.publish 'tome:palette-pin-toggled', entry: @, pinned: @popoverPinned
onClick: (e) =>
- return if @options.level.get('type', true) is 'hero' # No need for confusing docs pinning on hero levels.
+ if @options.level.get('type', true) is 'hero'
+ # Jiggle instead of pin for hero levels
+ jigglyPopover = $('.spell-palette-popover.popover')
+ jigglyPopover.addClass 'jiggling'
+ pauseJiggle = =>
+ jigglyPopover.removeClass 'jiggling'
+ _.delay pauseJiggle, 1000
+ return
if key.shift
Backbone.Mediator.publish 'tome:insert-snippet', doc: @options.doc, language: @options.language, formatted: @doc
return
diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee
index 40f4f90bc..dc6c984d5 100644
--- a/app/views/play/level/tome/SpellView.coffee
+++ b/app/views/play/level/tome/SpellView.coffee
@@ -228,7 +228,7 @@ module.exports = class SpellView extends CocoView
unless CampaignOptions?.getOption?(@options?.level?.get?('slug'), 'backspaceThrottle')
@ace.remove "left"
return
-
+
nowDate = Date.now()
if @aceSession.selection.isEmpty()
cursor = @ace.getCursorPosition()
@@ -245,7 +245,7 @@ module.exports = class SpellView extends CocoView
@backspaceThrottleMs = null
@lastBackspace = nowDate
@ace.remove "left"
-
+
fillACE: ->
@@ -293,8 +293,15 @@ module.exports = class SpellView extends CocoView
return true if doc.owner is owner
return (owner is 'this' or owner is 'more') and (not doc.owner? or doc.owner is 'this')
if doc?.snippets?[e.language]
+ content = doc.snippets[e.language].code
+ if /loop/.test(content) and LevelOptions[@options.level.get('slug')]?.moveRightLoopSnippet
+ # Replace default loop snippet with an embedded moveRight()
+ content = switch e.language
+ when 'python' then 'loop:\n self.moveRight()\n ${1:}'
+ when 'javascript' then 'loop {\n this.moveRight();\n ${1:}\n}'
+ else content
entry =
- content: doc.snippets[e.language].code
+ content: content
meta: 'press tab'
name: doc.name
tabTrigger: doc.snippets[e.language].tab
@@ -793,6 +800,7 @@ module.exports = class SpellView extends CocoView
@decoratedGutter[row] = ''
lastExecuted = _.last executed
showToolbarView = executed.length and @spellThang.castAether.metrics.statementsExecuted > 3 and not LevelOptions[@options.level.get('slug')]?.hidesCodeToolbar # Hide for a while
+ showToolbarView = false # TODO: fix toolbar styling in new design to have some space for it
if showToolbarView
statementIndex = Math.max 0, lastExecuted.length - 1
@@ -939,12 +947,18 @@ module.exports = class SpellView extends CocoView
return if @destroyed
source = @getSource().replace @singleLineCommentRegex(), ''
suspectCodeFragments = LevelOptions[@options.level.get('slug')].suspectCode
+ detectedSuspectCodeFragmentNames = []
for suspectCodeFragment in suspectCodeFragments
if suspectCodeFragment.pattern.test source
@warnedCodeFragments ?= {}
unless @warnedCodeFragments[suspectCodeFragment.name]
Backbone.Mediator.publish 'tome:suspect-code-fragment-added', codeFragment: suspectCodeFragment.name, codeLanguage: @spell.language
- @warnedCodeFragments[suspectCodeFragment] = true
+ @warnedCodeFragments[suspectCodeFragment.name] = true
+ detectedSuspectCodeFragmentNames.push suspectCodeFragment.name
+ for lastDetectedSuspectCodeFragmentName in @lastDetectedSuspectCodeFragmentNames ? []
+ unless lastDetectedSuspectCodeFragmentName in detectedSuspectCodeFragmentNames
+ Backbone.Mediator.publish 'tome:suspect-code-fragment-deleted', codeFragment: lastDetectedSuspectCodeFragmentName, codeLanguage: @spell.language
+ @lastDetectedSuspectCodeFragmentNames = detectedSuspectCodeFragmentNames
destroy: ->
$(@ace?.container).find('.ace_gutter').off 'click', '.ace_error, .ace_warning, .ace_info', @onAnnotationClick
diff --git a/app/views/play/modal/ItemDetailsView.coffee b/app/views/play/modal/ItemDetailsView.coffee
index 8c860fc3f..6baed33e9 100644
--- a/app/views/play/modal/ItemDetailsView.coffee
+++ b/app/views/play/modal/ItemDetailsView.coffee
@@ -3,6 +3,7 @@ template = require 'templates/play/modal/item-details-view'
CocoCollection = require 'collections/CocoCollection'
LevelComponent = require 'models/LevelComponent'
+{downTheChain} = require 'lib/world/world_utils'
utils = require 'lib/utils'
module.exports = class ItemDetailsView extends CocoView
@@ -21,6 +22,7 @@ module.exports = class ItemDetailsView extends CocoView
@item.affordable = me.gems() >= @item.get('gems')
@item.owned = me.ownsItem @item.get('original')
@item.comingSoon = not @item.getFrontFacingStats().props.length and not _.size @item.getFrontFacingStats().stats # Temp: while there are placeholder items
+ @componentConfigs = (c.config for c in @item.get('components') when c.config)
stats = @item.getFrontFacingStats()
props = (p for p in stats.props when not @propDocs[p])
@@ -78,15 +80,22 @@ module.exports = class ItemDetailsView extends CocoView
description = description.replace(/#{spriteName}/g, 'hero')
if fact = stats.stats.shieldDefenseFactor
description = description.replace(/#{shieldDefensePercent}%/g, fact.display)
- ## We don't have the full components loaded here, so we can't really get most of these values.
- #description = description.replace /#{([^.]+?)}/g, (match, keyChain) ->
- # console.log 'gotta find', keyChain, 'from', match, 'and have', stats
- # match
+ if prop is 'buildTypes'
+ buildsConfig = _.find @componentConfigs, 'buildables'
+ description = description.replace '#{buildTypes}', "`[\"#{_.keys(buildsConfig.buildables).join('\", \"')}\"]`"
+ # We don't have the full components loaded here, so we can't really get most of these values.
+ componentConfigs = @componentConfigs ? []
+ description = description.replace /#{([^.]+?)}/g, (match, keyChain) ->
+ for componentConfig in componentConfigs
+ if value = downTheChain componentConfig, keyChain
+ return value
+ #console.log 'gotta find', keyChain, 'from', match
+ match
description = description.replace(/#{(.+?)}/g, '`$1`')
description = $(marked(description)).html()
c.props.push {
- name: _.string.humanize prop
+ name: prop
description: description or '...'
}
c
diff --git a/app/views/play/modal/PlayAchievementsModal.coffee b/app/views/play/modal/PlayAchievementsModal.coffee
index 360330685..686bc5ed9 100644
--- a/app/views/play/modal/PlayAchievementsModal.coffee
+++ b/app/views/play/modal/PlayAchievementsModal.coffee
@@ -11,17 +11,16 @@ PAGE_SIZE = 200
module.exports = class PlayAchievementsModal extends ModalView
className: 'modal fade play-modal'
template: template
- modalWidthPercent: 90
id: 'play-achievements-modal'
plain: true
-
+
earnedMap: {}
constructor: (options) ->
super options
@achievements = new Backbone.Collection()
earnedMap = {}
-
+
achievementsFetcher = new CocoCollection([], {url: '/db/achievement', model: Achievement})
achievementsFetcher.setProjection([
'name'
@@ -32,10 +31,10 @@ module.exports = class PlayAchievementsModal extends ModalView
'rewards'
'collection'
])
-
+
earnedAchievementsFetcher = new CocoCollection([], {url: '/db/earned_achievement', model: EarnedAchievement})
earnedAchievementsFetcher.setProjection([ 'achievement' ])
-
+
achievementsFetcher.skip = 0
achievementsFetcher.fetch({data: {skip: 0, limit: PAGE_SIZE}})
earnedAchievementsFetcher.skip = 0
@@ -46,7 +45,7 @@ module.exports = class PlayAchievementsModal extends ModalView
@supermodel.loadCollection(achievementsFetcher, 'achievement')
@supermodel.loadCollection(earnedAchievementsFetcher, 'achievement')
-
+
@onEverythingLoaded = _.after(2, @onEverythingLoaded)
onAchievementsLoaded: (fetcher) ->
diff --git a/server/achievements/earned_achievement_handler.coffee b/server/achievements/earned_achievement_handler.coffee
index cfb2a1f62..b35e6de22 100644
--- a/server/achievements/earned_achievement_handler.coffee
+++ b/server/achievements/earned_achievement_handler.coffee
@@ -12,6 +12,7 @@ class EarnedAchievementHandler extends Handler
# Don't allow POSTs or anything yet
hasAccess: (req) ->
+ return false unless req.user
req.method in ['GET', 'POST'] # or req.user.isAdmin()
get: (req, res) ->
diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee
index d3ae3071c..adabf2d8e 100644
--- a/server/commons/Handler.coffee
+++ b/server/commons/Handler.coffee
@@ -56,7 +56,7 @@ module.exports = class Handler
isBrandNew = req.method is 'POST' and not req.body.original
props = props.concat @postEditableProperties if isBrandNew
- if @modelClass.schema.uses_coco_permissions
+ if @modelClass.schema.uses_coco_permissions and req.user
# can only edit permissions if this is a brand new property,
# or you are an owner of the old one
isOwner = document.getAccessForUserObjectId(req.user._id) is 'owner'
@@ -523,7 +523,7 @@ module.exports = class Handler
# This is not a Mongoose user
projectionForUser: (req, model, ownerID) ->
- return {} if 'privateProperties' not of model or req.user._id + '' is ownerID + '' or req.user.isAdmin()
+ return {} if 'privateProperties' not of model or req.user?._id + '' is ownerID + '' or req.user.isAdmin()
projection = {}
projection[field] = 0 for field in model.privateProperties
projection
diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee
index b7c9ccaaa..665c39444 100644
--- a/server/levels/level_handler.coffee
+++ b/server/levels/level_handler.coffee
@@ -102,6 +102,7 @@ LevelHandler = class LevelHandler extends Handler
# of model, like in this case. Refactor to move that logic to the model instead.
getMySessions: (req, res, slugOrID) ->
+ return @sendForbiddenError(res) if not req.user
findParameters = {}
if Handler.isID slugOrID
findParameters['_id'] = slugOrID
@@ -271,6 +272,7 @@ LevelHandler = class LevelHandler extends Handler
@doGetFeedback req, res, levelID, false
getAllFeedback: (req, res, levelID) ->
+ return @sendNotFoundError(res) unless req.user
@doGetFeedback req, res, levelID, true
doGetFeedback: (req, res, levelID, multiple) ->
diff --git a/server/levels/sessions/LevelSession.coffee b/server/levels/sessions/LevelSession.coffee
index 80f511a9c..46beecef2 100644
--- a/server/levels/sessions/LevelSession.coffee
+++ b/server/levels/sessions/LevelSession.coffee
@@ -39,7 +39,7 @@ LevelSessionSchema.statics.privateProperties = ['code', 'submittedCode', 'unsubs
LevelSessionSchema.statics.editableProperties = ['multiplayer', 'players', 'code', 'codeLanguage', 'completed', 'state',
'levelName', 'creatorName', 'levelID', 'screenshot',
'chat', 'teamSpells', 'submitted', 'submittedCodeLanguage',
- 'unsubscribed', 'playtime', 'heroConfig', 'team']
+ 'unsubscribed', 'playtime', 'heroConfig', 'team', 'transpiledCode']
LevelSessionSchema.statics.jsonSchema = jsonschema
LevelSessionSchema.index {user: 1, changed: -1}, {sparse: true, name: 'last played index'}
diff --git a/server/levels/sessions/level_session_handler.coffee b/server/levels/sessions/level_session_handler.coffee
index 4e23a56f9..77d3ce7e0 100644
--- a/server/levels/sessions/level_session_handler.coffee
+++ b/server/levels/sessions/level_session_handler.coffee
@@ -20,7 +20,7 @@ class LevelSessionHandler extends Handler
return _.omit documentObject, @privateProperties
getActiveSessions: (req, res) ->
- return @sendForbiddenError(res) unless req.user.isAdmin()
+ return @sendForbiddenError(res) unless req.user?.isAdmin()
start = new Date()
start = new Date(start.getTime() - TIMEOUT)
query = @modelClass.find({'changed': {$gt: start}})
diff --git a/server/plugins/plugins.coffee b/server/plugins/plugins.coffee
index 9478a4a47..1007719a6 100644
--- a/server/plugins/plugins.coffee
+++ b/server/plugins/plugins.coffee
@@ -116,7 +116,7 @@ module.exports.PermissionsPlugin = (schema) ->
allowed = allowed[method] or []
for permission in @permissions
- if permission.target is 'public' or actor._id.equals(permission.target)
+ if permission.target is 'public' or actor?._id.equals(permission.target)
return true if permission.access in allowed
return false
diff --git a/server/routes/db.coffee b/server/routes/db.coffee
index 8791d3f91..6b967d38d 100644
--- a/server/routes/db.coffee
+++ b/server/routes/db.coffee
@@ -25,7 +25,8 @@ module.exports.setup = (app) ->
parts = module.split('/')
module = parts[0]
return getSchema(req, res, module) if parts[1] is 'schema'
- return errors.unauthorized(res, 'Must have an identity to do anything with the db. Do you have cookies enabled?') unless req.user
+ if (not req.user) and req.route.method isnt 'get'
+ return errors.unauthorized(res, 'Must have an identity to do anything with the db. Do you have cookies enabled?')
try
moduleName = module.replace new RegExp('\\.', 'g'), '_'
diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee
index 0e0e989ee..f051b5a3d 100644
--- a/server/users/user_handler.coffee
+++ b/server/users/user_handler.coffee
@@ -224,6 +224,7 @@ UserHandler = class UserHandler extends Handler
res.end()
getLevelSessionsForEmployer: (req, res, userID) ->
+ return @sendForbiddenError(res) unless req.user
return @sendForbiddenError(res) unless req.user._id+'' is userID or req.user.isAdmin() or ('employer' in (req.user.get('permissions') ? []))
query = creator: userID, levelID: {$in: ['criss-cross', 'gridmancer', 'greed', 'dungeon-arena', 'brawlwood', 'gold-rush']}
projection = 'levelName levelID team playtime codeLanguage submitted code totalScore teamSpells level'
@@ -241,7 +242,7 @@ UserHandler = class UserHandler extends Handler
return @sendDatabaseError res, err if err
return @sendNotFoundError res unless userID?
query = creator: userID + ''
- isAuthorized = req.user._id+'' is userID or req.user.isAdmin()
+ isAuthorized = req.user?._id+'' is userID or req.user?.isAdmin()
projection = {}
if req.query.project
projection[field] = 1 for field in req.query.project.split(',') when isAuthorized or not (field in LevelSessionHandler.privateProperties)
@@ -278,9 +279,9 @@ UserHandler = class UserHandler extends Handler
trackActivity: (req, res, userID, activityName, increment=1) ->
return @sendMethodNotAllowed res unless req.method is 'POST'
- isMe = userID is req.user._id + ''
- isAuthorized = isMe or req.user.isAdmin()
- isAuthorized ||= ('employer' in (req.user.get('permissions') ? [])) and (activityName in ['viewed_by_employer', 'contacted_by_employer'])
+ isMe = userID is req.user?._id + ''
+ isAuthorized = isMe or req.user?.isAdmin()
+ isAuthorized ||= ('employer' in (req.user?.get('permissions') ? [])) and (activityName in ['viewed_by_employer', 'contacted_by_employer'])
return @sendForbiddenError res unless isAuthorized
updateUser = (user) =>
activity = user.trackActivity activityName, increment
@@ -322,6 +323,7 @@ UserHandler = class UserHandler extends Handler
res.end()
getCandidates: (req, res) ->
+ return @sendForbiddenError(res) unless req.user
authorized = req.user.isAdmin() or ('employer' in (req.user.get('permissions') ? []))
months = if req.user.isAdmin() then 12 else 2
since = (new Date((new Date()) - months * 30.4 * 86400 * 1000)).toISOString()
@@ -356,7 +358,7 @@ UserHandler = class UserHandler extends Handler
true
getEmployers: (req, res) ->
- return @sendForbiddenError(res) unless req.user.isAdmin()
+ return @sendForbiddenError(res) unless req.user?.isAdmin()
query = {employerAt: {$exists: true, $ne: ''}}
selection = 'name firstName lastName email activity signedEmployerAgreement photoURL employerAt'
User.find(query).select(selection).lean().exec (err, documents) =>
@@ -379,7 +381,7 @@ UserHandler = class UserHandler extends Handler
hash.digest('hex')
getRemark: (req, res, userID) ->
- return @sendForbiddenError(res) unless req.user.isAdmin()
+ return @sendForbiddenError(res) unless req.user?.isAdmin()
query = user: userID
projection = null
if req.query.project
@@ -392,7 +394,7 @@ UserHandler = class UserHandler extends Handler
searchForUser: (req, res) ->
# TODO: also somehow search the CLAs to find a match amongst those fields and to find GitHub ids
- return @sendForbiddenError(res) unless req.user.isAdmin()
+ return @sendForbiddenError(res) unless req.user?.isAdmin()
search = req.body.search
query = email: {$exists: true}, $or: [
{emailLower: search}
@@ -605,7 +607,7 @@ UserHandler = class UserHandler extends Handler
@statRecalculators[statName] done
recalculate: (req, res, statName) ->
- return @sendForbiddenError(res) unless req.user.isAdmin()
+ return @sendForbiddenError(res) unless req.user?.isAdmin()
log.debug 'recalculate'
return @sendNotFoundError(res) unless statName of @statRecalculators
@recalculateStats statName