From fe66b6e9605a89d521f09bf3b90db0baaaa88d87 Mon Sep 17 00:00:00 2001
From: yjw9012 <yjw9012@hotmail.com>
Date: Thu, 16 Oct 2014 21:39:59 -0700
Subject: [PATCH 01/46] #1668: moved the question above the dropdown
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

moved the question ‘which programming do you want to use?’ above the
programming language dropdown.
---
 app/templates/game-menu/choose-hero-view.jade | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/templates/game-menu/choose-hero-view.jade b/app/templates/game-menu/choose-hero-view.jade
index 131023084..e9f86a36a 100644
--- a/app/templates/game-menu/choose-hero-view.jade
+++ b/app/templates/game-menu/choose-hero-view.jade
@@ -43,11 +43,11 @@
 
 .form
   .form-group.select-group
+    span.help-block(data-i18n="choose_hero.programming_language_description") Which programming language do you want to use?
     label.control-label(for="option-code-language", data-i18n="choose_hero.programming_language") Programming Language
     select#option-code-language(name="code-language")
       for option in codeLanguages
         option(value=option.id, selected=codeLanguage === option.id)= option.name
-    span.help-block(data-i18n="choose_hero.programming_language_description") Which programming language do you want to use?
 
 if level
   .form-group.select-group

From f496823bb5a3f9f1d2f9af5ed28c14a0d0200933 Mon Sep 17 00:00:00 2001
From: Imperadeiro98 <Imperadeiro98@users.noreply.github.com>
Date: Fri, 17 Oct 2014 16:38:21 +0100
Subject: [PATCH 02/46] Update level_loading.jade

Removed an unused tip.
---
 app/templates/play/level/level_loading.jade | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/templates/play/level/level_loading.jade b/app/templates/play/level/level_loading.jade
index 31ffd34fb..9deddc448 100644
--- a/app/templates/play/level/level_loading.jade
+++ b/app/templates/play/level/level_loading.jade
@@ -9,7 +9,6 @@
       .progress-bar.progress-bar-success
 
   #tip-wrapper
-    strong.tip(data-i18n='play_level.tip_insert_positions') Shift+Click a point on the map to insert it into the spell editor.
     strong.tip(data-i18n='play_level.tip_toggle_play') Toggle play/paused with Ctrl+P.
     strong.tip(data-i18n='play_level.tip_scrub_shortcut') Ctrl+[ and Ctrl+] rewind and fast-forward.
     strong.tip(data-i18n='play_level.tip_guide_exists') Click the guide at the top of the page for useful info.

From 7bc50ade3032ac1fa09f0e7f6b906077100cf40a Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Fri, 17 Oct 2014 08:47:53 -0700
Subject: [PATCH 03/46] Fixes for spectate layout in new WebGL dual-stage mode.

---
 app/lib/surface/Surface.coffee     |  6 ++++--
 app/styles/play/spectate.sass      | 10 ++++++++--
 app/templates/play/spectate.jade   |  3 ++-
 app/views/play/SpectateView.coffee |  5 +++--
 4 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee
index 617dbd279..bb2f26f86 100644
--- a/app/lib/surface/Surface.coffee
+++ b/app/lib/surface/Surface.coffee
@@ -522,7 +522,7 @@ module.exports = Surface = class Surface extends CocoClass
       newWidth = 0.55 * pageWidth
       newHeight = newWidth / aspectRatio
     return unless newWidth > 0 and newHeight > 0
-    return if newWidth is oldWidth and newHeight is oldHeight
+    return if newWidth is oldWidth and newHeight is oldHeight and not @options.spectateGame
     #scaleFactor = if application.isIPadApp then 2 else 1  # Retina
     scaleFactor = 1
     @normalCanvas.add(@webGLCanvas).attr width: newWidth * scaleFactor, height: newHeight * scaleFactor
@@ -533,7 +533,9 @@ module.exports = Surface = class Surface extends CocoClass
     @normalStage.scaleX *= newWidth / oldWidth
     @normalStage.scaleY *= newHeight / oldHeight
     @camera.onResize newWidth, newHeight
-
+    if @options.spectateGame
+      # Since normalCanvas is absolutely positioned, it needs help aligning with webGLCanvas. But not further than +149px (1920px screen).
+      @normalCanvas.css 'left', Math.min 149, @webGLCanvas.offset().left
 
   #- Camera focus on hero
   focusOnHero: ->
diff --git a/app/styles/play/spectate.sass b/app/styles/play/spectate.sass
index 0d48f27a9..a0f7343fa 100644
--- a/app/styles/play/spectate.sass
+++ b/app/styles/play/spectate.sass
@@ -42,12 +42,18 @@
     position: relative
     margin: 0 auto
 
-  canvas#surface
-    background-color: #333
+  canvas#webgl-surface, canvas#normal-surface
     display: block
     z-index: 1
     margin: 0 auto
 
+  canvas#webgl-surface
+    background-color: #333
+
+  canvas#normal-surface
+    position: absolute
+    top: 0
+    pointer-events: none
 
   min-width: 1024px
   position: relative
diff --git a/app/templates/play/spectate.jade b/app/templates/play/spectate.jade
index 7867ba9a6..80ed5c35d 100644
--- a/app/templates/play/spectate.jade
+++ b/app/templates/play/spectate.jade
@@ -3,7 +3,8 @@
 .level-content
   #control-bar-view
   #canvas-wrapper
-    canvas(width=924, height=589)#surface
+    canvas(width=924, height=589)#webgl-surface
+    canvas(width=924, height=589)#normal-surface
     #canvas-left-gradient.gradient
     #canvas-top-gradient.gradient
   #gold-view.secret.expanded
diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee
index 0468e227d..9c6cc5dc9 100644
--- a/app/views/play/SpectateView.coffee
+++ b/app/views/play/SpectateView.coffee
@@ -205,8 +205,9 @@ module.exports = class SpectateLevelView extends RootView
   # initialization
 
   initSurface: ->
-    surfaceCanvas = $('canvas#surface', @$el)
-    @surface = new Surface(@world, surfaceCanvas, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, wizards: @level.get('type', true) isnt 'hero')
+    webGLSurface = $('canvas#webgl-surface', @$el)
+    normalSurface = $('canvas#normal-surface', @$el)
+    @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true, wizards: @level.get('type', true) isnt 'hero')
     worldBounds = @world.getBounds()
     bounds = [{x:worldBounds.left, y:worldBounds.top}, {x:worldBounds.right, y:worldBounds.bottom}]
     @surface.camera.setBounds(bounds)

From 3b9feebee8b75d61601645ff29c08d50909ef702 Mon Sep 17 00:00:00 2001
From: Imperadeiro98 <Imperadeiro98@users.noreply.github.com>
Date: Fri, 17 Oct 2014 17:06:25 +0100
Subject: [PATCH 04/46] Update cast_button.jade

Internationalized "Submit".
---
 app/templates/play/level/tome/cast_button.jade | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/templates/play/level/tome/cast_button.jade b/app/templates/play/level/tome/cast_button.jade
index bde30b02b..02facd457 100644
--- a/app/templates/play/level/tome/cast_button.jade
+++ b/app/templates/play/level/tome/cast_button.jade
@@ -1,3 +1,3 @@
 button.btn.btn-lg.btn-inverse.banner.cast-button(title=castVerbose, data-i18n="play_level.tome_run_button_ran") Ran
 
-button.btn.btn-lg.btn-success.banner.submit-button(title=castRealTimeVerbose) Submit
+button.btn.btn-lg.btn-success.banner.submit-button(title=castRealTimeVerbose, data-i18n="play_level.tome_submit_button") Submit

From 34dd1dadcad5c5e43206a6798c52f13e3a09447a Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Fri, 17 Oct 2014 13:56:44 -0300
Subject: [PATCH 05/46] Update pt-BR.coffee

---
 app/locale/pt-BR.coffee | 54 ++++++++++++++++++++---------------------
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 407e13abf..384b9c79e 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -216,13 +216,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     tome_cast_button_castable: "Lançar" # Temporary, if tome_cast_button_run isn't translated.
     tome_cast_button_casting: "Conjurando" # Temporary, if tome_cast_button_running isn't translated.
     tome_cast_button_cast: "Feitiço" # Temporary, if tome_cast_button_ran isn't translated.
-#    tome_cast_button_run: "Run"
-#    tome_cast_button_running: "Running"
-#    tome_cast_button_ran: "Ran"
+    tome_cast_button_run: "Rodar"
+    tome_cast_button_running: "Rodando"
+    tome_cast_button_ran: "Rodado"
     tome_submit_button: "Enviar"
-#    tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
+    tome_reload_method: "Recarregar o código original para este método" # Title text for individual method reload button.
     tome_select_method: "Selecione um Método"
-#    tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
+    tome_see_all_methods: "Visualizar todos os métodos que você pode editar" # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "Selecione alguém para "
     tome_available_spells: "Feitiços Disponíveis"
     tome_your_skills: "Suas habilidades"
@@ -236,14 +236,14 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     time_total: "Máximo:"
     time_goto: "Ir para:"
     infinite_loop_try_again: "Tentar novamente"
-#    infinite_loop_reset_level: "Reset Level"
+    infinite_loop_reset_level: "Resetar nível"
 #    infinite_loop_comment_out: "Comment Out My Code"
-#    tip_toggle_play: "Toggle play/paused with Ctrl+P."
-#    tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward."
+    tip_toggle_play: "Alterne entre rodando/pausado com Ctrl+P."
+    tip_scrub_shortcut: "Ctrl+[ e Ctrl+] rebobina e avança."
 #    tip_guide_exists: "Click the guide at the top of the page for useful info."
-#    tip_open_source: "CodeCombat is 100% open source!"
-#    tip_beta_launch: "CodeCombat launched its beta in October, 2013."
-#    tip_think_solution: "Think of the solution, not the problem."
+    tip_open_source: "CodeCombat é 100% código aberto!"
+    tip_beta_launch: "CodeCombat lançou sua versão beta em outubro de 2013."
+    tip_think_solution: "Pense na solução, não no problema."
 #    tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra"
 #    tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis"
 #    tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra"
@@ -266,7 +266,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 #    tip_hardware_problem: "Q: How many programmers does it take to change a light bulb?  A: None, it's a hardware problem."
 #    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
 #    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
-#    tip_brute_force: "When in doubt, use brute force. - Ken Thompson"
+    tip_brute_force: "Na dúvida, utilize força bruta. - Ken Thompson"
     customize_wizard: "Personalize o feiticeiro"
 
   game_menu:
@@ -277,14 +277,14 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     guide_tab: "Guia"
     multiplayer_tab: "Multijogador"
     inventory_caption: "Equipar seu herói"
-#    choose_hero_caption: "Choose hero, language"
+    choose_hero_caption: "Escolha seu herói, linguagem"
 #    save_load_caption: "... and view history"
-#    options_caption: "Configure settings"
+    options_caption: "Configurar preferências"
     guide_caption: "Documentos e dicas"
-#    multiplayer_caption: "Play with friends!"
+    multiplayer_caption: "Jogue com seus amigos!"
 
 #  inventory:
-#    choose_inventory: "Equip Items"
+    choose_inventory: "Equipar itens"
 
   choose_hero:
     choose_hero: "Escolha seu Herói"
@@ -300,23 +300,23 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     granularity_change_history: "Histórico"
 
   options:
-#    general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level
+    general_options: "Opções Gerais" # Check out the Options tab in the Game Menu while playing a level
     volume_label: "Volume"
     music_label: "Música"
-#    music_description: "Turn background music on/off."
-#    autorun_label: "Autorun"
-#    autorun_description: "Control automatic code execution."
+    music_description: "Ligar/desligar música de fundo."
+    autorun_label: "Rodar automaticamente"
+    autorun_description: "Controlar execução automática do código."
     editor_config: "Editor de Configurações"
     editor_config_title: "Editor de Configurações"
-#    editor_config_level_language_label: "Language for This Level"
-#    editor_config_level_language_description: "Define the programming language for this particular level."
-#    editor_config_default_language_label: "Default Programming Language"
-#    editor_config_default_language_description: "Define the programming language you want to code in when starting new levels."
+    editor_config_level_language_label: "Linguagem para este nível"
+    editor_config_level_language_description: "Definir linguagem para esse nível específico."
+    editor_config_default_language_label: "Linguagem de programação padrão"
+    editor_config_default_language_description: "Define a linguagem de programação que você quer utilizar quando iniciar novos níveis."
     editor_config_keybindings_label: "Teclas de Atalho"
     editor_config_keybindings_default: "Padrão (Ace)"
     editor_config_keybindings_description: "Adicionar atalhos conhecidos de editores comuns."
-#    editor_config_livecompletion_label: "Live Autocompletion"
-#    editor_config_livecompletion_description: "Displays autocomplete suggestions while typing."
+    editor_config_livecompletion_label: "Autocompletar durante a escrita"
+    editor_config_livecompletion_description: "Mostra opções de autocompletar enquanto estiver escrevendo."
     editor_config_invisibles_label: "Mostrar Invisíveis"
     editor_config_invisibles_description: "Mostrar invisíveis como espaços e tabs."
     editor_config_indentguides_label: "Mostrar Linhas de Identação"
@@ -367,7 +367,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     forum_page: "nosso fórum"
     forum_suffix: " ao invés disso."
     send: "Enviar opinião"
-#    contact_candidate: "Contact Candidate" # Deprecated
+    contact_candidate: "Contactar Candidato" # Deprecated
 #    recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
 
   account_settings:

From a3c86215841304fd47786938ed2779a61a4408fc Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Fri, 17 Oct 2014 16:13:20 -0300
Subject: [PATCH 06/46] Update pt-BR.coffee

---
 app/locale/pt-BR.coffee | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 384b9c79e..e50e91b20 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -257,9 +257,9 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 #    tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep."
 #    tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't."
 #    tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
-#    tip_no_try: "Do. Or do not. There is no try. - Yoda"
-#    tip_patience: "Patience you must have, young Padawan. - Yoda"
-#    tip_documented_bug: "A documented bug is not a bug; it is a feature."
+    tip_no_try: "Faça. Ou não faça. Não existe tentar. - Yoda"
+    tip_patience: "Paciência você deve ter, jovem Padawan. - Yoda"
+    tip_documented_bug: "Um bug documentado não é um bug; é uma funcionalidade."
 #    tip_impossible: "It always seems impossible until it's done. - Nelson Mandela"
 #    tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds"
 #    tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay"
@@ -368,7 +368,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     forum_suffix: " ao invés disso."
     send: "Enviar opinião"
     contact_candidate: "Contactar Candidato" # Deprecated
-#    recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns." # Deprecated
+    recruitment_reminder: "Utilize esse formulário para entrar em contato com candidatos que você esteja interessado em entrevistar. Lembre-se que o CodeCombat cobra 15% do salário do primeiro ano. A taxa de contratação é cobrada quando da contratação do empregado e é reembolsável por 90 dias, se o empregado não permanece no emprego. Empregados de meio-turno, remotos ou com contrato serão gratuitos como estagiários." # Deprecated
 
   account_settings:
     title: "Configurações da Conta"
@@ -416,12 +416,12 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     enter: "Enter"
     escape: "Esc"
     shift: "Shift"
-#    cast_spell: "Cast current spell."
-#    run_real_time: "Run in real time."
+    cast_spell: "Lançar feitiço atual."
+    run_real_time: "Rodar em tempo real."
 #    continue_script: "Continue past current script."
 #    skip_scripts: "Skip past all skippable scripts."
-#    toggle_playback: "Toggle play/pause."
-#    scrub_playback: "Scrub back and forward through time."
+    toggle_playback: "Alternar play/pause."
+    scrub_playback: "Rolar para frente e para trás no tempo."
 #    single_scrub_playback: "Scrub back and forward through time by a single frame."
 #    scrub_execution: "Scrub through current spell execution."
 #    toggle_debug: "Toggle debug display."
@@ -979,11 +979,11 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     projects_header_2: "Projetos (Top 3)"
     projects_blurb: "Destaque seus projetos para impressionar os empregadores."
     project_name: "Nome do Projeto"
-#    project_name_help: "What was the project called?"
+    project_name_help: "Como o projeto se chama?"
     project_description: "Descrição"
-#    project_description_help: "Briefly describe the project."
+    project_description_help: "Descreva o projeto brevemente."
     project_picture: "Imagem"
-#    project_picture_help: "Upload a 230x115px or larger image showing off the project."
+    project_picture_help: "Envie uma imagem com 230x115px ou maior mostrando o projeto."
     project_link: "Link"
     project_link_help: "Link para o projeto."
 #    player_code: "Player Code"
@@ -1035,11 +1035,11 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 #    inactive_developers: "Inactive Developers"
 
   admin:
-#    av_espionage: "Espionage" # Really not important to translate /admin controls.
-#    av_espionage_placeholder: "Email or username"
-#    av_usersearch: "User Search"
-#    av_usersearch_placeholder: "Email, username, name, whatever"
-#    av_usersearch_search: "Search"
+    av_espionage: "Espionagem" # Really not important to translate /admin controls.
+    av_espionage_placeholder: "Email ou username"
+    av_usersearch: "Busca de Usuário"
+    av_usersearch_placeholder: "Email, username, nome, qualquer coisa"
+    av_usersearch_search: "Buscar"
     av_title: "Visualização de Administrador"
     av_entities_sub_title: "Entidades"
     av_entities_users_url: "Usuários"

From b8d59ed78aa9e82e4d9fa3827dbaf4449bb1adf7 Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Fri, 17 Oct 2014 16:59:33 -0300
Subject: [PATCH 07/46] Update pt-BR.coffee

---
 app/locale/pt-BR.coffee | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index e50e91b20..45261eb75 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -422,14 +422,14 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 #    skip_scripts: "Skip past all skippable scripts."
     toggle_playback: "Alternar play/pause."
     scrub_playback: "Rolar para frente e para trás no tempo."
-#    single_scrub_playback: "Scrub back and forward through time by a single frame."
-#    scrub_execution: "Scrub through current spell execution."
-#    toggle_debug: "Toggle debug display."
-#    toggle_grid: "Toggle grid overlay."
-#    toggle_pathfinding: "Toggle pathfinding overlay."
-#    beautify: "Beautify your code by standardizing its formatting."
-#    maximize_editor: "Maximize/minimize code editor."
-#    move_wizard: "Move your Wizard around the level."
+    single_scrub_playback: "Rolar para frente e para trás no tempo, quadro a quadro."
+    scrub_execution: "Rolar através da execução do feitiço atual."
+    toggle_debug: "Ligar/desligar informações de debug."
+    toggle_grid: "Ligar/desligar exibição da grade."
+    toggle_pathfinding: "Ligar/desligar exibição do pathfinding (caminho)."
+    beautify: "Embeleze seu código a partir da padronização de formatação."
+    maximize_editor: "Maximizar/minimizar editor de código."
+    move_wizard: "Mova o Wizard pelo nível."
 
   community:
     main_title: "Comunidade CodeCombat"
@@ -468,7 +468,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     article_title: "Editor de Artigo"
     thang_title: "Editor de Thang"
     level_title: "Editor de Nível"
-#    achievement_title: "Achievement Editor"
+    achievement_title: "Editor de Conquistas"
     back: "Voltar"
     revert: "Reverter"
     revert_models: "Reverter Modelos"

From 7ec54720ca2a993c8a8af44116fa19451873895e Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Fri, 17 Oct 2014 17:01:51 -0300
Subject: [PATCH 08/46] Update pt-BR.coffee

---
 app/locale/pt-BR.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 45261eb75..82986569c 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -218,7 +218,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     tome_cast_button_cast: "Feitiço" # Temporary, if tome_cast_button_ran isn't translated.
     tome_cast_button_run: "Rodar"
     tome_cast_button_running: "Rodando"
-    tome_cast_button_ran: "Rodado"
+    tome_cast_button_ran: "Encerrado"
     tome_submit_button: "Enviar"
     tome_reload_method: "Recarregar o código original para este método" # Title text for individual method reload button.
     tome_select_method: "Selecione um Método"

From a65dabad04de90d2ddaa7538fe1745fdbf55eccf Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Fri, 17 Oct 2014 15:25:31 -0700
Subject: [PATCH 09/46] Removed level-specific achievements from achievements
 list. Fixed bug with return type documentation not showing up. Reduced
 initial first-level arrow delay.

---
 app/templates/user/achievements.jade          | 20 ++++++++++---------
 app/views/play/WorldMapView.coffee            |  2 +-
 app/views/play/level/tome/DocFormatter.coffee |  4 +++-
 app/views/user/AchievementsView.coffee        |  3 +--
 4 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/app/templates/user/achievements.jade b/app/templates/user/achievements.jade
index 33833d6f3..ca44144cb 100644
--- a/app/templates/user/achievements.jade
+++ b/app/templates/user/achievements.jade
@@ -36,15 +36,17 @@ block append content
               th XP
             each earnedAchievement in earnedAchievements.models
               - var achievement = earnedAchievement.get('achievement');
-              tr
-                td= achievement.i18nName()
-                td= achievement.i18nDescription()
-                td= moment().format("MMMM Do YYYY", earnedAchievement.get('changed'))
-                if achievement.isRepeatable()
-                  td= earnedAchievement.get('achievedAmount')
-                else
-                  td
-                td= earnedAchievement.get('earnedPoints')
+              if achievement.get('category')
+                // No level-specific achievements in here.
+                tr
+                  td= achievement.i18nName()
+                  td= achievement.i18nDescription()
+                  td= moment().format("MMMM Do YYYY", earnedAchievement.get('changed'))
+                  if achievement.isRepeatable()
+                    td= earnedAchievement.get('achievedAmount')
+                  else
+                    td
+                  td= earnedAchievement.get('earnedPoints')
         else
           .panel#no-achievements
             .panel-body(data-i18n="user.no_achievements") No achievements earned yet.
diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee
index 0bcb43334..80a83eadc 100644
--- a/app/views/play/WorldMapView.coffee
+++ b/app/views/play/WorldMapView.coffee
@@ -97,7 +97,7 @@ module.exports = class WorldMapView extends RootView
       @$el.find('.level').tooltip()
     @$el.addClass _.string.slugify @terrain
     @updateVolume()
-    @highlightElement '.level.next', delay: 8000, duration: 20000, rotation: 0, sides: ['top']
+    @highlightElement '.level.next', delay: 2000, duration: 60000, rotation: 0, sides: ['top']
 
   onSessionsLoaded: (e) ->
     for session in @sessions.models
diff --git a/app/views/play/level/tome/DocFormatter.coffee b/app/views/play/level/tome/DocFormatter.coffee
index 3784139a6..220989f09 100644
--- a/app/views/play/level/tome/DocFormatter.coffee
+++ b/app/views/play/level/tome/DocFormatter.coffee
@@ -83,9 +83,11 @@ module.exports = class DocFormatter
       @doc.title = if @options.shortenize then @doc.shorterName else @doc.shortName
 
     # Grab the language-specific documentation for some sub-properties, if we have it.
-    toTranslate = [{obj: @doc, prop: 'description'}, {obj: @doc, prop: 'example'}, {obj: @doc, prop: 'returns'}]
+    toTranslate = [{obj: @doc, prop: 'description'}, {obj: @doc, prop: 'example'}]
     for arg in (@doc.args ? [])
       toTranslate.push {obj: arg, prop: 'example'}, {obj: arg, prop: 'description'}
+    if @doc.returns
+      toTranslate.push {obj: @doc.returns, prop: 'example'}, {obj: @doc.returns, prop: 'description'}
     for {obj, prop} in toTranslate
       if val = obj[prop]?[@options.language]
         obj[prop] = val
diff --git a/app/views/user/AchievementsView.coffee b/app/views/user/AchievementsView.coffee
index c5a7f32bb..41517c062 100644
--- a/app/views/user/AchievementsView.coffee
+++ b/app/views/user/AchievementsView.coffee
@@ -48,9 +48,8 @@ module.exports = class AchievementsView extends UserView
     # After user is loaded
     if @user and not @user.isAnonymous()
       context.earnedAchievements = @earnedAchievements
-      context.achievements = @achievements
       context.achievementsByCategory = {}
-      for achievement in @achievements.models
+      for achievement in @achievements.models when achievement.get('category')
         context.achievementsByCategory[achievement.get('category')] ?= []
         context.achievementsByCategory[achievement.get('category')].push achievement
     context

From f75ff8a236829342467cdf7a6cf42b1a916d1c78 Mon Sep 17 00:00:00 2001
From: Matt Lott <mattlott@live.com>
Date: Fri, 17 Oct 2014 15:52:57 -0700
Subject: [PATCH 10/46] Don't save duplicate user code problems

---
 app/views/play/level/tome/Problem.coffee   | 20 -----------------
 app/views/play/level/tome/SpellView.coffee | 26 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/app/views/play/level/tome/Problem.coffee b/app/views/play/level/tome/Problem.coffee
index 2ac28e0fe..5c8e3d2e1 100644
--- a/app/views/play/level/tome/Problem.coffee
+++ b/app/views/play/level/tome/Problem.coffee
@@ -1,6 +1,5 @@
 ProblemAlertView = require './ProblemAlertView'
 Range = ace.require('ace/range').Range
-UserCodeProblem = require 'models/UserCodeProblem'
 
 module.exports = class Problem
   annotation: null
@@ -11,7 +10,6 @@ module.exports = class Problem
     @buildAlertView() if withAlert
     @buildMarkerRange() if isCast
     Backbone.Mediator.publish("problem:problem-created", line:@annotation.row, text: @annotation.text) if application.isIPadApp
-    @saveUserCodeProblem() if isCast
 
   destroy: ->
     unless @alertView?.destroyed
@@ -50,21 +48,3 @@ module.exports = class Problem
     @ace.getSession().removeMarker @markerRange.id
     @markerRange.start.detach()
     @markerRange.end.detach()
-
-  saveUserCodeProblem: () ->
-    @userCodeProblem = new UserCodeProblem()
-    @userCodeProblem.set 'code', @aether.raw
-    if @aetherProblem.range
-      rawLines = @aether.raw.split '\n'
-      errorLines = rawLines.slice @aetherProblem.range[0].row, @aetherProblem.range[1].row + 1
-      @userCodeProblem.set 'codeSnippet', errorLines.join '\n'
-    @userCodeProblem.set 'errHint', @aetherProblem.hint if @aetherProblem.hint
-    @userCodeProblem.set 'errId', @aetherProblem.id if @aetherProblem.id
-    @userCodeProblem.set 'errLevel', @aetherProblem.level if @aetherProblem.level
-    @userCodeProblem.set 'errMessage', @aetherProblem.message if @aetherProblem.message
-    @userCodeProblem.set 'errRange', @aetherProblem.range if @aetherProblem.range
-    @userCodeProblem.set 'errType', @aetherProblem.type if @aetherProblem.type
-    @userCodeProblem.set 'language', @aether.language.id if @aether.language?.id
-    @userCodeProblem.set 'levelID', @levelID if @levelID
-    @userCodeProblem.save()
-    null
\ No newline at end of file
diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee
index 48334248b..e77f689ab 100644
--- a/app/views/play/level/tome/SpellView.coffee
+++ b/app/views/play/level/tome/SpellView.coffee
@@ -8,6 +8,7 @@ Problem = require './Problem'
 SpellDebugView = require './SpellDebugView'
 SpellToolbarView = require './SpellToolbarView'
 LevelComponent = require 'models/LevelComponent'
+UserCodeProblem = require 'models/UserCodeProblem'
 
 module.exports = class SpellView extends CocoView
   id: 'spell-view'
@@ -63,6 +64,7 @@ module.exports = class SpellView extends CocoView
     @listenTo(@session, 'change:multiplayer', @onMultiplayerChanged)
     @spell = options.spell
     @problems = []
+    @savedProblems = {} # Cache saved user code problems to prevent duplicates
     @writable = false unless me.team in @spell.permissions.readwrite  # TODO: make this do anything
     @highlightCurrentLine = _.throttle @highlightCurrentLine, 100
     $(window).on 'resize', @onWindowResize
@@ -486,6 +488,7 @@ module.exports = class SpellView extends CocoView
       continue if key = aetherProblem.userInfo?.key and key of seenProblemKeys
       seenProblemKeys[key] = true if key
       @problems.push problem = new Problem aether, aetherProblem, @ace, isCast and problemIndex is 0, isCast, @spell.levelID
+      @saveUserCodeProblem(aether, aetherProblem) if isCast
       annotations.push problem.annotation if problem.annotation
     @aceSession.setAnnotations annotations
     @highlightCurrentLine aether.flow unless _.isEmpty aether.flow
@@ -498,6 +501,29 @@ module.exports = class SpellView extends CocoView
     Backbone.Mediator.publish 'tome:problems-updated', spell: @spell, problems: @problems, isCast: isCast
     @ace.resize()
 
+  saveUserCodeProblem: (aether, aetherProblem) ->
+    # Skip duplicate problems
+    hashValue = aether.raw + aetherProblem.message
+    return if hashValue of @savedProblems
+    @savedProblems[hashValue] = true
+    # Save new problem
+    @userCodeProblem = new UserCodeProblem()
+    @userCodeProblem.set 'code', aether.raw
+    if aetherProblem.range
+      rawLines = aether.raw.split '\n'
+      errorLines = rawLines.slice aetherProblem.range[0].row, aetherProblem.range[1].row + 1
+      @userCodeProblem.set 'codeSnippet', errorLines.join '\n'
+    @userCodeProblem.set 'errHint', aetherProblem.hint if aetherProblem.hint
+    @userCodeProblem.set 'errId', aetherProblem.id if aetherProblem.id
+    @userCodeProblem.set 'errLevel', aetherProblem.level if aetherProblem.level
+    @userCodeProblem.set 'errMessage', aetherProblem.message if aetherProblem.message
+    @userCodeProblem.set 'errRange', aetherProblem.range if aetherProblem.range
+    @userCodeProblem.set 'errType', aetherProblem.type if aetherProblem.type
+    @userCodeProblem.set 'language', aether.language.id if aether.language?.id
+    @userCodeProblem.set 'levelID', @spell.levelID if @spell.levelID
+    @userCodeProblem.save()
+    null
+
   # Autocast:
   # Goes immediately if the code is a) changed and b) complete/valid and c) the cursor is at beginning or end of a line
   # We originally thought it would:

From a71c591f54b2b21677f2437004064c7b23789fc7 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Fri, 17 Oct 2014 17:57:18 -0700
Subject: [PATCH 11/46] First set of fixes to HeroVictoryModal.

---
 .../play/level/modal/hero-victory-modal.sass  | 117 +++++++-----------
 .../play/level/modal/HeroVictoryModal.coffee  |  37 ++++--
 2 files changed, 71 insertions(+), 83 deletions(-)

diff --git a/app/styles/play/level/modal/hero-victory-modal.sass b/app/styles/play/level/modal/hero-victory-modal.sass
index 62b31642e..6433d252f 100644
--- a/app/styles/play/level/modal/hero-victory-modal.sass
+++ b/app/styles/play/level/modal/hero-victory-modal.sass
@@ -1,18 +1,27 @@
+@import "app/styles/mixins"
+@import "app/styles/bootstrap/variables"
+
 #hero-victory-modal
+  //- Top-level modal container
+  .modal-dialog
+    margin-top: 15px
+    padding-top: 0
   
   //- Header
   
   .background-wrapper
-    background: url("/images/pages/play/level/modal/victory_modal_background.png")
-    height: 650px
+    //background: url("/images/pages/play/level/modal/victory_modal_background.png")
     width: 550px
-    
+    border-width: 25px
+    border-image: url("/images/pages/play/level/modal/victory_modal_background.png") 25 fill round
+    border-radius: 10px
+
   #victory-header
     display: block
-    margin: 40px auto 0
+    margin: 15px auto 0
     
   .modal-header
-    height: 110px
+    height: 85px
     border: none
   
     
@@ -28,10 +37,7 @@
     margin: 5px auto
     position: relative
 
-    -webkit-transition-duration: 1s
-    -moz-transition-duration: 1s
-    -o-transition-duration: 1s
-    transition-duration: 1s
+    @include transition-duration(1s)
 
     -webkit-filter: grayscale(100%)
     -moz-filter: grayscale(100%)
@@ -66,7 +72,6 @@
   //- Reward panels
   
   .reward-panel
-    background: url("/images/pages/play/level/modal/reward_plate.png")
     background: url("/images/pages/play/level/modal/reward_plate.png")
     width: 77px
     height: 85px
@@ -81,21 +86,11 @@
       width: 56px
       position: relative
 
-      -webkit-transform: scale(0, 0)
-      -moz-transform: scale(0, 0)
-      -o-transform: scale(0, 0)
-      transform: scale(0, 0)
-
-      -webkit-transition-duration: 0.5s
-      -moz-transition-duration: 0.5s
-      -o-transition-duration: 0.5s
-      transition-duration: 0.5s
+      @include scale(0)
+      @include transition-duration(0.5s)
       
       &.show
-        -webkit-transform: scale(1, 1)
-        -moz-transform: scale(1, 1)
-        -o-transform: scale(1, 1)
-        transform: scale(1, 1)
+        @include scale(1)
       
       img
         margin: 0
@@ -103,17 +98,8 @@
         top: 50%
         left: 50%
         margin-right: -50%
-
-        -webkit-transition-duration: 0.5s
-        -moz-transition-duration: 0.5s
-        -o-transition-duration: 0.5s
-        transition-duration: 0.5s
-
-        -webkit-transform: translate(-50%, -50%)
-        -moz-transform: translate(-50%, -50%)
-        -o-transform: translate(-50%, -50%)
-        transform: translate(-50%, -50%)
-        
+        @include transition-duration(0.5s)
+        @include translate(-50%, -50%)
         max-width: 56px
         max-height: 55px
 
@@ -134,55 +120,46 @@
     
   //- Pulse effect
 
-  @-webkit-keyframes pulse  
+  +keyframes(rewardPulse)
     from
-      -webkit-transform: translate(-50%, -50%) scale(1.0)
+      max-width: 56px
+      max-height: 55px
     50%
-      -webkit-transform: translate(-50%, -50%) scale(1.3)
+      width: 72px
+      max-width: 72px
+      max-height: 72px
     to
-      -webkit-transform: translate(-50%, -50%) scale(1.0)
-
-  @-moz-keyframes pulse
-    from
-      -moz-transform: translate(-50%, -50%) scale(1.0)
-    50%
-      -moz-transform: translate(-50%, -50%) scale(1.3)
-    to
-      -moz-transform: translate(-50%, -50%) scale(1.0)
-
-  @-o-keyframes pulse
-    from
-      -o-transform: translate(-50%, -50%) scale(1.0)
-    50%
-      -o-transform: translate(-50%, -50%) scale(1.3)
-    to
-      -o-transform: translate(-50%, -50%) scale(1.0)
-
-  @keyframes pulse
-    from
-      transform: translate(-50%, -50%) scale(1.0)
-    50%
-      transform: translate(-50%, -50%) scale(1.3)
-    to
-      transform: translate(-50%, -50%) scale(1.0)
+      max-width: 56px
+      max-height: 55px
 
   .pulse
-    -webkit-animation: pulse 0.5s infinite
-    -moz-animation: pulse 0.5s infinite
-    -o-animation: pulse 0.5s infinite
-    animation: pulse 0.5s infinite
-    
+    @include animation(rewardPulse 0.15s infinite)
     
   //- Footer
   
   .modal-content
-    height: 650px // so the footer appears at the bottom
+    padding-bottom: 50px // so the footer appears at the bottom
   
   .modal-footer
     position: absolute
-    bottom: 20px
+    bottom: -20px
     left: 20px
     right: 20px
     
   #totals
-    color: white
\ No newline at end of file
+    color: white
+
+html.no-borderimage
+  #hero-victory-modal
+    .background-wrapper
+      background: url("/images/pages/play/level/modal/victory_modal_background.png")
+      height: 650px
+    #victory-header
+      margin-top: 40px
+    .modal-header
+      height: 110px
+    .modal-content
+      height: 650px
+      padding-bottom: 0
+    .modal-footer
+      bottom: 20px
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index 5f4fe7d83..743843848 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -73,12 +73,12 @@ module.exports = class HeroVictoryModal extends ModalView
         achievement.completedAWhileAgo = new Date() - Date.parse(earnedAchievement.get('created')) > 30 * 1000
     c.achievements = @achievements.models
 
-    # for testing the three states
-#    if c.achievements.length
-#      c.achievements = [c.achievements[0].clone(), c.achievements[0].clone(), c.achievements[0].clone()]
-#    for achievement, index in c.achievements
-#      achievement.completed = index > 0
-#      achievement.completedAWhileAgo = index > 1
+    ## for testing the three states
+    #if c.achievements.length
+    #  c.achievements = [c.achievements[0].clone(), c.achievements[0].clone(), c.achievements[0].clone()]
+    #for achievement, index in c.achievements
+    #  achievement.completed = index > 0
+    #  achievement.completedAWhileAgo = index > 1
 
     c.thangTypes = @thangTypes
     return c
@@ -116,8 +116,7 @@ module.exports = class HeroVictoryModal extends ModalView
       unit: $(panel).data('number-unit')
     })
 
-    # TODO: mess with this more later. Doesn't seem to work, often times will pulse background red rather than animate
-#    itemPanel.rootEl.find('.reward-image-container img').addClass('pulse') for itemPanel in @numericalItemPanels
+    itemPanel.rootEl.find('.reward-image-container img').addClass('pulse') for itemPanel in @numericalItemPanels
     @numberAnimationStart = new Date()
     @totalXP = 0
     @totalXP += panel.number for panel in @numericalItemPanels when panel.unit is 'xp'
@@ -128,11 +127,21 @@ module.exports = class HeroVictoryModal extends ModalView
     @numberAnimationInterval = setInterval(@tickNumberAnimation, 15 / 1000)
 
   tickNumberAnimation: =>
-    pct = Math.min(1, (new Date() - @numberAnimationStart) / 1500)
-    panel.textEl.text('+'+parseInt(panel.number*pct)) for panel in @numericalItemPanels
-    @XPEl.text('+'+parseInt(@totalXP * pct))
-    @gemEl.text('+'+parseInt(@totalGems * pct))
-    @endAnimateNumbers() if pct is 1
+    # TODO: make these tick serially
+    # TODO: make each panel huge while it's ticking
+    # TODO: only play a sound when an integer tick up happens
+    # TODO: make sure the animation pulses happen when the numbers go up and sounds play (up to a max speed)
+    # TODO: add easing so that the counts start slow and speed up, then end slow (easeInOut)
+    # TODO: make each animation slightly longer if it has lots of stuff to animate, faster if not much to animate
+    ratio = Math.min(1, (new Date() - @numberAnimationStart) / 1500)
+    panel.textEl.text('+'+parseInt(panel.number * ratio)) for panel in @numericalItemPanels
+    @XPEl.text('+'+parseInt(@totalXP * ratio))
+    @gemEl.text('+'+parseInt(@totalGems * ratio))
+    @endAnimateNumbers() if ratio is 1
+    xpTrigger = 'xp-' + (parseInt(panel.number * ratio) % 6)  # 6 xp sounds
+    gemTrigger = 'gem-' + (parseInt(panel.number * ratio) % 4)  # 4 gem sounds
+    Backbone.Mediator.publish 'audio-player:play-sound', trigger: xpTrigger, volume: 0.5 + ratio / 2
+    Backbone.Mediator.publish 'audio-player:play-sound', trigger: gemTrigger, volume: 0.5 + ratio / 2
 
   endAnimateNumbers: ->
     @$el.find('.pulse').removeClass('pulse')
@@ -144,3 +153,5 @@ module.exports = class HeroVictoryModal extends ModalView
     return unless @animationComplete
     @$el.find('#saving-progress-label').toggleClass('hide', @readyToContinue)
     @$el.find('#continue-button').toggleClass('hide', not @readyToContinue)
+
+  # TODO: award heroes/items and play an awesome sound when you get one

From de7985fc2e9d0f390f5c3942af44ae1f3901fe2b Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Fri, 17 Oct 2014 20:15:41 -0700
Subject: [PATCH 12/46] More blingstrositization for the HeroVictoryModal.

---
 .../play/level/modal/hero-victory-modal.sass  | 27 ++++--
 .../play/level/modal/hero-victory-modal.jade  | 10 +--
 .../play/level/modal/HeroVictoryModal.coffee  | 88 +++++++++++++------
 3 files changed, 88 insertions(+), 37 deletions(-)

diff --git a/app/styles/play/level/modal/hero-victory-modal.sass b/app/styles/play/level/modal/hero-victory-modal.sass
index 6433d252f..f3cc7f6a9 100644
--- a/app/styles/play/level/modal/hero-victory-modal.sass
+++ b/app/styles/play/level/modal/hero-victory-modal.sass
@@ -19,6 +19,10 @@
   #victory-header
     display: block
     margin: 15px auto 0
+    @include transition(0.25s ease-in)
+
+    &.out
+      margin-top: -100px
     
   .modal-header
     height: 85px
@@ -78,6 +82,17 @@
     float: left
     margin: 0 1.8px
     position: relative
+    z-index: 1
+    @include transition(0.25s ease)
+
+    &.animating
+      @include scale(1.5)
+      z-index: 2
+
+      .reward-text
+        font-size: 18px
+        overflow: visible
+        bottom: 9px
 
     .reward-image-container
       top: 8px
@@ -116,7 +131,6 @@
       white-space: nowrap
       overflow: hidden
       text-overflow: ellipsis
-
     
   //- Pulse effect
 
@@ -125,15 +139,18 @@
       max-width: 56px
       max-height: 55px
     50%
-      width: 72px
-      max-width: 72px
-      max-height: 72px
+      width: 66px
+      max-width: 66px
+      max-height: 66px
     to
       max-width: 56px
       max-height: 55px
 
-  .pulse
+  .xp .pulse
     @include animation(rewardPulse 0.15s infinite)
+
+  .gems .pulse
+    @include animation(rewardPulse 0.25s infinite)
     
   //- Footer
   
diff --git a/app/templates/play/level/modal/hero-victory-modal.jade b/app/templates/play/level/modal/hero-victory-modal.jade
index dd0d78d22..ffb2c3c21 100644
--- a/app/templates/play/level/modal/hero-victory-modal.jade
+++ b/app/templates/play/level/modal/hero-victory-modal.jade
@@ -1,6 +1,6 @@
 extends /templates/modal/modal_base
 block modal-header-content
-  img(src="/images/pages/play/level/modal/victory_word.png")#victory-header
+  img(src="/images/pages/play/level/modal/victory_word.png")#victory-header.out
 
 block modal-body-content
   
@@ -14,13 +14,13 @@ block modal-body-content
       div.achievement-rewards
         - var worth = achievement.get('worth', true);
         if worth
-          .reward-panel.numerical(data-number=worth, data-number-unit='xp')
+          .reward-panel.numerical.xp(data-number=worth, data-number-unit='xp')
             .reward-image-container(class=animate?'':'show')
               img(src="/images/pages/play/level/modal/reward_icon_xp.png")
             .reward-text= animate ? 'x0' : '+'+worth
 
         if rewards.gems
-          .reward-panel.numerical(data-number=rewards.gems, data-number-unit='gem')
+          .reward-panel.numerical.gems(data-number=rewards.gems, data-number-unit='gem')
             .reward-image-container(class=animate?'':'show')
               img(src="/images/pages/play/level/modal/reward_icon_gems.png")
             .reward-text= animate ? 'x0' : '+'+rewards.gems
@@ -28,7 +28,7 @@ block modal-body-content
         if rewards.heroes
           for hero in rewards.heroes
             - var hero = thangTypes[hero];
-            .reward-panel
+            .reward-panel.hero
               .reward-image-container(class=animate?'':'show')
                 img(src=hero.getPortraitURL())
               .reward-text= hero.get('name')
@@ -36,7 +36,7 @@ block modal-body-content
         if rewards.items
           for item in rewards.items
             - var item = thangTypes[item];
-            .reward-panel
+            .reward-panel.item
               .reward-image-container(class=animate?'':'show')
                 img(src=item.getPortraitURL())
               .reward-text= item.get('name')
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index 743843848..427ae7fcc 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -25,6 +25,7 @@ module.exports = class HeroVictoryModal extends ModalView
     @achievements = @supermodel.loadCollection(achievements, 'achievements').model
     @listenToOnce @achievements, 'sync', @onAchievementsLoaded
     @readyToContinue = false
+    Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory'
 
   onAchievementsLoaded: ->
     thangTypeOriginals = []
@@ -73,12 +74,17 @@ module.exports = class HeroVictoryModal extends ModalView
         achievement.completedAWhileAgo = new Date() - Date.parse(earnedAchievement.get('created')) > 30 * 1000
     c.achievements = @achievements.models
 
-    ## for testing the three states
+    # for testing the three states
     #if c.achievements.length
     #  c.achievements = [c.achievements[0].clone(), c.achievements[0].clone(), c.achievements[0].clone()]
     #for achievement, index in c.achievements
-    #  achievement.completed = index > 0
-    #  achievement.completedAWhileAgo = index > 1
+    ##  achievement.completed = index > 0
+    ##  achievement.completedAWhileAgo = index > 1
+    #  achievement.completed = true
+    #  achievement.completedAWhileAgo = false
+    #  achievement.attributes.worth = (index + 1) * achievement.get('worth')
+    #  rewards = achievement.get('rewards')
+    #  rewards.gems *= (index + 1)
 
     c.thangTypes = @thangTypes
     return c
@@ -87,6 +93,7 @@ module.exports = class HeroVictoryModal extends ModalView
     super()
     return unless @supermodel.finished()
     @updateSavingProgressStatus()
+    @$el.find('#victory-header').delay(250).queue(-> $(@).removeClass('out').dequeue())
     complete = _.once(_.bind(@beginAnimateNumbers, @))
     @animatedPanels = $()
     panels = @$el.find('.achievement-panel')
@@ -94,15 +101,15 @@ module.exports = class HeroVictoryModal extends ModalView
       panel = $(panel)
       continue unless panel.data('animate')
       @animatedPanels = @animatedPanels.add(panel)
-      panel.delay(500)
+      panel.delay(500)  # Waiting for victory header to show up and fall
       panel.queue(->
-        $(this).addClass('earned') # animate out the grayscale
-        $(this).dequeue()
+        $(@).addClass('earned') # animate out the grayscale
+        $(@).dequeue()
       )
       panel.delay(500)
       panel.queue(->
-        $(this).find('.reward-image-container').addClass('show')
-        $(this).dequeue()
+        $(@).find('.reward-image-container').addClass('show')
+        $(@).dequeue()
       )
       panel.delay(500)
       panel.queue(-> complete())
@@ -116,36 +123,59 @@ module.exports = class HeroVictoryModal extends ModalView
       unit: $(panel).data('number-unit')
     })
 
-    itemPanel.rootEl.find('.reward-image-container img').addClass('pulse') for itemPanel in @numericalItemPanels
-    @numberAnimationStart = new Date()
     @totalXP = 0
     @totalXP += panel.number for panel in @numericalItemPanels when panel.unit is 'xp'
     @totalGems = 0
     @totalGems += panel.number for panel in @numericalItemPanels when panel.unit is 'gem'
     @gemEl = $('#gem-total')
     @XPEl = $('#xp-total')
-    @numberAnimationInterval = setInterval(@tickNumberAnimation, 15 / 1000)
+    @totalXPAnimated = @totalGemsAnimated = @lastTotalXP = @lastTotalGems = 0
+    @numberAnimationStart = new Date()
+    @numberAnimationInterval = setInterval(@tickNumberAnimation, 1000 / 60)
 
   tickNumberAnimation: =>
-    # TODO: make these tick serially
-    # TODO: make each panel huge while it's ticking
-    # TODO: only play a sound when an integer tick up happens
     # TODO: make sure the animation pulses happen when the numbers go up and sounds play (up to a max speed)
-    # TODO: add easing so that the counts start slow and speed up, then end slow (easeInOut)
-    # TODO: make each animation slightly longer if it has lots of stuff to animate, faster if not much to animate
-    ratio = Math.min(1, (new Date() - @numberAnimationStart) / 1500)
-    panel.textEl.text('+'+parseInt(panel.number * ratio)) for panel in @numericalItemPanels
-    @XPEl.text('+'+parseInt(@totalXP * ratio))
-    @gemEl.text('+'+parseInt(@totalGems * ratio))
-    @endAnimateNumbers() if ratio is 1
-    xpTrigger = 'xp-' + (parseInt(panel.number * ratio) % 6)  # 6 xp sounds
-    gemTrigger = 'gem-' + (parseInt(panel.number * ratio) % 4)  # 4 gem sounds
-    Backbone.Mediator.publish 'audio-player:play-sound', trigger: xpTrigger, volume: 0.5 + ratio / 2
-    Backbone.Mediator.publish 'audio-player:play-sound', trigger: gemTrigger, volume: 0.5 + ratio / 2
+    return @endAnimateNumbers() unless panel = @numericalItemPanels[0]
+    duration = Math.log10(panel.number + 1) * 1000
+    ratio = @getEaseRatio (new Date() - @numberAnimationStart), duration
+    if panel.unit is 'xp'
+      totalXP = @totalXPAnimated + Math.floor(ratio * panel.number)
+      if totalXP isnt @lastTotalXP
+        panel.textEl.text('+' + totalXP)
+        @XPEl.text('+' + totalXP)
+        xpTrigger = 'xp-' + (totalXP % 6)  # 6 xp sounds
+        Backbone.Mediator.publish 'audio-player:play-sound', trigger: xpTrigger, volume: 0.5 + ratio / 2
+        @lastTotalXP = totalXP
+    else
+      totalGems = @totalGemsAnimated + Math.floor(ratio * panel.number)
+      if totalGems isnt @lastTotalGems
+        panel.textEl.text('+' + totalGems)
+        @gemEl.text('+' + totalGems)
+        gemTrigger = 'gem-' + (parseInt(panel.number * ratio) % 4)  # 4 gem sounds
+        Backbone.Mediator.publish 'audio-player:play-sound', trigger: gemTrigger, volume: 0.5 + ratio / 2
+        @lastTotalGems = totalGems
+    if ratio is 1
+      panel.rootEl.removeClass('animating').find('.reward-image-container img').removeClass('pulse')
+      @numberAnimationStart = new Date()
+      if panel.unit is 'xp'
+        @totalXPAnimated += panel.number
+      else
+        @totalGemsAnimated += panel.number
+      @numericalItemPanels.shift()
+      return
+    panel.rootEl.addClass('animating').find('.reward-image-container img').addClass('pulse')
+
+  getEaseRatio: (timeSinceStart, duration) ->
+    # Ease in/out quadratic - http://gizma.com/easing/
+    timeSinceStart = Math.min timeSinceStart, duration
+    t = 2 * timeSinceStart / duration
+    if t < 1
+      return 0.5 * t * t
+    --t
+    -0.5 * (t * (t - 2) - 1)
 
   endAnimateNumbers: ->
-    @$el.find('.pulse').removeClass('pulse')
-    clearInterval(@numberAnimationInterval)
+    clearInterval @numberAnimationInterval
     @animationComplete = true
     @updateSavingProgressStatus()
 
@@ -155,3 +185,7 @@ module.exports = class HeroVictoryModal extends ModalView
     @$el.find('#continue-button').toggleClass('hide', not @readyToContinue)
 
   # TODO: award heroes/items and play an awesome sound when you get one
+
+  destroy: ->
+    clearInterval @numberAnimationInterval
+    super()

From 2e539debbb2622f13edd607d97d819afc94f6604 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Fri, 17 Oct 2014 20:47:32 -0700
Subject: [PATCH 13/46] Added signup poke to HeroVictoryModal.

---
 app/styles/mixins.sass                        |  6 ++++
 .../play/level/modal/hero-victory-modal.sass  | 32 +++++++++++++++----
 .../play/level/modal/hero-victory-modal.jade  |  9 ++++--
 .../play/level/modal/HeroVictoryModal.coffee  |  2 ++
 4 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/app/styles/mixins.sass b/app/styles/mixins.sass
index 18f695aac..c3ca386c1 100644
--- a/app/styles/mixins.sass
+++ b/app/styles/mixins.sass
@@ -86,6 +86,12 @@
   -ms-flex-pack: justify
   justify-content: space-between
 
+@mixin flex-justify-center()
+  -webkit-box-pack: center
+  -webkit-justify-content: center
+  -ms-flex-pack: center
+  justify-content: center
+
 @mixin flex-align-content-start()
   -webkit-align-content: flex-start
   -ms-flex-align-content: flex-start
diff --git a/app/styles/play/level/modal/hero-victory-modal.sass b/app/styles/play/level/modal/hero-victory-modal.sass
index f3cc7f6a9..f044a91a3 100644
--- a/app/styles/play/level/modal/hero-victory-modal.sass
+++ b/app/styles/play/level/modal/hero-victory-modal.sass
@@ -43,10 +43,10 @@
 
     @include transition-duration(1s)
 
-    -webkit-filter: grayscale(100%)
-    -moz-filter: grayscale(100%)
-    -o-filter: grayscale(100%)
-    filter: grayscale(100%)
+    -webkit-filter: grayscale(100%) brightness(75%)
+    -moz-filter: grayscale(100%) brightness(75%)
+    -o-filter: grayscale(100%) brightness(75%)
+    filter: grayscale(100%) brightness(75%)
 
     &.earned
       -webkit-filter: none
@@ -54,7 +54,11 @@
       -o-filter: none
       filter: none
 
+      .achievement-description
+        @include opacity(1)
+
   .achievement-description
+    @include opacity(0.75)
     position: absolute
     text-align: center
     left: 95px
@@ -64,14 +68,15 @@
     white-space: nowrap
     overflow: hidden
     text-overflow: ellipsis
-    
+
   .achievement-rewards
     position: absolute
     left: 25px
     right: 23px
     top: 41px
     bottom: 18px
-    
+    @include flexbox()
+    @include flex-justify-center()
     
   //- Reward panels
   
@@ -156,7 +161,10 @@
   
   .modal-content
     padding-bottom: 50px // so the footer appears at the bottom
-  
+
+  &.with-sign-up .modal-content
+    padding-bottom: 100px  // need more space for signup poke
+
   .modal-footer
     position: absolute
     bottom: -20px
@@ -166,6 +174,16 @@
   #totals
     color: white
 
+  p.sign-up-poke
+    position: absolute
+    bottom: 60px
+    right: 20px
+    color: white
+
+    .sign-up-button
+      float: right
+      margin-left: 10px
+
 html.no-borderimage
   #hero-victory-modal
     .background-wrapper
diff --git a/app/templates/play/level/modal/hero-victory-modal.jade b/app/templates/play/level/modal/hero-victory-modal.jade
index ffb2c3c21..32d4f2fbb 100644
--- a/app/templates/play/level/modal/hero-victory-modal.jade
+++ b/app/templates/play/level/modal/hero-victory-modal.jade
@@ -17,13 +17,13 @@ block modal-body-content
           .reward-panel.numerical.xp(data-number=worth, data-number-unit='xp')
             .reward-image-container(class=animate?'':'show')
               img(src="/images/pages/play/level/modal/reward_icon_xp.png")
-            .reward-text= animate ? 'x0' : '+'+worth
+            .reward-text= animate ? '+0' : '+'+worth
 
         if rewards.gems
           .reward-panel.numerical.gems(data-number=rewards.gems, data-number-unit='gem')
             .reward-image-container(class=animate?'':'show')
               img(src="/images/pages/play/level/modal/reward_icon_gems.png")
-            .reward-text= animate ? 'x0' : '+'+rewards.gems
+            .reward-text= animate ? '+0' : '+'+rewards.gems
           
         if rewards.heroes
           for hero in rewards.heroes
@@ -52,3 +52,8 @@ block modal-footer-content
 
   button.btn.btn-warning.hide#saving-progress-label(disabled, data-i18n="play_level.victory_saving_progress") Saving Progress
   a.btn.btn-success.world-map-button.hide#continue-button(href="/play-hero", data-dismiss="modal", data-i18n="play_level.victory_play_continue") Continue
+
+  if me.get('anonymous')
+    p.sign-up-poke
+      button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/SignupModal", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress
+      span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account!
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index 427ae7fcc..b21805334 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -87,11 +87,13 @@ module.exports = class HeroVictoryModal extends ModalView
     #  rewards.gems *= (index + 1)
 
     c.thangTypes = @thangTypes
+    c.me = me
     return c
 
   afterRender: ->
     super()
     return unless @supermodel.finished()
+    @$el.addClass 'with-sign-up' if me.get('anonymous')
     @updateSavingProgressStatus()
     @$el.find('#victory-header').delay(250).queue(-> $(@).removeClass('out').dequeue())
     complete = _.once(_.bind(@beginAnimateNumbers, @))

From d56b2207da999d1b3ab9cbfb0fdab7759e78a502 Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Sat, 18 Oct 2014 10:39:44 -0300
Subject: [PATCH 14/46] Update pt-BR.coffee

---
 app/locale/pt-BR.coffee | 338 ++++++++++++++++++++--------------------
 1 file changed, 169 insertions(+), 169 deletions(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 82986569c..dcd4d0174 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -237,35 +237,35 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     time_goto: "Ir para:"
     infinite_loop_try_again: "Tentar novamente"
     infinite_loop_reset_level: "Resetar nível"
-#    infinite_loop_comment_out: "Comment Out My Code"
+    infinite_loop_comment_out: "Comentar Meu Código"
     tip_toggle_play: "Alterne entre rodando/pausado com Ctrl+P."
     tip_scrub_shortcut: "Ctrl+[ e Ctrl+] rebobina e avança."
-#    tip_guide_exists: "Click the guide at the top of the page for useful info."
+    tip_guide_exists: "Clique no guia no topo da página para informações úteis."
     tip_open_source: "CodeCombat é 100% código aberto!"
     tip_beta_launch: "CodeCombat lançou sua versão beta em outubro de 2013."
     tip_think_solution: "Pense na solução, não no problema."
-#    tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra"
-#    tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis"
-#    tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra"
-#    tip_forums: "Head over to the forums and tell us what you think!"
-#    tip_baby_coders: "In the future, even babies will be Archmages."
-#    tip_morale_improves: "Loading will continue until morale improves."
-#    tip_all_species: "We believe in equal opportunities to learn programming for all species."
-#    tip_reticulating: "Reticulating spines."
-#    tip_harry: "Yer a Wizard, "
-#    tip_great_responsibility: "With great coding skill comes great debug responsibility."
-#    tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep."
-#    tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't."
-#    tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
+    tip_theory_practice: "Na teoria, não existe diferença entre teoria e prática. Mas, na prática, há. - Yogi Berra"
+    tip_error_free: "Existem duas formas de escrever programas sem erros; apenas a terceira funciona. - Alan Perlis"
+    tip_debugging_program: "Se depurar é o processo de remover erros, então programar deve ser o processo de adicioná-los. - Edsger W. Dijkstra"
+    tip_forums: "Vá aos fóruns e diga-nos o que você pensa!"
+    tip_baby_coders: "No futuro, até bebês serão Arquimagos."
+    tip_morale_improves: "O carregamento continuará até que a ânimo melhore."
+    tip_all_species: "Nós acreditamos em oportunidades iguais para todas as espécies aprenderem a programar."
+    tip_reticulating: "Reticulando espinhas."
+    tip_harry: "Você é um Feiticeiro, "
+    tip_great_responsibility: "Com grandes poderes de programacão vêm grandes responsabilidades de debug."
+    tip_munchkin: "Se você não comer legumes e verduras, um ogro virá te buscar equanto você estiver dormindo."
+    tip_binary: "Existem apenas 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem."
+    tip_commitment_yoda: "Um programador deve possuir um compromisso profundo, uma mente séria. ~ Yoda"
     tip_no_try: "Faça. Ou não faça. Não existe tentar. - Yoda"
     tip_patience: "Paciência você deve ter, jovem Padawan. - Yoda"
     tip_documented_bug: "Um bug documentado não é um bug; é uma funcionalidade."
-#    tip_impossible: "It always seems impossible until it's done. - Nelson Mandela"
-#    tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds"
-#    tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay"
-#    tip_hardware_problem: "Q: How many programmers does it take to change a light bulb?  A: None, it's a hardware problem."
-#    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
-#    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
+    tip_impossible: "Sempre parece impossível, até ser feito. - Nelson Mandela"
+    tip_talk_is_cheap: "Falar é fácil. Mostre-me o código. - Linus Torvalds"
+    tip_first_language: "A coisa mais desastrosa que você pode aprender é a sua primeira linguagem de programação. - Alan Kay"
+    tip_hardware_problem: "P: Quantos programadores são necessários para se trocar uma lâmpada?  R: Nenhum, é um problema de hardware."
+    tip_hofstadters_law: "Lei de Hofstadter: Sempre demora mais do que você espera, mesmo quando você leva em consideração a Lei de Hofstadter."
+    tip_premature_optimization: "Uma otimização permatura é a raíz de todos os males. - Donald Knuth"
     tip_brute_force: "Na dúvida, utilize força bruta. - Ken Thompson"
     customize_wizard: "Personalize o feiticeiro"
 
@@ -278,12 +278,12 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     multiplayer_tab: "Multijogador"
     inventory_caption: "Equipar seu herói"
     choose_hero_caption: "Escolha seu herói, linguagem"
-#    save_load_caption: "... and view history"
+    save_load_caption: "... e visualizar o histórico"
     options_caption: "Configurar preferências"
     guide_caption: "Documentos e dicas"
     multiplayer_caption: "Jogue com seus amigos!"
 
-#  inventory:
+  inventory:
     choose_inventory: "Equipar itens"
 
   choose_hero:
@@ -387,8 +387,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     email_announcements: "Notícias"
     email_announcements_description: "Receba emails com as últimas notícias e desenvolvimentos do CodeCombat."
     email_notifications: "Notificações"
-#    email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
-#    email_any_notes: "Any Notifications"
+    email_notifications_summary: "Controles para notificações por email, automáticas e personalizadas, relacionadas a sua atividade no CodeCombat."
+    email_any_notes: "Quaisquer Notificações"
     email_any_notes_description: "Desabilitar todas as atividades de notificação por email."
     email_news: "Notícias"
     email_recruit_notes: "Oportunidades de emprego"
@@ -403,8 +403,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     password_mismatch: "As senhas não estão iguais"
     password_repeat: "Por favor repita sua senha."
     job_profile: "Perfil de trabalho" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
-#    job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
-#    job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
+    job_profile_approved: "Seu perfil de trabalho foi aprovado pelo CodeCombat. Empregadores poderão vê-lo até que você o marque como inativo ou caso não seja alterado por quatro semanas."
+    job_profile_explanation: "Olá! Preencha tudo e iremos entrar em contato sobre encontrar um trabalho como desenvolvedor de software."
     sample_profile: "Veja um perfil de exemplo"
     view_profile: "Visualizar seu perfil"
     wizard_tab: "Feiticeiro"
@@ -418,8 +418,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     shift: "Shift"
     cast_spell: "Lançar feitiço atual."
     run_real_time: "Rodar em tempo real."
-#    continue_script: "Continue past current script."
-#    skip_scripts: "Skip past all skippable scripts."
+    continue_script: "Pular script atual."
+    skip_scripts: "Pular todos os scripts puláveis."
     toggle_playback: "Alternar play/pause."
     scrub_playback: "Rolar para frente e para trás no tempo."
     single_scrub_playback: "Rolar para frente e para trás no tempo, quadro a quadro."
@@ -433,20 +433,20 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 
   community:
     main_title: "Comunidade CodeCombat"
-#    introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!"
+    introduction: "Verifique abaixo de que maneires você pode se envolver e decida qual lhe parece mais divertida. Esperamos trabalhar com você em breve!"
     level_editor_prefix: "Use o CodeCombat"
-#    level_editor_suffix: "to create and edit levels. Users have created levels for their classes, friends, hackathons, students, and siblings. If create a new level sounds intimidating you can start by forking one of ours!"
+    level_editor_suffix: "para criar e editar níveis. Usuários criaram níveis para suas classes, amigos, hackathons, estudantes e parentes. Se criar um novo nível soa intimidador, você pode iniciar fazendo um fork de um dos nossos."
 #    thang_editor_prefix: "We call units within the game 'thangs'. Use the"
 #    thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites."
-#    article_editor_prefix: "See a mistake in some of our docs? Want to make some instructions for your own creations? Check out the"
-#    article_editor_suffix: "and help CodeCombat players get the most out of their playtime."
-#    find_us: "Find us on these sites"
-#    social_blog: "Read the CodeCombat blog on Sett"
-#    social_discource: "Join the discussion on our Discourse forum"
+    article_editor_prefix: "Encontrou algo errado na nossa documentação? Gostaria de criar algumas instruções para suas próprias criações? Dê uma olhada em"
+    article_editor_suffix: "e ajude os jogadores do CodeCombat a aproveitar o máximo de seu jogo."
+    find_us: "Encontre-nos nestes sites"
+    social_blog: "Leia o blog do CodeCombat no Sett"
+    social_discource: "Entre na discussão no nosso Fórum"
     social_facebook: "Curta o CodeCombat no Facebook"
     social_twitter: "Siga o CodeCombat no Twitter"
-#    social_gplus: "Join CodeCombat on Google+"
-#    social_hipchat: "Chat with us in the public CodeCombat HipChat room"
+    social_gplus: "Ingresse no CodeCombat no Google+"
+    social_hipchat: "Converse conosco na sala pública do CodeCombat no HipChat"
     contribute_to_the_project: "Contribuir para o projeto"
 
   classes:
@@ -474,13 +474,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     revert_models: "Reverter Modelos"
     pick_a_terrain: "Escolha um Terreno"
     small: "Pequeno"
-#    grassy: "Grassy"
-#    fork_title: "Fork New Version"
-#    fork_creating: "Creating Fork..."
-#    generate_terrain: "Generate Terrain"
+    grassy: "Gramado"
+    fork_title: "Realizar um Novo Fork"
+    fork_creating: "Criando Fork..."
+    generate_terrain: "Gerando Terreno"
     more: "Mais"
     wiki: "Wiki"
-#    live_chat: "Live Chat"
+    live_chat: "Chat Ao Vivo"
     level_some_options: "Algumas  Opções?"
     level_tab_thangs: "Thangs"
     level_tab_scripts: "Scripts"
@@ -489,7 +489,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     level_tab_systems: "Sistemas"
     level_tab_docs: "Documentação"
     level_tab_thangs_title: "Thangs Atuais"
-#    level_tab_thangs_all: "All"
+    level_tab_thangs_all: "Tudo"
     level_tab_thangs_conditions: "Condições de Início"
     level_tab_thangs_add: "Adicionar Thangs"
     delete: "Excluir"
@@ -512,20 +512,20 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     new_article_title: "Criar um Novo Artigo"
     new_thang_title: "Criar um Novo Tipo de Thang"
     new_level_title: "Criar um Novo Nível"
-#    new_article_title_login: "Log In to Create a New Article"
+    new_article_title_login: "Faça login para Criar um Novo Artigo"
 #    new_thang_title_login: "Log In to Create a New Thang Type"
-#    new_level_title_login: "Log In to Create a New Level"
-#    new_achievement_title: "Create a New Achievement"
-#    new_achievement_title_login: "Log In to Create a New Achievement"
+    new_level_title_login: "Faça login para Criar um Novo Nível"
+    new_achievement_title: "Criar Nova Conquista"
+    new_achievement_title_login: "Faça login para Criar uma Nova Conquista"
     article_search_title: "Procurar Artigos Aqui"
     thang_search_title: "Procurar Tipos de Thang Aqui"
     level_search_title: "Procurar Níveis Aqui"
-#    achievement_search_title: "Search Achievements"
-#    read_only_warning2: "Note: you can't save any edits here, because you're not logged in."
-#    no_achievements: "No achievements have been added for this level yet."
+    achievement_search_title: "Buscar Conquistas"
+    read_only_warning2: "Nota: você não pode salvar suas edições aqui pois não está logado."
+    no_achievements: "Nenhuma conquista foi adicionada para esse nível ainda."
 #    achievement_query_misc: "Key achievement off of miscellanea"
 #    achievement_query_goals: "Key achievement off of level goals"
-#    level_completion: "Level Completion"
+    level_completion: "Conclusão do Nível"
 
   article:
     edit_btn_preview: "Prever"
@@ -541,7 +541,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     introduction_desc_ending: "Nós esperamos que você se junte a nossa festa!"
     introduction_desc_signature: "- Nick, George, Scott, Michael, Jeremy and Matt"
     alert_account_message_intro: "Ei!"
-#    alert_account_message: "To subscribe for class emails, you'll need to be logged in first."
+    alert_account_message: "Para assinar os emails de classe, você precisa estar logado."
     archmage_summary: "Interessado em trabalhar em gráficos do jogo, design de interface de usuário, banco de dados e organização de servidores, networking multijogador, física, som ou desempenho do motor de jogo? Quer ajudar a construir um jogo para ajudar outras pessoas a aprender o que você é bom? Temos muito a fazer e se você é um programador experiente e quer desenvolver para o CodeCombat, esta classe é para você. Gostaríamos muito de sua ajuda a construir o melhor jogo de programação da história."
     archmage_introduction: "Uma das melhores partes sobre a construção de jogos é que eles sintetizam diversas coisas diferentes. Gráficos, som, interação em tempo real, redes sociais, e, claro, muitos dos aspectos mais comuns da programação, desde a gestão em baixo nível de banco de dados, e administração do servidor até interação com o usuário e desenvolvimento da interface. Há muito a fazer, e se você é um programador experiente com um desejo ardente de realmente mergulhar no âmago da questão do CodeCombat, esta classe pode ser para você. Nós gostaríamos de ter sua ajuda para construir o melhor jogo de programação de todos os tempos."
     class_attributes: "Atributos da Classe"
@@ -623,11 +623,11 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     simulation_explanation: "Por simular partidas você pode classificar seu jogo mais rápido!"
     simulate_games: "Simular Partidas!"
     simulate_all: "RESETAR E SIMULAR PARTIDAS"
-#    games_simulated_by: "Games simulated by you:"
-#    games_simulated_for: "Games simulated for you:"
-#    games_simulated: "Games simulated"
-#    games_played: "Games played"
-#    ratio: "Ratio"
+    games_simulated_by: "Partidas simuladas por você:"
+    games_simulated_for: "Partidas simuladas para você:"
+    games_simulated: "Partidas simuladas"
+    games_played: "Partidas jogadas"
+    ratio: "Taxa"
     leaderboard: "Tabela de Classificação"
     battle_as: "Lutar como "
     summary_your: "Seus "
@@ -640,13 +640,13 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     rank_submitted: "Submetendo para a Classificação"
     rank_failed: "Falha ao Classificar"
     rank_being_ranked: "Jogo sendo Classificado"
-#    rank_last_submitted: "submitted "
-#    help_simulate: "Help simulate games?"
+    rank_last_submitted: "enviado "
+    help_simulate: "Ajuda simulando partidas?"
     code_being_simulated: "Seu novo código está sendo simulado por outros jogadores para ser classificado. Isto atualizará automaticamente assim que novas partidas entrarem."
     no_ranked_matches_pre: "Sem partidas classificadas para o "
     no_ranked_matches_post: " time! Jogue contra alguns competidores e então volte aqui para ter seu jogo classificado."
     choose_opponent: "Escolha um Oponente"
-#    select_your_language: "Select your language!"
+    select_your_language: "Selecione sua linguagem!"
     tutorial_play: "Jogue o Tutorial"
     tutorial_recommended: "Recomendado se você nunca jogou antes"
     tutorial_skip: "Pular Tutorial"
@@ -654,21 +654,21 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     tutorial_play_first: "Jogue o Tutorial primeiro."
     simple_ai: "IA Simples"
     warmup: "Aquecimento"
-#    friends_playing: "Friends Playing"
-#    log_in_for_friends: "Log in to play with your friends!"
-#    social_connect_blurb: "Connect and play against your friends!"
-#    invite_friends_to_battle: "Invite your friends to join you in battle!"
-#    fight: "Fight!"
-#    watch_victory: "Watch your victory"
-#    defeat_the: "Defeat the"
-#    tournament_ends: "Tournament ends"
-#    tournament_ended: "Tournament ended"
-#    tournament_rules: "Tournament Rules"
-#    tournament_blurb: "Write code, collect gold, build armies, crush foes, win prizes, and upgrade your career in our $40,000 Greed tournament! Check out the details"
-#    tournament_blurb_criss_cross: "Win bids, construct paths, outwit opponents, grab gems, and upgrade your career in our Criss-Cross tournament! Check out the details"
-#    tournament_blurb_blog: "on our blog"
-#    rules: "Rules"
-#    winners: "Winners"
+    friends_playing: "Amigos Jogando"
+    log_in_for_friends: "Faça loginp ara jogar com seus amigos!"
+    social_connect_blurb: "Conecte-se e jogue contra seus amigos!"
+    invite_friends_to_battle: "Convide seus amigos para juntarem-se à sua batalha!"
+    fight: "Lutem!"
+    watch_victory: "Assista sua vitória"
+    defeat_the: "Derrote"
+    tournament_ends: "Fim do torneio"
+    tournament_ended: "Torneio encerrado"
+    tournament_rules: "Regras do Torneio"
+    tournament_blurb: "Escreva códigos, colete ouro, construa exércitos, esmague inimigos, ganhe prêmios e aprimore sua carreira no nosso Torneio da Cobiça de $40,000! Veja os detalhes"
+    tournament_blurb_criss_cross: "Ganhe leilões, construa caminhos, despiste oponentes, agarre joias e aprimore sua carreira no nosso Torneio de Cruzadas! Veja os detalhes"
+    tournament_blurb_blog: "no nosso blog"
+    rules: "Regras"
+    winners: "Vencedores"
 
   user:
     stats: "Estatísticas"
@@ -687,8 +687,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 
   achievements:
     last_earned: "Últimos Ganhos"
-#    amount_achieved: "Amount"
-#    achievement: "Achievement"
+    amount_achieved: "Montante"
+    achievement: "Conquista"
     category_contributor: "Cotribuidor"
     category_miscellaneous: "Diversos"
     category_levels: "Níveis"
@@ -696,95 +696,95 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     current_xp_prefix: ""
     current_xp_postfix: " no total"
     new_xp_prefix: ""
-#    new_xp_postfix: " earned"
+    new_xp_postfix: " adquirido"
     left_xp_prefix: ""
-#    left_xp_infix: " until level "
+    left_xp_infix: " até o nível "
     left_xp_postfix: ""
 
   account:
     recently_played: "Jogos Recentes"
     no_recent_games: "Não foram feitos jogos durante duas semanas."
 
-#  loading_error:
-#    could_not_load: "Error loading from server"
-#    connection_failure: "Connection failed."
-#    unauthorized: "You need to be signed in. Do you have cookies disabled?"
-#    forbidden: "You do not have the permissions."
-#    not_found: "Not found."
-#    not_allowed: "Method not allowed."
-#    timeout: "Server timeout."
-#    conflict: "Resource conflict."
-#    bad_input: "Bad input."
-#    server_error: "Server error."
-#    unknown: "Unknown error."
+  loading_error:
+    could_not_load: "Erro ao carregar do servidor"
+    connection_failure: "Conexão falhou."
+    unauthorized: "Você precisa estar autenticado. Você desativou os cookies?"
+    forbidden: "Você não possui permissão."
+    not_found: "Não encontrado."
+    not_allowed: "Método não permitodo."
+    timeout: "Tempo de requisição esgotado."
+    conflict: "Conflito de recurso."
+    bad_input: "Problema de entrada (bad input)."
+    server_error: "Erro do servidor."
+    unknown: "Erro desconhecido."
 
-#  resources:
-#    sessions: "Sessions"
-#    your_sessions: "Your Sessions"
-#    level: "Level"
-#    social_network_apis: "Social Network APIs"
-#    facebook_status: "Facebook Status"
-#    facebook_friends: "Facebook Friends"
-#    facebook_friend_sessions: "Facebook Friend Sessions"
-#    gplus_friends: "G+ Friends"
-#    gplus_friend_sessions: "G+ Friend Sessions"
-#    leaderboard: "Leaderboard"
-#    user_schema: "User Schema"
-#    user_profile: "User Profile"
-#    patches: "Patches"
-#    patched_model: "Source Document"
-#    model: "Model"
-#    system: "System"
-#    systems: "Systems"
-#    component: "Component"
-#    components: "Components"
+  resources:
+    sessions: "Sessão"
+    your_sessions: "Sua sessão"
+    level: "Nível"
+    social_network_apis: "APIs das Redes Sociais"
+    facebook_status: "Status do Facebook"
+    facebook_friends: "Amigos do Facebook"
+    facebook_friend_sessions: "Sessões de Amigos do Facebook"
+    gplus_friends: "Amigos do G+"
+    gplus_friend_sessions: "Sessões de Amigos do G+"
+    leaderboard: "Tabela de Classificação"
+    user_schema: "Esquema do Usuário"
+    user_profile: "Perfil do Usuário"
+    patches: "Patches"
+    patched_model: "Documento da Fonte"
+    model: "Modelo"
+    system: "Sistema"
+    systems: "Sistemas"
+    component: "Componente"
+    components: "Componentes"
 #    thang: "Thang"
 #    thangs: "Thangs"
-#    level_session: "Your Session"
-#    opponent_session: "Opponent Session"
-#    article: "Article"
-#    user_names: "User Names"
+    level_session: "Sua Sessão"
+    opponent_session: "Sessão do Oponente"
+    article: "Artigo"
+    user_names: "Nomes de Usuários"
 #    thang_names: "Thang Names"
-#    files: "Files"
-#    top_simulators: "Top Simulators"
-#    source_document: "Source Document"
-#    document: "Document"
+    files: "Arquivos"
+    top_simulators: "Top Simuladores"
+    source_document: "Documento da Fonte"
+    document: "Documento"
 #    sprite_sheet: "Sprite Sheet"
-#    employers: "Employers"
-#    candidates: "Candidates"
+    employers: "Empregadores"
+    candidates: "Candidatos"
 #    candidate_sessions: "Candidate Sessions"
-#    user_remark: "User Remark"
-#    user_remarks: "User Remarks"
-#    versions: "Versions"
-#    items: "Items"
-#    heroes: "Heroes"
-#    wizard: "Wizard"
-#    achievement: "Achievement"
-#    clas: "CLAs"
-#    play_counts: "Play Counts"
-#    feedback: "Feedback"
+    user_remark: "Observação do Usuário"
+    user_remarks: "Observações do Usuário"
+    versions: "Versões"
+    items: "Itens"
+    heroes: "Heróis"
+    wizard: "Assistente"
+    achievement: "Conquista"
+    clas: "CLAs"
+    play_counts: "Contagem de Jogos"
+    feedback: "Comentários"
 
   delta:
-#    added: "Added"
-#    modified: "Modified"
-#    deleted: "Deleted"
-#    moved_index: "Moved Index"
-#    text_diff: "Text Diff"
-#    merge_conflict_with: "MERGE CONFLICT WITH"
+    added: "Adicionado"
+    modified: "Modificado"
+    deleted: "Removido"
+    moved_index: "Índice Movido"
+    text_diff: "Diff do Texto"
+    merge_conflict_with: "MERGE DO CONFLITO COM"
     no_changes: "Sem Alterações"
 
 #  guide:
 #    temp: "Temp"
 
   multiplayer:
-    multiplayer_title: "Configurações do Multijogador" # We'll be changing this around significantly soon. Until then, it's not important to translate.
-#    multiplayer_toggle: "Enable multiplayer"
-#    multiplayer_toggle_description: "Allow others to join your game."
+    multiplayer_title: "Configurações de Multijogador" # We'll be changing this around significantly soon. Until then, it's not important to translate.
+    multiplayer_toggle: "Habilitar multijogador"
+    multiplayer_toggle_description: "Permitir que outros entrem no seu jogo."
     multiplayer_link_description: "Passe este link para quem você quiser que se una à partida."
     multiplayer_hint_label: "Dica:"
     multiplayer_hint: " Clique no link para selecionar tudo, então dê Ctrl+C ou ⌘+C para copiar o link. "
     multiplayer_coming_soon: "Mais novidades no multijogador estão chegando!"
-#    multiplayer_sign_in_leaderboard: "Sign in or create an account and get your solution on the leaderboard."
+    multiplayer_sign_in_leaderboard: "Autentique-se ou crie uma conta para enviar sua solução para a tabela de classificação."
 
   legal:
     page_title: "Jurídico"
@@ -847,25 +847,25 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     nutshell_description: "Todos os recursos que oferecemos no Editor de Níveis é livre para usar como quiser para a criação de níveis. Mas nós nos reservamos o direito de restringir a distribuição dos próprios níveis (que são criados em codecombat.com) para que possam ser cobrados no futuro, se é que isso precise acontecer."
     canonical: "A versão em inglês deste documento é a versão canônica definitiva. Se houver discrepâncias entre traduções, o documento em inglês tem precedência."
 
-#  ladder_prizes:
-#    title: "Tournament Prizes" # This section was for an old tournament and doesn't need new translations now.
-#    blurb_1: "These prizes will be awarded according to"
-#    blurb_2: "the tournament rules"
-#    blurb_3: "to the top human and ogre players."
-#    blurb_4: "Two teams means double the prizes!"
-#    blurb_5: "(There will be two first place winners, two second-place winners, etc.)"
-#    rank: "Rank"
-#    prizes: "Prizes"
-#    total_value: "Total Value"
+  ladder_prizes:
+    title: "Prêmios do Torneio" # This section was for an old tournament and doesn't need new translations now.
+    blurb_1: "Esses prêmios serão entregues de acordo com"
+    blurb_2: "as regras do torneio"
+    blurb_3: "para os melhores jogadores humano e ogro."
+    blurb_4: "Dois times significa o dobro de prêmios!"
+    blurb_5: "(Haverá dois vencedores em primeiro lugar, dois vencedores em segundo lugar etc.)"
+    rank: "Classificação"
+    prizes: "Prêmios"
+    total_value: "Valor Total"
 #    in_cash: "in cash"
-#    custom_wizard: "Custom CodeCombat Wizard"
-#    custom_avatar: "Custom CodeCombat avatar"
-#    heap: "for six months of \"Startup\" access"
-#    credits: "credits"
-#    one_month_coupon: "coupon: choose either Rails or HTML"
-#    one_month_discount: "discount, 30% off: choose either Rails or HTML"
-#    license: "license"
-#    oreilly: "ebook of your choice"
+    custom_wizard: "Assistente Personalizado do CodeCombat"
+    custom_avatar: "Avatar Personalizado do CodeCombat"
+    heap: "para seis meses de acesso \"Startup\""
+    credits: "créditos"
+    one_month_coupon: "cupom: escolha Rails ou HTML"
+    one_month_discount: "desconto de 30%: escolha Rails ou HTML"
+    license: "licença"
+    oreilly: "ebook de sua escolha"
 
   wizard_settings:
     title: "Configurações do Feiticeiro"
@@ -889,17 +889,17 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     done_editing: "Edição Feita"
     profile_for_prefix: "Perfil de "
     profile_for_suffix: ""
-#    featured: "Featured"
-#    not_featured: "Not Featured"
-#    looking_for: "Looking for:"
+    featured: "Disponível"
+    not_featured: "Não disponível"
+    looking_for: "Procurando por:"
     last_updated: "Última atualização:"
     contact: "Contato"
-#    active: "Looking for interview offers now"
-#    inactive: "Not looking for offers right now"
+    active: "Procurando por entrevistas de emprego no momento"
+    inactive: "Não está procurando por oportunidades no momento"
     complete: "Completo"
     next: "Próximo"
     next_city: "Cidade?"
-#    next_country: "pick your country."
+    next_country: "escolha seu país."
     next_name: "Nome?"
 #    next_short_description: "write a short description."
 #    next_long_description: "describe your desired position."
@@ -986,7 +986,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     project_picture_help: "Envie uma imagem com 230x115px ou maior mostrando o projeto."
     project_link: "Link"
     project_link_help: "Link para o projeto."
-#    player_code: "Player Code"
+    player_code: "Código do Jogador"
 
 #  employers:
 #    deprecation_warning_title: "Sorry, CodeCombat is not recruiting right now."
@@ -1044,8 +1044,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     av_entities_sub_title: "Entidades"
     av_entities_users_url: "Usuários"
     av_entities_active_instances_url: "Instâncias Ativas"
-#    av_entities_employer_list_url: "Employer List"
-#    av_entities_candidates_list_url: "Candidate List"
+    av_entities_employer_list_url: "Lista de Empregadores"
+     av_entities_candidates_list_url: "Lista de Candidatos"
     av_other_sub_title: "Outro"
     av_other_debug_base_url: "Base (para debugar base.jade)"
     u_title: "Lista de Usuários"

From 4aff89d60a10341b12490bf29095b6ebb4d7da58 Mon Sep 17 00:00:00 2001
From: Michael Schmatz <michaelschmatz@gmail.com>
Date: Sat, 18 Oct 2014 09:46:07 -0400
Subject: [PATCH 15/46] Fixed spell palette changes for iPad

---
 app/views/play/level/tome/SpellPaletteView.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/play/level/tome/SpellPaletteView.coffee b/app/views/play/level/tome/SpellPaletteView.coffee
index 621cabb69..98eaacaea 100644
--- a/app/views/play/level/tome/SpellPaletteView.coffee
+++ b/app/views/play/level/tome/SpellPaletteView.coffee
@@ -59,7 +59,7 @@ module.exports = class SpellPaletteView extends CocoView
           itemGroup.append entry.el
           entry.render()  # Render after appending so that we can access parent container for popover
       @$el.addClass 'hero'
-      @updateMaxHeight()
+      @updateMaxHeight() unless application.isIPadApp
 
   afterInsert: ->
     super()

From cf64112d957e4771a046bea0c08a016d2999a905 Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Sat, 18 Oct 2014 11:29:43 -0300
Subject: [PATCH 16/46] Almost done!

---
 app/locale/pt-BR.coffee | 128 ++++++++++++++++++++--------------------
 1 file changed, 64 insertions(+), 64 deletions(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index dcd4d0174..3608e9e5a 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -901,79 +901,79 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     next_city: "Cidade?"
     next_country: "escolha seu país."
     next_name: "Nome?"
-#    next_short_description: "write a short description."
-#    next_long_description: "describe your desired position."
-#    next_skills: "list at least five skills."
-#    next_work: "chronicle your work history."
-#    next_education: "recount your educational ordeals."
-#    next_projects: "show off up to three projects you've worked on."
-#    next_links: "add any personal or social links."
-#    next_photo: "add an optional professional photo."
-#    next_active: "mark yourself open to offers to show up in searches."
+    next_short_description: "escreva uma breve descrição."
+    next_long_description: "descreva o tipo de vaga ou cargo desejados."
+    next_skills: "relacione pelo menos cinco habilidades."
+    next_work: "descreva seu histórico de trabalho."
+    next_education: "descreva seu percurso acadêmico."
+    next_projects: "mostre até três projetos nos quais você trabalhou."
+    next_links: "adicione links pessoais ou sociais."
+    next_photo: "adicione uma foto profissional (opcional)."
+    next_active: "marque-se como \"aberto a oportunidades\"."
     example_blog: "Blog"
     example_personal_site: "Site Pessoal"
-#    links_header: "Personal Links"
-#    links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog."
-#    links_name: "Link Name"
-#    links_name_help: "What are you linking to?"
-#    links_link_blurb: "Link URL"
-#    basics_header: "Update basic info"
-    basics_active: "Aberto para Ofertas"
-#    basics_active_help: "Want interview offers right now?"
-#    basics_job_title: "Desired Job Title"
-#    basics_job_title_help: "What role are you looking for?"
+    links_header: "Links Pessoais"
+    links_blurb: "Adicione links para sites ou perfis que você gostaria de destacar, como seu GitHub, LinkedIn ou seu blog."
+    links_name: "Nome do Link"
+    links_name_help: "Para onde você está linkando?"
+    links_link_blurb: "URL do Link"
+    basics_header: "Atualizar informações básicas"
+    basics_active: "Aberto para Oportunidades"
+    basics_active_help: "Está procurando oportunidades de entrevista agora?"
+    basics_job_title: "Título do Trabalho Desejado"
+    basics_job_title_help: "Qual cargo você está procurando?"
     basics_city: "Cidade"
-#    basics_city_help: "City you want to work in (or live in now)."
+    basics_city_help: "Cidade que você quer trabalhar (ou morar)."
     basics_country: "País"
-#    basics_country_help: "Country you want to work in (or live in now)."
-#    basics_visa: "US Work Status"
-#    basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)"
-#    basics_looking_for: "Looking For"
-#    basics_looking_for_full_time: "Full-time"
-#    basics_looking_for_part_time: "Part-time"
-#    basics_looking_for_remote: "Remote"
-#    basics_looking_for_contracting: "Contracting"
-#    basics_looking_for_internship: "Internship"
-#    basics_looking_for_help: "What kind of developer position do you want?"
-#    name_header: "Fill in your name"
-#    name_anonymous: "Anonymous Developer"
-#    name_help: "Name you want employers to see, like 'Nick Winter'."
-#    short_description_header: "Write a short description of yourself"
-#    short_description_blurb: "Add a tagline to help an employer quickly learn more about you."
-#    short_description: "Tagline"
-#    short_description_help: "Who are you, and what are you looking for? 140 characters max."
-#    skills_header: "Skills"
-#    skills_help: "Tag relevant developer skills in order of proficiency."
-#    long_description_header: "Describe your desired position"
-#    long_description_blurb: "Tell employers how awesome you are and what role you want."
-#    long_description: "Self Description"
-#    long_description_help: "Describe yourself to potential employers. Keep it short and to the point. We recommend outlining the position that would most interest you. Tasteful markdown okay; 600 characters max."
-#    work_experience: "Work Experience"
-#    work_header: "Chronicle your work history"
-#    work_years: "Years of Experience"
-#    work_years_help: "How many years of professional experience (getting paid) developing software do you have?"
-#    work_blurb: "List your relevant work experience, most recent first."
-#    work_employer: "Employer"
-#    work_employer_help: "Name of your employer."
-#    work_role: "Job Title"
-#    work_role_help: "What was your job title or role?"
+    basics_country_help: "País que você quer trabalhar (ou morar)."
+    basics_visa: "Status de Trabalho nos EUA"
+    basics_visa_help: "Você está autorizado a trabalhar nos EUA ou você precisa de patrocínio para o VISA? (Se você mora no Canadá ou na Austrália, marque como autorizado.)"
+    basics_looking_for: "Procurando por"
+    basics_looking_for_full_time: "Tempo integral"
+    basics_looking_for_part_time: "Meio-turno"
+    basics_looking_for_remote: "Remoto"
+    basics_looking_for_contracting: "Contratando"
+    basics_looking_for_internship: "Estágio"
+    basics_looking_for_help: "Que tipo de cargo de desenvolvendor você procura?"
+    name_header: "Preencha seu nome"
+    name_anonymous: "Desenvolvedor Anônimo"
+    name_help: "Nome que você quer que os empregadores vejam, por exemplo 'Nick Winter'."
+    short_description_header: "Escreva uma breve descrição de si mesmo"
+    short_description_blurb: "Adicione um slogan (frase) que ajudará o empregador a lhe conhecer rapidamente."
+    short_description: "Slogan"
+    short_description_help: "Quem é você e o que você está procurando? Máximo de 140 caracteres."
+    skills_header: "Habilidades"
+    skills_help: "Marque habilidades de desenvolvimento relevantes em ordem de proficiência."
+    long_description_header: "Descreva o cargo desejado"
+    long_description_blurb: "Diga aos empregadores o quão incrível você é e qual cargo você deseja."
+    long_description: "Autodescrição"
+    long_description_help: "Descreva a si mesmo para seu potencial empregador. Mantenha curto e direto. Recomendamos esboçar o cargo que mais lhe interessa. Máximo de 600 caracteres."
+    work_experience: "Experiência de Trabalho"
+    work_header: "Descreva seu histórico de trabalho"
+    work_years: "Anos de Experiência"
+    work_years_help: "Quantos anos de experiência profissional (sendo pago) de desenvolvimento de software você tem?"
+    work_blurb: "Liste experiências relevantes de trabalho. As mais recentes primeiro."
+    work_employer: "Empregador"
+    work_employer_help: "Nome do empregador."
+    work_role: "Título do Emprego"
+    work_role_help: "Qual era a sua função ou cargo no emprego?"
     work_duration: "Duração"
-#    work_duration_help: "When did you hold this gig?"
+    work_duration_help: "Por quanto tempo?"
     work_description: "Descrição"
-#    work_description_help: "What did you do there? (140 chars; optional)"
+    work_description_help: "O que você fez lá? (140 carac.; opcional)"
     education: "Educação"
-#    education_header: "Recount your academic ordeals"
-#    education_blurb: "List your academic ordeals."
+    education_header: "Descreva seu percurso acadêmico"
+    education_blurb: "Liste seu percurso acadêmico."
     education_school: "Escola"
     education_school_help: "Nome da sua escola."
     education_degree: "Grau"
-#    education_degree_help: "What was your degree and field of study?"
+    education_degree_help: "Qual é o seu grau e área de estudo?"
     education_duration: "Datas"
     education_duration_help: "Quando?"
     education_description: "Descrição"
-#    education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
+    education_description_help: "Destaque qualquer coisa sobre essa experiência acadêmica. (140 carac.; opcional)"
     our_notes: "Nossas notas"
-#    remarks: "Remarks"
+    remarks: "Observações"
     projects: "Projetos"
     projects_header: "Adicione 3 projetos"
     projects_header_2: "Projetos (Top 3)"
@@ -988,11 +988,11 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     project_link_help: "Link para o projeto."
     player_code: "Código do Jogador"
 
-#  employers:
-#    deprecation_warning_title: "Sorry, CodeCombat is not recruiting right now."
-#    deprecation_warning: "We are focusing on beginner levels instead of finding expert developers for the time being."
-#    hire_developers_not_credentials: "Hire developers, not credentials." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
-#    get_started: "Get Started"
+  employers:
+    deprecation_warning_title: "Desculpe, o CodeCombat não está recrutando no momento."
+    deprecation_warning: "Estamos nos concentrando em níveis iniciante, em vez de encontrar desenvolvedores especializados no momento."
+    hire_developers_not_credentials: "Contrate desenvolvedores, não referências." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
+    get_started: "Comece"
 #    already_screened: "We've already technically screened all our candidates"
 #    filter_further: ", but you can also filter further:"
 #    filter_visa: "Visa"

From 441b1351aae1dfb7af5b2cd2db361ed3b40aeab6 Mon Sep 17 00:00:00 2001
From: Dmitry <spellhunter92@gmail.com>
Date: Sun, 19 Oct 2014 00:32:26 +0400
Subject: [PATCH 17/46] some translates

---
 app/locale/ru.coffee | 44 ++++++++++++++++++++++----------------------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee
index 0a1a33e3a..5561dff76 100644
--- a/app/locale/ru.coffee
+++ b/app/locale/ru.coffee
@@ -56,14 +56,14 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     spectate: "Наблюдать" # Ladder page
     players: "игроки" # Hover over a level on /play
     hours_played: "часов сыграно" # Hover over a level on /play
-#    items: "Items" # Tooltip on item shop button from /play
+    items: "Предметы" # Tooltip on item shop button from /play
     heroes: "Герои" # Tooltip on hero shop button from /play
     achievements: "Достижения" # Tooltip on achievement list button from /play
     account: "Аккаунт" # Tooltip on account button from /play
     settings: "Настройки" # Tooltip on settings button from /play
     next: "Следующий" # Go from choose hero to choose inventory before playing a level
     change_hero: "Выбрать героя" # Go back from choose inventory to choose hero
-#    choose_inventory: "Equip Items"
+    choose_inventory: "Выбрать предметы"
     older_campaigns: "Старые компании"
     anonymous: "Неизвестный игрок"
     level_difficulty: "Сложность: "
@@ -135,7 +135,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
   general:
     and: "и"
     name: "Имя"
-#    date: "Date"
+    date: "Дата"
     body: "Содержание"
     version: "Версия"
     commit_msg: "Сопроводительное сообщение"
@@ -204,7 +204,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     victory_rate_the_level: "Оцените уровень:" # Only in old-style levels.
     victory_return_to_ladder: "Вернуться к ладдеру"
     victory_play_next_level: "Следующий уровень" # Only in old-style levels.
-#    victory_play_continue: "Continue"
+    victory_play_continue: "Продолжить"
     victory_go_home: "На главную" # Only in old-style levels.
     victory_review: "Расскажите нам больше!" # Only in old-style levels.
     victory_hour_of_code_done: "Вы закончили?"
@@ -225,13 +225,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
 #    tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "Выбрать кого-нибудь для "
     tome_available_spells: "Доступные заклинания"
-#    tome_your_skills: "Your Skills"
+    tome_your_skills: "Ваши навыки"
     hud_continue: "Продолжить (Shift+Пробел)"
     spell_saved: "Заклинание сохранено"
     skip_tutorial: "Пропуск (Esc)"
     keyboard_shortcuts: "Горячие клавиши"
     loading_ready: "Готово!"
-#    loading_start: "Start Level"
+    loading_start: "Начать уровень"
     time_current: "Текущее:"
     time_total: "Максимальное:"
     time_goto: "Перейти на:"
@@ -265,7 +265,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     tip_first_language: "Наиболее катастрофическая вещь, которую вы можете выучить - ваш первый язык программирования. - Alan Kay"
     tip_hardware_problem: "В: Сколько программистов нужно, чтобы вкрутить лампочку? О: Нисколько, это проблемы с железом."
 #    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
-#    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
+    tip_premature_optimization: "Поспешная оптимизация - корень всех зол. - Donald Knuth"
 #    tip_brute_force: "When in doubt, use brute force. - Ken Thompson"
     customize_wizard: "Настройки волшебника"
 
@@ -274,9 +274,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     choose_hero_tab: "Перезапустить уровень"
     save_load_tab: "Сохранить/Загрузить"
     options_tab: "Настройки"
-#    guide_tab: "Guide"
+    guide_tab: "Руководство"
     multiplayer_tab: "Мультиплеер"
-#    inventory_caption: "Equip your hero"
+    inventory_caption: "Оденьте своего героя"
     choose_hero_caption: "Выбор героя, языка"
 #    save_load_caption: "... and view history"
 #    options_caption: "Configure settings"
@@ -305,7 +305,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     music_label: "Музыка"
     music_description: "Фоновая музыка вкл/выкл"
     autorun_label: "Автозапуск"
-#    autorun_description: "Control automatic code execution."
+    autorun_description: "Настройка автоматического выполнения кода."
     editor_config: "Настройки редактора"
     editor_config_title: "Настройки редактора"
     editor_config_level_language_label: "Язык для этого уровня"
@@ -417,7 +417,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     escape: "Escape"
 #    shift: "Shift"
     cast_spell: "Произнести текущее заклинание."
-#    run_real_time: "Run in real time."
+    run_real_time: "Запустить в реальном времени."
     continue_script: "Продолжить текущий скрипт."
     skip_scripts: "Пропустить все возможные скрипты."
     toggle_playback: "Переключить проигрывание/паузу."
@@ -428,7 +428,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     toggle_grid: "Включить наложение сетки."
     toggle_pathfinding: "Включить путевой оверлей.."
     beautify: "Приукрасьте свой код стандартизацией его форматирования."
-#    maximize_editor: "Maximize/minimize code editor."
+    maximize_editor: "Развернуть/свернуть редактор кода."
     move_wizard: "Перемещайте своего Волшебника по уровню."
 
   community:
@@ -477,7 +477,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     grassy: "Травянистый"
     fork_title: "Форк новой версии"
     fork_creating: "Создание форка..."
-#    generate_terrain: "Generate Terrain"
+    generate_terrain: "Создать ландшафт"
     more: "Ещё"
     wiki: "Вики"
     live_chat: "Онлайн-чат"
@@ -487,7 +487,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     level_tab_settings: "Настройки"
     level_tab_components: "Компоненты"
     level_tab_systems: "Системы"
-#    level_tab_docs: "Documentation"
+    level_tab_docs: "Документация"
     level_tab_thangs_title: "Текущие объекты"
     level_tab_thangs_all: "Все"
     level_tab_thangs_conditions: "Начальные условия"
@@ -522,7 +522,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     level_search_title: "Искать уровни"
     achievement_search_title: "Искать достижения"
     read_only_warning2: "Примечание: вы не можете сохранять любые правки здесь, потому что вы не авторизованы."
-#    no_achievements: "No achievements have been added for this level yet."
+    no_achievements: "Для этого уровня еще не были добавлены достижения."
 #    achievement_query_misc: "Key achievement off of miscellanea"
 #    achievement_query_goals: "Key achievement off of level goals"
 #    level_completion: "Level Completion"
@@ -719,7 +719,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     unknown: "Неизвестная ошибка."
 
   resources:
-#    sessions: "Sessions"
+    sessions: "Сессии"
     your_sessions: "Ваши сессии"
     level: "Уровень"
     social_network_apis: "API социальных сетей"
@@ -735,7 +735,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     patched_model: "Исходный документ"
     model: "Модель"
     system: "Система"
-#    systems: "Systems"
+    systems: "Системы"
     component: "Компонент"
     components: "Компоненты"
 #    thang: "Thang"
@@ -756,13 +756,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     user_remark: "Пользовательские поправки"
 #    user_remarks: "User Remarks"
     versions: "Версии"
-#    items: "Items"
-#    heroes: "Heroes"
-#    wizard: "Wizard"
-#    achievement: "Achievement"
+    items: "Предметы"
+    heroes: "Герои"
+    wizard: "Волшебник"
+    achievement: "Достижение"
 #    clas: "CLAs"
 #    play_counts: "Play Counts"
-#    feedback: "Feedback"
+    feedback: "Отзыв"
 
   delta:
     added: "Добавлено"

From 56a80e3615ef720f2d9c639b3c83a58361c981d3 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sat, 18 Oct 2014 14:51:43 -0700
Subject: [PATCH 18/46] Started getting hero-ladder level type working.

---
 app/lib/LevelLoader.coffee                    |  6 ++--
 app/lib/simulator/Simulator.coffee            |  2 +-
 app/lib/surface/Surface.coffee                |  4 ++-
 app/models/Level.coffee                       | 35 ++++++++++++-------
 app/schemas/models/level.coffee               |  2 +-
 .../component/ThangComponentConfigView.coffee |  2 +-
 .../level/thangs/LevelThangEditView.coffee    |  2 +-
 .../editor/level/thangs/ThangsTabView.coffee  |  6 ++--
 app/views/game-menu/GameMenuModal.coffee      |  2 +-
 app/views/game-menu/MultiplayerView.coffee    |  4 +--
 app/views/play/SpectateView.coffee            |  6 ++--
 app/views/play/WorldMapView.coffee            | 11 ++++++
 app/views/play/ladder/utils.coffee            |  2 +-
 app/views/play/level/ControlBarView.coffee    |  6 ++--
 app/views/play/level/LevelHUDView.coffee      |  2 +-
 app/views/play/level/LevelPlaybackView.coffee |  2 +-
 app/views/play/level/PlayLevelView.coffee     | 27 +++++++-------
 .../play/level/modal/VictoryModal.coffee      |  5 +--
 app/views/play/level/tome/Spell.coffee        |  2 +-
 .../play/level/tome/SpellPaletteView.coffee   |  6 ++--
 app/views/play/level/tome/TomeView.coffee     |  2 +-
 server/levels/level_handler.coffee            |  2 +-
 server/queues/scoring.coffee                  |  2 +-
 23 files changed, 81 insertions(+), 59 deletions(-)

diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 3bd7c64b3..8f69b2229 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -91,9 +91,9 @@ module.exports = class LevelLoader extends CocoClass
   loadDependenciesForSession: (session) ->
     if session is @session
       Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session
-    return unless @level.get('type', true) is 'hero'
+    return unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
     heroConfig = session.get('heroConfig')
-    heroConfig ?= me.get('heroConfig')
+    heroConfig ?= me.get('heroConfig') if session is @session
     heroConfig ?= {inventory: {}, thangType: '529ffbf1cf1818f2be000001'}  # If all else fails, assign Tharin as the hero.
     session.set 'heroConfig', heroConfig unless _.isEqual heroConfig, session.get('heroConfig')
     url = "/db/thang.type/#{heroConfig.thangType}/version"
@@ -334,7 +334,7 @@ module.exports = class LevelLoader extends CocoClass
     @initialized = true
     @world = new World()
     @world.levelSessionIDs = if @opponentSessionID then [@sessionID, @opponentSessionID] else [@sessionID]
-    serializedLevel = @level.serialize(@supermodel, @session)
+    serializedLevel = @level.serialize(@supermodel, @session, @opponentSession)
     @world.loadFromLevel serializedLevel, false
     console.log 'World has been initialized from level loader.'
 
diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee
index 01cff2057..eef6edae0 100644
--- a/app/lib/simulator/Simulator.coffee
+++ b/app/lib/simulator/Simulator.coffee
@@ -193,7 +193,7 @@ module.exports = class Simulator extends CocoClass
     @levelLoader = null
 
   setupGod: ->
-    @god.setLevel @level.serialize @supermodel
+    @god.setLevel @level.serialize @supermodel, @task.getSessions()[0], @task.getSessions()[1]
     @god.setLevelSessionIDs (session.sessionID for session in @task.getSessions())
     @god.setWorldClassMap @world.classMap
     @god.setGoalManager new GoalManager(@world, @level.get 'goals')
diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee
index bb2f26f86..727cab71a 100644
--- a/app/lib/surface/Surface.coffee
+++ b/app/lib/surface/Surface.coffee
@@ -540,7 +540,9 @@ module.exports = Surface = class Surface extends CocoClass
   #- Camera focus on hero
   focusOnHero: ->
     @heroLank = @lankBoss.lankFor 'Hero Placeholder'
-
+    if me.team is 'ogres'
+      # TODO: do this for real
+      @heroLank = @lankBoss.lankFor 'Hero Placeholder 1'
 
   #- Real-time playback
 
diff --git a/app/models/Level.coffee b/app/models/Level.coffee
index 1851bfbe1..1a89588cd 100644
--- a/app/models/Level.coffee
+++ b/app/models/Level.coffee
@@ -8,8 +8,8 @@ module.exports = class Level extends CocoModel
   @schema: require 'schemas/models/level'
   urlRoot: '/db/level'
 
-  serialize: (supermodel, session, cached=false) ->
-    o = @denormalize supermodel, session # hot spot to optimize
+  serialize: (supermodel, session, otherSession, cached=false) ->
+    o = @denormalize supermodel, session, otherSession # hot spot to optimize
 
     # Figure out Components
     o.levelComponents = if cached then @getCachedLevelComponents(supermodel) else $.extend true, [], (lc.attributes for lc in supermodel.getModels LevelComponent)
@@ -44,17 +44,24 @@ module.exports = class Level extends CocoModel
       newLevelComponents.push(@cachedLevelComponents[levelComponent.id])
     newLevelComponents
 
-  denormalize: (supermodel, session) ->
+  denormalize: (supermodel, session, otherSession) ->
     o = $.extend true, {}, @attributes
-    if o.thangs and @get('type', true) is 'hero'
-      # TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization.
+    if o.thangs and @get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
       for levelThang in o.thangs
-        @denormalizeThang(levelThang, supermodel, session)
+        @denormalizeThang(levelThang, supermodel, session, otherSession)
     o
 
-  denormalizeThang: (levelThang, supermodel, session) ->
+  denormalizeThang: (levelThang, supermodel, session, otherSession) ->
     levelThang.components ?= []
-    isHero = levelThang.id is 'Hero Placeholder'
+    isHero = /Hero Placeholder/.test levelThang.id
+    if isHero and otherSession
+      # If it's a hero and there's another session, find the right session for it.
+      # If there is no other session (playing against default code, or on single player), clone all placeholders.
+      # TODO: actually look at the teams on these things to determine which session should go with which placeholder.
+      if levelThang.id is 'Hero Placeholder 1' and session.get('team') is 'humans'
+        session = otherSession
+      else if levelThang.id is 'Hero Placeholder' and session.get('team') is 'ogres'
+        session = otherSession
 
     # Empty out placeholder Components and store their values if we're the hero placeholder.
     if isHero
@@ -129,6 +136,7 @@ module.exports = class Level extends CocoModel
     # Example: Programmable must come last, since it has to override any Component-provided methods that any other Component might have created. Can't enumerate all soft dependencies.
     # Example: Plans needs to come after everything except Programmable, since other Components that add plannable methods need to have done so by the time Plans is attached.
     # Example: Collides doesn't depend on Allied, but if both exist, Collides must come after Allied. Soft dependency example. Can't just figure out a proper priority to take care of it.
+    # Example: Moves doesn't depend on Acts, but if both exist, Moves must come after Acts. Another soft dependency example.
     # Decision? Just special case the sort logic in here until we have more examples than these two and decide how best to handle most of the cases then, since we don't really know the whole of the problem yet.
     # TODO: anything that depends on Programmable will break right now.
 
@@ -158,10 +166,13 @@ module.exports = class Level extends CocoModel
               console.error parentType, thang.id or thang.name, 'does not have dependent Component', dependent, 'from', lc.name
             visit c2 if c2
           if lc.name is 'Collides'
-            allied = _.find levelComponents, {name: 'Allied'}
-            if allied
-              collides = _.find(thang.components, {original: allied.original})
-              visit collides if collides
+            if allied = _.find levelComponents, {name: 'Allied'}
+              allied = _.find(thang.components, {original: allied.original})
+              visit allied if allied
+          if lc.name is 'Moves'
+            if acts = _.find levelComponents, {name: 'Acts'}
+              acts = _.find(thang.components, {original: acts.original})
+              visit acts if acts
         #console.log thang.id, 'sorted comps adding', lc.name
         sorted.push c
       for comp in thang.components
diff --git a/app/schemas/models/level.coffee b/app/schemas/models/level.coffee
index 318265cfb..be5b83621 100644
--- a/app/schemas/models/level.coffee
+++ b/app/schemas/models/level.coffee
@@ -244,7 +244,7 @@ _.extend LevelSchema.properties,
   icon: {type: 'string', format: 'image-file', title: 'Icon'}
   banner: {type: 'string', format: 'image-file', title: 'Banner'}
   goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
-  type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero'])
+  type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero', 'hero-ladder', 'hero-coop'])
   terrain: c.terrainString
   showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
 
diff --git a/app/views/editor/component/ThangComponentConfigView.coffee b/app/views/editor/component/ThangComponentConfigView.coffee
index 343a75017..b89f96db3 100644
--- a/app/views/editor/component/ThangComponentConfigView.coffee
+++ b/app/views/editor/component/ThangComponentConfigView.coffee
@@ -52,7 +52,7 @@ module.exports = class ThangComponentConfigView extends CocoView
     schema.default ?= {}
     _.merge schema.default, @additionalDefaults if @additionalDefaults
 
-    if @level?.get('type', true) is 'hero'
+    if @level?.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
       schema.required = []
     treemaOptions =
       supermodel: @supermodel
diff --git a/app/views/editor/level/thangs/LevelThangEditView.coffee b/app/views/editor/level/thangs/LevelThangEditView.coffee
index d5debf33b..b909acb25 100644
--- a/app/views/editor/level/thangs/LevelThangEditView.coffee
+++ b/app/views/editor/level/thangs/LevelThangEditView.coffee
@@ -46,7 +46,7 @@ module.exports = class LevelThangEditView extends CocoView
       level: @level
       world: @world
 
-    if @level.get('type', true) is 'hero' then options.thangType = thangType
+    if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then options.thangType = thangType
 
     @thangComponentEditView = new ThangComponentsEditView options
     @listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged
diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee
index 292c02d2f..6d2f39c6f 100644
--- a/app/views/editor/level/thangs/ThangsTabView.coffee
+++ b/app/views/editor/level/thangs/ThangsTabView.coffee
@@ -520,7 +520,7 @@ module.exports = class ThangsTabView extends CocoView
 
     @level.set 'thangs', thangs
     return if @editThangView
-    serializedLevel = @level.serialize @supermodel, null, true
+    serializedLevel = @level.serialize @supermodel, null, null, true
     try
       @world.loadFromLevel serializedLevel, false
     catch error
@@ -552,14 +552,14 @@ module.exports = class ThangsTabView extends CocoView
     if batchInsert
       if thangType.get('name') is 'Hero Placeholder'
         thangID = 'Hero Placeholder'
-        return if @level.get('type', true) isnt 'hero' or @getThangByID(thangID)
+        return if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or @getThangByID(thangID)
       else
         thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}"
     else
       thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @getThangByID(thangID)
     if @cloneSourceThang
       components = _.cloneDeep @getThangByID(@cloneSourceThang.id).components
-    else if @level.get('type', true) is 'hero'
+    else if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
       components = []  # Load them all from default ThangType Components
     else
       components = _.cloneDeep thangType.get('components') ? []
diff --git a/app/views/game-menu/GameMenuModal.coffee b/app/views/game-menu/GameMenuModal.coffee
index 1b4d63092..04df7322e 100644
--- a/app/views/game-menu/GameMenuModal.coffee
+++ b/app/views/game-menu/GameMenuModal.coffee
@@ -21,7 +21,7 @@ module.exports = class GameMenuModal extends ModalView
   constructor: (options) ->
     super options
     @options.showDevBits = me.isAdmin() or /https?:\/\/localhost/.test(window.location.href)
-    @options.showInventory = @options.level.get('type', true) is 'hero'
+    @options.showInventory = @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
     @options.levelID = @options.level.get('slug')
     @options.startingSessionHeroConfig = $.extend {}, true, (@options.session.get('heroConfig') ? {})
 
diff --git a/app/views/game-menu/MultiplayerView.coffee b/app/views/game-menu/MultiplayerView.coffee
index 9d95345bd..e1a3b56b4 100644
--- a/app/views/game-menu/MultiplayerView.coffee
+++ b/app/views/game-menu/MultiplayerView.coffee
@@ -40,7 +40,7 @@ module.exports = class MultiplayerView extends CocoView
     c.team = @session.get 'team'
     c.levelSlug = @level?.get 'slug'
     # For now, ladderGame will disallow multiplayer, because session code combining doesn't play nice yet.
-    if @level?.get('type') is 'ladder'
+    if @level?.get('type') in ['ladder', 'hero-ladder']
       c.ladderGame = true
       c.readyToRank = @session?.readyToRank()
 
@@ -68,7 +68,7 @@ module.exports = class MultiplayerView extends CocoView
   updateLinkSection: ->
     multiplayer = @$el.find('#multiplayer').prop('checked')
     la = @$el.find('#link-area')
-    la.toggle if @level?.get('type') is 'ladder' then false else Boolean(multiplayer)
+    la.toggle if @level?.get('type') in ['ladder', 'hero-ladder'] then false else Boolean(multiplayer)
     true
 
   onHidden: ->
diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee
index 9c6cc5dc9..095ee4be9 100644
--- a/app/views/play/SpectateView.coffee
+++ b/app/views/play/SpectateView.coffee
@@ -68,7 +68,7 @@ module.exports = class SpectateLevelView extends RootView
       @load()
 
   setLevel: (@level, @supermodel) ->
-    serializedLevel = @level.serialize @supermodel, @session
+    serializedLevel = @level.serialize @supermodel, @session, @otherSession
     @god?.setLevel serializedLevel
     if @world
       @world.loadFromLevel serializedLevel, false
@@ -105,7 +105,7 @@ module.exports = class SpectateLevelView extends RootView
     #at this point, all requisite data is loaded, and sessions are not denormalized
     team = @world.teamForPlayer(0)
     @loadOpponentTeam(team)
-    @god.setLevel @level.serialize @supermodel, @session
+    @god.setLevel @level.serialize @supermodel, @session, @otherSession
     @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id]
     @god.setWorldClassMap @world.classMap
     @setTeam team
@@ -119,7 +119,7 @@ module.exports = class SpectateLevelView extends RootView
     @register()
     @controlBar.setBus(@bus)
     @surface.showLevel()
-    if @level.get('type', true) isnt 'hero'
+    if not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'])
       if me.id isnt @session.get 'creator'
         @surface.createOpponentWizard
           id: @session.get('creator')
diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee
index 80a83eadc..2968c9884 100644
--- a/app/views/play/WorldMapView.coffee
+++ b/app/views/play/WorldMapView.coffee
@@ -718,6 +718,17 @@ hero = [
     x: 95.31
     y: 88.26
   }
+  {
+    name: 'Dueling Grounds'
+    type: 'hero-ladder'
+    difficulty: 1
+    id: 'dueling-grounds'
+    original: '5442ba0e1e835500007eb1c7'
+    description: 'Battle head-to-head against another hero in this basic beginner combat arena.'
+    disabled: not me.isAdmin()
+    x: 17.54
+    y: 78.39
+  }
   #{
   #  name: ''
   #  type: 'hero'
diff --git a/app/views/play/ladder/utils.coffee b/app/views/play/ladder/utils.coffee
index ffa340ac3..182777b37 100644
--- a/app/views/play/ladder/utils.coffee
+++ b/app/views/play/ladder/utils.coffee
@@ -1,7 +1,7 @@
 {hslToHex} = require 'lib/utils'
 
 module.exports.teamDataFromLevel = (level) ->
-  alliedSystem = _.find level.get('systems'), (value) -> value.config?.teams?
+  alliedSystem = _.find level.get('systems', true), (value) -> value.config?.teams?
   teamNames = (teamName for teamName, teamConfig of alliedSystem.config.teams when teamConfig.playable)
   teamConfigs = alliedSystem.config.teams
 
diff --git a/app/views/play/level/ControlBarView.coffee b/app/views/play/level/ControlBarView.coffee
index f5a779e94..722dec599 100644
--- a/app/views/play/level/ControlBarView.coffee
+++ b/app/views/play/level/ControlBarView.coffee
@@ -51,15 +51,15 @@ module.exports = class ControlBarView extends CocoView
     super c
     c.worldName = @worldName
     c.multiplayerEnabled = @session.get('multiplayer')
-    c.ladderGame = @level.get('type') is 'ladder'
+    c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder']
     c.spectateGame = @spectateGame
     @homeViewArgs = [{supermodel: @supermodel}]
-    if @level.get('type', true) in ['ladder', 'ladder-tutorial']
+    if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder']
       levelID = @level.get('slug').replace /\-tutorial$/, ''
       @homeLink = c.homeLink = '/play/ladder/' + levelID
       @homeViewClass = require 'views/play/ladder/LadderView'
       @homeViewArgs.push levelID
-    else if @level.get('type', true) is 'hero'
+    else if @level.get('type', true) in ['hero', 'hero-coop']
       @homeLink = c.homeLink = '/play'
       @homeViewClass = require 'views/play/WorldMapView'
     else
diff --git a/app/views/play/level/LevelHUDView.coffee b/app/views/play/level/LevelHUDView.coffee
index f315920a1..87691450e 100644
--- a/app/views/play/level/LevelHUDView.coffee
+++ b/app/views/play/level/LevelHUDView.coffee
@@ -85,7 +85,7 @@ module.exports = class LevelHUDView extends CocoView
     clearTimeout @hintNextSelectionTimeout
     @$el.find('.no-selection-message').hide()
     if not @thang
-      unless @options.level.get('type', true) is 'hero'
+      unless @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
         @hintNextSelectionTimeout = _.delay((=> @$el.find('.no-selection-message').slideDown('slow')), 10000)
       return
     @createAvatar thangType, @thang
diff --git a/app/views/play/level/LevelPlaybackView.coffee b/app/views/play/level/LevelPlaybackView.coffee
index b01b7081c..ed4a4b822 100644
--- a/app/views/play/level/LevelPlaybackView.coffee
+++ b/app/views/play/level/LevelPlaybackView.coffee
@@ -167,7 +167,7 @@ module.exports = class LevelPlaybackView extends CocoView
     @togglePlaybackControls false
     Backbone.Mediator.publish 'playback:real-time-playback-started', {}
     Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'real-time-playback-start', volume: 1
-    Backbone.Mediator.publish 'level:set-letterbox', on: true
+    Backbone.Mediator.publish 'level:set-letterbox', on: true if @options.level.get('type', true) is ['hero']  # not with flags...?
 
   onRealTimeMultiplayerCast: (e) ->
     @realTime = true
diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee
index 27b54efbb..f966fe230 100644
--- a/app/views/play/level/PlayLevelView.coffee
+++ b/app/views/play/level/PlayLevelView.coffee
@@ -118,7 +118,7 @@ module.exports = class PlayLevelView extends RootView
     @supermodel.collections = givenSupermodel.collections
     @supermodel.shouldSaveBackups = givenSupermodel.shouldSaveBackups
 
-    serializedLevel = @level.serialize @supermodel, @session
+    serializedLevel = @level.serialize @supermodel, @session, @otherSession
     @god?.setLevel serializedLevel
     if @world
       @world.loadFromLevel serializedLevel, false
@@ -215,8 +215,8 @@ module.exports = class PlayLevelView extends RootView
     @session = @levelLoader.session
     @world = @levelLoader.world
     @level = @levelLoader.level
-    @$el.addClass 'hero' if @level.get('type', true) is 'hero'
-    @$el.addClass 'flags' if @level.get('slug') is 'sky-span'  # TODO: figure out when the player has flags.
+    @$el.addClass 'hero' if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
+    @$el.addClass 'flags' if @level.get('slug') is 'sky-span' or (@level.get('type', true) in ['hero-ladder', 'hero-coop']) # TODO: figure out when the player has flags.
     @otherSession = @levelLoader.opponentSession
     @worldLoadFakeResources = []  # first element (0) is 1%, last (100) is 100%
     for percent in [1 .. 100]
@@ -251,7 +251,7 @@ module.exports = class PlayLevelView extends RootView
       @session.set 'multiplayer', false
 
   setupGod: ->
-    @god.setLevel @level.serialize @supermodel, @session
+    @god.setLevel @level.serialize @supermodel, @session, @otherSession
     @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id]
     @god.setWorldClassMap @world.classMap
 
@@ -268,9 +268,9 @@ module.exports = class PlayLevelView extends RootView
 
   insertSubviews: ->
     @insertSubView @tome = new TomeView levelID: @levelID, session: @session, otherSession: @otherSession, thangs: @world.thangs, supermodel: @supermodel, level: @level
-    @insertSubView new LevelPlaybackView session: @session, levelID: @levelID
+    @insertSubView new LevelPlaybackView session: @session, levelID: @levelID, level: @level
     @insertSubView new GoalsView {}
-    @insertSubView new LevelFlagsView world: @world if @levelID is 'sky-span'  # TODO: figure out when flags are available
+    @insertSubView new LevelFlagsView world: @world if @levelID is 'sky-span' or @level.get('type', true) in ['hero-ladder', 'hero-coop'] # TODO: figure out when flags are available
     @insertSubView new GoldView {}
     @insertSubView new HUDView {level: @level}
     @insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session
@@ -297,11 +297,11 @@ module.exports = class PlayLevelView extends RootView
 
   onLevelLoaded: (e) ->
     # Just the level has been loaded by the level loader
-    @showWizardSettingsModal() if not me.get('name') and not @isIPadApp() and e.level.get('type', true) isnt 'hero'
+    @showWizardSettingsModal() if not me.get('name') and not @isIPadApp() and not (e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'])
 
   onSessionLoaded: (e) ->
     # Just the level and session have been loaded by the level loader
-    if e.level.get('type', true) is 'hero' and not _.size e.session.get('heroConfig')?.inventory ? {}
+    if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {}
       @openModalView new GameMenuModal level: e.level, session: e.session
 
   onLoaded: ->
@@ -331,7 +331,7 @@ module.exports = class PlayLevelView extends RootView
   initSurface: ->
     webGLSurface = $('canvas#webgl-surface', @$el)
     normalSurface = $('canvas#normal-surface', @$el)
-    @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, wizards: @level.get('type', true) isnt 'hero')
+    @surface = new Surface(@world, normalSurface, webGLSurface, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, wizards: not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']))
     worldBounds = @world.getBounds()
     bounds = [{x: worldBounds.left, y: worldBounds.top}, {x: worldBounds.right, y: worldBounds.bottom}]
     @surface.camera.setBounds(bounds)
@@ -346,7 +346,7 @@ module.exports = class PlayLevelView extends RootView
     if window.currentModal and not window.currentModal.destroyed and window.currentModal.constructor isnt VictoryModal
       return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @
     @surface.showLevel()
-    if @otherSession and @level.get('type', true) isnt 'hero'
+    if @otherSession and not (@level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'])
       # TODO: colorize name and cloud by team, colorize wizard by user's color config
       @surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team'), levelSlug: @level.get('slug'), codeLanguage: @otherSession.get('submittedCodeLanguage')
     if @isEditorPreview
@@ -377,7 +377,7 @@ module.exports = class PlayLevelView extends RootView
     return if @alreadyLoadedState
     @alreadyLoadedState = true
     state = @originalSessionState
-    if @level.get('type', true) is 'hero'
+    if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
       Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: true
       Backbone.Mediator.publish 'tome:select-primary-sprite', {}
       Backbone.Mediator.publish 'level:suppress-selection-sounds', suppress: false
@@ -443,7 +443,7 @@ module.exports = class PlayLevelView extends RootView
   onDonePressed: -> @showVictory()
 
   onShowVictory: (e) ->
-    $('#level-done-button').show() unless @level.get('type', true) is 'hero'
+    $('#level-done-button').show() unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
     @showVictory() if e.showModal
     setTimeout(@preloadNextLevel, 3000)
     return if @victorySeen
@@ -455,7 +455,8 @@ module.exports = class PlayLevelView extends RootView
 
   showVictory: ->
     options = {level: @level, supermodel: @supermodel, session: @session}
-    ModalClass = if @level.get('type', true) is 'hero' then HeroVictoryModal else VictoryModal
+    ModalClass = if @level.get('type', true) in ['hero', 'hero-coop'] then HeroVictoryModal else VictoryModal
+    # TODO: made HeroVictoryModal able to support hero-ladder and then switch over for that level type, too
     victoryModal = new ModalClass(options)
     @openModalView(victoryModal)
     if me.get('anonymous')
diff --git a/app/views/play/level/modal/VictoryModal.coffee b/app/views/play/level/modal/VictoryModal.coffee
index d2afe6a1c..4fa83402c 100644
--- a/app/views/play/level/modal/VictoryModal.coffee
+++ b/app/views/play/level/modal/VictoryModal.coffee
@@ -36,9 +36,6 @@ module.exports = class VictoryModal extends ModalView
     @session = options.session
     @saveReviewEventually = _.debounce(@saveReviewEventually, 2000)
     @loadExistingFeedback()
-    if @level.get('type', true) is 'hero'
-      @closeButton = false
-      @closesOnClickOutside = false
     super options
 
   loadExistingFeedback: ->
@@ -82,7 +79,7 @@ module.exports = class VictoryModal extends ModalView
     c.hasNextLevel = _.isObject(@level.get('nextLevel'))
     c.levelName = utils.i18n @level.attributes, 'name'
     c.level = @level
-    if c.level.get('type') is 'ladder'
+    if c.level.get('type') in ['ladder', 'hero-ladder']
       c.readyToRank = @session.readyToRank()
     if me.get 'hourOfCode'
       # Show the Hour of Code "I'm Done" tracking pixel after they played for 30 minutes
diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee
index 1abf57c29..aba1c56b1 100644
--- a/app/views/play/level/tome/Spell.coffee
+++ b/app/views/play/level/tome/Spell.coffee
@@ -133,7 +133,7 @@ module.exports = class Spell
     writable = @permissions.readwrite.length > 0
     skipProtectAPI = @skipProtectAPI or not writable
     problemContext = @createProblemContext thang
-    aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: @levelType is 'hero', problemContext: problemContext
+    aetherOptions = createAetherOptions functionName: @name, codeLanguage: @language, functionParameters: @parameters, skipProtectAPI: skipProtectAPI, includeFlow: @levelType in ['hero', 'hero-ladder', 'hero-coop'], problemContext: problemContext
     aether = new Aether aetherOptions
     if @worker
       workerMessage =
diff --git a/app/views/play/level/tome/SpellPaletteView.coffee b/app/views/play/level/tome/SpellPaletteView.coffee
index 98eaacaea..e94734028 100644
--- a/app/views/play/level/tome/SpellPaletteView.coffee
+++ b/app/views/play/level/tome/SpellPaletteView.coffee
@@ -121,7 +121,7 @@ module.exports = class SpellPaletteView extends CocoView
     else
       propStorage =
         'this': ['apiProperties', 'apiMethods']
-    if @options.level.get('type', true) isnt 'hero' or not @options.programmable
+    if not (@options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']) or not @options.programmable
       @organizePalette propStorage, allDocs, excludedDocs
     else
       @organizePaletteHero propStorage, allDocs, excludedDocs
@@ -162,7 +162,7 @@ module.exports = class SpellPaletteView extends CocoView
     if tabbify and _.find @entries, ((entry) -> entry.doc.owner isnt 'this')
       @entryGroups = _.groupBy @entries, groupForEntry
     else
-      i18nKey = if @options.level.get('type', true) is 'hero' then 'play_level.tome_your_skills' else 'play_level.tome_available_spells'
+      i18nKey = if @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then 'play_level.tome_your_skills' else 'play_level.tome_available_spells'
       defaultGroup = $.i18n.t i18nKey
       @entryGroups = {}
       @entryGroups[defaultGroup] = @entries
@@ -218,7 +218,7 @@ module.exports = class SpellPaletteView 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 not doc and not excludedDocs['__' + prop]
-          console.log 'could not find doc for', prop, 'from', allDocs['__' + prop], 'for', owner, 'of', propGroups, 'with item', item
+          console.log 'could not find doc for', prop, 'from', allDocs['__' + prop], 'for', owner, 'of', propsByItem, 'with item', item
           doc ?= prop
         if doc
           @entries.push @addEntry(doc, shortenize, false, owner is 'snippets', item, propIndex > 0)
diff --git a/app/views/play/level/tome/TomeView.coffee b/app/views/play/level/tome/TomeView.coffee
index 9d6e961fa..528ebfa77 100644
--- a/app/views/play/level/tome/TomeView.coffee
+++ b/app/views/play/level/tome/TomeView.coffee
@@ -186,7 +186,7 @@ module.exports = class TomeView extends CocoView
     @thangList?.$el.show()
 
   onSpriteSelected: (e) ->
-    return if @spellView and @options.level.get('type', true) is 'hero'  # Never deselect the hero in the Tome.
+    return if @spellView and @options.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']  # Never deselect the hero in the Tome.
     thang = e.thang
     spellName = e.spellName
     @spellList?.$el.hide()
diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee
index 908a6b1dd..b14a71968 100644
--- a/server/levels/level_handler.coffee
+++ b/server/levels/level_handler.coffee
@@ -67,7 +67,7 @@ LevelHandler = class LevelHandler extends Handler
         sessionQuery.team = req.query.team
 
       # TODO: generalize this for levels based on their teams
-      else if level.get('type') is 'ladder'
+      else if level.get('type') in ['ladder', 'hero-ladder']
         sessionQuery.team = 'humans'
 
       Session.findOne(sessionQuery).exec (err, doc) =>
diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee
index d6aa6f3cb..13b3259e8 100644
--- a/server/queues/scoring.coffee
+++ b/server/queues/scoring.coffee
@@ -279,7 +279,7 @@ fetchAndVerifyLevelType = (levelID, cb) ->
   .lean()
   query.exec (err, levelWithType) ->
     if err? then return cb err
-    if not levelWithType.type or levelWithType.type isnt 'ladder' then return cb 'Level isn\'t of type "ladder"'
+    if not levelWithType.type or not (levelWithType.type in ['ladder', 'hero-ladder']) then return cb 'Level isn\'t of type "ladder"'
     cb null
 
 fetchSessionObjectToSubmit = (sessionID, callback) ->

From 9c8a0e83af8fb93b7ef6850a9553e8262ecc9b7c Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sat, 18 Oct 2014 14:54:04 -0700
Subject: [PATCH 19/46] Fixed an indentation typo in pt-BR.coffee.

---
 app/locale/pt-BR.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 3608e9e5a..92b306952 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -1045,7 +1045,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     av_entities_users_url: "Usuários"
     av_entities_active_instances_url: "Instâncias Ativas"
     av_entities_employer_list_url: "Lista de Empregadores"
-     av_entities_candidates_list_url: "Lista de Candidatos"
+    av_entities_candidates_list_url: "Lista de Candidatos"
     av_other_sub_title: "Outro"
     av_other_debug_base_url: "Base (para debugar base.jade)"
     u_title: "Lista de Usuários"

From e32787d25c4e3040eefd8d52d5b53b5551a53d7b Mon Sep 17 00:00:00 2001
From: Rafael Jaques <rafael@phpit.com.br>
Date: Sat, 18 Oct 2014 19:17:07 -0300
Subject: [PATCH 20/46] Translation done and spell check

---
 app/locale/pt-BR.coffee | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 3608e9e5a..4b442447a 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -346,7 +346,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     nick_blurb: "Guru Motivacional"
     michael_title: "Programador"
     michael_blurb: "Administrador de Sistemas"
-    matt_title: "PProgramador"
+    matt_title: "Programador"
     matt_blurb: "O Ciclista"
 
   versions:
@@ -436,8 +436,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     introduction: "Verifique abaixo de que maneires você pode se envolver e decida qual lhe parece mais divertida. Esperamos trabalhar com você em breve!"
     level_editor_prefix: "Use o CodeCombat"
     level_editor_suffix: "para criar e editar níveis. Usuários criaram níveis para suas classes, amigos, hackathons, estudantes e parentes. Se criar um novo nível soa intimidador, você pode iniciar fazendo um fork de um dos nossos."
-#    thang_editor_prefix: "We call units within the game 'thangs'. Use the"
-#    thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites."
+    thang_editor_prefix: "Nós chamamos as unidades do jogo de 'thangs'. Utilize o"
+    thang_editor_suffix: "para modificar o fonte das artes. Permita que lancem projéteis, modifique a direção das animações, modifique os pontos de vida da unidade ou envie seu próprio vetor de sprites."
     article_editor_prefix: "Encontrou algo errado na nossa documentação? Gostaria de criar algumas instruções para suas próprias criações? Dê uma olhada em"
     article_editor_suffix: "e ajude os jogadores do CodeCombat a aproveitar o máximo de seu jogo."
     find_us: "Encontre-nos nestes sites"
@@ -738,21 +738,21 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     systems: "Sistemas"
     component: "Componente"
     components: "Componentes"
-#    thang: "Thang"
-#    thangs: "Thangs"
+    thang: "Thang"
+    thangs: "Thangs"
     level_session: "Sua Sessão"
     opponent_session: "Sessão do Oponente"
     article: "Artigo"
     user_names: "Nomes de Usuários"
-#    thang_names: "Thang Names"
+    thang_names: "Nome do Thang"
     files: "Arquivos"
     top_simulators: "Top Simuladores"
     source_document: "Documento da Fonte"
     document: "Documento"
-#    sprite_sheet: "Sprite Sheet"
+    sprite_sheet: "Folha de Sprites"
     employers: "Empregadores"
     candidates: "Candidatos"
-#    candidate_sessions: "Candidate Sessions"
+    candidate_sessions: "Sessão do Candidato"
     user_remark: "Observação do Usuário"
     user_remarks: "Observações do Usuário"
     versions: "Versões"
@@ -1050,4 +1050,4 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     av_other_debug_base_url: "Base (para debugar base.jade)"
     u_title: "Lista de Usuários"
     lg_title: "Últimos Jogos"
-#    clas: "CLAs"
+    clas: "CLAs"

From 24da2aa80aa3fde33a8e9e477aff5f5beeab8ccf Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sat, 18 Oct 2014 17:32:01 -0700
Subject: [PATCH 21/46] Preserving flag history and submission count so that
 things are more stable in between real-time submissions.

---
 app/assets/javascripts/workers/worker_world.js |  4 ++++
 app/lib/God.coffee                             |  8 +++++++-
 app/lib/LevelBus.coffee                        | 18 ++++++++++++++++++
 app/lib/LevelLoader.coffee                     |  2 ++
 app/lib/world/world.coffee                     |  6 +++---
 app/schemas/models/level_session.coffee        | 16 ++++++++++++++++
 app/schemas/subscriptions/tome.coffee          |  4 +++-
 app/views/play/level/tome/TomeView.coffee      | 10 +++++++---
 headless_client/worker_world.coffee            |  2 ++
 9 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/app/assets/javascripts/workers/worker_world.js b/app/assets/javascripts/workers/worker_world.js
index eb99b8c6a..40af1eeae 100644
--- a/app/assets/javascripts/workers/worker_world.js
+++ b/app/assets/javascripts/workers/worker_world.js
@@ -290,6 +290,8 @@ self.setupDebugWorldToRunUntilFrame = function (args) {
         try {
             self.debugWorld = new World(args.userCodeMap);
             self.debugWorld.levelSessionIDs = args.levelSessionIDs;
+            self.debugWorld.submissionCount = args.submissionCount;
+            self.debugWorld.flagHistory = args.flagHistory;
             if (args.level)
                 self.debugWorld.loadFromLevel(args.level, true);
             self.debugWorld.debugging = true;
@@ -347,6 +349,8 @@ self.runWorld = function runWorld(args) {
   try {
     self.world = new World(args.userCodeMap);
     self.world.levelSessionIDs = args.levelSessionIDs;
+    self.world.submissionCount = args.submissionCount;
+    self.world.flagHistory = args.flagHistory || [];
     if(args.level)
       self.world.loadFromLevel(args.level, true);
     self.world.preloading = args.preload;
diff --git a/app/lib/God.coffee b/app/lib/God.coffee
index cf1631689..c6b9deb01 100644
--- a/app/lib/God.coffee
+++ b/app/lib/God.coffee
@@ -54,9 +54,11 @@ module.exports = class God extends CocoClass
   setWorldClassMap: (worldClassMap) -> @angelsShare.worldClassMap = worldClassMap
 
   onTomeCast: (e) ->
+    @lastSubmissionCount = e.submissionCount
+    @lastFlagHistory = e.flagHistory
     @createWorld e.spells, e.preload, e.realTime
 
-  createWorld: (spells, preload=false, realTime=false) ->
+  createWorld: (spells, preload, realTime) ->
     console.log "#{@nick}: Let there be light upon #{@level.name}! (preload: #{preload})"
     userCodeMap = @getUserCodeMap spells
 
@@ -81,6 +83,8 @@ module.exports = class God extends CocoClass
       userCodeMap: userCodeMap
       level: @level
       levelSessionIDs: @levelSessionIDs
+      submissionCount: @lastSubmissionCount
+      flagHistory: @lastFlagHistory
       goals: @angelsShare.goalManager?.getGoals()
       headless: @angelsShare.headless
       preload: preload
@@ -110,6 +114,8 @@ module.exports = class God extends CocoClass
         userCodeMap: @currentUserCodeMap
         level: @level
         levelSessionIDs: @levelSessionIDs
+        submissionCount: @lastSubmissionCount
+        flagHistory: @lastFlagHistory
         goals: @goalManager?.getGoals()
         frame: args.frame
         currentThangID: args.thangID
diff --git a/app/lib/LevelBus.coffee b/app/lib/LevelBus.coffee
index 11e2232aa..11f1f447e 100644
--- a/app/lib/LevelBus.coffee
+++ b/app/lib/LevelBus.coffee
@@ -23,8 +23,10 @@ module.exports = class LevelBus extends Bus
     'level:show-victory': 'onVictory'
     'tome:spell-changed': 'onSpellChanged'
     'tome:spell-created': 'onSpellCreated'
+    'tome:cast-spells': 'onCastSpells'
     'application:idle-changed': 'onIdleChanged'
     'goal-manager:new-goal-states': 'onNewGoalStates'
+    'god:new-world-created': 'onNewWorldCreated'
 
   constructor: ->
     super(arguments...)
@@ -126,6 +128,22 @@ module.exports = class LevelBus extends Bus
       # https://github.com/codecombat/codecombat/issues/81
       @onSpellChanged e  # Save the new spell to the session, too.
 
+  onCastSpells: (e) ->
+    return unless @onPoint() and e.realTime
+    # We have incremented state.submissionCount and reset state.flagHistory.
+    @changedSessionProperties.state = true
+    @saveSession()
+
+  onNewWorldCreated: (e) ->
+    return unless @onPoint()
+    # Record the flag history.
+    state = @session.get('state')
+    return if _.isEqual state.flagHistory, e.world.flagHistory
+    state.flagHistory = e.world.flagHistory
+    @changedSessionProperties.state = true
+    @session.set('state', state)
+    @saveSession()
+
   onScriptStateChanged: (e) ->
     return unless @onPoint()
     @fireScriptsRef?.update(e)
diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 8f69b2229..8b975f91a 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -334,6 +334,8 @@ module.exports = class LevelLoader extends CocoClass
     @initialized = true
     @world = new World()
     @world.levelSessionIDs = if @opponentSessionID then [@sessionID, @opponentSessionID] else [@sessionID]
+    @world.submissionCount = @session?.get('state')?.submissionCount ? 0
+    @world.flagHistory = @session?.get('state')?.flagHistory ? []
     serializedLevel = @level.serialize(@supermodel, @session, @opponentSession)
     @world.loadFromLevel serializedLevel, false
     console.log 'World has been initialized from level loader.'
diff --git a/app/lib/world/world.coffee b/app/lib/world/world.coffee
index 523f706e4..34f24153a 100644
--- a/app/lib/world/world.coffee
+++ b/app/lib/world/world.coffee
@@ -39,7 +39,6 @@ module.exports = class World
     @systems = []
     @systemMap = {}
     @scriptNotes = []
-    @flagHistory = []
     @rand = new Rand 0  # Existence System may change this seed
     @frames = [new WorldFrame(@, 0)]
 
@@ -349,7 +348,8 @@ module.exports = class World
     endFrame = @frames.length
     #console.log "... world serializing frames from", startFrame, "to", endFrame, "of", @totalFrames
     [transferableObjects, nontransferableObjects] = [0, 0]
-    o = {totalFrames: @totalFrames, maxTotalFrames: @maxTotalFrames, frameRate: @frameRate, dt: @dt, victory: @victory, userCodeMap: {}, trackedProperties: {}}
+    delete flag.processed for flag in @flagHistory
+    o = {totalFrames: @totalFrames, maxTotalFrames: @maxTotalFrames, frameRate: @frameRate, dt: @dt, victory: @victory, userCodeMap: {}, trackedProperties: {}, flagHistory: @flagHistory}
     o.trackedProperties[prop] = @[prop] for prop in @trackedProperties or []
 
     for thangID, methods of @userCodeMap
@@ -455,7 +455,7 @@ module.exports = class World
             w.userCodeMap[thangID][methodName][aetherStateKey] = serializedAether[aetherStateKey]
     else
       w = new World o.userCodeMap, classMap
-    [w.totalFrames, w.maxTotalFrames, w.frameRate, w.dt, w.scriptNotes, w.victory] = [o.totalFrames, o.maxTotalFrames, o.frameRate, o.dt, o.scriptNotes ? [], o.victory]
+    [w.totalFrames, w.maxTotalFrames, w.frameRate, w.dt, w.scriptNotes, w.victory, w.flagHistory] = [o.totalFrames, o.maxTotalFrames, o.frameRate, o.dt, o.scriptNotes ? [], o.victory, o.flagHistory]
     w[prop] = val for prop, val of o.trackedProperties
 
     perf.t1 = now()
diff --git a/app/schemas/models/level_session.coffee b/app/schemas/models/level_session.coffee
index 3545c3a1f..980a1e5e6 100644
--- a/app/schemas/models/level_session.coffee
+++ b/app/schemas/models/level_session.coffee
@@ -110,6 +110,22 @@ _.extend LevelSessionSchema.properties,
         type: 'object'
         properties:
           status: enum: ['failure', 'incomplete', 'success']
+    submissionCount:
+      description: 'How many times the session has been submitted for real-time playback (can affect the random seed).'
+      type: 'integer'
+      minimum: 0
+    flagHistory:
+      description: 'The history of flag events during the last real-time playback submission.'
+      type: 'array'
+      items: c.object {required: ['player', 'color', 'time', 'active']},
+        player: {type: 'string'}
+        team: {type: 'string'}
+        color: {type: 'string', enum: ['green', 'black', 'violet']}
+        time: {type: 'number', minimum: 0}
+        active: {type: 'boolean'}
+        pos: c.object {required: ['x', 'y']},
+          x: {type: 'number'}
+          y: {type: 'number'}
 
   code:
     type: 'object'
diff --git a/app/schemas/subscriptions/tome.coffee b/app/schemas/subscriptions/tome.coffee
index 573cd5dd3..ad5d0ac42 100644
--- a/app/schemas/subscriptions/tome.coffee
+++ b/app/schemas/subscriptions/tome.coffee
@@ -7,10 +7,12 @@ module.exports =
     preload: {type: 'boolean'}
     realTime: {type: 'boolean'}
 
-  'tome:cast-spells': c.object {title: 'Cast Spells', description: 'Published when spells are cast', required: ['spells', 'preload', 'realTime']},
+  'tome:cast-spells': c.object {title: 'Cast Spells', description: 'Published when spells are cast', required: ['spells', 'preload', 'realTime', 'submissionCount', 'flagHistory']},
     spells: [type: 'object']
     preload: [type: 'boolean']
     realTime: [type: 'boolean']
+    submissionCount: [type: 'integer']
+    flagHistory: [type: 'array']
 
   'tome:manual-cast': c.object {title: 'Manually Cast Spells', description: 'Published when you wish to manually recast all spells', required: []},
     realTime: {type: 'boolean'}
diff --git a/app/views/play/level/tome/TomeView.coffee b/app/views/play/level/tome/TomeView.coffee
index 528ebfa77..22a24968c 100644
--- a/app/views/play/level/tome/TomeView.coffee
+++ b/app/views/play/level/tome/TomeView.coffee
@@ -157,11 +157,15 @@ module.exports = class TomeView extends CocoView
 
   onCastSpell: (e) ->
     # A single spell is cast.
-    # Hmm; do we need to make sure other spells are all cast here?
     @cast e?.preload, e?.realTime
 
   cast: (preload=false, realTime=false) ->
-    Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime
+    sessionState = @options.session.get('state') ? {}
+    if realTime
+      sessionState.submissionCount = (sessionState.submissionCount ? 0) + 1
+      sessionState.flagHistory = []
+      @options.session.set 'state', sessionState
+    Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime, submissionCount: sessionState.submissionCount ? 0, flagHistory: sessionState.flagHistory ? []
 
   onToggleSpellList: (e) ->
     @spellList.rerenderEntries()
@@ -230,7 +234,7 @@ module.exports = class TomeView extends CocoView
 
   reloadAllCode: ->
     spell.view.reloadCode false for spellKey, spell of @spells when spell.view and (spell.team is me.team or (spell.team in ['common', 'neutral', null]))
-    Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: false, realTime: false
+    @cast false, false
 
   updateLanguageForAllSpells: (e) ->
     spell.updateLanguageAether e.language for spellKey, spell of @spells when spell.canWrite()
diff --git a/headless_client/worker_world.coffee b/headless_client/worker_world.coffee
index fadfc9519..9406cec63 100644
--- a/headless_client/worker_world.coffee
+++ b/headless_client/worker_world.coffee
@@ -78,6 +78,8 @@ work = () ->
     try
       self.world = new World(args.userCodeMap)
       self.world.levelSessionIDs = args.levelSessionIDs
+      self.world.submissionCount = args.submissionCount
+      self.world.flagHistory = args.flagHistory
       self.world.loadFromLevel args.level, true if args.level
       self.world.headless = args.headless
       self.goalManager = new GoalManager(self.world)

From 66c728210bb3821e0099fd68e5477ea6f0a2782f Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sat, 18 Oct 2014 18:18:12 -0700
Subject: [PATCH 22/46] Fixing flag coloring in new WebGL rendering.

---
 app/lib/surface/LayerAdapter.coffee | 4 ++--
 app/models/ThangType.coffee         | 9 ++-------
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/app/lib/surface/LayerAdapter.coffee b/app/lib/surface/LayerAdapter.coffee
index c4baacdac..3b074034f 100644
--- a/app/lib/surface/LayerAdapter.coffee
+++ b/app/lib/surface/LayerAdapter.coffee
@@ -500,8 +500,8 @@ module.exports = LayerAdapter = class LayerAdapter extends CocoClass
 
   renderGroupingKey: (thangType, grouping, colorConfig) ->
     key = thangType.get('slug')
-    if colorConfig?.team
-      key += "(#{colorConfig.team.hue},#{colorConfig.team.saturation},#{colorConfig.team.lightness})"
+    for colorKey, colorValue of colorConfig ? {}
+      key += "(#{colorKey}:#{colorValue.hue},#{colorValue.saturation},#{colorValue.lightness})"
     key += '.'+grouping if grouping
     key
 
diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee
index 2042d5545..37ba7d5b6 100644
--- a/app/models/ThangType.coffee
+++ b/app/models/ThangType.coffee
@@ -43,7 +43,7 @@ module.exports = class ThangType extends CocoModel
   isFullyLoaded: ->
     # TODO: Come up with a better way to identify when the model doesn't have everything needed to build the sprite. ie when it's a projection without all the required data.
     return @get('actions') or @get('raster') # needs one of these two things
-  
+
   loadRasterImage: ->
     return if @loadingRaster or @loadedRaster
     return unless raster = @get('raster')
@@ -57,7 +57,7 @@ module.exports = class ThangType extends CocoModel
       @loadingRaster = false
       @trigger('raster-image-load-errored', @)
     )
-    
+
   getActions: ->
     return {} unless @isFullyLoaded()
     return @actions or @buildActions()
@@ -72,11 +72,6 @@ module.exports = class ThangType extends CocoModel
         @actions[relatedAction.name] = relatedAction
     @actions
 
-  getSpriteSheet: (options) ->
-    options = @fillOptions options
-    key = @spriteSheetKey(options)
-    return @spriteSheets[key] or @buildSpriteSheet(options)
-
   fillOptions: (options) ->
     options ?= {}
     options = _.clone options

From 9f216e336118d55c5d557b9585f24493d4e53b07 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sat, 18 Oct 2014 18:57:33 -0700
Subject: [PATCH 23/46] Preserving opponent flags.

---
 app/lib/LevelLoader.coffee                     | 10 ++++++++++
 app/views/play/level/modal/VictoryModal.coffee |  2 +-
 app/views/play/level/tome/TomeView.coffee      |  2 +-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 8b975f91a..bf5de9c6e 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -91,6 +91,9 @@ module.exports = class LevelLoader extends CocoClass
   loadDependenciesForSession: (session) ->
     if session is @session
       Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session
+      @consolidateFlagHistory() if @opponentSession?.loaded
+    else
+      @consolidateFlagHistory() if @session.loaded
     return unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
     heroConfig = session.get('heroConfig')
     heroConfig ?= me.get('heroConfig') if session is @session
@@ -113,6 +116,13 @@ module.exports = class LevelLoader extends CocoClass
         @loadDefaultComponentsForThangType itemThangType
         @loadThangsRequiredByThangType itemThangType
 
+  consolidateFlagHistory: ->
+    state = @session.get('state') ? {}
+    myFlagHistory = _.filter state.flagHistory ? [], team: @session.get('team')
+    opponentFlagHistory = _.filter @opponentSession.get('state')?.flagHistory ? [], team: @opponentSession.get('team')
+    state.flagHistory = myFlagHistory.concat opponentFlagHistory
+    @session.set 'state', state
+
   # Grabbing the rest of the required data for the level
 
   populateLevel: ->
diff --git a/app/views/play/level/modal/VictoryModal.coffee b/app/views/play/level/modal/VictoryModal.coffee
index 4fa83402c..741ce558b 100644
--- a/app/views/play/level/modal/VictoryModal.coffee
+++ b/app/views/play/level/modal/VictoryModal.coffee
@@ -29,7 +29,7 @@ module.exports = class VictoryModal extends ModalView
 
   constructor: (options) ->
     application.router.initializeSocialMediaServices()
-    victory = options.level.get('victory')
+    victory = options.level.get('victory', true)
     body = utils.i18n(victory, 'body') or 'Sorry, this level has no victory message yet.'
     @body = marked(body)
     @level = options.level
diff --git a/app/views/play/level/tome/TomeView.coffee b/app/views/play/level/tome/TomeView.coffee
index 22a24968c..d8335993b 100644
--- a/app/views/play/level/tome/TomeView.coffee
+++ b/app/views/play/level/tome/TomeView.coffee
@@ -163,7 +163,7 @@ module.exports = class TomeView extends CocoView
     sessionState = @options.session.get('state') ? {}
     if realTime
       sessionState.submissionCount = (sessionState.submissionCount ? 0) + 1
-      sessionState.flagHistory = []
+      sessionState.flagHistory = _.filter sessionState.flagHistory ? [], (event) => event.team isnt @options.session.get('team')
       @options.session.set 'state', sessionState
     Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime, submissionCount: sessionState.submissionCount ? 0, flagHistory: sessionState.flagHistory ? []
 

From 3fd24a28cee184da47cc7fa83e1fb36026006fac Mon Sep 17 00:00:00 2001
From: Matt Lott <mattlott@live.com>
Date: Sat, 18 Oct 2014 22:11:39 -0700
Subject: [PATCH 24/46] Eliminate unjoined file brunch warnings

By specifying the directories that should be watched/built (i.e.
exclude `test/server`)

Checking this fix in from @es128
---
 config.coffee | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/config.coffee b/config.coffee
index f6ebd484e..ff02150a1 100644
--- a/config.coffee
+++ b/config.coffee
@@ -4,7 +4,8 @@ startsWith = (string, substring) ->
 
 exports.config =
   paths:
-    'public': 'public'
+    public: 'public'
+    watched: ['app', 'vendor', 'test/app', 'test/demo']  
   conventions:
     ignored: (path) -> startsWith(sysPath.basename(path), '_')
   sourceMaps: true

From d9a32895c75de89ee520490c62b50668fa9e731f Mon Sep 17 00:00:00 2001
From: Imperadeiro98 <Imperadeiro98@users.noreply.github.com>
Date: Sun, 19 Oct 2014 12:49:57 +0100
Subject: [PATCH 25/46] Update MainPlayView.coffee

---
 app/views/play/MainPlayView.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/play/MainPlayView.coffee b/app/views/play/MainPlayView.coffee
index 98e886dca..0c2301a86 100644
--- a/app/views/play/MainPlayView.coffee
+++ b/app/views/play/MainPlayView.coffee
@@ -325,6 +325,6 @@ campaigns = [
   {id: 'old_beginner', name: 'Old Beginner Campaign', description: '... in which you learn the wizardry of programming.', levels: tutorials}
   {id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: arenas}
   {id: 'dev', name: 'Random Harder Levels', description: '... in which you learn the interface while doing something a little harder.', levels: experienced}
-  {id: 'classic' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms}
+  {id: 'classic_algorithms' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms}
   {id: 'player_created', name: 'Player-Created', description: '... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>.', levels: playerCreated}
 ]

From d4f9078980cdaa56215b9058c24ec9afd59ecab9 Mon Sep 17 00:00:00 2001
From: Imperadeiro98 <Imperadeiro98@users.noreply.github.com>
Date: Sun, 19 Oct 2014 12:50:58 +0100
Subject: [PATCH 26/46] Update WorldMapView.coffee

---
 app/views/play/WorldMapView.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee
index 2968c9884..e1588fe0c 100644
--- a/app/views/play/WorldMapView.coffee
+++ b/app/views/play/WorldMapView.coffee
@@ -781,7 +781,7 @@ campaigns = [
   #{id: 'beginner', name: 'Beginner Campaign', description: '... in which you learn the wizardry of programming.', levels: tutorials, color: "rgb(255, 80, 60)"}
   #{id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: arenas, color: "rgb(80, 5, 60)"}
   #{id: 'dev', name: 'Random Harder Levels', description: '... in which you learn the interface while doing something a little harder.', levels: experienced, color: "rgb(80, 60, 255)"}
-  #{id: 'classic' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms, color: "rgb(110, 80, 120)"}
+  #{id: 'classic_algorithms' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms, color: "rgb(110, 80, 120)"}
   #{id: 'player_created', name: 'Player-Created', description: '... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>.', levels: playerCreated, color: "rgb(160, 160, 180)"}
   {id: 'beginner', name: 'Beginner Campaign', levels: hero, color: 'rgb(255, 80, 60)'}
 ]

From 84c05109ea3a19acdc2540a167797fb0e72e3d67 Mon Sep 17 00:00:00 2001
From: Imperadeiro98 <Imperadeiro98@users.noreply.github.com>
Date: Sun, 19 Oct 2014 12:51:50 +0100
Subject: [PATCH 27/46] Update en.coffee

---
 app/locale/en.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index f2c9f83a7..ad2a61431 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -73,7 +73,7 @@
     adventurer_forum: "the Adventurer forum"
     adventurer_suffix: "."
     campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... in which you learn the wizardry of programming."
+    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
     campaign_dev: "Random Harder Levels"
     campaign_dev_description: "... in which you learn the interface while doing something a little harder."
     campaign_multiplayer: "Multiplayer Arenas"

From c722c4cea70a657514e7e7262ac86d058258fb56 Mon Sep 17 00:00:00 2001
From: AbnerZheng <abnerzheng@gmail.com>
Date: Sun, 19 Oct 2014 22:47:17 +0800
Subject: [PATCH 28/46] Update zh-HANS.coffee
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

由于前面有人把stats翻成"成就",为保持一致性,也翻译成"成就"
---
 app/locale/zh-HANS.coffee | 90 +++++++++++++++++++--------------------
 1 file changed, 45 insertions(+), 45 deletions(-)

diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee
index 44a5fcc9a..08da67df5 100644
--- a/app/locale/zh-HANS.coffee
+++ b/app/locale/zh-HANS.coffee
@@ -34,7 +34,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     about: "关于"
     contact: "联系我们"
     twitter_follow: "关注"
-#    teachers: "Teachers"
+    teachers: "教师"
 
   modal:
     close: "关闭"
@@ -54,14 +54,14 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
   play:
     play_as: "Play As" # Ladder page
     spectate: "旁观他人的游戏" # Ladder page
-#    players: "players" # Hover over a level on /play
+    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
-#    heroes: "Heroes" # Tooltip on hero shop button from /play
+    items: "道具" # Tooltip on item shop button from /play
+    heroes: "英雄" # Tooltip on hero shop button from /play
     achievements: "成就" # Tooltip on achievement list button from /play
     account: "账户" # Tooltip on account button from /play
     settings: "设置" # Tooltip on settings button from /play
-#    next: "Next" # Go from choose hero to choose inventory before playing a level
+    next: "下一步" # Go from choose hero to choose inventory before playing a level
     change_hero: "重新选择英雄" # Go back from choose inventory to choose hero
     choose_inventory: "装备道具"
     older_campaigns: "旧的战役"
@@ -204,7 +204,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     victory_rate_the_level: "评估关卡:" # Only in old-style levels.
     victory_return_to_ladder: "返回"
     victory_play_next_level: "下一关" # Only in old-style levels.
-#    victory_play_continue: "Continue"
+    victory_play_continue: "继续"
     victory_go_home: "返回主页" # Only in old-style levels.
     victory_review: "给我们反馈!" # Only in old-style levels.
     victory_hour_of_code_done: "你完成了吗?"
@@ -283,8 +283,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
 #    guide_caption: "Docs and tips"
 #    multiplayer_caption: "Play with friends!"
 
-#  inventory:
-#    choose_inventory: "Equip Items"
+  inventory:
+    choose_inventory: "装备道具"
 
   choose_hero:
     choose_hero: "请选择您的英雄"
@@ -334,9 +334,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     why_paragraph_2_suffix: "这就是为什么 CodeCombat 是个多人游戏,而不是一个游戏化的编程课。你不停,我们就不停——但这次这是件好事。"
     why_paragraph_3: "如果你一定要对游戏上瘾,那就对这个游戏上瘾,然后成为科技时代的法师吧。"
     press_title: "博客/媒体"
-#    press_paragraph_1_prefix: "Want to write about us? Feel free to download and use all of the resources included in our"
-#    press_paragraph_1_link: "press packet"
-#    press_paragraph_1_suffix: ". All logos and images may be used without contacting us directly."
+    press_paragraph_1_prefix: "想要报道我们? 您可以自由下载和使用"
+    press_paragraph_1_link: "成套宣传包"
+    press_paragraph_1_suffix: "里的所有材料. 所有商标和图像的使用都不必事先联系我们。"
     team: "团队"
 #    george_title: "CEO"
 #    george_blurb: "Businesser"
@@ -541,7 +541,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     introduction_desc_ending: "我们希望你也能一起加入进来!"
     introduction_desc_signature: "- Nick, George, Scott, Michael, Jeremy 以及 Matt"
     alert_account_message_intro: "你好!"
-#    alert_account_message: "To subscribe for class emails, you'll need to be logged in first."
+    alert_account_message: "想要订阅邮件? 您必须先登录"
     archmage_summary: "你对游戏图像、界面设计、数据库和服务器运营、多人在线、物理、声音、游戏引擎性能感兴趣吗?想做一个教别人编程的游戏吗?如果你有编程经验,想要开发 CodeCombat ,那就选择这个职业吧。我们会非常高兴在制作史上最棒编程游戏的过程中得到你的帮助。"
     archmage_introduction: "制作游戏时,最令人激动的事莫过于整合诸多东西。图像、音响、实时网络交流、社交网络,从底层数据库管理到服务器运维,再到用户界面的设计和实现。制作游戏有很多事情要做,所以如果你有编程经验,  那么你应该选择这个职业。我们会很高兴在制作史上最好编程游戏的路上有你的陪伴."
     class_attributes: "职业说明"
@@ -670,40 +670,40 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
 #    rules: "Rules"
 #    winners: "Winners"
 
-#  user:
-#    stats: "Stats"
-#    singleplayer_title: "Singleplayer Levels"
-#    multiplayer_title: "Multiplayer Levels"
-#    achievements_title: "Achievements"
-#    last_played: "Last Played"
-#    status: "Status"
-#    status_completed: "Completed"
-#    status_unfinished: "Unfinished"
-#    no_singleplayer: "No Singleplayer games played yet."
-#    no_multiplayer: "No Multiplayer games played yet."
-#    no_achievements: "No Achievements earned yet."
-#    favorite_prefix: "Favorite language is "
-#    favorite_postfix: "."
+  user:
+    stats: "成就"
+    singleplayer_title: "单人关卡"
+    multiplayer_title: "多人关卡"
+    achievements_title: "成就"
+    last_played: "最近玩的时间"
+    status: "状态"
+    status_completed: "完成"
+    status_unfinished: "未完成"
+    no_singleplayer: "还未玩过任何单人关卡。"
+    no_multiplayer: "还未玩过任何多人关卡。"
+    no_achievements: "还未得到任何成就"
+    favorite_prefix: "最喜爱的语言是 "
+    favorite_postfix: "."
 
-#  achievements:
-#    last_earned: "Last Earned"
-#    amount_achieved: "Amount"
-#    achievement: "Achievement"
-#    category_contributor: "Contributor"
-#    category_miscellaneous: "Miscellaneous"
-#    category_levels: "Levels"
-#    category_undefined: "Uncategorized"
-#    current_xp_prefix: ""
-#    current_xp_postfix: " in total"
-#    new_xp_prefix: ""
-#    new_xp_postfix: " earned"
-#    left_xp_prefix: ""
-#    left_xp_infix: " until level "
-#    left_xp_postfix: ""
+  achievements:
+    last_earned: "最近取得的时间"
+    amount_achieved: "数量"
+    achievement: "成就"
+    category_contributor: "Contributor"
+    category_miscellaneous: "Miscellaneous"
+    category_levels: "Levels"
+    category_undefined: "Uncategorized"
+    current_xp_prefix: ""
+    current_xp_postfix: " in total"
+    new_xp_prefix: ""
+    new_xp_postfix: " earned"
+    left_xp_prefix: ""
+    left_xp_infix: " until level "
+    left_xp_postfix: ""
 
-#  account:
-#    recently_played: "Recently Played"
-#    no_recent_games: "No games played during the past two weeks."
+  account:
+    recent0ly_played: "最近玩过的关卡"
+    no_recent_games: "最近两个星期没有玩过游戏。"
 
   loading_error:
     could_not_load: "载入失败"
@@ -730,7 +730,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
 #    gplus_friend_sessions: "G+ Friend Sessions"
     leaderboard: "排行榜"
     user_schema: "用户模式"
-    user_profile: "User Profile"
+    user_profile: "用户信息"
     patches: "补丁"
 #    patched_model: "Source Document"
 #    model: "Model"

From b7143c32f7c415b20ac7bb5e3c1b49d2680375e5 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sun, 19 Oct 2014 08:33:30 -0700
Subject: [PATCH 29/46] A bit of housekeeping for the last few i18n pull
 requests in perspicacious preparation for proper propagation.

---
 app/locale/ar.coffee          |  2 +-
 app/locale/bg.coffee          |  2 +-
 app/locale/ca.coffee          |  2 +-
 app/locale/cs.coffee          |  2 +-
 app/locale/da.coffee          |  2 +-
 app/locale/de-AT.coffee       |  2 +-
 app/locale/de-CH.coffee       |  2 +-
 app/locale/de-DE.coffee       |  2 +-
 app/locale/el.coffee          |  2 +-
 app/locale/en-AU.coffee       |  2 +-
 app/locale/en-GB.coffee       |  2 +-
 app/locale/en-US.coffee       |  2 +-
 app/locale/es-419.coffee      |  2 +-
 app/locale/es-ES.coffee       |  2 +-
 app/locale/fa.coffee          |  2 +-
 app/locale/fi.coffee          |  2 +-
 app/locale/fr.coffee          |  2 +-
 app/locale/he.coffee          |  2 +-
 app/locale/hi.coffee          |  2 +-
 app/locale/hu.coffee          |  2 +-
 app/locale/id.coffee          |  2 +-
 app/locale/it.coffee          |  2 +-
 app/locale/ja.coffee          |  2 +-
 app/locale/ko.coffee          |  2 +-
 app/locale/lt.coffee          |  2 +-
 app/locale/ms.coffee          |  2 +-
 app/locale/nb.coffee          |  2 +-
 app/locale/nl-BE.coffee       |  2 +-
 app/locale/nl-NL.coffee       |  2 +-
 app/locale/nn.coffee          |  2 +-
 app/locale/no.coffee          |  2 +-
 app/locale/pl.coffee          |  2 +-
 app/locale/pt-BR.coffee       |  2 +-
 app/locale/pt-PT.coffee       |  2 +-
 app/locale/ro.coffee          |  2 +-
 app/locale/ru.coffee          |  2 +-
 app/locale/sk.coffee          |  2 +-
 app/locale/sl.coffee          |  2 +-
 app/locale/sr.coffee          |  2 +-
 app/locale/sv.coffee          |  2 +-
 app/locale/th.coffee          |  2 +-
 app/locale/tr.coffee          |  2 +-
 app/locale/uk.coffee          |  2 +-
 app/locale/ur.coffee          |  2 +-
 app/locale/vi.coffee          |  2 +-
 app/locale/zh-HANS.coffee     | 30 +++++++++++++++---------------
 app/locale/zh-HANT.coffee     |  2 +-
 app/locale/zh-WUU-HANS.coffee |  2 +-
 app/locale/zh-WUU-HANT.coffee |  2 +-
 49 files changed, 63 insertions(+), 63 deletions(-)

diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee
index 45f2b1605..4674bc2a0 100644
--- a/app/locale/ar.coffee
+++ b/app/locale/ar.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
     adventurer_forum: "منتدى المغامر"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... فيها تتعلم سحر البرمجة."
+    campaign_old_beginner_description: "... فيها تتعلم سحر البرمجة."
     campaign_dev: "مستويات أصعب عشوائية"
     campaign_dev_description: "... فيها تتعلم واجهة بينما  تفعل شيئا أصعب قليلا."
     campaign_multiplayer: "ساحات متعددة اللاّعبين"
diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee
index 3824c4923..fc9964d3a 100644
--- a/app/locale/bg.coffee
+++ b/app/locale/bg.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "български език", englishDescri
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee
index 114622cdc..a8e2708b5 100644
--- a/app/locale/ca.coffee
+++ b/app/locale/ca.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
     adventurer_forum: "El fòrum de l'aventurer"
     adventurer_suffix: "."
     campaign_old_beginner: "Antiga campanya del principiant"
-    campaign_beginner_description: "... on aprens la bruixeria de la programació."
+    campaign_old_beginner_description: "... on aprens la bruixeria de la programació."
     campaign_dev: "Nivells difícils aleatoris"
     campaign_dev_description: "... on aprens a interactuar amb la interfície tot fent coses un pèl més difícils."
     campaign_multiplayer: "Arenes Multijugador"
diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee
index 696cfe40e..2fd1cfb58 100644
--- a/app/locale/cs.coffee
+++ b/app/locale/cs.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
     adventurer_forum: "fóru Dobrodruhů"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "...ve které se naučíte kouzla programování."
+    campaign_old_beginner_description: "...ve které se naučíte kouzla programování."
     campaign_dev: "Náhodné težší úrovně"
     campaign_dev_description: "...ve kterých se dozvíte více o prostředí při plnění těžších úkolů."
     campaign_multiplayer: "Multiplayer Aréna"
diff --git a/app/locale/da.coffee b/app/locale/da.coffee
index 4f7cad262..654b141ae 100644
--- a/app/locale/da.coffee
+++ b/app/locale/da.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
     adventurer_forum: "Eventyrer-forummet"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... hvor du lærer programmeringens kunst."
+    campaign_old_beginner_description: "... hvor du lærer programmeringens kunst."
     campaign_dev: "Tilfældige Sværere Niveauer"
     campaign_dev_description: "... hvor du lærer grænsefladen imens du udfører lidt sværere opgaver."
     campaign_multiplayer: "Multiplayer Arenaer"
diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee
index 22bad597b..beb55e260 100644
--- a/app/locale/de-AT.coffee
+++ b/app/locale/de-AT.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
     adventurer_forum: "im Abenteurerforum"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... in der Du die Zauberei der Programmierung lernst."
+    campaign_old_beginner_description: "... in der Du die Zauberei der Programmierung lernst."
     campaign_dev: "Beliebiges schwierigeres Level"
     campaign_dev_description: "... in welchem Du die Bedienung erlernst, indem Du etwas schwierigeres machst."
     campaign_multiplayer: "Multiplayerarena"
diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee
index eb6af2dce..0d1af307b 100644
--- a/app/locale/de-CH.coffee
+++ b/app/locale/de-CH.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
     adventurer_forum: "Abentürer-Forum"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... i dere du d Zauberkunst vom Programmiere lernsch."
+    campaign_old_beginner_description: "... i dere du d Zauberkunst vom Programmiere lernsch."
     campaign_dev: "Zuefälligi schwierigeri Level"
     campaign_dev_description: "... i dene du s Interface kenne lernsch, während du öppis chli Schwierigers machsch."
     campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee
index 603b5439b..48ee5797f 100644
--- a/app/locale/de-DE.coffee
+++ b/app/locale/de-DE.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     adventurer_forum: "im Abenteurerforum"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... in der Du die Zauberei der Programmierung lernst."
+    campaign_old_beginner_description: "... in der Du die Zauberei der Programmierung lernst."
     campaign_dev: "Beliebiges schwierigeres Level"
     campaign_dev_description: "... in welchem Du die Bedienung erlernst, indem Du etwas schwierigeres machst."
     campaign_multiplayer: "Multiplayerarena"
diff --git a/app/locale/el.coffee b/app/locale/el.coffee
index 9ffbeb92d..1e70683a8 100644
--- a/app/locale/el.coffee
+++ b/app/locale/el.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
     adventurer_forum: "Φόρουμ του Adventurer"
     adventurer_suffix: "."
     campaign_old_beginner: "Παλαιότερη Εκστρατεία Αρχαρίων"
-    campaign_beginner_description: "... στην οποία μαθαίνετε τη μαγεία του προγραμματισμού."
+    campaign_old_beginner_description: "... στην οποία μαθαίνετε τη μαγεία του προγραμματισμού."
     campaign_dev: "Τυχαία Δυσκολότερα Επίπεδα"
     campaign_dev_description: "... στα οποία μπορείτε να μάθετε το περιβάλλον, ενώ κάνετε κάτι λίγο δυσκολότερο."
     campaign_multiplayer: "Αρένες Πολλαπλών Παικτών"
diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee
index 909a24e8d..075576835 100644
--- a/app/locale/en-AU.coffee
+++ b/app/locale/en-AU.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee
index 023abda26..89a7c9901 100644
--- a/app/locale/en-GB.coffee
+++ b/app/locale/en-GB.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee
index 0f2920ee0..f9649f85e 100644
--- a/app/locale/en-US.coffee
+++ b/app/locale/en-US.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee
index 5669aa6ac..c48b9767c 100644
--- a/app/locale/es-419.coffee
+++ b/app/locale/es-419.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
     adventurer_forum: "el foro del aventurero"
     adventurer_suffix: "."
     campaign_old_beginner: "Campaña anterior de principiante"
-    campaign_beginner_description: "... en la que aprendes la hechicería de la programación."
+    campaign_old_beginner_description: "... en la que aprendes la hechicería de la programación."
     campaign_dev: "Niveles aleatorios más difíciles"
     campaign_dev_description: "... en los que aprendes sobre la interfaz mientras haces algo un poco más difícil."
     campaign_multiplayer: "Arenas Multijugador"
diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee
index a2d08c635..5037a5ca3 100644
--- a/app/locale/es-ES.coffee
+++ b/app/locale/es-ES.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
     adventurer_forum: "el foro del aventurero "
     adventurer_suffix: "sobre ello."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... en la que aprenderás la magia de la programación."
+    campaign_old_beginner_description: "... en la que aprenderás la magia de la programación."
     campaign_dev: "Niveles aleatorios más dificiles"
     campaign_dev_description: "... en los que aprenderás sobre la interfaz mientras haces algo más difícil."
     campaign_multiplayer: "Arenas Multijugador"
diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee
index c5b63805a..fe13b4dcb 100644
--- a/app/locale/fa.coffee
+++ b/app/locale/fa.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
     adventurer_forum: "انجمن ماجراجو ها"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: ".که شما در آن می توانید جادوگری به وسیله برنامه نویسی را یادبگیرید..."
+    campaign_old_beginner_description: ".که شما در آن می توانید جادوگری به وسیله برنامه نویسی را یادبگیرید..."
     campaign_dev: "مراحل سخت تصادفی"
     campaign_dev_description: "... جایی که میتونید طراحی ظاهر رو یاد بگیرید درحالی که فعالیت سخت تری انجام میدید"
     campaign_multiplayer: "مسابقات چند نفره"
diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee
index 252a572d7..0da0efc09 100644
--- a/app/locale/fi.coffee
+++ b/app/locale/fi.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee
index 4b264e527..6bf3bda70 100644
--- a/app/locale/fr.coffee
+++ b/app/locale/fr.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
     adventurer_forum: "le forum de l'Aventurier"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... dans laquelle vous apprendrez la magie de la programmation."
+    campaign_old_beginner_description: "... dans laquelle vous apprendrez la magie de la programmation."
     campaign_dev: "Niveaux aléatoires plus difficiles"
     campaign_dev_description: "... dans lesquels vous apprendrez à utiliser l'interface en faisant quelque chose d'un petit peu plus dur."
     campaign_multiplayer: "Campagne multi-joueurs"
diff --git a/app/locale/he.coffee b/app/locale/he.coffee
index 51cdc3551..91f03c6d8 100644
--- a/app/locale/he.coffee
+++ b/app/locale/he.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
     adventurer_forum: "פורום ההרפתקנים"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "...שבו תלמד את קסם התכנות."
+    campaign_old_beginner_description: "...שבו תלמד את קסם התכנות."
     campaign_dev: "שלבים אקראים קשים יותר"
     campaign_dev_description: "...שבהם תלמד על הממשק בזמן שתעשה משהו קצת קשה יותר."
     campaign_multiplayer: "זירות רב-המשתתפים"
diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee
index bb69699dd..a29ef8b73 100644
--- a/app/locale/hi.coffee
+++ b/app/locale/hi.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee
index bee46a6ca..7df2f6fac 100644
--- a/app/locale/hu.coffee
+++ b/app/locale/hu.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
     adventurer_forum: "a Kalandozók Fórumán"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... amelyben megtanulhatod a programozás varázslatait."
+    campaign_old_beginner_description: "... amelyben megtanulhatod a programozás varázslatait."
     campaign_dev: "Véletlenszerű Nehezebb Pályák"
     campaign_dev_description: "... amelyekben kicsit nehezebb dolgokkal nézhetsz szembe."
     campaign_multiplayer: "Multiplayer Arénák"
diff --git a/app/locale/id.coffee b/app/locale/id.coffee
index e0f299366..c8b752085 100644
--- a/app/locale/id.coffee
+++ b/app/locale/id.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/it.coffee b/app/locale/it.coffee
index f85233a5a..9d058b4bc 100644
--- a/app/locale/it.coffee
+++ b/app/locale/it.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
     adventurer_forum: "forum degli Avventurieri"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... nelle quali imparerai i trucchi della programmazione."
+    campaign_old_beginner_description: "... nelle quali imparerai i trucchi della programmazione."
     campaign_dev: "Livelli difficili casuali"
     campaign_dev_description: "... nei quali imparerai a usare l'interfaccia facendo qualcosa di un po' più difficile."
     campaign_multiplayer: "Arene multigiocatore"
diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee
index 9a4175e50..09b2d5525 100644
--- a/app/locale/ja.coffee
+++ b/app/locale/ja.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
     adventurer_forum: "冒険者の掲示板"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "プログラミングの魔法を学びましょう"
+    campaign_old_beginner_description: "プログラミングの魔法を学びましょう"
     campaign_dev: "いろんな難しいレベル"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
     campaign_multiplayer: "マルチプレイ・アリーナ"
diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee
index 534b77bd8..e02118a66 100644
--- a/app/locale/ko.coffee
+++ b/app/locale/ko.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
     adventurer_forum: "모험가들의 포럼"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... 이곳에서 당신은 프로그래밍의 마법을 배우게 될 것입니다."
+    campaign_old_beginner_description: "... 이곳에서 당신은 프로그래밍의 마법을 배우게 될 것입니다."
     campaign_dev: "상급 레벨 랜덤 선택"
     campaign_dev_description: "... 이곳에서 당신은 조금 더 어려운 레벨에 도전할때 필요한 조작 방법을 배울 것입니다."
     campaign_multiplayer: "멀티 플레이어 전투장"
diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee
index 23cbe5ae7..d28a9ab5d 100644
--- a/app/locale/lt.coffee
+++ b/app/locale/lt.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee
index 4f89c5e2b..a9dac5265 100644
--- a/app/locale/ms.coffee
+++ b/app/locale/ms.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee
index cd7f540e0..60e09f459 100644
--- a/app/locale/nb.coffee
+++ b/app/locale/nb.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
     adventurer_forum: "Adventurer forumet"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... hvor du lærer trolldommen bak programmering."
+    campaign_old_beginner_description: "... hvor du lærer trolldommen bak programmering."
     campaign_dev: "Tilfeldig Vanskeligere Nivåer"
     campaign_dev_description: "... hvor du lærer grensesnittet mens du stadig gjør mer vanskeligere utfordringer."
     campaign_multiplayer: "Multispiller Arenaer"
diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee
index 83bee04e7..217a99b44 100644
--- a/app/locale/nl-BE.coffee
+++ b/app/locale/nl-BE.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
     adventurer_forum: "het Avonturiersforum"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... waarin je de toverkunst van het programmeren leert."
+    campaign_old_beginner_description: "... waarin je de toverkunst van het programmeren leert."
     campaign_dev: "Willekeurige moeilijkere levels"
     campaign_dev_description: "... waarin je de interface leert kennen terwijl je wat moeilijkers doet."
     campaign_multiplayer: "Multiplayer Arena's"
diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee
index ba1429f28..b0bebed94 100644
--- a/app/locale/nl-NL.coffee
+++ b/app/locale/nl-NL.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
     adventurer_forum: "het Avonturiersforum"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... waarin je de toverkunst van het programmeren leert."
+    campaign_old_beginner_description: "... waarin je de toverkunst van het programmeren leert."
     campaign_dev: "Willekeurige moeilijkere levels"
     campaign_dev_description: "... waarin je de interface leert kennen terwijl je wat moeilijkers doet."
     campaign_multiplayer: "Multiplayer Arena's"
diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee
index 88b810783..3406fdbe4 100644
--- a/app/locale/nn.coffee
+++ b/app/locale/nn.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/no.coffee b/app/locale/no.coffee
index e2af61cbe..70781c665 100644
--- a/app/locale/no.coffee
+++ b/app/locale/no.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
     adventurer_forum: "Eventyrerforumet"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... hvor du lærer trolldommen bak programmering."
+    campaign_old_beginner_description: "... hvor du lærer trolldommen bak programmering."
     campaign_dev: "Vanskeligere brett (tilfeldige)"
     campaign_dev_description: "... hvor du lærer hvordan du bruker skjermbildene mens du stadig løser mer vanskelige utfordringer."
     campaign_multiplayer: "Flerspiller brett (arenaer)"
diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee
index 33aebc652..60d812e05 100644
--- a/app/locale/pl.coffee
+++ b/app/locale/pl.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
     adventurer_forum: "forum Podróżników"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... w której nauczysz się magii programowania"
+    campaign_old_beginner_description: "... w której nauczysz się magii programowania"
     campaign_dev: "Losowe trudniejsze poziomy"
     campaign_dev_description: "... w których nauczysz się interfejsu robiąc coś trudniejszego."
     campaign_multiplayer: "Pola walki dla wielu graczy"
diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index b4b89d5b1..7a6afd9bf 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     adventurer_forum: "Fórum do Aventureiro"
     adventurer_suffix: "."
     campaign_old_beginner: "Campanha antiga para Iniciantes"
-    campaign_beginner_description: "... na qual você aprenderá a magia da programação."
+    campaign_old_beginner_description: "... na qual você aprenderá a magia da programação."
     campaign_dev: "Fases Difíceis Aleatórias"
     campaign_dev_description: "... nas quais você aprenderá a interface enquanto faz algo um pouco mais difícil."
     campaign_multiplayer: "Arenas Multijogador"
diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee
index 66ec658ff..5b6abebda 100644
--- a/app/locale/pt-PT.coffee
+++ b/app/locale/pt-PT.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     adventurer_forum: "fórum do Aventureiro"
     adventurer_suffix: "."
     campaign_old_beginner: "Campanha para Iniciantes Antiga"
-    campaign_beginner_description: "... onde aprendes a magia da programação."
+    campaign_old_beginner_description: "... onde aprendes a magia da programação."
     campaign_dev: "Níveis mais Difíceis Aleatórios"
     campaign_dev_description: "... onde aprendes a interface enquanto fazes coisas um bocadinho mais difíceis."
     campaign_multiplayer: "Arenas Multijogador"
diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee
index ca16adcae..1eff3953f 100644
--- a/app/locale/ro.coffee
+++ b/app/locale/ro.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
     adventurer_forum: "forumul Aventurierului"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... în care se învață tainele programării."
+    campaign_old_beginner_description: "... în care se învață tainele programării."
     campaign_dev: "Nivele aleatoare mai grele"
     campaign_dev_description: "... în care se învață interfața, cu o dificultate puțin mai mare."
     campaign_multiplayer: "Arene Multiplayer"
diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee
index 5561dff76..c5539d2e3 100644
--- a/app/locale/ru.coffee
+++ b/app/locale/ru.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     adventurer_forum: "форуме Искателей приключений"
     adventurer_suffix: "."
     campaign_old_beginner: "Старые компании для новичков"
-    campaign_beginner_description: "... в которой вы познакомитесь с магией программирования."
+    campaign_old_beginner_description: "... в которой вы познакомитесь с магией программирования."
     campaign_dev: "Случайные уровни потруднее"
     campaign_dev_description: "... в которых вы изучите интерфейс и научитесь делать кое-что посложнее."
     campaign_multiplayer: "Арены для мультиплеера"
diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee
index 2d36d1aee..a26af01af 100644
--- a/app/locale/sk.coffee
+++ b/app/locale/sk.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
     adventurer_forum: "fóre pre dobrodruhov"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... v ktorom sa naučíš mágiu programovania."
+    campaign_old_beginner_description: "... v ktorom sa naučíš mágiu programovania."
     campaign_dev: "Náhodné ťažšie úrovne"
     campaign_dev_description: "... v ktorych sa naučíš používať rozhranie a čeliť väčším výzvam."
     campaign_multiplayer: "Aréna pre viacerých hráčov"
diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee
index c8bc34f58..a9adc9468 100644
--- a/app/locale/sl.coffee
+++ b/app/locale/sl.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee
index c19a5e80b..af6f7cee9 100644
--- a/app/locale/sr.coffee
+++ b/app/locale/sr.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
     adventurer_forum: "форуму Авантуриста"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... у којој учиш магију програмирања."
+    campaign_old_beginner_description: "... у којој учиш магију програмирања."
     campaign_dev: "Насумични тежи нивои"
     campaign_dev_description: "... у којима учиш о интерфејсу док радиш нешто теже."
     campaign_multiplayer: "Арене за више играча"
diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee
index 8aa5fb51e..3c0c9b7cf 100644
--- a/app/locale/sv.coffee
+++ b/app/locale/sv.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
     adventurer_forum: "Äventyrarforumet"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... i vilken du lär dig programmerandets magi."
+    campaign_old_beginner_description: "... i vilken du lär dig programmerandets magi."
     campaign_dev: "Slumpad svårare nivå"
     campaign_dev_description: "... där du lär dig att hantera gränssnittet medan du gör något lite svårare."
     campaign_multiplayer: "Flerspelararenor"
diff --git a/app/locale/th.coffee b/app/locale/th.coffee
index aec3df531..d708ce025 100644
--- a/app/locale/th.coffee
+++ b/app/locale/th.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee
index 7149938c3..ed8dd736d 100644
--- a/app/locale/tr.coffee
+++ b/app/locale/tr.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     adventurer_forum: "Maceracı forumunda"
     adventurer_suffix: " tartışabilirsiniz."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "Programlama büyüsünü öğrenmek için..."
+    campaign_old_beginner_description: "Programlama büyüsünü öğrenmek için..."
     campaign_dev: "Rastgele Daha Zor Seviyeler"
     campaign_dev_description: "Biraz daha zor işlerle uğraşırken arayüzü öğrenmek için..."
     campaign_multiplayer: "Çok Oyunculu Meydanlar"
diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee
index 90bf0fc54..a02858986 100644
--- a/app/locale/uk.coffee
+++ b/app/locale/uk.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
     adventurer_forum: "форумі Шукачів пригод"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "... у якій ви навчитеся магії програмування."
+    campaign_old_beginner_description: "... у якій ви навчитеся магії програмування."
     campaign_dev: "Випадкові складніші рівні"
     campaign_dev_description: "... в яких ви вивчите інтерфейс, одночасно роблячи щось складніше."
     campaign_multiplayer: "Арени для мультиплеєра"
diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee
index ce3904144..41b36ab27 100644
--- a/app/locale/ur.coffee
+++ b/app/locale/ur.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee
index 54c9c0b2b..bc183aa55 100644
--- a/app/locale/vi.coffee
+++ b/app/locale/vi.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
     adventurer_forum: "diễn đàn Adventurer"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
     campaign_dev: "Các cấp độ khó hơn ngẫu nhiên"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
     campaign_multiplayer: "Khu vực đa người chơi"
diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee
index 08da67df5..b08dddda8 100644
--- a/app/locale/zh-HANS.coffee
+++ b/app/locale/zh-HANS.coffee
@@ -52,9 +52,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     subscribe_as_diplomat: "提交翻译人员申请"
 
   play:
-    play_as: "Play As" # Ladder page
+    #play_as: "Play As" # Ladder page
     spectate: "旁观他人的游戏" # Ladder page
-    players: "players" # Hover over a level on /play
+    #players: "players" # Hover over a level on /play
 #    hours_played: "hours played" # Hover over a level on /play
     items: "道具" # Tooltip on item shop button from /play
     heroes: "英雄" # Tooltip on hero shop button from /play
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     adventurer_forum: "冒险者论坛"
     adventurer_suffix: "。"
     campaign_old_beginner: "旧的新手战役"
-    campaign_beginner_description: "……在这里你可以学习到编程技巧。"
+    campaign_old_beginner_description: "……在这里你可以学习到编程技巧。"
     campaign_dev: "随机困难关卡"
     campaign_dev_description: "……在这里你可以学到做一些复杂功能的接口。"
     campaign_multiplayer: "多人竞技场"
@@ -689,20 +689,20 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     last_earned: "最近取得的时间"
     amount_achieved: "数量"
     achievement: "成就"
-    category_contributor: "Contributor"
-    category_miscellaneous: "Miscellaneous"
-    category_levels: "Levels"
-    category_undefined: "Uncategorized"
-    current_xp_prefix: ""
-    current_xp_postfix: " in total"
-    new_xp_prefix: ""
-    new_xp_postfix: " earned"
-    left_xp_prefix: ""
-    left_xp_infix: " until level "
-    left_xp_postfix: ""
+    #category_contributor: "Contributor"
+    #category_miscellaneous: "Miscellaneous"
+    #category_levels: "Levels"
+    #category_undefined: "Uncategorized"
+    #current_xp_prefix: ""
+    #current_xp_postfix: " in total"
+    #new_xp_prefix: ""
+    #new_xp_postfix: " earned"
+    #left_xp_prefix: ""
+    #left_xp_infix: " until level "
+    #left_xp_postfix: ""
 
   account:
-    recent0ly_played: "最近玩过的关卡"
+    recently_played: "最近玩过的关卡"
     no_recent_games: "最近两个星期没有玩过游戏。"
 
   loading_error:
diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee
index e23b33394..b76b1f4a7 100644
--- a/app/locale/zh-HANT.coffee
+++ b/app/locale/zh-HANT.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
     adventurer_forum: "冒險家論壇"
     adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "...在這裡可以學到編程技巧。"
+    campaign_old_beginner_description: "...在這裡可以學到編程技巧。"
     campaign_dev: "隨機關卡"
     campaign_dev_description: "...在這裡你可以學到做一些較複雜的程式技巧。"
     campaign_multiplayer: "多人競技場"
diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee
index d26ade695..1ba96a21f 100644
--- a/app/locale/zh-WUU-HANS.coffee
+++ b/app/locale/zh-WUU-HANS.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    adventurer_forum: "the Adventurer forum"
 #    adventurer_suffix: "."
 #    campaign_old_beginner: "Old Beginner Campaign"
-#    campaign_beginner_description: "... in which you learn the wizardry of programming."
+#    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
 #    campaign_dev: "Random Harder Levels"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee
index e3a721444..847a53884 100644
--- a/app/locale/zh-WUU-HANT.coffee
+++ b/app/locale/zh-WUU-HANT.coffee
@@ -73,7 +73,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
     adventurer_forum: "冒險者論壇"
     adventurer_suffix: "。"
 #    campaign_old_beginner: "Old Beginner Campaign"
-    campaign_beginner_description: "……徠箇裏爾學得到編程手法。"
+    campaign_old_beginner_description: "……徠箇裏爾學得到編程手法。"
     campaign_dev: "照摸難關"
     campaign_dev_description: "……徠箇搭爾學得到做一許囉唆功能個接口。"
     campaign_multiplayer: "多人競賽場"

From 0f6bfddd57e51b15ecd8feb3a9b12834613bebd3 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sun, 19 Oct 2014 08:34:15 -0700
Subject: [PATCH 30/46] Propagated i18n.

---
 app/locale/ar.coffee          |  2 +-
 app/locale/bg.coffee          |  2 +-
 app/locale/ca.coffee          |  2 +-
 app/locale/cs.coffee          |  2 +-
 app/locale/da.coffee          |  2 +-
 app/locale/de-AT.coffee       |  2 +-
 app/locale/de-CH.coffee       |  2 +-
 app/locale/de-DE.coffee       |  2 +-
 app/locale/el.coffee          |  2 +-
 app/locale/en-AU.coffee       |  2 +-
 app/locale/en-GB.coffee       |  2 +-
 app/locale/en-US.coffee       |  2 +-
 app/locale/es-419.coffee      |  2 +-
 app/locale/es-ES.coffee       |  2 +-
 app/locale/fa.coffee          |  2 +-
 app/locale/fi.coffee          |  2 +-
 app/locale/fr.coffee          |  2 +-
 app/locale/he.coffee          |  2 +-
 app/locale/hi.coffee          |  2 +-
 app/locale/hu.coffee          |  2 +-
 app/locale/id.coffee          |  2 +-
 app/locale/it.coffee          |  2 +-
 app/locale/ja.coffee          |  2 +-
 app/locale/ko.coffee          |  2 +-
 app/locale/lt.coffee          |  2 +-
 app/locale/ms.coffee          |  2 +-
 app/locale/nb.coffee          |  2 +-
 app/locale/nl-BE.coffee       |  2 +-
 app/locale/nl-NL.coffee       |  2 +-
 app/locale/nn.coffee          |  2 +-
 app/locale/no.coffee          |  2 +-
 app/locale/pl.coffee          |  2 +-
 app/locale/pt-BR.coffee       |  4 ++--
 app/locale/pt-PT.coffee       |  2 +-
 app/locale/ro.coffee          |  2 +-
 app/locale/ru.coffee          |  2 +-
 app/locale/sk.coffee          |  2 +-
 app/locale/sl.coffee          |  2 +-
 app/locale/sr.coffee          |  2 +-
 app/locale/sv.coffee          |  2 +-
 app/locale/th.coffee          |  2 +-
 app/locale/tr.coffee          |  2 +-
 app/locale/uk.coffee          |  2 +-
 app/locale/ur.coffee          |  2 +-
 app/locale/vi.coffee          |  2 +-
 app/locale/zh-HANS.coffee     | 28 ++++++++++++++--------------
 app/locale/zh-HANT.coffee     |  2 +-
 app/locale/zh-WUU-HANS.coffee |  2 +-
 app/locale/zh-WUU-HANT.coffee |  2 +-
 49 files changed, 63 insertions(+), 63 deletions(-)

diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee
index 4674bc2a0..91e87b156 100644
--- a/app/locale/ar.coffee
+++ b/app/locale/ar.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee
index fc9964d3a..2ee7384a4 100644
--- a/app/locale/bg.coffee
+++ b/app/locale/bg.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "български език", englishDescri
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "български език", englishDescri
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee
index a8e2708b5..de79233fd 100644
--- a/app/locale/ca.coffee
+++ b/app/locale/ca.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
     armor: "Armadura"
     hands: "Mans"
     accessories: "Accessoris"
-    books: "Llibres"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Jugar el següent nivell" # Only in old-style levels.
     victory_play_continue: "Continuar"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Tornar a l'inici" # Only in old-style levels.
     victory_review: "Diguens més!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee
index 2fd1cfb58..5c6a23be7 100644
--- a/app/locale/cs.coffee
+++ b/app/locale/cs.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Hrát další úroveň" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Přejít domů" # Only in old-style levels.
     victory_review: "Připomínky!" # Only in old-style levels.
     victory_hour_of_code_done: "Skončili jste?"
diff --git a/app/locale/da.coffee b/app/locale/da.coffee
index 654b141ae..302712571 100644
--- a/app/locale/da.coffee
+++ b/app/locale/da.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Spil næste bane" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Gå hjem" # Only in old-style levels.
     victory_review: "Fortæl os mere!" # Only in old-style levels.
     victory_hour_of_code_done: "Er du færdig?"
diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee
index beb55e260..e0020b744 100644
--- a/app/locale/de-AT.coffee
+++ b/app/locale/de-AT.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
     armor: "Rüstung"
     hands: "Hände"
     accessories: "Zubehör"
-    books: "Bücher"
     minions: "Minions"
     misc: "Sonstiges"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
     victory_return_to_ladder: "Zurück zur Rangliste"
     victory_play_next_level: "Spiel das nächste Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Geh auf die Startseite" # Only in old-style levels.
     victory_review: "Erzähl uns davon!" # Only in old-style levels.
     victory_hour_of_code_done: "Bist Du fertig?"
diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee
index 0d1af307b..3c1b41dec 100644
--- a/app/locale/de-CH.coffee
+++ b/app/locale/de-CH.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
     victory_return_to_ladder: "Zrugg zum letzte Level"
     victory_play_next_level: "Spiel s nögste Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
     victory_review: "Verzell üs meh!" # Only in old-style levels.
     victory_hour_of_code_done: "Bisch fertig?"
diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee
index 48ee5797f..9eed5d516 100644
--- a/app/locale/de-DE.coffee
+++ b/app/locale/de-DE.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     armor: "Rüstung"
     hands: "Hände"
     accessories: "Zubehör"
-    books: "Bücher"
     minions: "Minions"
     misc: "Sonstiges"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     victory_return_to_ladder: "Zurück zur Rangliste"
     victory_play_next_level: "Spiel das nächste Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Geh auf die Startseite" # Only in old-style levels.
     victory_review: "Erzähl uns davon!" # Only in old-style levels.
     victory_hour_of_code_done: "Bist Du fertig?"
diff --git a/app/locale/el.coffee b/app/locale/el.coffee
index 1e70683a8..98c51dcf1 100644
--- a/app/locale/el.coffee
+++ b/app/locale/el.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
     armor: "Πανοπλία"
     hands: "Χέρια"
     accessories: "Εξαρτήματα"
-    books: "Βιβλία"
     minions: "Minions"
     misc: "Διάφορα"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Παίξε το επόμενο επίπεδο" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Πηγαίνετε στην Αρχική" # Only in old-style levels.
     victory_review: "Πείτε μας περισσότερα!" # Only in old-style levels.
     victory_hour_of_code_done: "Τελείωσες;"
diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee
index 075576835..c6dc7371d 100644
--- a/app/locale/en-AU.coffee
+++ b/app/locale/en-AU.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee
index 89a7c9901..9520b5200 100644
--- a/app/locale/en-GB.coffee
+++ b/app/locale/en-GB.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee
index f9649f85e..3b3fe7a47 100644
--- a/app/locale/en-US.coffee
+++ b/app/locale/en-US.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee
index c48b9767c..861f38017 100644
--- a/app/locale/es-419.coffee
+++ b/app/locale/es-419.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
     armor: "Armadura"
     hands: "Manos"
     accessories: "Accesorios"
-    books: "Libros"
     minions: "Seguidores"
     misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
     victory_return_to_ladder: "Volver a la escalera"
     victory_play_next_level: "Jugar Próximo Nivel" # Only in old-style levels.
     victory_play_continue: "Continuar"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Ir al Inicio" # Only in old-style levels.
     victory_review: "¡Cuéntanos más!" # Only in old-style levels.
     victory_hour_of_code_done: "¿Has acabado?"
diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee
index 5037a5ca3..e70fe83c1 100644
--- a/app/locale/es-ES.coffee
+++ b/app/locale/es-ES.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
     victory_return_to_ladder: "Volver a Clasificación"
     victory_play_next_level: "Jugar el siguiente nivel" # Only in old-style levels.
     victory_play_continue: "Continuar"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Ir a Inicio" # Only in old-style levels.
     victory_review: "¡Cuéntanos más!" # Only in old-style levels.
     victory_hour_of_code_done: "¿Ya terminaste?"
diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee
index fe13b4dcb..8682128a4 100644
--- a/app/locale/fa.coffee
+++ b/app/locale/fa.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee
index 0da0efc09..6ea8016e0 100644
--- a/app/locale/fi.coffee
+++ b/app/locale/fi.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee
index 6bf3bda70..b3ba5175d 100644
--- a/app/locale/fr.coffee
+++ b/app/locale/fr.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Jouer au prochain niveau" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Retourner à l'accueil" # Only in old-style levels.
     victory_review: "Dites-nous en plus!" # Only in old-style levels.
     victory_hour_of_code_done: "Déjà fini ?"
diff --git a/app/locale/he.coffee b/app/locale/he.coffee
index 91f03c6d8..946e6f80f 100644
--- a/app/locale/he.coffee
+++ b/app/locale/he.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee
index a29ef8b73..c77631423 100644
--- a/app/locale/hi.coffee
+++ b/app/locale/hi.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee
index 7df2f6fac..299106b2f 100644
--- a/app/locale/hu.coffee
+++ b/app/locale/hu.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Következő pálya" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Vissza a kezdőoldalra" # Only in old-style levels.
     victory_review: "Mondd el a véleményedet!" # Only in old-style levels.
     victory_hour_of_code_done: "Készen vagy?"
diff --git a/app/locale/id.coffee b/app/locale/id.coffee
index c8b752085..c7c399d0b 100644
--- a/app/locale/id.coffee
+++ b/app/locale/id.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/it.coffee b/app/locale/it.coffee
index 9d058b4bc..2cf126cfd 100644
--- a/app/locale/it.coffee
+++ b/app/locale/it.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Gioca il prossimo livello" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Torna alla pagina iniziale" # Only in old-style levels.
     victory_review: "Dicci di più!" # Only in old-style levels.
     victory_hour_of_code_done: "Finito?"
diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee
index 09b2d5525..88fa14564 100644
--- a/app/locale/ja.coffee
+++ b/app/locale/ja.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "次のレベル" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "ホームに戻る" # Only in old-style levels.
     victory_review: "フィードバック" # Only in old-style levels.
     victory_hour_of_code_done: "完了してよろしいですか?"
diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee
index e02118a66..1f65c4454 100644
--- a/app/locale/ko.coffee
+++ b/app/locale/ko.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
     victory_return_to_ladder: "레더로 돌아가기"
     victory_play_next_level: "다음 레벨 플레이 하기" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "홈으로" # Only in old-style levels.
     victory_review: "리뷰를 남겨주세요" # Only in old-style levels.
     victory_hour_of_code_done: "정말 종료합니까?"
diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee
index d28a9ab5d..185c802d8 100644
--- a/app/locale/lt.coffee
+++ b/app/locale/lt.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee
index a9dac5265..7d0797d6e 100644
--- a/app/locale/ms.coffee
+++ b/app/locale/ms.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee
index 60e09f459..0d6e09675 100644
--- a/app/locale/nb.coffee
+++ b/app/locale/nb.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Spill Neste Nivå" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Gå Hjem" # Only in old-style levels.
     victory_review: "Fortell oss mer!" # Only in old-style levels.
     victory_hour_of_code_done: "Er du ferdig?"
diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee
index 217a99b44..356244785 100644
--- a/app/locale/nl-BE.coffee
+++ b/app/locale/nl-BE.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
     victory_return_to_ladder: "Keer terug naar de ladder"
     victory_play_next_level: "Speel Volgend Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Ga naar Home" # Only in old-style levels.
     victory_review: "Vertel ons meer!" # Only in old-style levels.
     victory_hour_of_code_done: "Ben Je Klaar?"
diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee
index b0bebed94..c541c1424 100644
--- a/app/locale/nl-NL.coffee
+++ b/app/locale/nl-NL.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
     victory_return_to_ladder: "Keer terug naar de ladder"
     victory_play_next_level: "Speel Volgend Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Ga naar Home" # Only in old-style levels.
     victory_review: "Vertel ons meer!" # Only in old-style levels.
     victory_hour_of_code_done: "Ben Je Klaar?"
diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee
index 3406fdbe4..4c40d8a1b 100644
--- a/app/locale/nn.coffee
+++ b/app/locale/nn.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/no.coffee b/app/locale/no.coffee
index 70781c665..93ed924cc 100644
--- a/app/locale/no.coffee
+++ b/app/locale/no.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Spill neste nivå" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Gå til Hovedsiden" # Only in old-style levels.
     victory_review: "Fortell oss mer!" # Only in old-style levels.
     victory_hour_of_code_done: "Er du ferdig?"
diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee
index 60d812e05..ee27aaf04 100644
--- a/app/locale/pl.coffee
+++ b/app/locale/pl.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
     victory_return_to_ladder: "Powrót do drabinki"
     victory_play_next_level: "Przejdź na następny poziom" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Powrót do strony głównej" # Only in old-style levels.
     victory_review: "Powiedz nam coś więcej!" # Only in old-style levels.
     victory_hour_of_code_done: "Skończyłeś już?"
diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 7a6afd9bf..dc020e36d 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     armor: "Armadura"
     hands: "Mãos"
     accessories: "Accessórios"
-    books: "Livross"
     minions: "Minions"
     misc: "Diversos"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     victory_return_to_ladder: "Retornar para a Ladder"
     victory_play_next_level: "Jogar o próximo estágio" # Only in old-style levels.
     victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Ir à página inicial" # Only in old-style levels.
     victory_review: "Diga-nos mais!" # Only in old-style levels.
     victory_hour_of_code_done: "Terminou?"
@@ -339,7 +339,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     press_paragraph_1_suffix: ". Todas as logomarcas e imagens podem ser usadas sem nos contactar previamente."
     team: "Time"
     george_title: "CEO"
-    george_blurb: "Administrador" # Businesser
+    george_blurb: "Administrador"
     scott_title: "Programador"
     scott_blurb: "O Sensato"
     nick_title: "Programador"
diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee
index 5b6abebda..d42e62e1b 100644
--- a/app/locale/pt-PT.coffee
+++ b/app/locale/pt-PT.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     armor: "Armadura"
     hands: "Mãos"
     accessories: "Acessórios"
-    books: "Livros"
     minions: "Minions"
     misc: "Vários"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     victory_return_to_ladder: "Voltar à Classificação"
     victory_play_next_level: "Jogar Próximo Nível" # Only in old-style levels.
     victory_play_continue: "Continuar"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Ir para o Início" # Only in old-style levels.
     victory_review: "Conta-nos mais!" # Only in old-style levels.
     victory_hour_of_code_done: "Terminaste?"
diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee
index 1eff3953f..e5f4d64ec 100644
--- a/app/locale/ro.coffee
+++ b/app/locale/ro.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
     victory_return_to_ladder: "Înapoi la jocurile de clasament"
     victory_play_next_level: "Joacă nivelul următor" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Acasă" # Only in old-style levels.
     victory_review: "Spune-ne mai multe!" # Only in old-style levels.
     victory_hour_of_code_done: "Ai terminat?"
diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee
index c5539d2e3..002f0952d 100644
--- a/app/locale/ru.coffee
+++ b/app/locale/ru.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     armor: "Броня"
     hands: "Руки"
     accessories: "Аксессуары"
-    books: "Книги"
 #    minions: "Minions"
     misc: "Разное"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     victory_return_to_ladder: "Вернуться к ладдеру"
     victory_play_next_level: "Следующий уровень" # Only in old-style levels.
     victory_play_continue: "Продолжить"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "На главную" # Only in old-style levels.
     victory_review: "Расскажите нам больше!" # Only in old-style levels.
     victory_hour_of_code_done: "Вы закончили?"
diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee
index a26af01af..a1d761310 100644
--- a/app/locale/sk.coffee
+++ b/app/locale/sk.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee
index a9adc9468..8d58ccce4 100644
--- a/app/locale/sl.coffee
+++ b/app/locale/sl.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee
index af6f7cee9..e05088c3e 100644
--- a/app/locale/sr.coffee
+++ b/app/locale/sr.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Играј следећи ниво" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Иди на почетну" # Only in old-style levels.
     victory_review: "Реци нам више!" # Only in old-style levels.
     victory_hour_of_code_done: "Јеси ли завршио?"
diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee
index 3c0c9b7cf..a725e344d 100644
--- a/app/locale/sv.coffee
+++ b/app/locale/sv.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
     victory_return_to_ladder: "Gå tillbaka till stegen"
     victory_play_next_level: "Spela nästa nivå" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Gå hem" # Only in old-style levels.
     victory_review: "Berätta mer!" # Only in old-style levels.
     victory_hour_of_code_done: "Är du klar?"
diff --git a/app/locale/th.coffee b/app/locale/th.coffee
index d708ce025..f06b7a39e 100644
--- a/app/locale/th.coffee
+++ b/app/locale/th.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "เล่นด่านถัดไป" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "ไปหน้าแรก" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
     victory_hour_of_code_done: "เสร็จหรือยัง?"
diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee
index ed8dd736d..076f18cd0 100644
--- a/app/locale/tr.coffee
+++ b/app/locale/tr.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "Sonraki Seviyeyi Oyna: " # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "Anasayfaya Git" # Only in old-style levels.
     victory_review: "Daha detaylı bilgi verebilirsiniz!" # Only in old-style levels.
     victory_hour_of_code_done: "Bitirdiniz mi?"
diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee
index a02858986..a19f6dccd 100644
--- a/app/locale/uk.coffee
+++ b/app/locale/uk.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "українська мова", englishDesc
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
     victory_return_to_ladder: "Повернутись до таблиці рівнів"
     victory_play_next_level: "Наступний рівень" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "На головну" # Only in old-style levels.
     victory_review: "Розкажіть нам більше!" # Only in old-style levels.
     victory_hour_of_code_done: "Ви закінчили?"
diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee
index 41b36ab27..67f2749e5 100644
--- a/app/locale/ur.coffee
+++ b/app/locale/ur.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee
index bc183aa55..17d5c0e86 100644
--- a/app/locale/vi.coffee
+++ b/app/locale/vi.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee
index b08dddda8..c03974f5a 100644
--- a/app/locale/zh-HANS.coffee
+++ b/app/locale/zh-HANS.coffee
@@ -52,9 +52,9 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     subscribe_as_diplomat: "提交翻译人员申请"
 
   play:
-    #play_as: "Play As" # Ladder page
+#    play_as: "Play As" # Ladder page
     spectate: "旁观他人的游戏" # Ladder page
-    #players: "players" # Hover over a level on /play
+#    players: "players" # Hover over a level on /play
 #    hours_played: "hours played" # Hover over a level on /play
     items: "道具" # Tooltip on item shop button from /play
     heroes: "英雄" # Tooltip on hero shop button from /play
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     armor: "盔甲"
     hands: "手持"
     accessories: "配饰"
-    books: "图书"
     minions: "部下"
     misc: "辅助道具"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     victory_return_to_ladder: "返回"
     victory_play_next_level: "下一关" # Only in old-style levels.
     victory_play_continue: "继续"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "返回主页" # Only in old-style levels.
     victory_review: "给我们反馈!" # Only in old-style levels.
     victory_hour_of_code_done: "你完成了吗?"
@@ -689,17 +689,17 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     last_earned: "最近取得的时间"
     amount_achieved: "数量"
     achievement: "成就"
-    #category_contributor: "Contributor"
-    #category_miscellaneous: "Miscellaneous"
-    #category_levels: "Levels"
-    #category_undefined: "Uncategorized"
-    #current_xp_prefix: ""
-    #current_xp_postfix: " in total"
-    #new_xp_prefix: ""
-    #new_xp_postfix: " earned"
-    #left_xp_prefix: ""
-    #left_xp_infix: " until level "
-    #left_xp_postfix: ""
+#    category_contributor: "Contributor"
+#    category_miscellaneous: "Miscellaneous"
+#    category_levels: "Levels"
+#    category_undefined: "Uncategorized"
+#    current_xp_prefix: ""
+#    current_xp_postfix: " in total"
+#    new_xp_prefix: ""
+#    new_xp_postfix: " earned"
+#    left_xp_prefix: ""
+#    left_xp_infix: " until level "
+#    left_xp_postfix: ""
 
   account:
     recently_played: "最近玩过的关卡"
diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee
index b76b1f4a7..5204e1cdd 100644
--- a/app/locale/zh-HANT.coffee
+++ b/app/locale/zh-HANT.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
 #    victory_return_to_ladder: "Return to Ladder"
     victory_play_next_level: "下一關" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "返回首頁" # Only in old-style levels.
     victory_review: "給我們回饋!" # Only in old-style levels.
     victory_hour_of_code_done: "你完成了嗎?"
diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee
index 1ba96a21f..9b5dc793a 100644
--- a/app/locale/zh-WUU-HANS.coffee
+++ b/app/locale/zh-WUU-HANS.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    victory_return_to_ladder: "Return to Ladder"
 #    victory_play_next_level: "Play Next Level" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
 #    victory_go_home: "Go Home" # Only in old-style levels.
 #    victory_review: "Tell us more!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee
index 847a53884..685337b5e 100644
--- a/app/locale/zh-WUU-HANT.coffee
+++ b/app/locale/zh-WUU-HANT.coffee
@@ -111,7 +111,6 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
 #    armor: "Armor"
 #    hands: "Hands"
 #    accessories: "Accessories"
-#    books: "Books"
 #    minions: "Minions"
 #    misc: "Misc"
 
@@ -205,6 +204,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
     victory_return_to_ladder: "走轉"
     victory_play_next_level: "下關" # Only in old-style levels.
 #    victory_play_continue: "Continue"
+#    victory_saving_progress: "Saving Progress"
     victory_go_home: "轉到主頁" # Only in old-style levels.
     victory_review: "搭我裏反應!" # Only in old-style levels.
     victory_hour_of_code_done: "爾妝下落爻噃?"

From 9fc4498ace7fec6c97bf7fa194956fd7bf0eee88 Mon Sep 17 00:00:00 2001
From: Imperadeiro98 <Imperadeiro98@users.noreply.github.com>
Date: Sun, 19 Oct 2014 19:16:13 +0100
Subject: [PATCH 31/46] Update pt-PT.coffee

---
 app/locale/pt-PT.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee
index d42e62e1b..961cc1b38 100644
--- a/app/locale/pt-PT.coffee
+++ b/app/locale/pt-PT.coffee
@@ -204,7 +204,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     victory_return_to_ladder: "Voltar à Classificação"
     victory_play_next_level: "Jogar Próximo Nível" # Only in old-style levels.
     victory_play_continue: "Continuar"
-#    victory_saving_progress: "Saving Progress"
+    victory_saving_progress: "A Guardar o Progresso"
     victory_go_home: "Ir para o Início" # Only in old-style levels.
     victory_review: "Conta-nos mais!" # Only in old-style levels.
     victory_hour_of_code_done: "Terminaste?"

From 440e1700b1c1bd236e7ebad5498e470167fd6071 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sun, 19 Oct 2014 12:44:58 -0700
Subject: [PATCH 32/46] Using aiSource now for enemy AIs in multiplayer,
 separate from sample code source.

---
 .../editor/level/modals/SaveLevelModal.coffee |  1 +
 .../editor/thang/ThangTypeEditView.coffee     | 21 ++++++++++---------
 app/views/play/level/tome/Spell.coffee        |  2 ++
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/app/views/editor/level/modals/SaveLevelModal.coffee b/app/views/editor/level/modals/SaveLevelModal.coffee
index 3913257a4..7d90d1e74 100644
--- a/app/views/editor/level/modals/SaveLevelModal.coffee
+++ b/app/views/editor/level/modals/SaveLevelModal.coffee
@@ -52,6 +52,7 @@ module.exports = class SaveLevelModal extends SaveVersionModal
       console.log "Should we save", m.get('system'), m.get('name'), m, "? localChanges:", m.hasLocalChanges(), "version:", m.get('version'), 'isPublished:', m.isPublished(), 'collection:', m.collection
       return false
     return true if m.hasLocalChanges()
+    console.error "Trying to check major version of #{m.type()} #{m.get('name')}, but it doesn't have a version:", m unless m.get('version')
     return true if (m.get('version').major is 0 and m.get('version').minor is 0) or not m.isPublished() and not m.collection
     # Sometimes we have two versions: one in a search collection and one with a URL. We only save changes to the latter.
     false
diff --git a/app/views/editor/thang/ThangTypeEditView.coffee b/app/views/editor/thang/ThangTypeEditView.coffee
index 91d3f47d3..5ee5c35d7 100644
--- a/app/views/editor/thang/ThangTypeEditView.coffee
+++ b/app/views/editor/thang/ThangTypeEditView.coffee
@@ -77,7 +77,7 @@ module.exports = class ThangTypeEditView extends RootView
     context
 
   getAnimationNames: -> _.keys(@thangType.get('actions') or {})
-  
+
   afterRender: ->
     super()
     return unless @supermodel.finished()
@@ -119,7 +119,7 @@ module.exports = class ThangTypeEditView extends RootView
     @stage = new createjs.Stage(canvas[0])
     @layerAdapter = new LayerAdapter({name:'Default', webGL: true})
     @topLayer = new createjs.Container()
-    
+
     @layerAdapter.container.x = @topLayer.x = CENTER.x
     @layerAdapter.container.y = @topLayer.y = CENTER.y
     @stage.addChild(@layerAdapter.container, @topLayer)
@@ -135,7 +135,7 @@ module.exports = class ThangTypeEditView extends RootView
     @updateGrid()
     _.defer @refreshAnimation
     @toggleDots(false)
-    
+
     createjs.Ticker.setFPS(30)
     createjs.Ticker.addEventListener('tick', @stage)
 
@@ -244,7 +244,7 @@ module.exports = class ThangTypeEditView extends RootView
     lank = new Lank(@thangType, @getLankOptions())
     @showLank(lank)
     @updateScale()
-    
+
   onNewSpriteSheet: ->
     $('#spritesheets').empty()
     for image in @layerAdapter.spriteSheet._images
@@ -260,7 +260,7 @@ module.exports = class ThangTypeEditView extends RootView
     @showAction(animationName)
     @updateRotation()
     @updateScale() # must happen after update rotation, because updateRotation calls the sprite update() method.
-    
+
   showMovieClip: (animationName) ->
     vectorParser = new SpriteBuilder(@thangType)
     movieClip = vectorParser.buildMovieClip(animationName)
@@ -289,7 +289,7 @@ module.exports = class ThangTypeEditView extends RootView
     portrait?.attr('id', 'portrait').addClass('img-thumbnail')
     portrait.addClass 'img-thumbnail'
     $('#portrait').replaceWith(portrait)
-    
+
   showLank: (lank) ->
     @clearDisplayObject()
     @clearLank()
@@ -306,7 +306,7 @@ module.exports = class ThangTypeEditView extends RootView
 
   clearDisplayObject: ->
     @topLayer.removeChild(@currentObject) if @currentObject?
-    
+
   clearLank: ->
     @layerAdapter.removeLank(@currentLank) if @currentLank
     @currentLank?.destroy()
@@ -365,7 +365,8 @@ module.exports = class ThangTypeEditView extends RootView
       url = "/editor/thang/#{newThangType.get('slug') or newThangType.id}"
       portraitSource = null
       if @thangType.get('raster')
-        image = @currentLank.sprite.image
+        #image = @currentLank.sprite.image  # Doesn't work?
+        image = @currentLank.sprite.spriteSheet._images[0]
         portraitSource = imageToPortrait image
         # bit of a hacky way to get that portrait
       success = =>
@@ -429,7 +430,7 @@ module.exports = class ThangTypeEditView extends RootView
     obj = vectorParser.buildMovieClip(key) if type is 'animations'
     obj = vectorParser.buildContainerFromStore(key) if type is 'containers'
     obj = vectorParser.buildShapeFromStore(key) if type is 'shapes'
-    
+
     bounds = obj?.bounds or obj?.nominalBounds
     if bounds
       @boundsBox = new createjs.Shape()
@@ -437,7 +438,7 @@ module.exports = class ThangTypeEditView extends RootView
       @topLayer.addChild(@boundsBox)
       obj.regX = @boundsBox.regX = bounds.x + bounds.width / 2
       obj.regY = @boundsBox.regY = bounds.y + bounds.height / 2
-    
+
     @showSprite(obj) if obj
     @showingSelectedNode = true
     @currentLank?.destroy()
diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee
index aba1c56b1..0c0e50e8d 100644
--- a/app/views/play/level/tome/Spell.coffee
+++ b/app/views/play/level/tome/Spell.coffee
@@ -40,6 +40,8 @@ module.exports = class Spell
     if @permissions.readwrite.length and sessionSource = @session.getSourceFor(@spellKey)
       if sessionSource isnt '// Should fill in some default source\n'  # TODO: figure out why session is getting this default source in there and stop it
         @source = sessionSource
+    if p.aiSource and not @otherSession and not @canWrite()
+      @source = @originalSource = p.aiSource
     @thangs = {}
     if @canRead()  # We can avoid creating these views if we'll never use them.
       @view = new SpellView {spell: @, level: options.level, session: @session, worker: @worker}

From 1fb48f2b85380060716574b1fcd600ffbb9adddc Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sun, 19 Oct 2014 17:38:10 -0700
Subject: [PATCH 33/46] Fixed a few bugs. Removed Olark; disabled LinkedIn.
 Added ladder submission to HeroVictoryModal.

---
 app/assets/main.html                          |   8 +-
 app/initialize.coffee                         |   1 -
 app/lib/LevelLoader.coffee                    |   5 +-
 app/lib/Tracker.coffee                        |  19 ---
 app/lib/services/olark.coffee                 | 115 ------------------
 app/models/Level.coffee                       |   3 +-
 app/models/ThangType.coffee                   |   1 +
 .../play/level/modal/hero-victory-modal.sass  |  15 +++
 .../play/level/modal/hero-victory-modal.jade  |   9 +-
 .../editor/level/thangs/ThangsTabView.coffee  |   3 +-
 app/views/play/level/PlayLevelView.coffee     |   3 +-
 .../play/level/modal/HeroVictoryModal.coffee  |  13 ++
 scripts/transpile.coffee                      |   3 +-
 13 files changed, 48 insertions(+), 150 deletions(-)
 delete mode 100644 app/lib/services/olark.coffee

diff --git a/app/assets/main.html b/app/assets/main.html
index 74737fd6b..cdb9a3a89 100644
--- a/app/assets/main.html
+++ b/app/assets/main.html
@@ -37,18 +37,14 @@
   <script src="/javascripts/aether.js"></script>
   <script src="/javascripts/app.js"></script> <!-- it's all Backbone! -->
   
-  <script>
-    window.linkedInAsyncInit = function() {
-      console.log("Linkedin Async Init!");
-      Backbone.Mediator.publish('linkedin-loaded');
-    };
-    
+  <!-- Can move to lib/services/linkedin.coffee instead somehow? Or just get rid of LinkedIn...
   </script>
   <script type="text/javascript" async src="http://platform.linkedin.com/in.js">
     api_key: 75v8mv4ictvmx6
     onLoad: linkedInAsyncInit
     authorize: true
   </script>
+  -->
   
   <script>
     window.userObject = "userObjectTag";
diff --git a/app/initialize.coffee b/app/initialize.coffee
index db1f2f862..2b724cbe5 100644
--- a/app/initialize.coffee
+++ b/app/initialize.coffee
@@ -78,7 +78,6 @@ initializeUtilityServices = ->
   services = [
     './lib/services/filepicker'
     './lib/services/segmentio'
-    './lib/services/olark'
   ]
 
   for service in services
diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index bf5de9c6e..2aa40edc6 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -108,7 +108,7 @@ module.exports = class LevelLoader extends CocoClass
       @loadThangsRequiredByThangType heroThangType
 
     for itemThangType in _.values(heroConfig.inventory)
-      url = "/db/thang.type/#{itemThangType}/version?project=name,components,original,rasterIcon"
+      url = "/db/thang.type/#{itemThangType}/version?project=name,components,original,rasterIcon,kind"
       if itemResource = @maybeLoadURL(url, ThangType, 'thang')
         @worldNecessities.push itemResource
       else
@@ -193,7 +193,7 @@ module.exports = class LevelLoader extends CocoClass
       else if component.config.requiredThangTypes
         requiredThangTypes = requiredThangTypes.concat component.config.requiredThangTypes
     for thangType in requiredThangTypes
-      url = "/db/thang.type/#{thangType}/version?project=name,components,original,rasterIcon"
+      url = "/db/thang.type/#{thangType}/version?project=name,components,original,rasterIcon,kind"
       @worldNecessities.push @maybeLoadURL(url, ThangType, 'thang')
 
   onThangNamesLoaded: (thangNames) ->
@@ -250,7 +250,6 @@ module.exports = class LevelLoader extends CocoClass
     console.log 'SuperModel for Level loaded in', new Date().getTime() - @t0, 'ms'
     @loadLevelSounds()
     @denormalizeSession()
-    app.tracker.updatePlayState(@level, @session) unless @headless
 
   buildLoop: =>
     someLeft = false
diff --git a/app/lib/Tracker.coffee b/app/lib/Tracker.coffee
index fd51ecead..3b3af4d69 100644
--- a/app/lib/Tracker.coffee
+++ b/app/lib/Tracker.coffee
@@ -9,7 +9,6 @@ module.exports = class Tracker
     window.tracker = @
     @isProduction = document.location.href.search('codecombat.com') isnt -1
     @identify()
-    @updateOlark()
 
   identify: (traits) ->
     console.log 'Would identify', traits if debugAnalytics
@@ -20,24 +19,6 @@ module.exports = class Tracker
       traits[userTrait] ?= me.get(userTrait)
     analytics.identify me.id, traits
 
-  updateOlark: ->
-    return unless me and olark?
-    olark 'api.chat.updateVisitorStatus', snippet: ["User ID: #{me.id}"]
-    return if me.get('anonymous')
-    olark 'api.visitor.updateEmailAddress', emailAddress: me.get('email') if me.get('email')
-    olark 'api.chat.updateVisitorNickname', snippet: me.displayName()
-
-  updatePlayState: (level, session) ->
-    return unless olark?
-    link = "codecombat.com/play/level/#{level.get('slug') or level.id}?session=#{session.id}"
-    snippet = [
-      "#{link}"
-      "User ID: #{me.id}"
-      "Session ID: #{session.id}"
-      "Level: #{level.get('name')}"
-    ]
-    olark 'api.chat.updateVisitorStatus', snippet: snippet
-
   trackPageView: ->
     return unless @isProduction and analytics?
     url = Backbone.history.getFragment()
diff --git a/app/lib/services/olark.coffee b/app/lib/services/olark.coffee
deleted file mode 100644
index c91f3a89f..000000000
--- a/app/lib/services/olark.coffee
+++ /dev/null
@@ -1,115 +0,0 @@
-module.exports = initializeOlark = ->
-  window.olark or ((c) -> #<![CDATA[
-    f = window
-    d = document
-    l = (if f.location.protocol is 'https:' then 'https:' else 'http:')
-    z = c.name
-    r = 'load'
-    nt = ->
-      s = ->
-        a.P r
-        f[z] r
-        return
-      f[z] = ->
-        (a.s = a.s or []).push arguments
-        return
-
-      a = f[z]._ = {}
-      q = c.methods.length
-      while q--
-        ((n) ->
-          f[z][n] = ->
-            f[z] 'call', n, arguments
-            return
-
-          return
-        ) c.methods[q]
-      a.l = c.loader
-      a.i = nt
-      a.p = 0: +new Date
-      a.P = (u) ->
-        a.p[u] = new Date - a.p[0]
-        return
-
-      (if f.addEventListener then f.addEventListener(r, s, false) else f.attachEvent('on' + r, s))
-      ld = ->
-        p = (hd) ->
-          hd = 'head'
-          [
-            '<'
-            hd
-            '></'
-            hd
-            '><'
-            i
-            ' onl' + 'oad=\"var d='
-            g
-            ";d.getElementsByTagName('head')[0]."
-            j
-            '(d.'
-            h
-            "('script'))."
-            k
-            "='"
-            l
-            '//'
-            a.l
-            "'"
-            '\"'
-            '></'
-            i
-            '>'
-          ].join ''
-        i = 'body'
-        m = d[i]
-        return setTimeout(ld, 100)  unless m
-        a.P 1
-        j = 'appendChild'
-        h = 'createElement'
-        k = 'src'
-        n = d[h]('div')
-        v = n[j](d[h](z))
-        b = d[h]('iframe')
-        g = 'document'
-        e = 'domain'
-        o = undefined
-        n.style.display = 'none'
-        m.insertBefore(n, m.firstChild).id = z
-        b.frameBorder = '0'
-        b.id = z + '-loader'
-        b.src = 'javascript:false' if /MSIE[ ]+6/.test(navigator.userAgent)
-        b.allowTransparency = 'true'
-        v[j] b
-        try
-          b.contentWindow[g].open()
-        catch w
-          c[e] = d[e]
-          o = 'javascript:var d=' + g + ".open();d.domain='" + d.domain + "';"
-          b[k] = o + 'void(0);'
-        try
-          t = b.contentWindow[g]
-          t.write p()
-          t.close()
-        catch x
-          b[k] = o + 'd.write(\"' + p().replace(/"/g, String.fromCharCode(92) + '\"') + '\");d.close();'
-        a.P 2
-        return
-
-      ld()
-      return
-
-    nt()
-    return
-  )(
-    loader: 'static.olark.com/jsclient/loader0.js'
-    name: 'olark'
-    methods: [
-      'configure'
-      'extend'
-      'declare'
-      'identify'
-    ]
-  )
-
-  # custom configuration goes here (www.olark.com/documentation)
-  olark.identify '1451-787-10-5544' #]]>
diff --git a/app/models/Level.coffee b/app/models/Level.coffee
index 1a89588cd..6d91b9334 100644
--- a/app/models/Level.coffee
+++ b/app/models/Level.coffee
@@ -57,7 +57,8 @@ module.exports = class Level extends CocoModel
     if isHero and otherSession
       # If it's a hero and there's another session, find the right session for it.
       # If there is no other session (playing against default code, or on single player), clone all placeholders.
-      # TODO: actually look at the teams on these things to determine which session should go with which placeholder.
+      # TODO: actually look at the teams on these Thangs to determine which session should go with which placeholder.
+      console.error 'There is no session but there is a hero and an otherSession?', session, otherSession unless session?.get
       if levelThang.id is 'Hero Placeholder 1' and session.get('team') is 'humans'
         session = otherSession
       else if levelThang.id is 'Hero Placeholder' and session.get('team') is 'ogres'
diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee
index 37ba7d5b6..37c9ac648 100644
--- a/app/models/ThangType.coffee
+++ b/app/models/ThangType.coffee
@@ -235,6 +235,7 @@ module.exports = class ThangType extends CocoModel
     return if _.isString spriteSheet
     return unless spriteSheet
     canvas = $("<canvas width='#{size}' height='#{size}'></canvas>")
+    console.log 'made canvas', canvas, 'with size', size unless canvas[0]
     stage = new createjs.Stage(canvas[0])
     sprite = new createjs.Sprite(spriteSheet)
     pt = @actions.portrait?.positions?.registration
diff --git a/app/styles/play/level/modal/hero-victory-modal.sass b/app/styles/play/level/modal/hero-victory-modal.sass
index f044a91a3..d825d9926 100644
--- a/app/styles/play/level/modal/hero-victory-modal.sass
+++ b/app/styles/play/level/modal/hero-victory-modal.sass
@@ -33,6 +33,7 @@
   
   .modal-body
     padding: 0 20px
+    min-height: 30px
   
   .achievement-panel
     background: url("/images/pages/play/level/modal/achievement_plate.png")
@@ -184,6 +185,20 @@
       float: right
       margin-left: 10px
 
+  .ladder-submission-view
+    display: inline-block
+    color: white
+
+    .rank-button.btn-block
+      display: inline-block
+      width: initial
+      padding-left: 19px
+      padding-right: 19px
+
+    .last-submitted
+      float: none
+
+
 html.no-borderimage
   #hero-victory-modal
     .background-wrapper
diff --git a/app/templates/play/level/modal/hero-victory-modal.jade b/app/templates/play/level/modal/hero-victory-modal.jade
index 32d4f2fbb..1ae5041bc 100644
--- a/app/templates/play/level/modal/hero-victory-modal.jade
+++ b/app/templates/play/level/modal/hero-victory-modal.jade
@@ -51,9 +51,16 @@ block modal-footer-content
     span#gem-total +0
 
   button.btn.btn-warning.hide#saving-progress-label(disabled, data-i18n="play_level.victory_saving_progress") Saving Progress
-  a.btn.btn-success.world-map-button.hide#continue-button(href="/play-hero", data-dismiss="modal", data-i18n="play_level.victory_play_continue") Continue
+
+  if readyToRank
+    .ladder-submission-view
+  else if level.get('type') === 'hero-ladder'
+    a.btn.btn-primary(href="/play/ladder/#{level.get('slug')}#my-matches", data-dismiss="modal", data-i18n="play_level.victory_return_to_ladder") Return to Ladder
+  else
+    a.btn.btn-success.world-map-button.hide#continue-button(href="/play-hero", data-dismiss="modal", data-i18n="play_level.victory_play_continue") Continue
 
   if me.get('anonymous')
     p.sign-up-poke
       button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/SignupModal", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress
       span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account!
+
diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee
index 6d2f39c6f..2e77e732c 100644
--- a/app/views/editor/level/thangs/ThangsTabView.coffee
+++ b/app/views/editor/level/thangs/ThangsTabView.coffee
@@ -484,7 +484,8 @@ module.exports = class ThangsTabView extends CocoView
 
   folderForThang: (thang) ->
     thangType = @supermodel.getModelByOriginal ThangType, thang.thangType
-    [thangType.get('kind'), thangType.get('name')]
+    console.error 'uhh, we had kind', thangType.get('kind', true), 'for', thangType unless thangType.get('kind', true)
+    [thangType.get('kind', true), thangType.get('name', true)]
 
   pathForThang: (thang) ->
     folder = @folderForThang(thang)
diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee
index f966fe230..167fd6be0 100644
--- a/app/views/play/level/PlayLevelView.coffee
+++ b/app/views/play/level/PlayLevelView.coffee
@@ -455,8 +455,7 @@ module.exports = class PlayLevelView extends RootView
 
   showVictory: ->
     options = {level: @level, supermodel: @supermodel, session: @session}
-    ModalClass = if @level.get('type', true) in ['hero', 'hero-coop'] then HeroVictoryModal else VictoryModal
-    # TODO: made HeroVictoryModal able to support hero-ladder and then switch over for that level type, too
+    ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] then HeroVictoryModal else VictoryModal
     victoryModal = new ModalClass(options)
     @openModalView(victoryModal)
     if me.get('anonymous')
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index b21805334..2158eba75 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -6,6 +6,7 @@ CocoCollection = require 'collections/CocoCollection'
 LocalMongo = require 'lib/LocalMongo'
 utils = require 'lib/utils'
 ThangType = require 'models/ThangType'
+LadderSubmissionView = require 'views/play/common/LadderSubmissionView'
 
 module.exports = class HeroVictoryModal extends ModalView
   id: 'hero-victory-modal'
@@ -13,6 +14,9 @@ module.exports = class HeroVictoryModal extends ModalView
   closeButton: false
   closesOnClickOutside: false
 
+  subscriptions:
+    'ladder:game-submitted': 'onGameSubmitted'
+
   constructor: (options) ->
     super(options)
     @session = options.session
@@ -88,6 +92,7 @@ module.exports = class HeroVictoryModal extends ModalView
 
     c.thangTypes = @thangTypes
     c.me = me
+    c.readyToRank = @level.get('type', true) is 'hero-ladder' and @session.readyToRank()
     return c
 
   afterRender: ->
@@ -116,6 +121,9 @@ module.exports = class HeroVictoryModal extends ModalView
       panel.delay(500)
       panel.queue(-> complete())
     @animationComplete = not @animatedPanels.length
+    if @level.get('type', true) is 'hero-ladder'
+      @ladderSubmissionView = new LadderSubmissionView session: @session, level: @level
+      @insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view')
 
   beginAnimateNumbers: ->
     @numericalItemPanels = _.map(@animatedPanels.find('.numerical'), (panel) -> {
@@ -186,6 +194,11 @@ module.exports = class HeroVictoryModal extends ModalView
     @$el.find('#saving-progress-label').toggleClass('hide', @readyToContinue)
     @$el.find('#continue-button').toggleClass('hide', not @readyToContinue)
 
+  onGameSubmitted: (e) ->
+    ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches"
+    Backbone.Mediator.publish 'router:navigate', route: ladderURL
+
+
   # TODO: award heroes/items and play an awesome sound when you get one
 
   destroy: ->
diff --git a/scripts/transpile.coffee b/scripts/transpile.coffee
index 090d44eae..1d17fcba2 100644
--- a/scripts/transpile.coffee
+++ b/scripts/transpile.coffee
@@ -17,7 +17,8 @@ transpileLevelSession = (sessionID, cb) ->
     if err then return cb err
     submittedCode = session.submittedCode
     unless session.submittedCodeLanguage
-      throw 'SUBMITTED CODE LANGUAGE DOESN\'T EXIST'
+      console.log '\n\n\n#{i++} SUBMITTED CODE LANGUAGE DOESN\'T EXIST\n', session, '\n\n'
+      return cb()
     else
       console.log "Transpiling code for session #{i++} #{session._id} in language #{session.submittedCodeLanguage}"
     transpiledCode = {}

From 08d9e39764ef12c299dacf6b130f539ba16f6de1 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Sun, 19 Oct 2014 21:56:26 -0700
Subject: [PATCH 34/46] LevelLoader and Simulator fixes for simulating
 hero-ladder matches. Commented out some logging that hasn't been very useful.
 Fixed some tests.

---
 app/lib/LevelLoader.coffee                    | 28 +++++++++++--------
 app/lib/simulator/Simulator.coffee            | 10 +++++--
 app/models/CocoModel.coffee                   |  3 +-
 app/models/Level.coffee                       |  1 -
 app/models/SuperModel.coffee                  |  2 +-
 app/views/play/ladder/SimulateTabView.coffee  |  1 +
 server/queues/scoring.coffee                  |  2 +-
 test/app/lib/LevelLoader.spec.coffee          |  8 +++---
 .../views/play/level/tome/Problem.spec.coffee |  9 +++---
 9 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 2aa40edc6..afddc8720 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -61,7 +61,6 @@ module.exports = class LevelLoader extends CocoClass
   # Session Loading
 
   loadSession: ->
-    return if @headless
     if @sessionID
       url = "/db/level.session/#{@sessionID}"
     else
@@ -71,6 +70,11 @@ module.exports = class LevelLoader extends CocoClass
     session = new LevelSession().setURL url
     @sessionResource = @supermodel.loadModel(session, 'level_session', {cache: false})
     @session = @sessionResource.model
+    if @opponentSessionID
+      opponentSession = new LevelSession().setURL "/db/level.session/#{@opponentSessionID}"
+      @opponentSessionResource = @supermodel.loadModel(opponentSession, 'opponent_session')
+      @opponentSession = @opponentSessionResource.model
+
     if @session.loaded
       @session.setURL '/db/level.session/' + @session.id
       @loadDependenciesForSession @session
@@ -78,11 +82,7 @@ module.exports = class LevelLoader extends CocoClass
       @listenToOnce @session, 'sync', ->
         @session.setURL '/db/level.session/' + @session.id
         @loadDependenciesForSession @session
-
-    if @opponentSessionID
-      opponentSession = new LevelSession().setURL "/db/level.session/#{@opponentSessionID}"
-      @opponentSessionResource = @supermodel.loadModel(opponentSession, 'opponent_session')
-      @opponentSession = @opponentSessionResource.model
+    if @opponentSession
       if @opponentSession.loaded
         @loadDependenciesForSession @opponentSession
       else
@@ -92,11 +92,13 @@ module.exports = class LevelLoader extends CocoClass
     if session is @session
       Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session
       @consolidateFlagHistory() if @opponentSession?.loaded
-    else
+    else if session is @opponentSession
       @consolidateFlagHistory() if @session.loaded
     return unless @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
+    @sessionDependenciesRegistered ?= {}
     heroConfig = session.get('heroConfig')
-    heroConfig ?= me.get('heroConfig') if session is @session
+    heroConfig ?= me.get('heroConfig') if session is @session and not @headless
+    console.error @level.get('name'), session.get('team'), session.get('creatorName'), 'had hero', heroConfig.thangType
     heroConfig ?= {inventory: {}, thangType: '529ffbf1cf1818f2be000001'}  # If all else fails, assign Tharin as the hero.
     session.set 'heroConfig', heroConfig unless _.isEqual heroConfig, session.get('heroConfig')
     url = "/db/thang.type/#{heroConfig.thangType}/version"
@@ -115,6 +117,9 @@ module.exports = class LevelLoader extends CocoClass
         itemThangType = @supermodel.getModel url
         @loadDefaultComponentsForThangType itemThangType
         @loadThangsRequiredByThangType itemThangType
+    @sessionDependenciesRegistered[session.id] = true
+    if _.size(@sessionDependenciesRegistered) is 2 and not (r for r in @worldNecessities when r?).length
+      @onWorldNecessitiesLoaded()
 
   consolidateFlagHistory: ->
     state = @session.get('state') ? {}
@@ -172,7 +177,7 @@ module.exports = class LevelLoader extends CocoClass
       url = "/db/level/#{obj.original}/version/#{obj.majorVersion}"
       @maybeLoadURL url, Level, 'level'
 
-    unless @headless
+    unless @headless or @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
       wizard = ThangType.loadUniversalWizard()
       @supermodel.loadModel wizard, 'thang'
 
@@ -216,9 +221,10 @@ module.exports = class LevelLoader extends CocoClass
     return unless index >= 0
     @worldNecessities.splice(index, 1)
     @worldNecessities = (r for r in @worldNecessities when r?)
-    @onWorldNecessitiesLoaded() if @worldNecessities.length is 0
+    if @worldNecessities.length is 0 and (not @sessionDependenciesRegistered or @sessionDependenciesRegistered[@session.id] and (not @opponentSession or @sessionDependenciesRegistered[@opponentSession.id]))
+      @onWorldNecessitiesLoaded()
 
-  onWorldNecessitiesLoaded: =>
+  onWorldNecessitiesLoaded: ->
     @initWorld()
     @supermodel.clearMaxProgress()
     @trigger 'world-necessities-loaded'
diff --git a/app/lib/simulator/Simulator.coffee b/app/lib/simulator/Simulator.coffee
index eef6edae0..0ca70cb89 100644
--- a/app/lib/simulator/Simulator.coffee
+++ b/app/lib/simulator/Simulator.coffee
@@ -45,7 +45,7 @@ module.exports = class Simulator extends CocoClass
         @supermodel ?= new SuperModel()
         @supermodel.resetProgress()
         @stopListening @supermodel, 'loaded-all'
-        @levelLoader = new LevelLoader supermodel: @supermodel, levelID: @task.getLevelName(), sessionID: @task.getFirstSessionID(), headless: true
+        @levelLoader = new LevelLoader supermodel: @supermodel, levelID: @task.getLevelName(), sessionID: @task.getFirstSessionID(), opponentSessionID: @task.getSecondSessionID(), headless: true
 
         if @supermodel.finished()
           @simulateSingleGame()
@@ -165,7 +165,7 @@ module.exports = class Simulator extends CocoClass
     @supermodel ?= new SuperModel()
     @supermodel.resetProgress()
     @stopListening @supermodel, 'loaded-all'
-    @levelLoader = new LevelLoader supermodel: @supermodel, levelID: levelID, sessionID: @task.getFirstSessionID(), headless: true
+    @levelLoader = new LevelLoader supermodel: @supermodel, levelID: levelID, sessionID: @task.getFirstSessionID(), opponentSessionID: @task.getSecondSessionID(), headless: true
     if @supermodel.finished()
       @simulateGame()
     else
@@ -189,11 +189,13 @@ module.exports = class Simulator extends CocoClass
     @world = @levelLoader.world
     @task.setWorld(@world)
     @level = @levelLoader.level
+    @session = @levelLoader.session
+    @otherSession = @levelLoader.opponentSession
     @levelLoader.destroy()
     @levelLoader = null
 
   setupGod: ->
-    @god.setLevel @level.serialize @supermodel, @task.getSessions()[0], @task.getSessions()[1]
+    @god.setLevel @level.serialize(@supermodel, @session, @otherSession)
     @god.setLevelSessionIDs (session.sessionID for session in @task.getSessions())
     @god.setWorldClassMap @world.classMap
     @god.setGoalManager new GoalManager(@world, @level.get 'goals')
@@ -424,6 +426,8 @@ class SimulationTask
 
   getFirstSessionID: -> @rawData.sessions[0].sessionID
 
+  getSecondSessionID: -> @rawData.sessions[1].sessionID
+
   getTaskID: -> @rawData.taskID
 
   getReceiptHandle: -> @rawData.receiptHandle
diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee
index 82982f08b..f41bc5bd1 100644
--- a/app/models/CocoModel.coffee
+++ b/app/models/CocoModel.coffee
@@ -78,7 +78,8 @@ class CocoModel extends Backbone.Model
     thisTV4.addSchema('metaschema', require('schemas/metaschema'))
     TreemaNode.utils.populateDefaults(clone, @schema(), thisTV4)
     @attributesWithDefaults = clone
-    console.debug "Populated defaults for #{@attributes.name or @type()} in #{new Date() - t0}ms"
+    duration = new Date() - t0
+    console.debug "Populated defaults for #{@attributes.name or @type()} in #{duration}ms" if duration > 10
 
   loadFromBackup: ->
     return unless @saveBackups
diff --git a/app/models/Level.coffee b/app/models/Level.coffee
index 6d91b9334..2e72342f2 100644
--- a/app/models/Level.coffee
+++ b/app/models/Level.coffee
@@ -58,7 +58,6 @@ module.exports = class Level extends CocoModel
       # If it's a hero and there's another session, find the right session for it.
       # If there is no other session (playing against default code, or on single player), clone all placeholders.
       # TODO: actually look at the teams on these Thangs to determine which session should go with which placeholder.
-      console.error 'There is no session but there is a hero and an otherSession?', session, otherSession unless session?.get
       if levelThang.id is 'Hero Placeholder 1' and session.get('team') is 'humans'
         session = otherSession
       else if levelThang.id is 'Hero Placeholder' and session.get('team') is 'ogres'
diff --git a/app/models/SuperModel.coffee b/app/models/SuperModel.coffee
index 7f43c03a9..dbff4d2d3 100644
--- a/app/models/SuperModel.coffee
+++ b/app/models/SuperModel.coffee
@@ -121,7 +121,7 @@ module.exports = class SuperModel extends Backbone.Model
       if cachedModel
         clone = $.extend true, {}, model.attributes
         cachedModel.set(clone, {silent: true, fromMerge: true})
-        console.debug "Updated cached model <#{cachedModel.get('name') or cachedModel.getURL()}> with new data"
+        #console.debug "Updated cached model <#{cachedModel.get('name') or cachedModel.getURL()}> with new data"
       else
         @registerModel(model)
     collection
diff --git a/app/views/play/ladder/SimulateTabView.coffee b/app/views/play/ladder/SimulateTabView.coffee
index 5993c2f22..616410d69 100644
--- a/app/views/play/ladder/SimulateTabView.coffee
+++ b/app/views/play/ladder/SimulateTabView.coffee
@@ -49,6 +49,7 @@ module.exports = class SimulateTabView extends CocoView
       fetchAndSimulateTaskOriginal = @simulator.fetchAndSimulateTask
       @simulator.fetchAndSimulateTask = =>
         if @simulator.simulatedByYou >= 5
+          console.log '------------------- Destroying  Simulator and making a new one -----------------'
           @simulator.destroy()
           @simulator = null
           @simulateNextGame()
diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee
index 13b3259e8..fd7dbc984 100644
--- a/server/queues/scoring.coffee
+++ b/server/queues/scoring.coffee
@@ -124,7 +124,7 @@ module.exports.getTwoGames = (req, res) ->
   #if userIsAnonymous req then return errors.unauthorized(res, 'You need to be logged in to get games.')
   humansGameID = req.body.humansGameID
   ogresGameID = req.body.ogresGameID
-  ladderGameIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span']
+  ladderGameIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span', 'dueling-grounds', 'cavern-survival']
   levelID = _.sample ladderGameIDs
   unless ogresGameID and humansGameID
     #fetch random games here
diff --git a/test/app/lib/LevelLoader.spec.coffee b/test/app/lib/LevelLoader.spec.coffee
index 4a9fc25b1..f177c703f 100644
--- a/test/app/lib/LevelLoader.spec.coffee
+++ b/test/app/lib/LevelLoader.spec.coffee
@@ -98,7 +98,7 @@ describe 'LevelLoader', ->
       levelLoader.loadDependenciesForSession(session)
       requests = jasmine.Ajax.requests.all()
       urls = (r.url for r in requests)
-      expect('/db/thang.type/gloves/version?project=name,components,original' in urls).toBeTruthy()
+      expect('/db/thang.type/gloves/version?project=name,components,original,rasterIcon,kind' in urls).toBeTruthy()
       expect('/db/thang.type/anya/version' in urls).toBeTruthy()
 
     it 'loads components for the hero in the heroConfig in the given session', ->
@@ -141,7 +141,7 @@ describe 'LevelLoader', ->
     jasmine.Ajax.requests.sendResponses(responses)
     requests = jasmine.Ajax.requests.all()
     urls = (r.url for r in requests)
-    expect('/db/thang.type/mace/version?project=name,components,original' in urls).toBeTruthy()
+    expect('/db/thang.type/mace/version?project=name,components,original,rasterIcon,kind' in urls).toBeTruthy()
 
   it 'loads components which are inherited by level thangs from thang type default components', ->
     new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'})
@@ -165,7 +165,7 @@ describe 'LevelLoader', ->
     jasmine.Ajax.requests.sendResponses(responses)
     requests = jasmine.Ajax.requests.all()
     urls = (r.url for r in requests)
-    expect('/db/thang.type/wand/version?project=name,components,original' in urls).toBeTruthy()
+    expect('/db/thang.type/wand/version?project=name,components,original,rasterIcon,kind' in urls).toBeTruthy()
 
   it 'loads components for item thang types which are inherited by level thangs from thang type default equips component configs', ->
     new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'})
@@ -173,7 +173,7 @@ describe 'LevelLoader', ->
     responses =
       '/db/level/id': levelWithShaman
       '/db/thang.type/names': [thangTypeShamanWithWandEquipped]
-      '/db/thang.type/wand/version?project=name,components,original': thangTypeWand
+      '/db/thang.type/wand/version?project=name,components,original,rasterIcon,kind': thangTypeWand
 
     jasmine.Ajax.requests.sendResponses(responses)
     requests = jasmine.Ajax.requests.all()
diff --git a/test/app/views/play/level/tome/Problem.spec.coffee b/test/app/views/play/level/tome/Problem.spec.coffee
index cf663225c..27ec88c8b 100644
--- a/test/app/views/play/level/tome/Problem.spec.coffee
+++ b/test/app/views/play/level/tome/Problem.spec.coffee
@@ -10,7 +10,7 @@ describe 'Problem', ->
       addMarker: ->
     }
   }
-  aether = { 
+  aether = {
     raw: "this.say('hi');\nthis.sad('bye');"
     language: { id: 'javascript' }
   }
@@ -27,7 +27,8 @@ describe 'Problem', ->
   }
   levelID = 'awesome'
 
-  it 'save user code problem', ->
+  # TODO: Problems are no longer saved when creating Problems; instead it's in SpellView. Update tests?
+  xit 'save user code problem', ->
     new Problem aether, aetherProblem, ace, false, true, levelID
     expect(jasmine.Ajax.requests.count()).toBe(1)
 
@@ -46,7 +47,7 @@ describe 'Problem', ->
     expect(params.language).toEqual(aether.language.id)
     expect(params.levelID).toEqual(levelID)
 
-  it 'save user code problem no range', ->
+  xit 'save user code problem no range', ->
     aetherProblem.range = null
     new Problem aether, aetherProblem, ace, false, true, levelID
     expect(jasmine.Ajax.requests.count()).toBe(1)
@@ -68,7 +69,7 @@ describe 'Problem', ->
     expect(params.codeSnippet).toBeUndefined()
     expect(params.errRange).toBeUndefined()
 
-  it 'save user code problem multi-line snippet', ->
+  xit 'save user code problem multi-line snippet', ->
     aether.raw = "this.say('hi');\nthis.sad\n('bye');"
     aetherProblem.range = [ { row: 1 }, { row: 2 } ]
 

From 1219710cbb5194b0bb0f2af6e174f1c8273645a2 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 09:41:28 -0700
Subject: [PATCH 35/46] Starting to work on codeProblems goal type. Rearranged
 script import for publishing notes earlier. Fallback for Math.log10.

---
 app/lib/world/GoalManager.coffee                  | 15 ++++++++++++++-
 app/lib/world/world.coffee                        |  2 +-
 app/schemas/subscriptions/world.coffee            |  9 +++++++++
 .../play/level/modal/HeroVictoryModal.coffee      |  2 +-
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/app/lib/world/GoalManager.coffee b/app/lib/world/GoalManager.coffee
index 8f629989e..a3d443848 100644
--- a/app/lib/world/GoalManager.coffee
+++ b/app/lib/world/GoalManager.coffee
@@ -44,6 +44,7 @@ module.exports = class GoalManager extends CocoClass
     'world:thang-touched-goal': 'onThangTouchedGoal'
     'world:thang-left-map': 'onThangLeftMap'
     'world:thang-collected-item': 'onThangCollectedItem'
+    'world:user-code-problem': 'onUserCodeProblem'
     'world:ended': 'onWorldEnded'
 
   onLevelRestarted: ->
@@ -140,6 +141,8 @@ module.exports = class GoalManager extends CocoClass
       @initGoalState(state, [goal.getToLocations?.who, goal.keepFromLocations?.who], 'arrived')
       @initGoalState(state, [goal.leaveOffSides?.who, goal.keepFromLeavingOffSides?.who], 'left')
       @initGoalState(state, [goal.collectThangs?.targets, goal.keepFromCollectingThangs?.targets], 'collected')
+      @initGoalState(state, [goal.linesOfCode?.who], 'lines')  # TODO: find out how many lines there are
+      @initGoalState(state, [goal.codeProblems?.who], 'problems')  # TODO: count initial problems, not just runtime
       @goalStates[goal.id] = state
 
   onThangDied: (e, frameNumber) ->
@@ -187,6 +190,14 @@ module.exports = class GoalManager extends CocoClass
     return unless thang.id in who or thang.team in who
     @updateGoalState(goalID, itemID, 'collected', frameNumber)
 
+  onUserCodeProblem: (e, frameNumber) ->
+    for goal in @goals ? [] when goal.codeProblems
+      @checkCodeProblem goal.id, goal.codeProblems.who, e.thang, frameNumber
+
+  checkCodeProblem: (goalID, who, thang, frameNumber) ->
+    return unless thang.id in who or thang.team in who
+    @updateGoalState goal.id, thang.id, 'problems', frameNumber
+
   wrapUpGoalStates: (finalFrame) ->
     for goalID, state of @goalStates
       if state.status is null
@@ -247,7 +258,7 @@ module.exports = class GoalManager extends CocoClass
       # saveThangs: by default we would want to save all the Thangs, which means that we would want none of them to be 'done'
       numNeeded = _.size(stateThangs) - Math.max((goal.howMany ? 1), _.size stateThangs) + 1
     numDone = _.filter(stateThangs).length
-    #console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs
+    #console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs, 'for', goalID, thangID, 'on frame', frameNumber
     return unless numDone >= numNeeded
     return if state.status and not success  # already failed it; don't wipe keyframe
     state.status = if success then 'success' else 'failure'
@@ -278,6 +289,8 @@ module.exports = class GoalManager extends CocoClass
     keepFromLeavingOffSides: 0
     collectThangs: 1
     keepFromCollectingThangs: 0
+    linesOfCode: 0
+    codeProblems: 0
 
   updateCodeGoalStates: ->
     # TODO
diff --git a/app/lib/world/world.coffee b/app/lib/world/world.coffee
index 34f24153a..7b967a86f 100644
--- a/app/lib/world/world.coffee
+++ b/app/lib/world/world.coffee
@@ -201,9 +201,9 @@ module.exports = class World
     @levelID = level.slug
     @levelComponents = level.levelComponents
     @thangTypes = level.thangTypes
+    @loadScriptsFromLevel level
     @loadSystemsFromLevel level
     @loadThangsFromLevel level, willSimulate
-    @loadScriptsFromLevel level
     system.start @thangs for system in @systems
 
   loadSystemsFromLevel: (level) ->
diff --git a/app/schemas/subscriptions/world.coffee b/app/schemas/subscriptions/world.coffee
index 2e38a32b2..31076e148 100644
--- a/app/schemas/subscriptions/world.coffee
+++ b/app/schemas/subscriptions/world.coffee
@@ -30,3 +30,12 @@ module.exports =
     thang: {type: 'object'}
 
   'world:custom-script-trigger': {type: 'object'}
+
+  'world:user-code-problem': c.object {required: ['thang', 'problem']},
+    thang: {type: 'object'}
+    problem: c.object {required: ['message', 'level', 'type']},  #, 'userInfo', 'error']},
+      userInfo: {type: 'object'}
+      message: {type: 'string'}
+      level: {type: 'string', enum: ['info', 'warning', 'error']}
+      type: {type: 'string'}
+      error: {type: 'object'}
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index 2158eba75..87097eba6 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -146,7 +146,7 @@ module.exports = class HeroVictoryModal extends ModalView
   tickNumberAnimation: =>
     # TODO: make sure the animation pulses happen when the numbers go up and sounds play (up to a max speed)
     return @endAnimateNumbers() unless panel = @numericalItemPanels[0]
-    duration = Math.log10(panel.number + 1) * 1000
+    duration = Math.log(panel.number + 1) / Math.LN10 * 1000  # Math.log10 is ES6
     ratio = @getEaseRatio (new Date() - @numberAnimationStart), duration
     if panel.unit is 'xp'
       totalXP = @totalXPAnimated + Math.floor(ratio * panel.number)

From 67166f14967abba14dd5f8e42fad7ce49b6cb5f6 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 09:41:58 -0700
Subject: [PATCH 36/46] Removed a log.

---
 app/lib/LevelLoader.coffee | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index afddc8720..fcd824fe9 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -98,7 +98,6 @@ module.exports = class LevelLoader extends CocoClass
     @sessionDependenciesRegistered ?= {}
     heroConfig = session.get('heroConfig')
     heroConfig ?= me.get('heroConfig') if session is @session and not @headless
-    console.error @level.get('name'), session.get('team'), session.get('creatorName'), 'had hero', heroConfig.thangType
     heroConfig ?= {inventory: {}, thangType: '529ffbf1cf1818f2be000001'}  # If all else fails, assign Tharin as the hero.
     session.set 'heroConfig', heroConfig unless _.isEqual heroConfig, session.get('heroConfig')
     url = "/db/thang.type/#{heroConfig.thangType}/version"

From ec3e1d0bcecf2564b9fd850eed14b225f8679d8a Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 13:57:32 -0700
Subject: [PATCH 37/46] Added optional goals. Working on lines-of-code goal.
 Fixed bugs with HeroVictoryModal not firing.

---
 app/lib/world/GoalManager.coffee              | 25 ++++++++++++++-----
 app/lib/world/world.coffee                    |  2 +-
 app/schemas/models/level.coffee               |  3 +++
 app/schemas/subscriptions/world.coffee        |  4 +++
 app/styles/play/world-map-view.sass           |  4 +++
 .../play/level/modal/HeroVictoryModal.coffee  |  1 +
 6 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/app/lib/world/GoalManager.coffee b/app/lib/world/GoalManager.coffee
index a3d443848..036f5d238 100644
--- a/app/lib/world/GoalManager.coffee
+++ b/app/lib/world/GoalManager.coffee
@@ -45,7 +45,7 @@ module.exports = class GoalManager extends CocoClass
     'world:thang-left-map': 'onThangLeftMap'
     'world:thang-collected-item': 'onThangCollectedItem'
     'world:user-code-problem': 'onUserCodeProblem'
-    'world:ended': 'onWorldEnded'
+    'world:lines-of-code-counted': 'onLinesOfCodeCounted'
 
   onLevelRestarted: ->
     @goals = []
@@ -116,10 +116,12 @@ module.exports = class GoalManager extends CocoClass
   checkOverallStatus: (ignoreIncomplete=false) ->
     overallStatus = null
     goals = if @goalStates then _.values @goalStates else []
+    goals = (g for g in goals when not g.optional)
     goals = (g for g in goals when g.team in [undefined, @team]) if @team
     statuses = if @goalStates then (goal.status for goal in goals) else []
     overallStatus = 'success' if statuses.length > 0 and _.every(statuses, (s) -> s is 'success' or (ignoreIncomplete and s is null))
     overallStatus = 'failure' if statuses.length > 0 and 'failure' in statuses
+    #console.log 'got overallStatus', overallStatus, 'from goals', goals, 'goalStates', @goalStates, 'statuses', statuses
     overallStatus
 
   # WORLD GOAL TRACKING
@@ -132,6 +134,7 @@ module.exports = class GoalManager extends CocoClass
         status: null # should eventually be either 'success', 'failure', or 'incomplete'
         keyFrame: 0 # when it became a 'success' or 'failure'
         team: goal.team
+        optional: goal.optional
       }
       @initGoalState(state, [goal.killThangs, goal.saveThangs], 'killed')
       for getTo in goal.getAllToLocations ? []
@@ -142,7 +145,7 @@ module.exports = class GoalManager extends CocoClass
       @initGoalState(state, [goal.leaveOffSides?.who, goal.keepFromLeavingOffSides?.who], 'left')
       @initGoalState(state, [goal.collectThangs?.targets, goal.keepFromCollectingThangs?.targets], 'collected')
       @initGoalState(state, [goal.linesOfCode?.who], 'lines')  # TODO: find out how many lines there are
-      @initGoalState(state, [goal.codeProblems?.who], 'problems')  # TODO: count initial problems, not just runtime
+      @initGoalState(state, [goal.codeProblems], 'problems')  # TODO: count initial problems, not just runtime
       @goalStates[goal.id] = state
 
   onThangDied: (e, frameNumber) ->
@@ -192,11 +195,21 @@ module.exports = class GoalManager extends CocoClass
 
   onUserCodeProblem: (e, frameNumber) ->
     for goal in @goals ? [] when goal.codeProblems
-      @checkCodeProblem goal.id, goal.codeProblems.who, e.thang, frameNumber
+      @checkCodeProblem goal.id, goal.codeProblems, e.thang, frameNumber
 
   checkCodeProblem: (goalID, who, thang, frameNumber) ->
     return unless thang.id in who or thang.team in who
-    @updateGoalState goal.id, thang.id, 'problems', frameNumber
+    @updateGoalState goalID, thang.id, 'problems', frameNumber
+
+  onLinesOfCodeCounted: (e, frameNumber) ->
+    for goal in @goals ? [] when goal.linesOfCode
+      @checkLinesOfCode goal.id, goal.linesOfCode, e.thang, e.linesUsed, frameNumber
+
+  checkLinesOfCode: (goalID, who, thang, linesUsed, frameNumber) ->
+    return unless thang.id in who or thang.team in who
+    # TODO: somehow pull in linesUsed
+    console.log 'checkLinesOfCode', goalID, who, thang, linesUsed, frameNumber
+    #@updateGoalState goalID, thang.id, 'lines', frameNumber
 
   wrapUpGoalStates: (finalFrame) ->
     for goalID, state of @goalStates
@@ -258,12 +271,12 @@ module.exports = class GoalManager extends CocoClass
       # saveThangs: by default we would want to save all the Thangs, which means that we would want none of them to be 'done'
       numNeeded = _.size(stateThangs) - Math.max((goal.howMany ? 1), _.size stateThangs) + 1
     numDone = _.filter(stateThangs).length
-    #console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs, 'for', goalID, thangID, 'on frame', frameNumber
+    console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs, 'for', goalID, thangID, 'on frame', frameNumber
     return unless numDone >= numNeeded
     return if state.status and not success  # already failed it; don't wipe keyframe
     state.status = if success then 'success' else 'failure'
     state.keyFrame = frameNumber
-    #console.log goalID, 'became', success, 'on frame', frameNumber, 'with overallStatus', @checkOverallStatus true
+    console.log goalID, 'became', success, 'on frame', frameNumber, 'with overallStatus', @checkOverallStatus true
     if overallStatus = @checkOverallStatus true
       matchedGoals = (_.find(@goals, {id: goalID}) for goalID, goalState of @goalStates when goalState.status is overallStatus)
       mostEagerGoal = _.min matchedGoals, 'worldEndsAfter'
diff --git a/app/lib/world/world.coffee b/app/lib/world/world.coffee
index 7b967a86f..eed0f7cc9 100644
--- a/app/lib/world/world.coffee
+++ b/app/lib/world/world.coffee
@@ -307,7 +307,7 @@ module.exports = class World
   publishNote: (channel, event) ->
     event ?= {}
     channel = 'world:' + channel
-    for script in @scripts
+    for script in @scripts ? []
       continue if script.channel isnt channel
       scriptNote = new WorldScriptNote script, event
       continue if scriptNote.invalid
diff --git a/app/schemas/models/level.coffee b/app/schemas/models/level.coffee
index be5b83621..df02026c3 100644
--- a/app/schemas/models/level.coffee
+++ b/app/schemas/models/level.coffee
@@ -31,6 +31,7 @@ GoalSchema = c.object {title: 'Goal', description: 'A goal that the player can a
   worldEndsAfter: {title: 'World Ends After', description: 'When included, ends the world this many seconds after this goal succeeds or fails.', type: 'number', minimum: 0, exclusiveMinimum: true, maximum: 300, default: 3}
   howMany: {title: 'How Many', description: 'When included, require only this many of the listed goal targets instead of all of them.', type: 'integer', minimum: 1}
   hiddenGoal: {title: 'Hidden', description: 'Hidden goals don\'t show up in the goals area for the player until they\'re failed. (Usually they\'re obvious, like "don\'t die".)', 'type': 'boolean' }
+  optional: {title: 'Optional', description: 'Optional goals do not need to be completed for overallStatus to be success.', type: 'boolean'}
   team: c.shortString(title: 'Team', description: 'Name of the team this goal is for, if it is not for all of the playable teams.')
   killThangs: c.array {title: 'Kill Thangs', description: 'A list of Thang IDs the player should kill, or team names.', uniqueItems: true, minItems: 1, 'default': ['ogres']}, thang
   saveThangs: c.array {title: 'Save Thangs', description: 'A list of Thang IDs the player should save, or team names', uniqueItems: true, minItems: 1, 'default': ['humans']}, thang
@@ -62,6 +63,8 @@ GoalSchema = c.object {title: 'Goal', description: 'A goal that the player can a
   keepFromCollectingThangs: c.object {title: 'Keep From Collecting', description: 'Thangs that the player must prevent other Thangs from collecting.', required: ['who', 'targets']},
     who: c.array {title: 'Who', description: 'The Thangs which must not collect the target items.', minItems: 1}, thang
     targets: c.array {title: 'Targets', description: 'The target items which the Thangs must not collect.', minItems: 1}, thang
+  codeProblems: c.array {title: 'Code Problems', description: 'A list of Thang IDs that should not have any code problems, or team names.', uniqueItems: true, minItems: 1, 'default': ['humans']}, thang
+  linesOfCode: {title: 'Lines of Code', description: 'A mapping of Thang IDs or teams to how many many lines of code should be allowed (well, statements).', type: 'object', default: {humans: 10}, additionalProperties: {type: 'integer', description: 'How many lines to allow for this Thang.'}}
 
 ResponseSchema = c.object {title: 'Dialogue Button', description: 'A button to be shown to the user with the dialogue.', required: ['text']},
   text: {title: 'Title', description: 'The text that will be on the button', 'default': 'Okay', type: 'string', maxLength: 30}
diff --git a/app/schemas/subscriptions/world.coffee b/app/schemas/subscriptions/world.coffee
index 31076e148..80d97647d 100644
--- a/app/schemas/subscriptions/world.coffee
+++ b/app/schemas/subscriptions/world.coffee
@@ -39,3 +39,7 @@ module.exports =
       level: {type: 'string', enum: ['info', 'warning', 'error']}
       type: {type: 'string'}
       error: {type: 'object'}
+
+  'world:lines-of-code-counted': c.object {required: ['thang', 'linesUsed']},
+    thang: {type: 'object'}
+    linesUsed: {type: 'integer'}
diff --git a/app/styles/play/world-map-view.sass b/app/styles/play/world-map-view.sass
index 9da4c8e1e..36a3de10f 100644
--- a/app/styles/play/world-map-view.sass
+++ b/app/styles/play/world-map-view.sass
@@ -287,3 +287,7 @@ $gameControlMargin: 30px
 
     &.vol-down .glyphicon.glyphicon-volume-down
       display: inline-block
+
+body:not(.ipad) #world-map-view
+  .level-info-container
+    pointer-events: none
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index 87097eba6..3c354db9f 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -93,6 +93,7 @@ module.exports = class HeroVictoryModal extends ModalView
     c.thangTypes = @thangTypes
     c.me = me
     c.readyToRank = @level.get('type', true) is 'hero-ladder' and @session.readyToRank()
+    c.level = @level
     return c
 
   afterRender: ->

From d0b878db370e8fd49618e73b013461c99ab8a139 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 14:43:18 -0700
Subject: [PATCH 38/46] Implemented lines-of-code goal type.

---
 app/lib/world/GoalManager.coffee | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/app/lib/world/GoalManager.coffee b/app/lib/world/GoalManager.coffee
index 036f5d238..05278be22 100644
--- a/app/lib/world/GoalManager.coffee
+++ b/app/lib/world/GoalManager.coffee
@@ -144,8 +144,8 @@ module.exports = class GoalManager extends CocoClass
       @initGoalState(state, [goal.getToLocations?.who, goal.keepFromLocations?.who], 'arrived')
       @initGoalState(state, [goal.leaveOffSides?.who, goal.keepFromLeavingOffSides?.who], 'left')
       @initGoalState(state, [goal.collectThangs?.targets, goal.keepFromCollectingThangs?.targets], 'collected')
-      @initGoalState(state, [goal.linesOfCode?.who], 'lines')  # TODO: find out how many lines there are
-      @initGoalState(state, [goal.codeProblems], 'problems')  # TODO: count initial problems, not just runtime
+      @initGoalState(state, [goal.codeProblems], 'problems')
+      @initGoalState(state, [_.keys(goal.linesOfCode ? {})], 'lines')
       @goalStates[goal.id] = state
 
   onThangDied: (e, frameNumber) ->
@@ -206,10 +206,8 @@ module.exports = class GoalManager extends CocoClass
       @checkLinesOfCode goal.id, goal.linesOfCode, e.thang, e.linesUsed, frameNumber
 
   checkLinesOfCode: (goalID, who, thang, linesUsed, frameNumber) ->
-    return unless thang.id in who or thang.team in who
-    # TODO: somehow pull in linesUsed
-    console.log 'checkLinesOfCode', goalID, who, thang, linesUsed, frameNumber
-    #@updateGoalState goalID, thang.id, 'lines', frameNumber
+    return unless linesAllowed = who[thang.id] ? who[thang.team]
+    @updateGoalState goalID, thang.id, 'lines', frameNumber if linesUsed > linesAllowed
 
   wrapUpGoalStates: (finalFrame) ->
     for goalID, state of @goalStates
@@ -271,12 +269,12 @@ module.exports = class GoalManager extends CocoClass
       # saveThangs: by default we would want to save all the Thangs, which means that we would want none of them to be 'done'
       numNeeded = _.size(stateThangs) - Math.max((goal.howMany ? 1), _.size stateThangs) + 1
     numDone = _.filter(stateThangs).length
-    console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs, 'for', goalID, thangID, 'on frame', frameNumber
+    #console.log 'needed', numNeeded, 'done', numDone, 'of total', _.size(stateThangs), 'with how many', goal.howMany, 'and stateThangs', stateThangs, 'for', goalID, thangID, 'on frame', frameNumber
     return unless numDone >= numNeeded
     return if state.status and not success  # already failed it; don't wipe keyframe
     state.status = if success then 'success' else 'failure'
     state.keyFrame = frameNumber
-    console.log goalID, 'became', success, 'on frame', frameNumber, 'with overallStatus', @checkOverallStatus true
+    #console.log goalID, 'became', success, 'on frame', frameNumber, 'with overallStatus', @checkOverallStatus true
     if overallStatus = @checkOverallStatus true
       matchedGoals = (_.find(@goals, {id: goalID}) for goalID, goalState of @goalStates when goalState.status is overallStatus)
       mostEagerGoal = _.min matchedGoals, 'worldEndsAfter'

From bc15ccd240040ff78d1f68172702d424a464e83a Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 16:13:56 -0700
Subject: [PATCH 39/46] Fixed panel vs. total counts on other achievements.

---
 app/views/editor/DeltaView.coffee                  | 10 ++++++++--
 app/views/play/level/modal/HeroVictoryModal.coffee | 10 ++++++----
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/app/views/editor/DeltaView.coffee b/app/views/editor/DeltaView.coffee
index 76208c76f..c55aed360 100644
--- a/app/views/editor/DeltaView.coffee
+++ b/app/views/editor/DeltaView.coffee
@@ -94,11 +94,17 @@ module.exports = class DeltaView extends CocoView
 
     if _.isObject(deltaData.left) and leftEl = deltaEl.find('.old-value')
       options = _.defaults {data: deltaData.left}, treemaOptions
-      TreemaNode.make(leftEl, options).build()
+      try
+        TreemaNode.make(leftEl, options).build()
+      catch error
+        console.error "Couldn't show left details Treema for", deltaData.left, treemaOptions
 
     if _.isObject(deltaData.right) and rightEl = deltaEl.find('.new-value')
       options = _.defaults {data: deltaData.right}, treemaOptions
-      TreemaNode.make(rightEl, options).build()
+      try
+        TreemaNode.make(rightEl, options).build()
+      catch error
+        console.error "Couldn't show right details Treema for", deltaData.right, treemaOptions
 
     if deltaData.action is 'text-diff'
       return console.error "Couldn't show diff for left: #{deltaData.left}, right: #{deltaData.right} of delta:", deltaData unless deltaData.left? and deltaData.right?
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index 3c354db9f..eb516d11b 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -150,17 +150,19 @@ module.exports = class HeroVictoryModal extends ModalView
     duration = Math.log(panel.number + 1) / Math.LN10 * 1000  # Math.log10 is ES6
     ratio = @getEaseRatio (new Date() - @numberAnimationStart), duration
     if panel.unit is 'xp'
-      totalXP = @totalXPAnimated + Math.floor(ratio * panel.number)
+      newXP = Math.floor(ratio * panel.number)
+      totalXP = @totalXPAnimated + newXP
       if totalXP isnt @lastTotalXP
-        panel.textEl.text('+' + totalXP)
+        panel.textEl.text('+' + newXP)
         @XPEl.text('+' + totalXP)
         xpTrigger = 'xp-' + (totalXP % 6)  # 6 xp sounds
         Backbone.Mediator.publish 'audio-player:play-sound', trigger: xpTrigger, volume: 0.5 + ratio / 2
         @lastTotalXP = totalXP
     else
-      totalGems = @totalGemsAnimated + Math.floor(ratio * panel.number)
+      newGems = Math.floor(ratio * panel.number)
+      totalGems = @totalGemsAnimated + newGems
       if totalGems isnt @lastTotalGems
-        panel.textEl.text('+' + totalGems)
+        panel.textEl.text('+' + newGems)
         @gemEl.text('+' + totalGems)
         gemTrigger = 'gem-' + (parseInt(panel.number * ratio) % 4)  # 4 gem sounds
         Backbone.Mediator.publish 'audio-player:play-sound', trigger: gemTrigger, volume: 0.5 + ratio / 2

From e3f894805f89eb6888d34b357af56cb90f4ef901 Mon Sep 17 00:00:00 2001
From: Volkan Gezer <wakeup@users.noreply.github.com>
Date: Tue, 21 Oct 2014 01:44:36 +0200
Subject: [PATCH 40/46] some updates to turkish language

---
 app/locale/tr.coffee | 252 +++++++++++++++++++++----------------------
 1 file changed, 126 insertions(+), 126 deletions(-)

diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee
index 076f18cd0..df5d87c93 100644
--- a/app/locale/tr.coffee
+++ b/app/locale/tr.coffee
@@ -6,27 +6,27 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     play: "Oyna" # The big play button that just starts playing a level
     old_browser: "Olamaz, Tarayıcınız CodeCombat'ı çalıştırmak için çok eski. Üzgünüz!" # Warning that shows up on really old Firefox/Chrome/Safari
     old_browser_suffix: "Deneyebilirsiniz, ama muhtemelen oyun çalışmayacaktır."
-    campaign: "Senaryo Modu"
+    campaign: "Senaryo Kipi"
     for_beginners: "Yeni Başlayanlar için"
-    multiplayer: "Çoklu-oyuncu Modu" # Not currently shown on home page
+    multiplayer: "Çoklu-oyuncu Kipi" # Not currently shown on home page
     for_developers: "Geliştiriciler için" # Not currently shown on home page.
-#    javascript_blurb: "The language of the web. Great for writing websites, web apps, HTML5 games, and servers." # Not currently shown on home page
-#    python_blurb: "Simple yet powerful, Python is a great general purpose programming language." # Not currently shown on home page
-#    coffeescript_blurb: "Nicer JavaScript syntax." # Not currently shown on home page
-#    clojure_blurb: "A modern Lisp." # Not currently shown on home page
-#    lua_blurb: "Game scripting language." # Not currently shown on home page
-#    io_blurb: "Simple but obscure." # Not currently shown on home page
+    javascript_blurb: "Web'in dili. web siteleri, web uygulamaları, HTML5 oyunları ve sunucular yazmak için mükemmeldir." # Not currently shown on home page
+    python_blurb: "Basit ancak güçlü. Python mükemmel bir genel amaçlı dildir." # Not currently shown on home page
+    coffeescript_blurb: "Daha iyi JavaScript sözdizimi." # Not currently shown on home page
+    clojure_blurb: "Modern bir Lisp." # Not currently shown on home page
+    lua_blurb: "Oyun betik dili." # Not currently shown on home page
+    io_blurb: "Basit fakat anlaşılması güç." # Not currently shown on home page
 
   nav:
     play: "Oyna" # The top nav bar entry where players choose which levels to play
-#    community: "Community"
+    community: "Topluluk"
     editor: "Düzenleyici"
     blog: "Blog"
     forum: "Forum"
-#    account: "Account"
-#    profile: "Profile"
-#    stats: "Stats"
-#    code: "Code"
+    account: "Hesap"
+    profile: "Profil"
+    stats: "İstatistikler"
+    code: "Kod"
     admin: "Yönetici" # Only shows up when you are an admin
     home: "Anasayfa"
     contribute: "Katkıda bulun"
@@ -34,7 +34,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     about: "Hakkında"
     contact: "İletişim"
     twitter_follow: "Takip et"
-#    teachers: "Teachers"
+    teachers: "Öğretmenler"
 
   modal:
     close: "Kapat"
@@ -54,25 +54,25 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
   play:
     play_as: "Olarak Oyna" # Ladder page
     spectate: "İzleyici olarak katıl" # 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
-#    heroes: "Heroes" # Tooltip on hero shop button from /play
-#    achievements: "Achievements" # Tooltip on achievement list button from /play
-#    account: "Account" # Tooltip on account button from /play
-#    settings: "Settings" # Tooltip on settings button from /play
-#    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"
-#    older_campaigns: "Older Campaigns"
-#    anonymous: "Anonymous Player"
+    players: "oyuncu" # Hover over a level on /play
+    hours_played: "saat oynandı" # Hover over a level on /play
+    items: "Ögeler" # Tooltip on item shop button from /play
+    heroes: "Kahramanlar" # Tooltip on hero shop button from /play
+    achievements: "Başarımlar" # Tooltip on achievement list button from /play
+    account: "Hesap" # Tooltip on account button from /play
+    settings: "Ayarlar" # Tooltip on settings button from /play
+    next: "İleri" # Go from choose hero to choose inventory before playing a level
+    change_hero: "Kahramanı Değiştir" # Go back from choose inventory to choose hero
+    choose_inventory: "Ögeleri Giy"
+    older_campaigns: "Daha Eski Görevler"
+    anonymous: "Anonim Oyuncu"
     level_difficulty: "Zorluk: "
     campaign_beginner: "Acemi Seferi"
     choose_your_level: "Seviye Seçimi" # The rest of this section is the old play view at /play-old and isn't very important.
     adventurer_prefix: "Aşağıdaki seviyelerden birini doğrudan oynayabilirsiniz, veya seviye ile ilgili "
     adventurer_forum: "Maceracı forumunda"
     adventurer_suffix: " tartışabilirsiniz."
-#    campaign_old_beginner: "Old Beginner Campaign"
+    campaign_old_beginner: "Eski Yeni Başlayan Görevi"
     campaign_old_beginner_description: "Programlama büyüsünü öğrenmek için..."
     campaign_dev: "Rastgele Daha Zor Seviyeler"
     campaign_dev_description: "Biraz daha zor işlerle uğraşırken arayüzü öğrenmek için..."
@@ -80,15 +80,15 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     campaign_multiplayer_description: "Diğer oyuncularla kafa kafaya verip kodlamak için..."
     campaign_player_created: "Oyuncuların Oluşturdukları"
     campaign_player_created_description: "<a href=\"/contribute#artisan\">Zanaatkâr Büyücüler</a>in yaratıcılıklarına karşı mücadele etmek için..."
-#    campaign_classic_algorithms: "Classic Algorithms"
-#    campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
+    campaign_classic_algorithms: "Klasik Algoritmalar"
+    campaign_classic_algorithms_description: "... Bilgisayar Bilimleri'nde öğrendiğiniz en yaygın algoritmalar."
 
   login:
-    sign_up: "Kaydol"
+    sign_up: "Hesap Oluştur"
     log_in: "Giriş Yap"
     logging_in: "Giriş Yapılıyor"
     log_out: "Çıkış Yap"
-    recover: "şifrenizi sıfırlayabilirsiniz."
+    recover: "hesabı kurtar."
 
   signup:
     create_account_title: "İlerlemenizi Kaydetmek için Hesap Oluşturun"
@@ -99,42 +99,42 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     creating: "Hesap oluşturuluyor..."
     sign_up: "Kaydol"
     log_in: "buradan giriş yapabilirsiniz."
-#    social_signup: "Or, you can sign up through Facebook or G+:"
-#    required: "You need to log in before you can go that way."
+    social_signup: "veya Facebook ya da G+ ile oturum açabilirsiniz:"
+    required: "Buraya gidebilmeniz için oturum açmanız gerekli."
 
   recover:
     recover_account_title: "Hesabı Kurtar"
     send_password: "Kurtarma Parolası Gönder"
-#    recovery_sent: "Recovery email sent."
+    recovery_sent: "Kurtarma e-postası gönderildi."
 
 #  items:
-#    armor: "Armor"
-#    hands: "Hands"
-#    accessories: "Accessories"
-#    minions: "Minions"
-#    misc: "Misc"
+    armor: "Zırh"
+    hands: "Eller"
+    accessories: "Aksesuarlar"
+    minions: "Köleler"
+    misc: "Çeşitli"
 
   common:
     loading: "Yükleniyor..."
     saving: "Kaydediliyor..."
     sending: "Gönderiliyor..."
-#    send: "Send"
+    send: "Gönder"
     cancel: "İptal"
     save: "Kaydet"
-#    publish: "Publish"
+    publish: "Yayınla"
     create: "Oluştur"
     manual: "El ile"
     fork: "Çatalla"
     play: "Oyna" # When used as an action verb, like "Play next level"
     retry: "Yeniden Dene"
-#    watch: "Watch"
-#    unwatch: "Unwatch"
-#    submit_patch: "Submit Patch"
+    watch: "İzle"
+    unwatch: "İzlemeyi Bırak"
+    submit_patch: "Yama Gönder"
 
   general:
     and: "ve"
     name: "İsim"
-#    date: "Date"
+    date: "Tarih"
     body: "Gövde"
     version: "Sürüm"
     commit_msg: "Gönderme İletisi"
@@ -144,12 +144,12 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     results: "Sonuçlar"
     description: "Açıklama"
     or: "veya"
-#    subject: "Subject"
+    subject: "Konu"
     email: "E-posta"
     password: "Şifre"
     message: "İleti"
     code: "Kod"
-#    ladder: "Ladder"
+    ladder: "Merdiven"
     when: "iken"
     opponent: "Rakip"
     rank: "Sıra"
@@ -160,7 +160,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     easy: "Kolay"
     medium: "Normal"
     hard: "Zor"
-#    player: "Player"
+    player: "Oyuncu"
 
   units:
     second: "saniye"
@@ -169,28 +169,28 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     minutes: "dakika"
     hour: "saat"
     hours: "saat"
-#    day: "day"
-#    days: "days"
-#    week: "week"
-#    weeks: "weeks"
-#    month: "month"
-#    months: "months"
-#    year: "year"
-#    years: "years"
+    day: "gün"
+    days: "gün"
+    week: "hafta"
+    weeks: "hafta"
+    month: "ay"
+    months: "ay"
+    year: "yıl"
+    years: "yıl"
 
   play_level:
     done: "Tamamdır"
     home: "Anasayfa"
-#    skip: "Skip"
-#    game_menu: "Game Menu"
+    skip: "Atla"
+    game_menu: "Oyun Menüsü"
     guide: "Rehber"
     restart: "Yeniden başlat"
     goals: "Hedefler"
-#    goal: "Goal"
-#    success: "Success!"
-#    incomplete: "Incomplete"
-#    timed_out: "Ran out of time"
-#    failing: "Failing"
+    goal: "Amaç"
+    success: "Başarılı!"
+    incomplete: "Tamamlanmamış"
+    timed_out: "Süre bitti"
+    failing: "Başarısız"
     action_timeline: "Eylem Çizelgesi"
     click_to_select: "Birimi seçmek için üzerine tıklayın."
     reload_title: "Tüm kod yeniden yüklensin mi?"
@@ -198,40 +198,40 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     reload_confirm: "Tümünü Yeniden Yükle"
     victory_title_prefix: ""
     victory_title_suffix: "Tamamlandı "
-    victory_sign_up: " Güncellemelere Abone Ol"
-    victory_sign_up_poke: "Son haberleri e-postanızda görmek ister misiniz? Ücretsiz bir hesap oluşturmanız durumunda sizi bilgilendirebiliriz."
+    victory_sign_up: "İlerlemeyi Kaydetmek için Kaydolun"
+    victory_sign_up_poke: "Kodu kaydetmek ister misiniz? Ücretsiz bir hesap oluşturun!"
     victory_rate_the_level: "Seviyeyi oyla:" # Only in old-style levels.
-#    victory_return_to_ladder: "Return to Ladder"
+    victory_return_to_ladder: "Merdivene Dön"
     victory_play_next_level: "Sonraki Seviyeyi Oyna: " # Only in old-style levels.
-#    victory_play_continue: "Continue"
-#    victory_saving_progress: "Saving Progress"
+    victory_play_continue: "Devam Et"
+    victory_saving_progress: "İlerlemeyi Kaydediliyor"
     victory_go_home: "Anasayfaya Git" # Only in old-style levels.
-    victory_review: "Daha detaylı bilgi verebilirsiniz!" # Only in old-style levels.
+    victory_review: "Daha fazla söyleyin!" # Only in old-style levels.
     victory_hour_of_code_done: "Bitirdiniz mi?"
     victory_hour_of_code_done_yes: "Evet, Kod Saatimi (Hour of Code) bitirdim!"
     guide_title: "Rehber"
     tome_minion_spells: "Minyonlarınızın Büyüleri" # Only in old-style levels.
     tome_read_only_spells: "Salt Okunur Büyüler" # Only in old-style levels.
     tome_other_units: "Diğer Birimler" # Only in old-style levels.
-    tome_cast_button_castable: "Fırlatılabilir" # Temporary, if tome_cast_button_run isn't translated.
-    tome_cast_button_casting: "Fırlatılıyor" # Temporary, if tome_cast_button_running isn't translated.
-    tome_cast_button_cast: "Fırlat" # Temporary, if tome_cast_button_ran isn't translated.
-#    tome_cast_button_run: "Run"
-#    tome_cast_button_running: "Running"
-#    tome_cast_button_ran: "Ran"
-#    tome_submit_button: "Submit"
-#    tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
-#    tome_select_method: "Select a Method"
-#    tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
+    tome_cast_button_castable: "Başlatılabilir" # Temporary, if tome_cast_button_run isn't translated.
+    tome_cast_button_casting: "Başlatılıyor" # Temporary, if tome_cast_button_running isn't translated.
+    tome_cast_button_cast: "Başlat" # Temporary, if tome_cast_button_ran isn't translated.
+    tome_cast_button_run: "Çalıştır"
+    tome_cast_button_running: "Çalıştırılıyor"
+    tome_cast_button_ran: "Çalıştırıldı"
+    tome_submit_button: "Gönder"
+    tome_reload_method: "Bu yöntem için özgün kodu yeniden yükle" # Title text for individual method reload button.
+    tome_select_method: "Bir Yöntem Seçin"
+    tome_see_all_methods: "Düzenleyebileceğiniz tüm yöntemleri görün" # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "Birini seç..."
     tome_available_spells: "Kullanılabilir Büyüler"
-#    tome_your_skills: "Your Skills"
+    tome_your_skills: "Yetenekleriniz"
     hud_continue: "Devam (ÜstKarakter+Boşluk)"
     spell_saved: "Büyü Kaydedildi"
     skip_tutorial: "Atla (esc)"
-#    keyboard_shortcuts: "Key Shortcuts"
+    keyboard_shortcuts: "Klavye Kısayolları"
     loading_ready: "Hazır!"
-#    loading_start: "Start Level"
+    loading_start: "Seviyeyi Başlat"
     time_current: "Şimdi:"
     time_total: "Max:"
     time_goto: "Git:"
@@ -270,30 +270,30 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     customize_wizard: "Sihirbazı Düzenle"
 
   game_menu:
-#    inventory_tab: "Inventory"
-#    choose_hero_tab: "Restart Level"
-#    save_load_tab: "Save/Load"
-#    options_tab: "Options"
-#    guide_tab: "Guide"
+    inventory_tab: "Envanter"
+    choose_hero_tab: "Seviyeyi Yeniden Başlat"
+    save_load_tab: "Kaydet/Yükle"
+    options_tab: "Seçenekler"
+    guide_tab: "Rehber"
     multiplayer_tab: "Çoklu-oyuncu"
-#    inventory_caption: "Equip your hero"
-#    choose_hero_caption: "Choose hero, language"
-#    save_load_caption: "... and view history"
-#    options_caption: "Configure settings"
-#    guide_caption: "Docs and tips"
-#    multiplayer_caption: "Play with friends!"
+    inventory_caption: "Kahramanınızı donatın"
+    choose_hero_caption: "Kahraman, dil seçin"
+    save_load_caption: "... ve geçmişe bak"
+    options_caption: "Ayarları yapılandır"
+    guide_caption: "Belgeler ve ipuçları"
+    multiplayer_caption: "Arkadaşlarla oyna!"
 
 #  inventory:
-#    choose_inventory: "Equip Items"
+    choose_inventory: "Ögeleri Donan"
 
 #  choose_hero:
-#    choose_hero: "Choose Your Hero"
-#    programming_language: "Programming Language"
-#    programming_language_description: "Which programming language do you want to use?"
-#    status: "Status"
-#    weapons: "Weapons"
-#    health: "Health"
-#    speed: "Speed"
+    choose_hero: "Kahramanınızı Seçin"
+    programming_language: "Programlama Dili"
+    programming_language_description: "Hangi programlama dilini kullanmak istiyorsunuz?"
+    status: "Durum"
+    weapons: "Silahlar"
+    health: "Sağlık"
+    speed: "Hız"
 
 #  save_load:
 #    granularity_saved_games: "Saved"
@@ -376,14 +376,14 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     autosave: "Değişiklikler Kendiliğinden Kaydedilir"
     me_tab: "Ben"
     picture_tab: "Resim"
-#    upload_picture: "Upload a picture"
+    upload_picture: "Bir Resim Yükle"
     password_tab: "Şifre"
     emails_tab: "E-postalar"
     admin: "Yönetici"
     new_password: "Yeni Şifre"
     new_password_verify: "Teyit Et"
     email_subscriptions: "E-posta Abonelikleri"
-#    email_subscriptions_none: "No Email Subscriptions."
+    email_subscriptions_none: "E-posta aboneliği yok."
     email_announcements: "Duyurular"
     email_announcements_description: "CodeCombat ile ilgili son haberlere ve gelişmelere ulaşın."
     email_notifications: "Bilgilendirme"
@@ -401,7 +401,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     error_saving: "Kayıt Esnasında Hata"
     saved: "Değişiklikler Kaydedildi"
     password_mismatch: "Şifreler Uyuşmuyor"
-#    password_repeat: "Please repeat your password."
+    password_repeat: "Lütfen şifrenizi yenileyin."
 #    job_profile: "Job Profile" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
 #    job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
 #    job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
@@ -411,13 +411,13 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     wizard_color: "Sihirbaz Kıyafeti Rengi"
 
 #  keyboard_shortcuts:
-#    keyboard_shortcuts: "Keyboard Shortcuts"
-#    space: "Space"
-#    enter: "Enter"
-#    escape: "Escape"
-#    shift: "Shift"
-#    cast_spell: "Cast current spell."
-#    run_real_time: "Run in real time."
+    keyboard_shortcuts: "Klavye Kısayolları"
+    space: "Boşluk"
+    enter: "Enter"
+    escape: "Escape"
+    shift: "ÜstKarakter"
+    cast_spell: "Geçerli büyüyü çalıştır."
+    run_real_time: "Eşzamanlı çalış."
 #    continue_script: "Continue past current script."
 #    skip_scripts: "Skip past all skippable scripts."
 #    toggle_playback: "Toggle play/pause."
@@ -468,32 +468,32 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     article_title: "Makale Düzenleyici"
     thang_title: "Nesne Düzenleyici"
     level_title: "Bölüm Düzenleyici"
-#    achievement_title: "Achievement Editor"
-#    back: "Back"
+    achievement_title: "Başarı Düzenleyici"
+    back: "Geri"
     revert: "Geri al"
     revert_models: "Önceki Modeller"
-#    pick_a_terrain: "Pick A Terrain"
-#    small: "Small"
-#    grassy: "Grassy"
-#    fork_title: "Fork New Version"
-#    fork_creating: "Creating Fork..."
-#    generate_terrain: "Generate Terrain"
-#    more: "More"
-#    wiki: "Wiki"
-#    live_chat: "Live Chat"
+    pick_a_terrain: "Bir Arazi Seçin"
+    small: "Küçük"
+    grassy: "Çimli"
+    fork_title: "Yeni Sürüm Çatalla"
+    fork_creating: "Çatal Oluşturuluyor..."
+    generate_terrain: "Arazi Oluştur"
+    more: "Daha Fazla"
+    wiki: "Viki"
+    live_chat: "Canlı Sohbet"
     level_some_options: "Bazı Seçenekler?"
     level_tab_thangs: "Nesneler"
     level_tab_scripts: "Betikler"
     level_tab_settings: "Ayarlar"
     level_tab_components: "Bileşenler"
     level_tab_systems: "Sistemler"
-#    level_tab_docs: "Documentation"
+    level_tab_docs: "Belgelendirme"
     level_tab_thangs_title: "Geçerli Şartlar"
-#    level_tab_thangs_all: "All"
+    level_tab_thangs_all: "Tüm"
     level_tab_thangs_conditions: "Başlama Şartları"
     level_tab_thangs_add: "Nesne Ekle"
-#    delete: "Delete"
-#    duplicate: "Duplicate"
+    delete: "Sil"
+    duplicate: "Kopyala"
     level_settings_title: "Ayarlar"
     level_component_tab_title: "Geçerli Bileşenler"
     level_component_btn_new: "Yeni Bileşen Oluştur"

From 0f7fb5d573117dd188b5c62921ccfd9e9843e6ff Mon Sep 17 00:00:00 2001
From: Volkan Gezer <wakeup@users.noreply.github.com>
Date: Tue, 21 Oct 2014 01:51:52 +0200
Subject: [PATCH 41/46] fix grouping

---
 app/locale/tr.coffee | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee
index df5d87c93..0ed4ce9fd 100644
--- a/app/locale/tr.coffee
+++ b/app/locale/tr.coffee
@@ -107,7 +107,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     send_password: "Kurtarma Parolası Gönder"
     recovery_sent: "Kurtarma e-postası gönderildi."
 
-#  items:
+  items:
     armor: "Zırh"
     hands: "Eller"
     accessories: "Aksesuarlar"
@@ -283,10 +283,10 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     guide_caption: "Belgeler ve ipuçları"
     multiplayer_caption: "Arkadaşlarla oyna!"
 
-#  inventory:
+  inventory:
     choose_inventory: "Ögeleri Donan"
 
-#  choose_hero:
+  choose_hero:
     choose_hero: "Kahramanınızı Seçin"
     programming_language: "Programlama Dili"
     programming_language_description: "Hangi programlama dilini kullanmak istiyorsunuz?"
@@ -410,7 +410,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     wizard_tab: "Sihirbaz"
     wizard_color: "Sihirbaz Kıyafeti Rengi"
 
-#  keyboard_shortcuts:
+  keyboard_shortcuts:
     keyboard_shortcuts: "Klavye Kısayolları"
     space: "Boşluk"
     enter: "Enter"

From 700b460f91a764ead91db84677434d335c3ad7c2 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 17:00:46 -0700
Subject: [PATCH 42/46] Fixed bug in fetching submitted ladder sessions that
 hadn't been scored yet.

---
 server/levels/sessions/level_session_handler.coffee | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/levels/sessions/level_session_handler.coffee b/server/levels/sessions/level_session_handler.coffee
index 7e94efcaf..4e23a56f9 100644
--- a/server/levels/sessions/level_session_handler.coffee
+++ b/server/levels/sessions/level_session_handler.coffee
@@ -30,7 +30,7 @@ class LevelSessionHandler extends Handler
       @sendSuccess(res, documents)
 
   hasAccessToDocument: (req, document, method=null) ->
-    return true if req.method is 'GET' and document.get('totalScore')
+    return true if req.method is 'GET' and document.get('submitted')
     return true if ('employer' in (req.user.get('permissions') ? [])) and (method ? req.method).toLowerCase() is 'get'
     super(arguments...)
 

From a33bb215d44361d7eca909944848de068e97234b Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 17:49:52 -0700
Subject: [PATCH 43/46] Fixed checking compile-time problems for clean code
 goals.

---
 .../images/pages/game-menu/slot-icons.png     | Bin 54967 -> 55899 bytes
 app/lib/world/GoalManager.coffee              |  10 +++++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/app/assets/images/pages/game-menu/slot-icons.png b/app/assets/images/pages/game-menu/slot-icons.png
index efffc74f9317012307c688d3a97cbf9142c70f4d..590e8d09cccaf7158f1a415786a2e6bd39c4b34e 100644
GIT binary patch
delta 55431
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%0Ad4AW49K5GfD*!B4!dzP`xB
zX{BRvW=3Ay8Ayr(lL+v~KKsz~@+3`3Y}Pk44p9c)lI-ysT3Y1iwzNJ-z}UG~e`L5=
zJ6)~y5H7D$p8@bQ3QS_JXmZIJ7p?!dr3s2Z5g<ttL?p9c`0?KbK+^PsJ1&Tng=cID
zkd((T6l5>C4oES7f?u@&l0rdYWER;Ss_pW$7xi}C0QT9t&pHecoQwes@&XC@1gvej
zTn>;@0+1vJSp~OU6-}E8ucIWPx$S5at&!_@fTcnL@D(wzs&W6;fdot%l67kJk)+#U
zTf1ajh@=6bH`dnW&vmO;F!S)HdqBRm6<wyD29Ok5-&tjU(yECBdo|2Z1T<oA1E4sf
z_Z5RETLmPA)`*@jDYa*44(0>X5GO}J%mI+9ss&K3d5F^yV=oB!V4g4c*}AJo%A#Rd
zu4h)f%<`hO-;2n2_+8gld>y_}yWg^yXFGsF#Xyp1VHNmw1&`jZH3+@~B<+mt3M4tU
zFh~X}Qxoui)h*v~nrc)VNYZxQgARDadHF%PjTp9&i6aev=!m`h`EPhF9UWEwj&cRJ
zw;D)t0T*+IN=&r2vXocCLA8=vx_Xnz)HkGqDj??K_?Y+P+8>H4U)!qnVEsVW>45%>
z1QOS+EIRz+P>Hn0+V5^f8QY&KkYwjy5=1Jo0TJVW-XDLhjN+Vx-BSaS^4!3Hm(5-Z
zz=KK`dZj>8Xps+Ez$4{FBmAS*dHVU&TGW3o8^FnWANAtFNS;AX7PMF($yuA_jC7Sn
z6N|czN;AIC%9?OAiBc9|((&_B0+%i5R+bBrK*Kf;WLSungVLdzS6z5>y8=mtfQJHO
z#6I(Xi(4@VwVDgNp5JuWNf;zYOgz*rQtX>oWu2KCX+`PzdD;nRJPoWG?Vez7G&HpY
z+DXzyWNBUmK*>TnS{^l_ukQc`#XW1M<UQrAMP78b7~ZZd?45P7GoA*J<k<LgUg7GD
zGuyp;;T8f(QWby(>f!I5_FB8D-^^xhb=8}H9vds^JtY1<`yc;D-P7=m9Y0AxltO2}
zmMsYz&b%0w{Z>-7!d9&ZtJf2-ne)YV_Wnn=!=CsP0FvSoM3JoTZ3iUfaXeGiGN_dT
zNd-2w_bk=>?>I+0V`tRXY0MKyzh1zRtQs&<ZCkL#G;Ze0Wv?bfb9CGDbyh~Vat>;L
zJr|CX__`O(#^l~P6F;aG(_<^<!Dd$32g))`74bG@xzsHCxN|1%jGeJFYH9zi?Nd-a
z><iSiRe81S;}!x*!l>aKJa+nTz3#(DYw|s%2ySa*rHLC~)ICFqcYKNqBx)L4I;1Sj
zs{-4-R_h_AnV0xI*6$nHZhK<8VJKyP&U>I;>J>;-76g)Z#?IIoJ7Z_m?ofzfn2kIw
zKzipK*cnfAZ#cSp?29nV^aHy$F751tov|}^#?JWD^NI4D4bs2_joL$}zF*vX_8u(h
zJBrmwa=UZSjy<S*#@f7drViPE4p)PuQEOn)g07>_nncW>+xTAs3;-^i?vq##(Vcn#
O0000<MNUMnLSTZE8Dio9

delta 54474
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%0Ad4
zAW47_DG&VPpLpH<{gH{&O2^Xdth{zIkQ4<b5#UdJ`l06)NScz^tZ!%>rVP9_)$291
zw#v_KX?>7@f3b6|{>VsDJ6)~y5H7D$p8@bQ3QS_JXmZIJm#qJ{r3s2Z5FkksL?pAH
z`?LQP07*0Bw_Ok^2hZ3NAgO?1D9T=P9grk~U$p>|LP23<7TF!D?XumAdZ%sx`|RCk
z9R>(a#{dQefrLT=*0x+O4@fBiNRorBg4?c&rcH&{e^HXq+)gx#*2oPwz)~>*_=*@<
z)wqA_KmsNW%R06CNYd@Fy+blCMACrJPc}B?&rPdWFnj-odqBQb>l*Lv0+K@OJEu%q
zHIZPih8c>0M(k|>6i4*FVi0AkfTYkG(eov(_6*IzLSP!=<miVv08&-80ID?)aXMn`
z1pyz-fAi%&+xGNISu_mG&Gl7pePzko?<HhB{H|-Oz7Aig-EUdUvuXlK1<pAFH%+Rf
zi}*QV&}G!imZGtqN4F~(6$2!R7FL4$;Q72?YY==FNZK7c6-aXILXZqprY7L4%UE=p
zYE&CY(stcL4tT_Q`9Zmj7`Bj!BMpD(h`smOe;2*h&d#cTN4bLATMZ<+fQvapB_`Tf
zT`nl$pjt_--F>N4`bFuW3W&M%c*1*h{kMtA*S2as*t7GZ=YXChkhpGT(cu?|N~AT`
zes?R%*#1y~Bs>3-AX149h!}T&_e)J|<t6O44M-|*1A|^Jdno`9DqZN60!g7oK4bxp
zf3z2k@Q+#N>1W%usQ<le04M8xynvI=Gsw$=mJ%%3wOP){R9Q4J(REas@qJp>griB6
zwg8ikpOq50Y(clOe2~PJzl4QoIVc^fdDVqCcPfxn40tFqM(s1dv=wtutGTf2`Av77
zgh6t|#6#U8#lCq}E^(@nR+OHfXPkh>f78IqEeV6Mqk2QyZ43cWM;oYS^z}-Cq!NOG
zRJCmORs%^6m~_rLd&lex@M~nJvaol7q}{O{K$2tQ&wItIGtTbx?uA<jBuP~O8mLFV
zf5vO;u6{F{jkPszW}>vl1tk7H{p<fyw;jH*<0lD-Qta&4vL#`|nHR&d-%6@hf7q(^
zVD);=d4($x)c3ix-Ldu`5Rep?Ac|yt?>Hc-fa962mO-r)NGh_ay{D<(f7dzM9lN8p
zPGf;U`t>4?WYvI?YTJS>rg1Z0E_*c<nxk8uU*a>im2*(*xp17s*S%;qCil*n_(83h
z9$PUF7EECuD9bRN;BCrssaf`MfA>t>9lK+9)YAT2+ozy<*cYg2tMY2u$1Mbsgi*se
zc;d`oc|Avu*W`Oj5!}|sN|WDwUiTCw-tj3elBj8H?bME+6|>!IwH{)cd5Pa+{l3wi
zwkLKPhEnFd2im1xkwj%tAZd5(j@_|4c1P_Fg&2m}=yn0pyXU~}*v`G-Xz1>-FTyO-
z5A5E!yt@x}$L`o2yW<bfCn|6@NCOizYLC47gJkd7f4HRYNUD?McITd(7_WQE+Prh7
w4%>f@RD+~ZYhclWu47M|M9jap@&5%F08uh17CC{C0ssI207*qoM6N<$g2Iem^Z)<=

diff --git a/app/lib/world/GoalManager.coffee b/app/lib/world/GoalManager.coffee
index 05278be22..d037811bd 100644
--- a/app/lib/world/GoalManager.coffee
+++ b/app/lib/world/GoalManager.coffee
@@ -63,7 +63,9 @@ module.exports = class GoalManager extends CocoClass
   # gets these goals and code, and is told to be all ears during world gen
   setGoals: (@goals) ->
   setCode: (@userCodeMap) -> @updateCodeGoalStates()
-  worldGenerationWillBegin: -> @initGoalStates()
+  worldGenerationWillBegin: ->
+    @initGoalStates()
+    @checkForInitialUserCodeProblems()
 
   # World generator feeds world events to the goal manager to keep track
   submitWorldGenerationEvent: (channel, event, frameNumber) ->
@@ -148,6 +150,12 @@ module.exports = class GoalManager extends CocoClass
       @initGoalState(state, [_.keys(goal.linesOfCode ? {})], 'lines')
       @goalStates[goal.id] = state
 
+  checkForInitialUserCodeProblems: ->
+    # There might have been some user code problems reported before the goal manager started listening.
+    for thang in @world.thangs when thang.isProgrammable
+      for message, problem of thang.publishedUserCodeProblems
+        @onUserCodeProblem {thang: thang, problem: problem}, 0
+
   onThangDied: (e, frameNumber) ->
     for goal in @goals ? []
       @checkKillThangs(goal.id, goal.killThangs, e.thang, frameNumber) if goal.killThangs?

From 7a9014f83a9e6018746c273d948015e6f39e5367 Mon Sep 17 00:00:00 2001
From: Nick Winter <livelily@gmail.com>
Date: Mon, 20 Oct 2014 19:01:00 -0700
Subject: [PATCH 44/46] Several improvements to the victory modal.

---
 .../play/level/modal/hero-victory-modal.sass  | 20 ++++--
 .../play/level/modal/hero-victory-modal.jade  | 18 ++---
 .../play/level/modal/HeroVictoryModal.coffee  | 71 +++++++++++++------
 3 files changed, 72 insertions(+), 37 deletions(-)

diff --git a/app/styles/play/level/modal/hero-victory-modal.sass b/app/styles/play/level/modal/hero-victory-modal.sass
index d825d9926..e3429b0b7 100644
--- a/app/styles/play/level/modal/hero-victory-modal.sass
+++ b/app/styles/play/level/modal/hero-victory-modal.sass
@@ -19,10 +19,11 @@
   #victory-header
     display: block
     margin: 15px auto 0
-    @include transition(0.25s ease-in)
+    // http://easings.net/#easeOutBack plus tweaked a bit: http://cubic-bezier.com/#.18,.68,.75,2
+    @include transition(0.5s cubic-bezier(0.18, 0.68, 0.75, 2))
 
     &.out
-      margin-top: -100px
+      @include scale(0)
     
   .modal-header
     height: 85px
@@ -95,10 +96,10 @@
       @include scale(1.5)
       z-index: 2
 
-      .reward-text
-        font-size: 18px
-        overflow: visible
-        bottom: 9px
+    &.numerical &.animating .reward-text
+      font-size: 18px
+      overflow: visible
+      bottom: 9px
 
     .reward-image-container
       top: 8px
@@ -113,6 +114,13 @@
       &.show
         @include scale(1)
       
+      &.pending-reward-image
+        img
+          -webkit-filter: brightness(2000%) contrast(25%)
+          -moz-filter: brightness(2000%) contrast(25%)
+          -o-filter: brightness(2000%) contrast(25%)
+          filter: brightness(2000%) contrast(25%)
+
       img
         margin: 0
         position: absolute
diff --git a/app/templates/play/level/modal/hero-victory-modal.jade b/app/templates/play/level/modal/hero-victory-modal.jade
index 1ae5041bc..4be673ed1 100644
--- a/app/templates/play/level/modal/hero-victory-modal.jade
+++ b/app/templates/play/level/modal/hero-victory-modal.jade
@@ -15,31 +15,31 @@ block modal-body-content
         - var worth = achievement.get('worth', true);
         if worth
           .reward-panel.numerical.xp(data-number=worth, data-number-unit='xp')
-            .reward-image-container(class=animate?'':'show')
+            .reward-image-container(class=animate ? 'pending-reward-image' : 'show')
               img(src="/images/pages/play/level/modal/reward_icon_xp.png")
             .reward-text= animate ? '+0' : '+'+worth
 
         if rewards.gems
           .reward-panel.numerical.gems(data-number=rewards.gems, data-number-unit='gem')
-            .reward-image-container(class=animate?'':'show')
+            .reward-image-container(class=animate ? 'pending-reward-image' : 'show')
               img(src="/images/pages/play/level/modal/reward_icon_gems.png")
             .reward-text= animate ? '+0' : '+'+rewards.gems
           
         if rewards.heroes
           for hero in rewards.heroes
             - var hero = thangTypes[hero];
-            .reward-panel.hero
-              .reward-image-container(class=animate?'':'show')
+            .reward-panel.hero(data-hero-thang-type=hero.get('original'))
+              .reward-image-container(class=animate ? 'pending-reward-image' : 'show')
                 img(src=hero.getPortraitURL())
-              .reward-text= hero.get('name')
+              .reward-text= animate ? 'New Hero' : hero.get('name')
 
         if rewards.items
           for item in rewards.items
             - var item = thangTypes[item];
-            .reward-panel.item
-              .reward-image-container(class=animate?'':'show')
+            .reward-panel.item(data-item-thang-type=item.get('original'))
+              .reward-image-container(class=animate ? 'pending-reward-image' : 'show')
                 img(src=item.getPortraitURL())
-              .reward-text= item.get('name')
+              .reward-text= animate ? 'New Item' : item.get('name')
 
 
 block modal-footer-content
@@ -60,7 +60,7 @@ block modal-footer-content
     a.btn.btn-success.world-map-button.hide#continue-button(href="/play-hero", data-dismiss="modal", data-i18n="play_level.victory_play_continue") Continue
 
   if me.get('anonymous')
-    p.sign-up-poke
+    p.sign-up-poke.hide
       button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/SignupModal", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress
       span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account!
 
diff --git a/app/views/play/level/modal/HeroVictoryModal.coffee b/app/views/play/level/modal/HeroVictoryModal.coffee
index eb516d11b..448f67562 100644
--- a/app/views/play/level/modal/HeroVictoryModal.coffee
+++ b/app/views/play/level/modal/HeroVictoryModal.coffee
@@ -7,6 +7,7 @@ LocalMongo = require 'lib/LocalMongo'
 utils = require 'lib/utils'
 ThangType = require 'models/ThangType'
 LadderSubmissionView = require 'views/play/common/LadderSubmissionView'
+AudioPlayer = require 'lib/AudioPlayer'
 
 module.exports = class HeroVictoryModal extends ModalView
   id: 'hero-victory-modal'
@@ -45,7 +46,7 @@ module.exports = class HeroVictoryModal extends ModalView
     for thangTypeOriginal in thangTypeOriginals
       thangType = new ThangType()
       thangType.url = "/db/thang.type/#{thangTypeOriginal}/version"
-      thangType.project = ['original', 'rasterIcon', 'name']
+      thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers']
       @thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
 
     if achievementIDs.length
@@ -86,7 +87,7 @@ module.exports = class HeroVictoryModal extends ModalView
     ##  achievement.completedAWhileAgo = index > 1
     #  achievement.completed = true
     #  achievement.completedAWhileAgo = false
-    #  achievement.attributes.worth = (index + 1) * achievement.get('worth')
+    #  achievement.attributes.worth = (index + 1) * achievement.get('worth', true)
     #  rewards = achievement.get('rewards')
     #  rewards.gems *= (index + 1)
 
@@ -99,10 +100,14 @@ module.exports = class HeroVictoryModal extends ModalView
   afterRender: ->
     super()
     return unless @supermodel.finished()
+    @playSelectionSound hero, true for original, hero of @thangTypes  # Preload them
     @$el.addClass 'with-sign-up' if me.get('anonymous')
     @updateSavingProgressStatus()
-    @$el.find('#victory-header').delay(250).queue(-> $(@).removeClass('out').dequeue())
-    complete = _.once(_.bind(@beginAnimateNumbers, @))
+    @$el.find('#victory-header').delay(250).queue(->
+      $(@).removeClass('out').dequeue()
+      Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory-title-appear'  # TODO: actually add this
+    )
+    complete = _.once(_.bind(@beginSequentialAnimations, @))
     @animatedPanels = $()
     panels = @$el.find('.achievement-panel')
     for panel in panels
@@ -126,29 +131,34 @@ module.exports = class HeroVictoryModal extends ModalView
       @ladderSubmissionView = new LadderSubmissionView session: @session, level: @level
       @insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view')
 
-  beginAnimateNumbers: ->
-    @numericalItemPanels = _.map(@animatedPanels.find('.numerical'), (panel) -> {
+  beginSequentialAnimations: ->
+    @sequentialAnimatedPanels = _.map(@animatedPanels.find('.reward-panel'), (panel) -> {
       number: $(panel).data('number')
       textEl: $(panel).find('.reward-text')
       rootEl: $(panel)
       unit: $(panel).data('number-unit')
+      hero: $(panel).data('hero-thang-type')
+      item: $(panel).data('item-thang-type')
     })
 
     @totalXP = 0
-    @totalXP += panel.number for panel in @numericalItemPanels when panel.unit is 'xp'
+    @totalXP += panel.number for panel in @sequentialAnimatedPanels when panel.unit is 'xp'
     @totalGems = 0
-    @totalGems += panel.number for panel in @numericalItemPanels when panel.unit is 'gem'
+    @totalGems += panel.number for panel in @sequentialAnimatedPanels when panel.unit is 'gem'
     @gemEl = $('#gem-total')
     @XPEl = $('#xp-total')
     @totalXPAnimated = @totalGemsAnimated = @lastTotalXP = @lastTotalGems = 0
-    @numberAnimationStart = new Date()
-    @numberAnimationInterval = setInterval(@tickNumberAnimation, 1000 / 60)
+    @sequentialAnimationStart = new Date()
+    @sequentialAnimationInterval = setInterval(@tickSequentialAnimation, 1000 / 60)
 
-  tickNumberAnimation: =>
+  tickSequentialAnimation: =>
     # TODO: make sure the animation pulses happen when the numbers go up and sounds play (up to a max speed)
-    return @endAnimateNumbers() unless panel = @numericalItemPanels[0]
-    duration = Math.log(panel.number + 1) / Math.LN10 * 1000  # Math.log10 is ES6
-    ratio = @getEaseRatio (new Date() - @numberAnimationStart), duration
+    return @endSequentialAnimations() unless panel = @sequentialAnimatedPanels[0]
+    if panel.number
+      duration = Math.log(panel.number + 1) / Math.LN10 * 1000  # Math.log10 is ES6
+    else
+      duration = 1000
+    ratio = @getEaseRatio (new Date() - @sequentialAnimationStart), duration
     if panel.unit is 'xp'
       newXP = Math.floor(ratio * panel.number)
       totalXP = @totalXPAnimated + newXP
@@ -158,7 +168,7 @@ module.exports = class HeroVictoryModal extends ModalView
         xpTrigger = 'xp-' + (totalXP % 6)  # 6 xp sounds
         Backbone.Mediator.publish 'audio-player:play-sound', trigger: xpTrigger, volume: 0.5 + ratio / 2
         @lastTotalXP = totalXP
-    else
+    else if panel.unit is 'gem'
       newGems = Math.floor(ratio * panel.number)
       totalGems = @totalGemsAnimated + newGems
       if totalGems isnt @lastTotalGems
@@ -167,16 +177,24 @@ module.exports = class HeroVictoryModal extends ModalView
         gemTrigger = 'gem-' + (parseInt(panel.number * ratio) % 4)  # 4 gem sounds
         Backbone.Mediator.publish 'audio-player:play-sound', trigger: gemTrigger, volume: 0.5 + ratio / 2
         @lastTotalGems = totalGems
+    else if panel.item
+      thangType = @thangTypes[panel.item]
+      panel.textEl.text(thangType.get('name'))
+      Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'item-unlocked', volume: 1 if 0.5 < ratio < 0.6
+    else if panel.hero
+      thangType = @thangTypes[panel.hero]
+      panel.textEl.text(thangType.get('name'))
+      @playSelectionSound hero if 0.5 < ratio < 0.6
     if ratio is 1
       panel.rootEl.removeClass('animating').find('.reward-image-container img').removeClass('pulse')
-      @numberAnimationStart = new Date()
+      @sequentialAnimationStart = new Date()
       if panel.unit is 'xp'
         @totalXPAnimated += panel.number
-      else
+      else if panel.unit is 'gem'
         @totalGemsAnimated += panel.number
-      @numericalItemPanels.shift()
+      @sequentialAnimatedPanels.shift()
       return
-    panel.rootEl.addClass('animating').find('.reward-image-container img').addClass('pulse')
+    panel.rootEl.addClass('animating').find('.reward-image-container').removeClass('pending-reward-image').find('img').addClass('pulse')
 
   getEaseRatio: (timeSinceStart, duration) ->
     # Ease in/out quadratic - http://gizma.com/easing/
@@ -187,8 +205,8 @@ module.exports = class HeroVictoryModal extends ModalView
     --t
     -0.5 * (t * (t - 2) - 1)
 
-  endAnimateNumbers: ->
-    clearInterval @numberAnimationInterval
+  endSequentialAnimations: ->
+    clearInterval @sequentialAnimationInterval
     @animationComplete = true
     @updateSavingProgressStatus()
 
@@ -196,14 +214,23 @@ module.exports = class HeroVictoryModal extends ModalView
     return unless @animationComplete
     @$el.find('#saving-progress-label').toggleClass('hide', @readyToContinue)
     @$el.find('#continue-button').toggleClass('hide', not @readyToContinue)
+    @$el.find('.sign-up-poke').toggleClass('hide', not @readyToContinue)
 
   onGameSubmitted: (e) ->
     ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches"
     Backbone.Mediator.publish 'router:navigate', route: ladderURL
 
+  playSelectionSound: (hero, preload=false) ->
+    return unless sounds = hero.get('soundTriggers')?.selected
+    return unless sound = sounds[Math.floor Math.random() * sounds.length]
+    name = AudioPlayer.nameForSoundReference sound
+    if preload
+      AudioPlayer.preloadSoundReference sound
+    else
+      AudioPlayer.playSound name, 1
 
   # TODO: award heroes/items and play an awesome sound when you get one
 
   destroy: ->
-    clearInterval @numberAnimationInterval
+    clearInterval @sequentialAnimationInterval
     super()

From 56c15116a71bad3bbdcc926fcdcacca2ec70007f Mon Sep 17 00:00:00 2001
From: Matt Lott <mattlott@live.com>
Date: Mon, 20 Oct 2014 21:20:30 -0700
Subject: [PATCH 45/46] Swap problem alert error message and hint lines

Also fixing problem alert border on Firefox.
---
 app/styles/play/level/tome/problem_alert.sass    | 8 ++++----
 app/templates/play/level/tome/problem_alert.jade | 6 ++++--
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/app/styles/play/level/tome/problem_alert.sass b/app/styles/play/level/tome/problem_alert.sass
index 8b0a623ea..2ffb62181 100644
--- a/app/styles/play/level/tome/problem_alert.sass
+++ b/app/styles/play/level/tome/problem_alert.sass
@@ -9,7 +9,7 @@
   left: 10px
   right: 10px
   background: transparent
-  border: 0
+  border: 1px solid transparent
   padding: 0
   text-shadow: none
   color: white
@@ -31,14 +31,14 @@
     &:hover, &:focus
       @include opacity(1)
 
-  .problem-hint
+  .problem-subtitle
     font-size: 80%
-      
+
   //&.alert-error
 
   &.alert-warning
     border-image-source: url(/images/level/code_editor_warning_background.png)
-    
+
   &.alert-info
     border-image-source: url(/images/level/code_editor_info_background.png)
 
diff --git a/app/templates/play/level/tome/problem_alert.jade b/app/templates/play/level/tome/problem_alert.jade
index e9cedca64..25df2198a 100644
--- a/app/templates/play/level/tome/problem_alert.jade
+++ b/app/templates/play/level/tome/problem_alert.jade
@@ -1,5 +1,7 @@
 button.close(type="button", data-dismiss="alert") &times;
-span.problem-message!= message
 if hint
+  span.problem-title!= hint
   br
-  span.problem-hint!= hint
\ No newline at end of file
+  span.problem-subtitle!= message
+else
+  span.problem-title!= message

From ca09381d42ee32a89677cbd60d6c5ca6b6b76eb4 Mon Sep 17 00:00:00 2001
From: yjw9012 <yjw9012@hotmail.com>
Date: Mon, 20 Oct 2014 23:12:00 -0700
Subject: [PATCH 46/46] Fixed #1567

Moved the code diff control to the top of the list, and added a short
instructional message.
---
 app/templates/modal/versions.jade | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/app/templates/modal/versions.jade b/app/templates/modal/versions.jade
index f99f9402c..827230ad2 100755
--- a/app/templates/modal/versions.jade
+++ b/app/templates/modal/versions.jade
@@ -5,6 +5,11 @@ block modal-header-content
     h3
      span(data-i18n="general.version_history_for") Version History for:
      |"#{dataList[0].name}"
+    p
+     |Select two changes below to see the difference.
+
+  div.delta-container
+    div.delta-view
 
 block modal-body-content
   if dataList
@@ -25,7 +30,4 @@ block modal-body-content
           td= data.creator
           td #{data.commitMessage}
 
-  div.delta-container
-    div.delta-view
-
 block modal-footer-content
\ No newline at end of file