Merge branch 'master' into production

This commit is contained in:
Nick Winter 2014-10-01 17:02:22 -07:00
commit a1cd43681f
22 changed files with 228 additions and 182 deletions

View file

@ -177,3 +177,7 @@ module.exports = class CocoRouter extends Backbone.Router
@openView view
else
@openView e.view
navigate: (fragment, options) ->
super fragment, options
Backbone.Mediator.publish 'router:navigated', route: fragment

View file

@ -61,9 +61,11 @@ setUpBackboneMediator = ->
Backbone.Mediator.addChannelSchemas schemas for channel, schemas of channelSchemas
Backbone.Mediator.setValidationEnabled document.location.href.search(/codecombat.com/) is -1
if webkit?.messageHandlers
window.iPadSubscriptions = 'application:error': true # We try to subscribe to this one before it's all set up, so just do it.
originalPublish = Backbone.Mediator.publish
Backbone.Mediator.publish = ->
originalPublish.apply Backbone.Mediator, arguments
if window.iPadSubscriptions[arguments[0]]
webkit.messageHandlers.backboneEventHandler?.postMessage channel: arguments[0], event: serializeForIOS(arguments[1] ? {})
setUpMoment = ->
@ -106,6 +108,12 @@ watchForErrors = ->
noty text: message, layout: 'topCenter', type: 'error', killer: false, timeout: 5000, dismissQueue: true, maxVisible: 3, callback: {onClose: -> --currentErrors}
Backbone.Mediator.publish 'application:error', message: msg # For iOS app
window.addIPadSubscription = (channel) ->
window.iPadSubscriptions[channel] = true
window.removeIPadSubscription = (channel) ->
window.iPadSubscriptions[channel] = false
setUpIOSLogging = ->
return unless webkit?.messageHandlers
for level in ['debug', 'log', 'info', 'warn', 'error']

View file

@ -59,10 +59,10 @@ module.exports = class RegionChooser extends CocoClass
updateShape: ->
rect = @options.camera.normalizeBounds([@firstPoint, @secondPoint])
@options.surfaceLayer.removeChild @shape if @shape
@options.normalStage.removeChild @shape if @shape
@shape = new createjs.Shape()
@shape.alpha = 0.5
@shape.mouseEnabled = false
@shape.graphics.beginFill('#fedcba').drawRect rect.x, rect.y, rect.width, rect.height
@shape.graphics.endFill()
@options.surfaceLayer.addChild(@shape)
@options.normalStage.addChild(@shape)

View file

@ -133,7 +133,7 @@ module.exports = Surface = class Surface extends CocoClass
@coordinateDisplay ?= new CoordinateDisplay camera: @camera, layer: @surfaceTextLayer if showCoordinates
hookUpChooseControls: ->
chooserOptions = stage: @normalStage, surfaceLayer: @surfaceLayer, camera: @camera, restrictRatio: @options.choosing is 'ratio-region'
chooserOptions = stage: @normalStage, normalStage: @normalStage, camera: @camera, restrictRatio: @options.choosing is 'ratio-region'
klass = if @options.choosing is 'point' then PointChooser else RegionChooser
@chooser = new klass chooserOptions
@ -506,7 +506,10 @@ module.exports = Surface = class Surface extends CocoClass
oldHeight = parseInt @normalCanvas.attr('height'), 10
aspectRatio = oldWidth / oldHeight
pageWidth = $('#page-container').width() - 17 # 17px nano scroll bar
if @realTime or @options.spectateGame
if application.isIPadApp
newWidth = 1024
newHeight = newWidth / aspectRatio
else if @realTime or @options.spectateGame
pageHeight = $('#page-container').height() - $('#control-bar-view').outerHeight() - $('#playback-view').outerHeight()
newWidth = Math.min pageWidth, pageHeight * aspectRatio
newHeight = newWidth / aspectRatio
@ -517,6 +520,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
##if InstallTrigger? # Firefox rendering performance goes down as canvas size goes up
## newWidth = Math.min 924, newWidth
## newHeight = Math.min 589, newHeight

View file

@ -3,11 +3,11 @@ module.exports = nativeDescription: "български език", englishDescri
loading: "Зареждане..."
saving: "Записване..."
sending: "Изпращане..."
# send: "Send"
send: "Изпрати"
cancel: "Отказ"
save: "Запис"
# publish: "Publish"
# create: "Create"
publish: "Публикирай"
create: "Создавай"
delay_1_sec: "1 секунда"
delay_3_sec: "3 секунди"
delay_5_sec: "5 секунди"
@ -19,21 +19,21 @@ module.exports = nativeDescription: "български език", englishDescri
# unwatch: "Unwatch"
# submit_patch: "Submit Patch"
# units:
# second: "second"
# seconds: "seconds"
# minute: "minute"
# minutes: "minutes"
# hour: "hour"
# hours: "hours"
# day: "day"
# days: "days"
# week: "week"
# weeks: "weeks"
# month: "month"
# months: "months"
# year: "year"
# years: "years"
units:
second: "секунда"
seconds: "секунди"
minute: "минута"
minutes: "минути"
hour: "час"
hours: "часове"
day: "ден"
days: "дни"
week: "седмица"
weeks: "седмици"
month: "месец"
months: "месеци"
year: "година"
years: "години"
modal:
close: "Затвори"
@ -44,20 +44,20 @@ module.exports = nativeDescription: "български език", englishDescri
nav:
play: "Нива" # The top nav bar entry where players choose which levels to play
# community: "Community"
community: "Обшност"
editor: "Редактор"
blog: "Блог"
forum: "Форум"
# account: "Account"
# profile: "Profile"
account: "Сметката"
profile: "Профил"
# stats: "Stats"
# code: "Code"
# admin: "Admin"
# home: "Home"
home: "Начало"
# contribute: "Contribute"
# legal: "Legal"
# about: "About"
# contact: "Contact"
about: "За нас"
contact: "Контакти"
# twitter_follow: "Follow"
# employers: "Employers"
@ -72,7 +72,7 @@ module.exports = nativeDescription: "български език", englishDescri
login:
sign_up: "Създай Профил"
log_in: "Вход"
# logging_in: "Logging In"
logging_in: "Влизане..."
log_out: "Изход"
recover: "Възстанови акаунт"
@ -82,16 +82,16 @@ module.exports = nativeDescription: "български език", englishDescri
# recovery_sent: "Recovery email sent."
signup:
# create_account_title: "Create Account to Save Progress"
# description: "It's free. Just need a couple things and you'll be good to go:"
# email_announcements: "Receive announcements by email"
create_account_title: "Создавай нов сметката за да записва прогрес"
description: "Е безплатен. Само ще трабва неколко неща и ти ще си готов:"
email_announcements: "Получава анонци през имейл"
# coppa: "13+ or non-USA "
coppa_why: "(Защо?)"
creating: "Създаване на профил..."
sign_up: "Регистриране"
log_in: "Вход с парола"
# 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: "Или, можеш да зарегистрираваш през Facebook или G+:"
required: "Трабва да влезиш преди можеш да ходиш на там."
home:
slogan: "Научи се да програмираш, докато играеш игра "
@ -165,11 +165,11 @@ module.exports = nativeDescription: "български език", englishDescri
# 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."
diplomat_suggestion:
# title: "Help translate CodeCombat!"
title: "Дай да помогни да преводи CodeCombat!"
# sub_heading: "We need your language skills."
pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Bulgarian but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Bulgarian."
missing_translations: "Until we can translate everything into Bulgarian, you'll see English when Bulgarian isn't available."
# learn_more: "Learn more about being a Diplomat"
learn_more: "Научи повече за ставане Дипломат"
# subscribe_as_diplomat: "Subscribe as a Diplomat"
# wizard_settings:

View file

@ -15,9 +15,9 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
fork: "Fork"
play: "Jugar" # When used as an action verb, like "Play next level"
retry: "Tornar a intentar"
# watch: "Watch"
# unwatch: "Unwatch"
# submit_patch: "Submit Patch"
watch: "Veure"
unwatch: "Amaga"
submit_patch: "Enviar pegat"
units:
second: "segon"
@ -51,7 +51,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
account: "Compte"
profile: "Perfil"
stats: "Estats"
# code: "Code"
code: "Codi"
admin: "Admin"
home: "Inici"
contribute: "Col·laborar"
@ -63,7 +63,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
versions:
save_version_title: "Guarda una nova versió"
# new_major_version: "New Major Version"
new_major_version: "Nova versió principal"
cla_prefix: "Per guardar els canvis primer has d'acceptar"
cla_url: "CLA"
cla_suffix: "."
@ -105,10 +105,10 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
multiplayer: "Multijugador"
for_developers: "Per a Desenvolupadors"
javascript_blurb: "El llenguatge de les webs. Útil per escriure pagines web, aplicacions web, jocs en HTML5 i servidors."
# python_blurb: "Simple yet powerful, Python is a great general purpose programming language."
# coffeescript_blurb: "Nicer JavaScript syntax."
# clojure_blurb: "A modern Lisp."
# lua_blurb: "Game scripting language."
python_blurb: "Simple però poderós, Python és un bon llenguatge d'us general."
coffeescript_blurb: "Sintaxi JavaScript millorat."
clojure_blurb: "Un Lisp modern."
lua_blurb: "Llenguatge script per a jocs."
io_blurb: "Senzill però obscur."
play:
@ -126,7 +126,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
campaign_player_created: "Creats pel Jugador"
campaign_player_created_description: "... on lluites contra la creativitat dels teus companys <a href=\"/contribute#artisan\">Artisan Wizards</a>."
campaign_classic_algorithms: "Algoritmes classics"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
campaign_classic_algorithms_description: "... on pots aprendre els algoritmes més populars de l'informàtica."
level_difficulty: "Dificultat: "
play_as: "Jugar com"
spectate: "Spectate"
@ -162,7 +162,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
forum_suffix: " sinó"
send: "Enviar comentari"
contact_candidate: "Contactar amb el candidat"
# 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."
recruitment_reminder: "Utilitza aquest formulari per a contactar amb els candidats que vols entrevistar. Recorda que CodeCombat cobrará el 15% del sou del primer any. El cost es per la contactacio del treballador i es reemborsable durant 90 dies si el treballdor no roman contractat . Temporals, a distancia i treballadors de contracte són gratuits, com els becaris."
diplomat_suggestion:
title: "Ajuda a traduir CodeCombat!"
@ -179,12 +179,12 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
color: "Color"
group: "Grup"
clothes: "Roba"
# trim: "Trim"
trim: "Decoració"
cloud: "Nuvol"
team: "Equip"
# spell: "Spell"
spell: "Encanteri"
boots: "Botes"
# hue: "Hue"
hue: "Matriu"
saturation: "Saturació"
lightness: "Brillantor"
@ -202,21 +202,21 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
wizard_color: "Color de la roba"
new_password: "Contrasenya nova"
new_password_verify: "Verifica"
# email_subscriptions: "Email Subscriptions"
# email_subscriptions_none: "No Email Subscriptions."
# email_announcements: "Announcements"
# email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
email_subscriptions: "Subscripcions via correu electrònic"
email_subscriptions_none: "Sense subsrcipcions de correu electrònic."
email_announcements: "Notícies"
email_announcements_description: "Rebre les últimes notícies i desenvolupaments de CodeCombat."
email_notifications: "Notificacions"
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
email_notifications_summary: "Controls per personalitzar les teves notificacions d'email automàtiques relacionades amb la teva activitat a CodeCombat."
email_any_notes: "Cap notificació"
# email_any_notes_description: "Disable to stop all activity notification emails."
email_any_notes_description: "Desactiva totes les notificacions via correu electrònic."
email_news: "Noticies"
email_recruit_notes: "Oportunitats de feina"
# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job."
# contributor_emails: "Contributor Class Emails"
# contribute_prefix: "We're looking for people to join our party! Check out the "
# contribute_page: "contribute page"
# contribute_suffix: " to find out more."
contribute_suffix: " per a trobar més."
email_toggle: "Activa-ho tot"
error_saving: "Error en desar"
saved: "Canvis desats"
@ -232,14 +232,14 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
settings: "Configuració"
edit_profile: "Modifica el perfil"
done_editing: "Acaba l'edició"
# profile_for_prefix: "Profile for "
profile_for_prefix: "Perfil de "
profile_for_suffix: ""
# featured: "Featured"
featured: "Destacat"
# not_featured: "Not Featured"
looking_for: "Buscant:"
# last_updated: "Last updated:"
last_updated: "Ultima actualització:"
contact: "Contacta"
# active: "Looking for interview offers now"
active: "Buscant entrevistes de feina"
# inactive: "Not looking for offers right now"
complete: "complet"
next: "Seguent"
@ -247,7 +247,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
next_country: "escull el teu país."
next_name: "nom?"
next_short_description: "escriu una breu descripció."
# next_long_description: "describe your desired position."
next_long_description: "descriu el lloc de feina que desitges."
# next_skills: "list at least five skills."
# next_work: "chronicle your work history."
# next_education: "recount your educational ordeals."
@ -596,11 +596,11 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
editor:
# main_title: "CodeCombat Editors"
# article_title: "Article Editor"
article_title: "Editor d'articles "
# thang_title: "Thang Editor"
level_title: "Editor de nivells"
achievement_title: "Editor de triomfs"
# back: "Back"
back: "Enrere"
# revert: "Revert"
# revert_models: "Revert Models"
# pick_a_terrain: "Pick A Terrain"
@ -616,21 +616,21 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# level_tab_thangs: "Thangs"
# level_tab_scripts: "Scripts"
level_tab_settings: "Configuració"
# level_tab_components: "Components"
# level_tab_systems: "Systems"
level_tab_components: "Components"
level_tab_systems: "Sistemes"
# level_tab_docs: "Documentation"
# level_tab_thangs_title: "Current Thangs"
# level_tab_thangs_all: "All"
level_tab_thangs_all: "Tot"
# level_tab_thangs_conditions: "Starting Conditions"
# level_tab_thangs_add: "Add Thangs"
delete: "Esborrar"
duplicate: "Duplicar"
level_settings_title: "Configuració"
# level_component_tab_title: "Current Components"
level_component_tab_title: "Components actuals"
# level_component_btn_new: "Create New Component"
# level_systems_tab_title: "Current Systems"
level_systems_tab_title: "Sistemes actuals"
# level_systems_btn_new: "Create New System"
# level_systems_btn_add: "Add System"
level_systems_btn_add: "Afegir sistema"
# level_components_title: "Back to All Thangs"
# level_components_type: "Type"
# level_component_edit_title: "Edit Component"
@ -678,7 +678,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# subject: "Subject"
# email: "Email"
password: "Contrasenya"
# message: "Message"
message: "Missatge"
# code: "Code"
# ladder: "Ladder"
# when: "When"
@ -718,8 +718,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
matt_title: "Programador"
# matt_blurb: "Bicyclist"
# legal:
# page_title: "Legal"
legal:
page_title: "Legalitat"
# opensource_intro: "CodeCombat is free to play and completely open source."
# opensource_description_prefix: "Check out "
# github_url: "our GitHub"
@ -728,7 +728,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# opensource_description_suffix: "for a list of the software that makes this game possible."
# practices_title: "Respectful Best Practices"
# practices_description: "These are our promises to you, the player, in slightly less legalese."
# privacy_title: "Privacy"
privacy_title: "Privacitat"
# privacy_description: "We will not sell any of your personal information. We intend to make money through recruitment eventually, but rest assured we will not distribute your personal information to interested companies without your explicit consent."
# security_title: "Security"
# security_description: "We strive to keep your personal information safe. As an open source project, our site is freely open to anyone to review and improve our security systems."
@ -887,13 +887,13 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# simulate_all: "RESET AND SIMULATE GAMES"
# games_simulated_by: "Games simulated by you:"
# games_simulated_for: "Games simulated for you:"
# games_simulated: "Games simulated"
games_simulated: "Partides simulades"
games_played: "Partides guanyades"
# ratio: "Ratio"
# leaderboard: "Leaderboard"
# battle_as: "Battle as "
# summary_your: "Your "
# summary_matches: "Matches - "
summary_your: "Les teves "
summary_matches: "Partides - "
summary_wins: " Victories, "
summary_losses: " Derrotes"
# rank_no_code: "No New Code to Rank"
@ -910,42 +910,42 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
choose_opponent: "Escull adversari"
select_your_language: "Escull el teu idioma!"
tutorial_play: "Juga el tutorial"
# tutorial_recommended: "Recommended if you've never played before"
# tutorial_skip: "Skip Tutorial"
tutorial_recommended: "Recomenat si no has jugat abans"
tutorial_skip: "Salta el tutorial"
# tutorial_not_sure: "Not sure what's going on?"
# tutorial_play_first: "Play the Tutorial first."
# simple_ai: "Simple AI"
tutorial_play_first: "Juga el tutorial primer."
simple_ai: "IA simple"
# warmup: "Warmup"
# friends_playing: "Friends Playing"
friends_playing: "Amics jugant"
# 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"
fight: "Lluita!"
watch_victory: "Mira la teva victòria"
defeat_the: "Derrota a"
tournament_ends: "El torneig acaba"
tournament_ended: "El torneig ha acabat"
tournament_rules: "Normes del torneig"
# 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"
tournament_blurb_blog: "en el nostre blog"
rules: "Normes"
winners: "Guanyadors"
ladder_prizes:
title: "Premis del torneig"
# blurb_1: "These prizes will be awarded according to"
blurb_1: "Aquests premis seran guanyats d'acord amb"
blurb_2: "Les normes del torneig"
# 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.)"
blurb_3: "els millors jugadors humans i ogres."
blurb_4: "Dos equips signifiquen el doble de premis!"
blurb_5: "(Hi haura dos guanyadors pel primer lloc, dos pels del segon lloc, etc.)"
rank: "Rang"
prizes: "Premis"
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"
in_cash: "en diners"
custom_wizard: "Personalitza el teu bruixot de CodeCombat"
custom_avatar: "Personalitza el teu avatar de CodeCombat"
heap: "per sis mesosd'acces \"Startup\" "
credits: "credits"
# one_month_coupon: "coupon: choose either Rails or HTML"
# one_month_discount: "discount, 30% off: choose either Rails or HTML"
@ -953,21 +953,21 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# oreilly: "ebook of your choice"
loading_error:
# could_not_load: "Error loading from server"
could_not_load: "Error de carrega del servidor"
connection_failure: "Connexió fallida."
# unauthorized: "You need to be signed in. Do you have cookies disabled?"
# forbidden: "You do not have the permissions."
forbidden: "No disposes dels permisos."
not_found: "No trobat."
# not_allowed: "Method not allowed."
not_allowed: "Metode no permès."
# timeout: "Server timeout."
# conflict: "Resource conflict."
# bad_input: "Bad input."
bad_input: "Entrada incorrecta."
server_error: "Error del servidor."
unknown: "Error desconegut."
resources:
sessions: "Sessions"
# your_sessions: "Your Sessions"
your_sessions: "Les teves sessions"
level: "Nivell"
# social_network_apis: "Social Network APIs"
# facebook_status: "Facebook Status"
@ -975,24 +975,24 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# 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"
leaderboard: "Classificació"
user_schema: "Esquema d'usuari"
user_profile: "Perfil d'usuari"
patches: "Pegats"
patched_model: "Document font"
model: "Model"
system: "Sistema"
systems: "Sistemes"
# component: "Component"
# components: "Components"
component: "Component"
components: "Components"
# thang: "Thang"
# thangs: "Thangs"
level_session: "La teva sessió"
# opponent_session: "Opponent Session"
# article: "Article"
opponent_session: "Sessió de l'adversari"
article: "Article"
user_names: "Noms d'usuaris"
# thang_names: "Thang Names"
files: "Archius"
files: "Arxius"
# top_simulators: "Top Simulators"
# source_document: "Source Document"
document: "Documents"
@ -1007,15 +1007,15 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
heroes: "Herois"
wizard: "Bruixot"
achievement: "Triomf"
# clas: "CLAs"
clas: "CLAs"
# play_counts: "Play Counts"
# feedback: "Feedback"
feedback: "Feedback"
delta:
added: "Afegit"
modified: "Modificat"
deleted: "Eliminat"
# moved_index: "Moved Index"
moved_index: "Índex desplaçat"
# text_diff: "Text Diff"
# merge_conflict_with: "MERGE CONFLICT WITH"
no_changes: "Sense canvis"

View file

@ -59,6 +59,7 @@
about: "About"
contact: "Contact"
twitter_follow: "Follow"
teachers: "Teachers"
employers: "Employers"
versions:

View file

@ -117,7 +117,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
adventurer_forum: "fórum do Aventureiro"
adventurer_suffix: "."
campaign_beginner: "Campanha para Iniciantes"
# campaign_old_beginner: "Old Beginner Campaign"
campaign_old_beginner: "Campanha para Iniciantes Antiga"
campaign_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."
@ -140,8 +140,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
next: "Seguinte"
previous: "Anterior"
choose_inventory: "Equipar Itens"
# older_campaigns: "Older Campaigns"
# anonymous: "Anonymous Player"
older_campaigns: "Campanhas Mais Antigas"
anonymous: "Jogador Anónimo"
items:
armor: "Armadura"
@ -419,9 +419,9 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
tome_cast_button_running: "A Correr"
tome_cast_button_ran: "Corrido"
tome_submit_button: "Submeter"
# 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_reload_method: "Recarregar o código original para este método" # Title text for individual method reload button.
tome_select_method: "Selecionar um método"
tome_see_all_methods: "Ver todos os métodos editáveis" # Title text for method list selector (shown when there are multiple programmable methdos).
tome_select_a_thang: "Seleciona Alguém para "
tome_available_spells: "Feitiços Disponíveis"
tome_your_skills: "As Tuas Habilidades"

View file

@ -29,6 +29,9 @@ module.exports =
viewClass: {type: 'function'}
viewArgs: {type: 'array'}
'router:navigated': c.object {required: ['route']},
route: {type: 'string'}
'achievements:new': c.object {required: ['earnedAchievements']},
earnedAchievements: {type: 'object'}

View file

@ -1,14 +1,24 @@
@import "app/styles/mixins"
#select-point-modal
#world-select-modal
@include user-select(none)
.modal-body
max-height: inherit
canvas
background-color: #ddd
.canvas-wrapper
position: relative
.normal-canvas
position: absolute
bottom: 0
left: 0
z-index: 1
pointer-events: none
.webgl-canvas
border: 1px solid black
background-color: #ddd
.instructions .alert
float: left

View file

@ -111,9 +111,14 @@
// Below snatched from play/level.sass; should refactor?
canvas#surface
canvas
background-color: #ddd
width: 100%
display: block
z-index: 1
border: 1px solid black
#webgl-surface
z-index: 1
#normal-surface
z-index: 2

View file

@ -267,6 +267,9 @@ body.ipad #level-view
a, .editor-dash
display: none
#goals-view
left: 40px
#level-chat-view
bottom: 40px

View file

@ -75,7 +75,7 @@ body
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
a(href='http://blog.codecombat.com/', data-i18n="nav.blog") Blog
a(href='http://discourse.codecombat.com/', data-i18n="nav.forum") Forum
a(href='/teachers', data-i18n="nav.forum") Teachers
a(href='/teachers', data-i18n="nav.teachers") Teachers
if me.isAdmin()
a(href='/admin', data-i18n="nav.admin") Admin

View file

@ -32,7 +32,9 @@ block modal-body-content
div.alert.alert-info
strong Enter
| to confirm
canvas(width=924, height=589)
.canvas-wrapper
canvas(width=924, height=589).webgl-canvas
canvas(width=924, height=589).normal-canvas
block modal-footer-content
a.btn.btn-primary#done-button Done

View file

@ -14,7 +14,8 @@ button.btn#thangs-palette-toggle
a(data-i18n="editor.delete") Delete
li#duplicate
a(data-i18n="editor.duplicate") Duplicate
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

View file

@ -1,10 +1,10 @@
ModalView = require 'views/kinds/ModalView'
template = require 'templates/editor/level/modal/world_select'
template = require 'templates/editor/level/modal/world-select-modal'
Surface = require 'lib/surface/Surface'
ThangType = require 'models/ThangType'
module.exports = class WorldSelectModal extends ModalView
id: 'select-point-modal'
id: 'world-select-modal'
template: template
modalWidthPercent: 80
cache: false
@ -41,10 +41,12 @@ module.exports = class WorldSelectModal extends ModalView
# surface setup
initSurface: ->
canvas = @$el.find('canvas')
canvas.attr('width', currentView.$el.width()*.8-70)
canvas.attr('height', currentView.$el.height()*.6)
@surface = new Surface @world, canvas, {
webGLCanvas = @$el.find('.webgl-canvas')
normalCanvas = @$el.find('.normal-canvas')
canvases = webGLCanvas.add(normalCanvas)
canvases.attr('width', currentView.$el.width()*.8-70)
canvases.attr('height', currentView.$el.height()*.6)
@surface = new Surface @world, normalCanvas, webGLCanvas, {
wizards: false
paths: false
grid: true

View file

@ -184,8 +184,9 @@ module.exports = class ThangsTabView extends CocoView
@openSmallerFolders(child)
initSurface: ->
surfaceCanvas = $('canvas#surface', @$el)
@surface = new Surface @world, surfaceCanvas, {
webGLCanvas = $('canvas#webgl-surface', @$el)
normalCanvas = $('canvas#normal-surface', @$el)
@surface = new Surface @world, normalCanvas, webGLCanvas, {
wizards: false
paths: false
coords: true
@ -219,7 +220,7 @@ module.exports = class ThangsTabView extends CocoView
onViewSwitched: (e) ->
@selectAddThang null, true
@surface?.spriteBoss?.selectSprite null, null
@surface?.lankBoss?.selectLank null, null
onSpriteMouseDown: (e) ->
@dragged = false
@ -229,7 +230,7 @@ module.exports = class ThangsTabView extends CocoView
# @onSpriteContextMenu e
onStageMouseDown: (e) ->
return unless @addThangSprite?.thangType.get('kind') is 'Wall'
return unless @addThangLank?.thangType.get('kind') is 'Wall'
@surface.camera.dragDisabled = true
@paintingWalls = true
@ -238,9 +239,9 @@ module.exports = class ThangsTabView extends CocoView
# We need to stop painting walls, but we may also stop in onExtantThangSelected.
_.defer =>
@paintingWalls = @paintedWalls = @surface.camera.dragDisabled = false
else if @addThangSprite
else if @addThangLank
@surface.camera.lock()
# If we click on the background, we need to add @addThangSprite, but not if onSpriteMouseUp will fire.
# If we click on the background, we need to add @addThangLank, but not if onSpriteMouseUp will fire.
@backgroundAddClickTimeout = _.defer => @onExtantThangSelected {}
$('#contextmenu').hide()
@ -252,7 +253,7 @@ module.exports = class ThangsTabView extends CocoView
cap = @surface.camera.screenToCanvas x: stageX, y: stageY
wop = @surface.camera.canvasToWorld cap
wop.z = @selectedExtantThang.depth / 2
@adjustThangPos @selectedExtantSprite, @selectedExtantThang, wop
@adjustThangPos @selectedExtantLank, @selectedExtantThang, wop
[w, h] = [@surface.camera.canvasWidth, @surface.camera.canvasHeight]
sidebarWidths = ((if @$el.find(id).hasClass('hide') then 0 else (@$el.find(id).outerWidth() / @surface.camera.canvasScaleFactorX)) for id in ['#all-thangs', '#add-thangs-view'])
w -= sidebarWidth for sidebarWidth in sidebarWidths
@ -304,9 +305,9 @@ module.exports = class ThangsTabView extends CocoView
# TODO: figure out a good way to have all Surface clicks and Treema clicks just proxy in one direction, so we can maintain only one way of handling selection and deletion
onExtantThangSelected: (e) ->
@selectedExtantSprite?.setNameLabel? null unless @selectedExtantSprite is e.sprite
@selectedExtantLank?.setNameLabel? null unless @selectedExtantLank is e.sprite
@selectedExtantThang = e.thang
@selectedExtantSprite = e.sprite
@selectedExtantLank = e.sprite
paintedAWall = @paintedWalls
@paintingWalls = @paintedWalls = @surface.camera.dragDisabled = false
if paintedAWall
@ -318,15 +319,15 @@ module.exports = class ThangsTabView extends CocoView
else if @justAdded()
# Skip double insert due to extra selection event
null
else if e.thang and not (@addThangSprite and @addThangType.get('name') in overlappableThangTypeNames)
else if e.thang and not (@addThangLank and @addThangType.get('name') in overlappableThangTypeNames)
# We clicked on a Thang (or its Treema), so select the Thang
@selectAddThang null, true
@selectedExtantThangClickTime = new Date()
# Show the label above selected thang, notice that we may get here from thang-edit-view, so it will be selected but no label
@selectedExtantSprite.setNameLabel @selectedExtantSprite.thangType.get('name') + ': ' + @selectedExtantThang.id
else if @addThangSprite
@selectedExtantLank.setNameLabel @selectedExtantLank.thangType.get('name') + ': ' + @selectedExtantThang.id
else if @addThangLank
# We clicked on the background when we had an add Thang selected, so add it
@addThang @addThangType, @addThangSprite.thang.pos
@addThang @addThangType, @addThangLank.thang.pos
@lastAddTime = new Date()
justAdded: -> @lastAddTime and (new Date() - @lastAddTime) < 150
@ -354,19 +355,19 @@ module.exports = class ThangsTabView extends CocoView
selectAddThangType: (type, @cloneSourceThang) ->
if _.isString type
type = _.find @supermodel.getModels(ThangType), (m) -> m.get('name') is type
pos = @addThangSprite?.thang.pos # Maintain old sprite's pos if we have it
@surface.spriteBoss.removeSprite @addThangSprite if @addThangSprite
pos = @addThangLank?.thang.pos # Maintain old sprite's pos if we have it
@surface.lankBoss.removeLank @addThangLank if @addThangLank
@addThangType = type
if @addThangType
thang = @createAddThang()
@addThangSprite = @surface.spriteBoss.addThangToSprites thang, @surface.spriteBoss.layerAdapters['Floating']
@addThangSprite.notOfThisWorld = true
@addThangSprite.sprite.alpha = 0.75
@addThangSprite.playSound? 'selected'
@addThangLank = @surface.lankBoss.addThangToLanks thang, @surface.lankBoss.layerAdapters['Floating']
@addThangLank.notOfThisWorld = true
@addThangLank.sprite.alpha = 0.75
@addThangLank.playSound? 'selected'
pos ?= x: Math.round(@world.width / 2), y: Math.round(@world.height / 2)
@adjustThangPos @addThangSprite, thang, pos
@adjustThangPos @addThangLank, thang, pos
else
@addThangSprite = null
@addThangLank = null
createEssentialComponents: (defaultComponents) ->
physicalConfig = {pos: {x: 10, y: 10, z: 1}}
@ -399,32 +400,32 @@ module.exports = class ThangsTabView extends CocoView
pos.y = Math.round((pos.y - (thang.height ? 1) / 2) / snap.y) * snap.y + (thang.height ? 1) / 2
pos.z = thang.depth / 2
thang.pos = pos
@surface.spriteBoss.update true # Make sure Obstacle layer resets cache
@surface.lankBoss.update true # Make sure Obstacle layer resets cache
onSurfaceMouseMoved: (e) ->
return unless @addThangSprite
return unless @addThangLank
wop = @surface.camera.screenToWorld x: e.x, y: e.y
wop.z = 0.5
@adjustThangPos @addThangSprite, @addThangSprite.thang, wop
@adjustThangPos @addThangLank, @addThangLank.thang, wop
if @paintingWalls
unless _.find @surface.spriteBoss.spriteArray, ((sprite) =>
sprite.thangType.get('kind') is 'Wall' and
Math.abs(sprite.thang.pos.x - @addThangSprite.thang.pos.x) < 2 and
Math.abs(sprite.thang.pos.y - @addThangSprite.thang.pos.y) < 2 and
sprite isnt @addThangSprite
unless _.find @surface.lankBoss.lankArray, ((lank) =>
lank.thangType.get('kind') is 'Wall' and
Math.abs(lank.thang.pos.x - @addThangLank.thang.pos.x) < 2 and
Math.abs(lank.thang.pos.y - @addThangLank.thang.pos.y) < 2 and
lank isnt @addThangLank
)
@addThang @addThangType, @addThangSprite.thang.pos
@addThang @addThangType, @addThangLank.thang.pos
@lastAddTime = new Date()
@paintedWalls = true
null
onSurfaceMouseOver: (e) ->
return unless @addThangSprite
@addThangSprite.sprite.visible = true
return unless @addThangLank
@addThangLank.sprite.visible = true
onSurfaceMouseOut: (e) ->
return unless @addThangSprite
@addThangSprite.sprite.visible = false
return unless @addThangLank
@addThangLank.sprite.visible = false
calculateMovement: (pctX, pctY, widthHeightRatio) ->
MOVE_TOP_MARGIN = 1.0 - MOVE_MARGIN
@ -521,14 +522,14 @@ module.exports = class ThangsTabView extends CocoView
# update selection, since the thangs have been remade
if @selectedExtantThang
@selectedExtantSprite = @surface.spriteBoss.sprites[@selectedExtantThang.id]
@selectedExtantThang = @selectedExtantSprite?.thang
@selectedExtantLank = @surface.lankBoss.lanks[@selectedExtantThang.id]
@selectedExtantThang = @selectedExtantLank?.thang
Backbone.Mediator.publish 'editor:thangs-edited', thangs: @world.thangs
onTreemaThangSelected: (e, selectedTreemas) =>
selectedThangID = _.last(selectedTreemas)?.data.id
if selectedThangID isnt @selectedExtantThang?.id
@surface.spriteBoss.selectThang selectedThangID, null, true
@surface.lankBoss.selectThang selectedThangID, null, true
onTreemaThangDoubleClicked: (e, treema) =>
id = treema?.data?.id
@ -566,6 +567,7 @@ module.exports = class ThangsTabView extends CocoView
thangData = $(e.target).data 'thang-data'
else # Mediator event
thangData = @getThangByID(e.thangID)
return unless thangData
@editThangView = new LevelThangEditView thangData: thangData, level: @level, world: @world, supermodel: @supermodel, oldPath: @pathForThang(thangData) # supermodel needed for checkForMissingSystems
@insertSubView @editThangView
@$el.find('>').hide()

View file

@ -68,7 +68,8 @@ module.exports = class WorldMapView extends RootView
for level, index in campaign.levels
level.x ?= 10 + 80 * Math.random()
level.y ?= 10 + 80 * Math.random()
level.locked = index > 0 and not me.earnedLevel level.original
#level.locked = index > 0 and not me.earnedLevel level.original
level.locked = false # Until we can solve the bug.
context.levelStatusMap = @levelStatusMap
context.levelPlayCountMap = @levelPlayCountMap
context.isIPadApp = application.isIPadApp

View file

@ -94,6 +94,7 @@ exports.config =
semicolons: false
sass:
mode: 'ruby'
allowCache: true
onCompile: (files) ->
exec = require('child_process').exec

View file

@ -16,7 +16,6 @@ class EarnedAchievementHandler extends Handler
recalculate: (req, res) ->
onSuccess = (data) => log.debug 'Finished recalculating achievements'
console.log 'req.body.achievements is', req.body.achievements
if 'achievements' of req.body # Support both slugs and IDs separated by commas
achievementSlugsOrIDs = req.body.achievements
EarnedAchievementHandler.recalculate achievementSlugsOrIDs, onSuccess
@ -55,7 +54,7 @@ class EarnedAchievementHandler extends Handler
log.info "Recalculating a total of #{achievements.length} achievements..."
# Fetch every single user. This tends to get big so do it in a streaming fashion.
userStream = User.find(slug: 'nick').sort('_id').stream()
userStream = User.find().sort('_id').stream()
streamFinished = false
usersTotal = 0
usersFinished = 0

View file

@ -528,7 +528,7 @@ var p = SpriteStage.prototype = new createjs.Stage();
* into itself).
**/
p.draw = function(ctx, ignoreCache) {
if (ctx === this._webGLContext || ctx instanceof WebGLRenderingContext) {
if (typeof WebGLRenderingContext !== 'undefined' && (ctx === this._webGLContext || ctx instanceof WebGLRenderingContext)) {
this._drawWebGLKids(this.children, ctx);
// If there is a remaining texture, draw it: