Merge branch 'master' into production

This commit is contained in:
Nick Winter 2014-08-04 19:46:11 -07:00
commit 33b1f9ba6e
174 changed files with 1725 additions and 1257 deletions

View file

@ -6,7 +6,10 @@ NotFoundView = require('views/NotFoundView')
go = (path) -> -> @routeDirectly path, arguments go = (path) -> -> @routeDirectly path, arguments
module.exports = class CocoRouter extends Backbone.Router module.exports = class CocoRouter extends Backbone.Router
subscribe: ->
initialize: ->
# http://nerds.airbnb.com/how-to-add-google-analytics-page-tracking-to-57536
@bind 'route', @_trackPageView
Backbone.Mediator.subscribe 'gapi-loaded', @onGPlusAPILoaded, @ Backbone.Mediator.subscribe 'gapi-loaded', @onGPlusAPILoaded, @
Backbone.Mediator.subscribe 'router:navigate', @onNavigate, @ Backbone.Mediator.subscribe 'router:navigate', @onNavigate, @
@ -14,12 +17,24 @@ module.exports = class CocoRouter extends Backbone.Router
'': go('HomeView') '': go('HomeView')
'about': go('AboutView') 'about': go('AboutView')
'admin': go('AdminView')
'account/profile(/:userID)': go('account/JobProfileView')
'account/settings': go('account/AccountSettingsView')
'account/unsubscribe': go('account/UnsubscribeView')
'admin': go('admin/MainAdminView')
'admin/candidates': go('admin/CandidatesView')
'admin/clas': go('admin/CLAsView')
'admin/employers': go('admin/EmployersListView')
'admin/files': go('admin/FilesView')
'admin/level-sessions': go('admin/LevelSessionsView')
'admin/users': go('admin/UsersView')
'beta': go('HomeView') 'beta': go('HomeView')
'cla': go('CLAView') 'cla': go('CLAView')
'community': go('CommunityView') 'community': go('CommunityView')
'contribute': go('contribute/MainContributeView') 'contribute': go('contribute/MainContributeView')
'contribute/adventurer': go('contribute/AdventurerView') 'contribute/adventurer': go('contribute/AdventurerView')
'contribute/ambassador': go('contribute/AmbassadorView') 'contribute/ambassador': go('contribute/AmbassadorView')
@ -28,71 +43,84 @@ module.exports = class CocoRouter extends Backbone.Router
'contribute/diplomat': go('contribute/DiplomatView') 'contribute/diplomat': go('contribute/DiplomatView')
'contribute/scribe': go('contribute/ScribeView') 'contribute/scribe': go('contribute/ScribeView')
'db/*path': 'routeToServer'
'demo(/*subpath)': go('DemoView') 'demo(/*subpath)': go('DemoView')
'docs/components': go('docs/ComponentDocumentationView')
'editor': go('editor/MainEditorView') 'editor': go('editor/MainEditorView')
'editor/achievement': go('editor/achievement/AchievementSearchView')
'editor/achievement': go('editor/achievement/AchievementEditView')
'editor/article': go('editor/article/ArticleSearchView')
'editor/article/preview': go('editor/article/ArticlePreviewView')
'editor/article/:articleID': go('editor/article/ArticleEditView')
'editor/level': go('editor/level/LevelSearchView')
'editor/level/:levelID': go('editor/level/LevelEditView')
'editor/thang': go('editor/thang/ThangTypeSearchView')
'editor/thang/:thangID': go('editor/thang/ThangTypeEditView')
'employers': go('EmployersView') 'employers': go('EmployersView')
'file/*path': 'routeToServer'
'legal': go('LegalView') 'legal': go('LegalView')
'multiplayer': go('MultiplayerView') 'multiplayer': go('MultiplayerView')
'play': go('play/MainPlayView') 'play': go('play/MainPlayView')
'play/ladder/:levelID': go('play/ladder/LadderView')
'play/ladder': go('play/ladder/MainLadderView')
'play/level/:levelID': go('play/level/PlayLevelView')
'play/spectate/:levelID': go('play/SpectateView')
'preview': go('HomeView') 'preview': go('HomeView')
'teachers': go('TeachersView') 'teachers': go('TeachersView')
'test(/*subpath)': go('TestView') 'test(/*subpath)': go('TestView')
'*name': 'showNotFoundView'
# editor views tend to have the same general structure routeToServer: (e) ->
'editor/:model(/:slug_or_id)(/:subview)': 'editorModelView' window.location.href = window.location.href
# Direct links routeDirectly: (path, args) ->
path = "views/#{path}"
ViewClass = @tryToLoadModule path
'play/ladder/:levelID': go('play/ladder/ladder_view') return @openView @notFoundView() if not ViewClass
'play/ladder': go('play/ladder_home') view = new ViewClass({}, args...) # options, then any path fragment args
# db and file urls call the server directly
'db/*path': 'routeToServer'
'file/*path': 'routeToServer'
# most go through here
'*name': 'general'
home: -> @openRoute('home')
general: (name) ->
@openRoute(name)
editorModelView: (modelName, slugOrId, subview) ->
modulePrefix = "views/editor/#{modelName}/"
suffix = subview or (if slugOrId then 'edit' else 'home')
ViewClass = @tryToLoadModule(modulePrefix + suffix)
unless ViewClass
#console.log('could not hack it', modulePrefix + suffix)
args = (a for a in arguments when a)
args.splice(0, 0, 'editor')
return @openRoute(args.join('/'))
view = new ViewClass({}, slugOrId)
view.render() view.render()
@openView if view then view else @notFoundView()
cache: {}
openRoute: (route) ->
route = route.split('?')[0]
route = route.split('#')[0]
view = @getViewFromCache(route)
@openView(view) @openView(view)
tryToLoadModule: (path) ->
try
return require(path)
catch error
if error.toString().search('Cannot find module "' + path + '" from') is -1
throw error
showNotFoundView: ->
@openView @notFoundView()
notFoundView: ->
view = new NotFoundView()
view.render()
openView: (view) -> openView: (view) ->
@closeCurrentView() @closeCurrentView()
$('#page-container').empty().append view.el $('#page-container').empty().append view.el
window.currentView = view window.currentView = view
@activateTab() @activateTab()
@renderLoginButtons() @renderLoginButtons()
window.scrollTo(0, view.scrollY) if view.scrollY?
view.afterInsert() view.afterInsert()
view.didReappear() if view.fromCache view.didReappear()
closeCurrentView: ->
if window.currentView?.reloadOnClose
return document.location.reload()
window.currentModal?.hide?()
return unless window.currentView?
window.currentView.destroy()
onGPlusAPILoaded: => onGPlusAPILoaded: =>
@renderLoginButtons() @renderLoginButtons()
@ -117,71 +145,10 @@ module.exports = class CocoRouter extends Backbone.Router
else else
console.warn 'Didn\'t have gapi.signin to render G+ login button. (DoNotTrackMe extension?)' console.warn 'Didn\'t have gapi.signin to render G+ login button. (DoNotTrackMe extension?)'
getViewFromCache: (route) ->
if route of @cache
@cache[route].fromCache = true
return @cache[route]
view = @getView(route)
@cache[route] = view if view?.cache
return view
routeDirectly: (path, args) ->
if window.currentView?.reloadOnClose
return document.location.reload()
path = "views/#{path}"
ViewClass = @tryToLoadModule path
return @openView @notFoundView() if not ViewClass
view = new ViewClass({}, args...) # options, then any path fragment args
view.render()
@openView(view)
getView: (route, suffix='_view') ->
# iteratively breaks down the url pieces looking for the view
# passing the broken off pieces as args. This way views like 'resource/14394893'
# will get passed to the resource view with arg '14394893'
pieces = _.string.words(route, '/')
split = Math.max(1, pieces.length-1)
while split > -1
sub_route = _.string.join('/', pieces[0..split]...)
path = "views/#{sub_route}#{suffix}"
ViewClass = @tryToLoadModule(path)
break if ViewClass
split -= 1
return @notFoundView() if not ViewClass
args = pieces[split+1..]
view = new ViewClass({}, args...) # options, then any path fragment args
view.render()
tryToLoadModule: (path) ->
try
return require(path)
catch error
if error.toString().search('Cannot find module "' + path + '" from') is -1
throw error
notFoundView: ->
view = new NotFoundView()
view.render()
closeCurrentView: ->
window.currentModal?.hide?()
return unless window.currentView?
if window.currentView.cache
window.currentView.scrollY = window.scrollY
window.currentView.willDisappear()
else
window.currentView.destroy()
activateTab: -> activateTab: ->
base = _.string.words(document.location.pathname[1..], '/')[0] base = _.string.words(document.location.pathname[1..], '/')[0]
$("ul.nav li.#{base}").addClass('active') $("ul.nav li.#{base}").addClass('active')
initialize: ->
@cache = {}
# http://nerds.airbnb.com/how-to-add-google-analytics-page-tracking-to-57536
@bind 'route', @_trackPageView
_trackPageView: -> _trackPageView: ->
window.tracker?.trackPageView() window.tracker?.trackPageView()
@ -196,6 +163,3 @@ module.exports = class CocoRouter extends Backbone.Router
@openView view @openView view
else else
@openView e.view @openView e.view
routeToServer: (e) ->
window.location.href = window.location.href

View file

@ -35,7 +35,7 @@ preload = (arrayOfImages) ->
$('<img/>')[0].src = @ $('<img/>')[0].src = @
Application = initialize: -> Application = initialize: ->
Router = require('lib/Router') Router = require('Router')
@tracker = new Tracker() @tracker = new Tracker()
@facebookHandler = new FacebookHandler() @facebookHandler = new FacebookHandler()
@gplusHandler = new GPlusHandler() @gplusHandler = new GPlusHandler()
@ -53,7 +53,6 @@ Application = initialize: ->
#resPostPath: '/languages/add/__lng__/__ns__' #resPostPath: '/languages/add/__lng__/__ns__'
}, (t) => }, (t) =>
@router = new Router() @router = new Router()
@router.subscribe()
onIdleChanged = (to) => => Backbone.Mediator.publish 'application:idle-changed', idle: @userIsIdle = to onIdleChanged = (to) => => Backbone.Mediator.publish 'application:idle-changed', idle: @userIsIdle = to
@idleTracker = new Idle @idleTracker = new Idle
onAway: onIdleChanged true onAway: onIdleChanged true

BIN
app/assets/images/common/code_languages/io_icon.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View file

@ -31,12 +31,11 @@ init = ->
app.initialize() app.initialize()
Backbone.history.start({ pushState: true }) Backbone.history.start({ pushState: true })
handleNormalUrls() handleNormalUrls()
setUpMoment() # Set up i18n for moment
treemaExt = require 'treema-ext' treemaExt = require 'treema-ext'
treemaExt.setup() treemaExt.setup()
$ -> init()
handleNormalUrls = -> handleNormalUrls = ->
# http://artsy.github.com/blog/2012/06/25/replacing-hashbang-routes-with-pushstate/ # http://artsy.github.com/blog/2012/06/25/replacing-hashbang-routes-with-pushstate/
$(document).on 'click', "a[href^='/']", (event) -> $(document).on 'click', "a[href^='/']", (event) ->
@ -66,6 +65,12 @@ setUpDefinitions = ->
for definition of definitionSchemas for definition of definitionSchemas
Backbone.Mediator.addDefSchemas definitionSchemas[definition] Backbone.Mediator.addDefSchemas definitionSchemas[definition]
setUpMoment = ->
{me} = require 'lib/auth'
moment.lang me.lang(), {}
me.on 'change', (me) ->
moment.lang me.lang(), {} if me._previousAttributes.preferredLanguage isnt me.get 'preferredLanguage'
initializeServices = -> initializeServices = ->
services = [ services = [
'./lib/services/filepicker' './lib/services/filepicker'
@ -93,3 +98,5 @@ watchForErrors = ->
#msg += "\nError: #{error}" if error? #msg += "\nError: #{error}" if error?
#msg += "\nStack: #{stack}" if stack = error?.stack #msg += "\nStack: #{stack}" if stack = error?.stack
noty text: msg, layout: 'topCenter', type: 'error', killer: false, timeout: 5000, dismissQueue: true, maxVisible: 3, callback: {onClose: -> --currentErrors} noty text: msg, layout: 'topCenter', type: 'error', killer: false, timeout: 5000, dismissQueue: true, maxVisible: 3, callback: {onClose: -> --currentErrors}
$ -> init()

View file

@ -11,6 +11,7 @@ module.exports.formToObject = (el) ->
module.exports.applyErrorsToForm = (el, errors, warning=false) -> module.exports.applyErrorsToForm = (el, errors, warning=false) ->
errors = [errors] if not $.isArray(errors) errors = [errors] if not $.isArray(errors)
missingErrors = []
for error in errors for error in errors
if error.dataPath if error.dataPath
prop = error.dataPath[1..] prop = error.dataPath[1..]
@ -23,8 +24,10 @@ module.exports.applyErrorsToForm = (el, errors, warning=false) ->
message = error.message if error.formatted message = error.message if error.formatted
prop = error.property prop = error.property
setErrorToProperty el, prop, message, warning missingErrors.push error unless setErrorToProperty el, prop, message, warning
missingErrors
# Returns the jQuery form group element in case of success, otherwise undefined
module.exports.setErrorToField = setErrorToField = (el, message, warning=false) -> module.exports.setErrorToField = setErrorToField = (el, message, warning=false) ->
formGroup = el.closest('.form-group') formGroup = el.closest('.form-group')
unless formGroup.length unless formGroup.length

View file

@ -28,10 +28,12 @@ Filters.brightness = (pixels, adjustment) ->
i+=4 i+=4
return pixels return pixels
module.exports.darkenImage = darkenImage = (img, pct=0.5) -> module.exports.darkenImage = darkenImage = (img, borderImageSelector, pct=0.5) ->
jqimg = $(img) jqimg = $(img)
cachedValue = jqimg.data('darkened') cachedValue = jqimg.data('darkened')
return img.src = cachedValue if cachedValue if cachedValue
$(borderImageSelector).css 'border-image-source', 'url(' + cachedValue + ')'
return img.src = cachedValue
jqimg.data('original', img.src) unless jqimg.data('original') jqimg.data('original', img.src) unless jqimg.data('original')
if not (img.naturalWidth > 0 and img.naturalHeight > 0) if not (img.naturalWidth > 0 and img.naturalHeight > 0)
console.warn 'Tried to darken image', img, 'but it has natural dimensions', img.naturalWidth, img.naturalHeight console.warn 'Tried to darken image', img, 'but it has natural dimensions', img.naturalWidth, img.naturalHeight
@ -41,9 +43,11 @@ module.exports.darkenImage = darkenImage = (img, pct=0.5) ->
ctx = c.getContext('2d') ctx = c.getContext('2d')
ctx.putImageData(imageData, 0, 0) ctx.putImageData(imageData, 0, 0)
img.src = c.toDataURL() img.src = c.toDataURL()
$(borderImageSelector).css 'border-image-source', 'url(' + img.src + ')'
jqimg.data('darkened', img.src) jqimg.data('darkened', img.src)
module.exports.revertImage = revertImage = (img) -> module.exports.revertImage = revertImage = (img, borderImageSelector) ->
jqimg = $(img) jqimg = $(img)
return unless jqimg.data('original') return unless jqimg.data('original')
$(borderImageSelector).css 'border-image-source', 'url(' + jqimg.data('original') + ')'
img.src = jqimg.data('original') img.src = jqimg.data('original')

View file

@ -597,7 +597,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
if @thangType.get('name') in ['Arrow', 'Spear'] and @thang.action is 'die' if @thangType.get('name') in ['Arrow', 'Spear'] and @thang.action is 'die'
@marks.shadow?.hide() @marks.shadow?.hide()
mark.update() for name, mark of @marks mark.update() for name, mark of @marks
#@thang.effectNames = ['berserk', 'confuse', 'control', 'curse', 'fear', 'poison', 'paralyze', 'regen', 'sleep', 'slow', 'haste'] #@thang.effectNames = ['warcry', 'confuse', 'control', 'curse', 'fear', 'poison', 'paralyze', 'regen', 'sleep', 'slow', 'haste']
@updateEffectMarks() if @thang?.effectNames?.length or @previousEffectNames?.length @updateEffectMarks() if @thang?.effectNames?.length or @previousEffectNames?.length
updateEffectMarks: -> updateEffectMarks: ->

View file

@ -1,7 +1,7 @@
module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "German (Switzerland)", translation: module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "German (Switzerland)", translation:
common: common:
loading: "Lade..." loading: "Lade..."
saving: "Spiichere..." saving: "Speichere..."
sending: "Sende..." sending: "Sende..."
send: "G'sendet" send: "G'sendet"
cancel: "Abbreche" cancel: "Abbreche"
@ -40,7 +40,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
okay: "Okay" okay: "Okay"
not_found: not_found:
page_not_found: "Siite nöd gfunde" page_not_found: "Siite nid gfunde"
nav: nav:
play: "Levels" play: "Levels"
@ -51,8 +51,8 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
account: "Account" account: "Account"
admin: "Admin" admin: "Admin"
home: "Home" home: "Home"
contribute: "Spende" contribute: "Mitmache"
# legal: "Legal" legal: "Rechtlichs"
about: "Über" about: "Über"
contact: "Kontakt" contact: "Kontakt"
twitter_follow: "Folge" twitter_follow: "Folge"
@ -100,26 +100,26 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
for_beginners: "Für Afänger" for_beginners: "Für Afänger"
multiplayer: "Multiplayer" multiplayer: "Multiplayer"
for_developers: "Für Entwickler" for_developers: "Für Entwickler"
# javascript_blurb: "The language of the web. Great for writing websites, web apps, HTML5 games, and servers." javascript_blurb: "D Internetsproch. Super zum Websiite, Web Apps, HTML5 Games und Server schriibe."
# python_blurb: "Simple yet powerful, Python is a great general purpose programming language." python_blurb: "Eifach und doch mächtig. Python isch grossartigi, allgemein isetzbari Programmiersproch."
# coffeescript_blurb: "Nicer JavaScript syntax." coffeescript_blurb: "Nettere JavaScript Syntax."
# clojure_blurb: "A modern Lisp." # clojure_blurb: "A modern Lisp."
# lua_blurb: "Game scripting language." lua_blurb: "D Sproch für Game Scripts."
# io_blurb: "Simple but obscure." io_blurb: "Eifach aber undurchsichtig."
play: play:
choose_your_level: "Wähl dis Level us" choose_your_level: "Wähl dis Level us"
adventurer_prefix: "Du chasch zu de untere Level zrugg goh oder die kommende Level diskutiere " adventurer_prefix: "Du chasch zu de untere Level zrugg goh oder die kommende Level diskutiere im "
adventurer_forum: "s Abentürer-Forum" adventurer_forum: "Abentürer-Forum"
# adventurer_suffix: "." adventurer_suffix: "."
campaign_beginner: "Afängerkampagne" campaign_beginner: "Afängerkampagne"
campaign_beginner_description: "... i dere du d Zauberkunst vom Programmiere lernsch." campaign_beginner_description: "... i dere du d Zauberkunst vom Programmiere lernsch."
campaign_dev: "Zuefälligi schwierigeri Level" campaign_dev: "Zuefälligi schwierigeri Level"
campaign_dev_description: "... i dene du s Interface kenne lernsch, während du öppis chli Schwierigers machsch." campaign_dev_description: "... i dene du s Interface kenne lernsch, während du öppis chli Schwierigers machsch."
campaign_multiplayer: "Multiplayer Arenas" campaign_multiplayer: "Multiplayer Arenas"
campaign_multiplayer_description: "... i dene du Chopf a Chopf geg anderi Spieler spielsch." campaign_multiplayer_description: "... i dene du Chopf a Chopf geg anderi Spieler spielsch."
# campaign_player_created: "Player-Created" campaign_player_created: "Vo Spieler erstellti Level"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... i dene du gege d Kreativität vome <a href=\"/contribute#artisan\">Handwerker Zauberer</a> kämpfsch."
level_difficulty: "Schwierigkeit: " level_difficulty: "Schwierigkeit: "
play_as: "Spiel als" play_as: "Spiel als"
spectate: "Zueluege" spectate: "Zueluege"
@ -129,19 +129,19 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
welcome: "Mir ghöred gern vo dir! Benutz das Formular zum üs e E-Mail schicke." welcome: "Mir ghöred gern vo dir! Benutz das Formular zum üs e E-Mail schicke."
contribute_prefix: "Wenn du dra interessiert bisch, mitzhelfe denn lueg doch mol verbii uf üsere " contribute_prefix: "Wenn du dra interessiert bisch, mitzhelfe denn lueg doch mol verbii uf üsere "
contribute_page: "Contribute Page" contribute_page: "Contribute Page"
# contribute_suffix: "!" contribute_suffix: "!"
forum_prefix: "Für öffentlichi Sache versuechs mol bi" forum_prefix: "Für öffentlichi Sache versuechs mol stattdesse i "
forum_page: "üsem Forum" forum_page: "üsem Forum"
forum_suffix: " stattdesse." forum_suffix: "."
send: "Feedback schicke" send: "Feedback schicke"
# contact_candidate: "Contact Candidate" contact_candidate: "Kandidat kontaktiere"
# 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: "Benutz das Formular zum mit Kandidate Kontakt ufneh, i die du interessiert bisch. Bhalt in Erinnerig, dass CodeCombat 15% vom erstjöhrige Lohn verrechnet. De Betrag wird fällig, sobald de Programmierer agstellt wird und chan 90 Täg lang zruggverrechnet werde wenn de Agstellti nid agstellt bliibt. Teilziitarbeit, Fernarbeit und temporäri Agstellti sind chostelos, s gliiche gilt für Interni Mitarbeiter."
diplomat_suggestion: diplomat_suggestion:
title: "Hilf, CodeCombat z übersetze!" title: "Hilf, CodeCombat z übersetze!"
sub_heading: "Mir bruuched dini Sprochfähigkeite." sub_heading: "Mir bruuched dini Sprochfähigkeite."
pitch_body: "Mir entwickled CodeCombat in Englisch, aber mir hend scho Spieler uf de ganze Welt. Vieli devo würed gern uf Schwiizerdütsch spiele, aber chönd kei Englisch. Wenn du beides chasch, denk doch mol drüber noh, dich bi üs als Diplomat izträge und z helfe, d CodeCombat Websiite und alli Level uf Schwiizerdütsch z übersetze." pitch_body: "Mir entwickled CodeCombat in Englisch, aber mir hend scho Spieler uf de ganze Welt. Vieli devo würed gern uf Schwiizerdütsch spiele, aber chönd kei Englisch. Wenn du beides chasch, denk doch mol drüber noh, dich bi üs als Diplomat izträge und z helfe, d CodeCombat Websiite und alli Level uf Schwiizerdütsch z übersetze."
missing_translations: "Until we can translate everything into Swiss German, you'll see generic German or English when Swiss German isn't available." missing_translations: "Bis mir alles chönd uf Schwiizerdütsch übersetze wirsch du döt generisches Dütsch oder Englisch gseh, wo Schwiizerdütsch nid verfüegbar isch."
learn_more: "Lern meh drüber, en Diplomat zsii" learn_more: "Lern meh drüber, en Diplomat zsii"
subscribe_as_diplomat: "Abonnier als en Diplomat" subscribe_as_diplomat: "Abonnier als en Diplomat"
@ -152,7 +152,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
color: "Farb" color: "Farb"
group: "Gruppe" group: "Gruppe"
clothes: "Chleider" clothes: "Chleider"
trim: "Zueschniide" trim: "Deko"
cloud: "Wolke" cloud: "Wolke"
team: "Team" team: "Team"
spell: "Zauberspruch" spell: "Zauberspruch"
@ -219,93 +219,93 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
next_name: "Name?" next_name: "Name?"
next_short_description: "schriibe e churzi Beschriibig." next_short_description: "schriibe e churzi Beschriibig."
next_long_description: "beschriib dini Wunschstell." next_long_description: "beschriib dini Wunschstell."
# next_skills: "list at least five skills." next_skills: "liste mindestens füf Fähigkeite uf."
# next_work: "chronicle your work history." next_work: "liste din bruefliche Werdegang uf."
# next_education: "recount your educational ordeals." # next_education: "recount your educational ordeals."
next_projects: "Zeig üs bis zu drü Projekt a dene du scho gschaffet hesch." next_projects: "Zeig üs bis zu drü Projekt a dene du scho gschaffet hesch."
next_links: "füeg persönlichi oder Social Media Links ih." next_links: "füeg persönlichi oder Social Media Links ih."
# next_photo: "add an optional professional photo." next_photo: "füeg optional es professionells Foti hinzue."
# next_active: "mark yourself open to offers to show up in searches." next_active: "markier dich selber als offe für Agebot zum i Suechafroge uftauche."
example_blog: "Blog" example_blog: "Blog"
example_personal_site: "Eigeni Websiite" example_personal_site: "Eigeni Websiite"
links_header: "Eigeni Links" links_header: "Eigeni Links"
# links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog." links_blurb: "Verlinke anderi Sitene oder Profil wo du willsch hervorhebe, wie zum Bispiel dis GitHub, dis LinkedIn Profil oder din Blog."
# links_name: "Link Name" links_name: "Link Name"
# links_name_help: "What are you linking to?" links_name_help: "Woane verlinksch?"
# links_link_blurb: "Link URL" links_link_blurb: "Link URL"
# basics_header: "Update basic info" basics_header: "Eifachi infos update"
# basics_active: "Open to Offers" basics_active: "Offe für Agebot"
# basics_active_help: "Want interview offers right now?" basics_active_help: "Wötsch ez gad Interview Agebot?"
# basics_job_title: "Desired Job Title" basics_job_title: "Erwünschte Job Titel"
# basics_job_title_help: "What role are you looking for?" basics_job_title_help: "Noch welem Job suechsch?"
# basics_city: "City" basics_city: "Stadt"
# basics_city_help: "City you want to work in (or live in now)." basics_city_help: "D Stadt wo du willsch schaffe (oder im Moment wohnsch)."
# basics_country: "Country" basics_country: "Land"
# basics_country_help: "Country you want to work in (or live in now)." basics_country_help: "Country you want to work in (or live in now)."
# basics_visa: "US Work Status" 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_visa_help: "Hesch du d Berechtigung zum i de USA schaffe oder bruchsch du e Visa Sponsorship? (Wenn du in Kanada oder Australie wohnsch, markier als berechtigt.)"
# basics_looking_for: "Looking For" basics_looking_for: "Ich sueche nach"
# basics_looking_for_full_time: "Full-time" basics_looking_for_full_time: "Vollziit"
# basics_looking_for_part_time: "Part-time" basics_looking_for_part_time: "Teilziit"
# basics_looking_for_remote: "Remote" # basics_looking_for_remote: "Remote"
# basics_looking_for_contracting: "Contracting" # basics_looking_for_contracting: "Contracting"
# basics_looking_for_internship: "Internship" basics_looking_for_internship: "Praktikum"
# basics_looking_for_help: "What kind of developer position do you want?" basics_looking_for_help: "Weli Art vo Entwicklerposition möchtisch du?"
# name_header: "Fill in your name" name_header: "Füll din Name us"
# name_anonymous: "Anonymous Developer" name_anonymous: "Anonyme Entwickler"
# name_help: "Name you want employers to see, like 'Nick Winter'." name_help: "De Name wo d Entwickler söled gseh, z.B. 'Nick Winter'."
# short_description_header: "Write a short description of yourself" short_description_header: "Schriib e churzi Beschriibi vo dir."
# short_description_blurb: "Add a tagline to help an employer quickly learn more about you." short_description_blurb: "Füeg e Tagline hinzue, damit Arbeitgeber chönd schnell öppis über dich erfahre."
# short_description: "Tagline" short_description: "Tagline"
# short_description_help: "Who are you, and what are you looking for? 140 characters max." short_description_help: "Wer bisch du und noch wa suechsch? 140 Charakter max."
# skills_header: "Skills" skills_header: "Fähigkeite"
# skills_help: "Tag relevant developer skills in order of proficiency." skills_help: "Tagge relevanti Entwicklerfähigkeite gordnet nach Kenntnis."
# long_description_header: "Describe your desired position" long_description_header: "Beschriib dini Wunschposition"
# long_description_blurb: "Tell employers how awesome you are and what role you want." long_description_blurb: "Verzell de Arbetgeber wie fantastisch du bisch und weli Position du gern hettsch."
# long_description: "Self Description" long_description: "Selbstbeschriibig"
# 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." long_description_help: "Beschriib dich de potentielle Arbetgeber. Halte es churz und relevant. Mir empfehled, churz d Position z umrahme, wo dich am meiste interessiert. Stilvolli Herabsetzig okay; 600 Charakter max."
# work_experience: "Work Experience" work_experience: "Arbeitserfahrig"
# work_header: "Chronicle your work history" work_header: "Liste dini Arbeitserfahrig uf"
# work_years: "Years of Experience" work_years: "Johr a Arbeitserfahrig"
# work_years_help: "How many years of professional experience (getting paid) developing software do you have?" work_years_help: "Wieviel (bezahlti) Johre Erfahrig hesch du im Bereich Softwareentwicklig?"
# work_blurb: "List your relevant work experience, most recent first." work_blurb: "Liste dini relevant Arbeitserfahrig uf, s neuste als Ersts."
# work_employer: "Employer" work_employer: "Arbeitgeber"
# work_employer_help: "Name of your employer." work_employer_help: "Name vo dim Arbeitgeber."
# work_role: "Job Title" work_role: "Job Titel"
# work_role_help: "What was your job title or role?" work_role_help: "Was hesch für en Job Titel / Position gha?"
# work_duration: "Duration" work_duration: "Ziitduur"
# work_duration_help: "When did you hold this gig?" work_duration_help: "Wenn hesch die Astellig gha?"
# work_description: "Description" work_description: "Beschriibig"
# work_description_help: "What did you do there? (140 chars; optional)" work_description_help: "Wa hesch du det gmacht? (140 Charakter; optional)"
# education: "Education" education: "Usbildig"
# education_header: "Recount your academic ordeals" # education_header: "Recount your academic ordeals"
# education_blurb: "List your academic ordeals." # education_blurb: "List your academic ordeals."
# education_school: "School" education_school: "Schuel"
# education_school_help: "Name of your school." education_school_help: "De Name vo dinere Schuel."
# education_degree: "Degree" education_degree: "Abschluss"
# education_degree_help: "What was your degree and field of study?" education_degree_help: "Was isch din Abschluss und dis Studiefach gsi?"
# education_duration: "Dates" education_duration: "Date"
# education_duration_help: "When?" education_duration_help: "Wenn?"
# education_description: "Description" education_description: "Beschriibig"
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)" education_description_help: "Öppis wo du willsch hervorhebe bezüglich dere Usbildig. (140 Charakter; optional)"
# our_notes: "CodeCombat's Notes" # our_notes: "CodeCombat's Notes"
# remarks: "Remarks" remarks: "Bemerkige"
# projects: "Projects" projects: "Projekt"
# projects_header: "Add 3 projects" projects_header: "Füeg 3 Projekt hinzue"
# projects_header_2: "Projects (Top 3)" projects_header_2: "Projekt (Top 3)"
# projects_blurb: "Highlight your projects to amaze employers." projects_blurb: "Hebe dini Projekt hervor zum Arbeitgeber in Stuune z versetze."
# project_name: "Project Name" project_name: "Projektname"
# project_name_help: "What was the project called?" project_name_help: "Wie het s Projekt gheisse?"
# project_description: "Description" project_description: "Beschriibig"
# project_description_help: "Briefly describe the project." project_description_help: "Beschriib churz dis Projekt."
# project_picture: "Picture" project_picture: "Bild"
# project_picture_help: "Upload a 230x115px or larger image showing off the project." project_picture_help: "Lad es Bild ufe wo 230x115px oder grösser isch zum dis Projekt präsentiere."
# project_link: "Link" project_link: "Link"
# project_link_help: "Link to the project." project_link_help: "Link zum Projekt."
# player_code: "Player Code" # player_code: "Player Code"
# employers: # employers:
# hire_developers_not_credentials: "Hire developers, not credentials." hire_developers_not_credentials: "Stell Entwickler ah, nid Zügnis."
# get_started: "Get Started" # get_started: "Get Started"
# already_screened: "We've already technically screened all our candidates" # already_screened: "We've already technically screened all our candidates"
# filter_further: ", but you can also filter further:" # filter_further: ", but you can also filter further:"
@ -381,94 +381,94 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
multiplayer_link_description: "Gib de Link jedem, wo mit dir will spiele." multiplayer_link_description: "Gib de Link jedem, wo mit dir will spiele."
multiplayer_hint_label: "Hiiwis:" multiplayer_hint_label: "Hiiwis:"
multiplayer_hint: " Klick uf de Link zum alles uswähle und druck ⌘-C or Ctrl-C zum de Link kopiere" multiplayer_hint: " Klick uf de Link zum alles uswähle und druck ⌘-C or Ctrl-C zum de Link kopiere"
# multiplayer_coming_soon: "More multiplayer features to come!" multiplayer_coming_soon: "Meh Multiplayer Features chömed no!"
# multiplayer_sign_in_leaderboard: "Sign in or create an account and get your solution on the leaderboard." # multiplayer_sign_in_leaderboard: "Sign in or create an account and get your solution on the leaderboard."
# guide_title: "Guide" guide_title: "Handbuech"
# tome_minion_spells: "Your Minions' Spells" tome_minion_spells: "Zaubersprüch vo dine Minions"
# tome_read_only_spells: "Read-Only Spells" tome_read_only_spells: "Read-Only Zaubersprüch"
# tome_other_units: "Other Units" tome_other_units: "Anderi Einheite"
# tome_cast_button_castable: "Cast Spell" tome_cast_button_castable: "Zauber beschwöre"
# tome_cast_button_casting: "Casting" tome_cast_button_casting: "Wird beschwore"
# tome_cast_button_cast: "Spell Cast" # tome_cast_button_cast: "Spell Cast"
# tome_autocast_delay: "Autocast Delay" # tome_autocast_delay: "Autocast Delay"
# tome_select_spell: "Select a Spell" tome_select_spell: "Wähl en Zauberspruch us"
# tome_select_a_thang: "Select Someone for " tome_select_a_thang: "Wähl öpper us für"
# tome_available_spells: "Available Spells" tome_available_spells: "Verfüegbari Zaubersprüch"
# hud_continue: "Continue (shift+space)" hud_continue: "Wiiter (shift+space)"
# spell_saved: "Spell Saved" spell_saved: "Zauberspruch gspeicheret"
# skip_tutorial: "Skip (esc)" skip_tutorial: "Überspringe (esc)"
# editor_config: "Editor Config" # editor_config: "Editor Config"
# editor_config_title: "Editor Configuration" editor_config_title: "Editor Konfiguration"
# editor_config_level_language_label: "Language for This Level" editor_config_level_language_label: "Sproch für das Level"
# editor_config_level_language_description: "Define the programming language for this particular level." editor_config_level_language_description: "Wähl d Programmiersproch us für das bestimmte Level."
# editor_config_default_language_label: "Default Programming Language" editor_config_default_language_label: "Vorigstellti Programmiersproch"
# editor_config_default_language_description: "Define the programming language you want to code in when starting new levels." editor_config_default_language_description: "Wähl us i welere Programmiersproch du willsch code wenn du es neus Level startisch."
# editor_config_keybindings_label: "Key Bindings" # editor_config_keybindings_label: "Key Bindings"
# editor_config_keybindings_default: "Default (Ace)" editor_config_keybindings_default: "Voristellig (Ace)"
# editor_config_keybindings_description: "Adds additional shortcuts known from the common editors." # editor_config_keybindings_description: "Adds additional shortcuts known from the common editors."
# editor_config_livecompletion_label: "Live Autocompletion" editor_config_livecompletion_label: "Live Auto-Vervollständigung"
# editor_config_livecompletion_description: "Displays autocomplete suggestions while typing." editor_config_livecompletion_description: "Schlot dir möglichi Wortvervollständigunge vor während du tippsch."
# editor_config_invisibles_label: "Show Invisibles" editor_config_invisibles_label: "Unsichtbari Zeiche azeige"
# editor_config_invisibles_description: "Displays invisibles such as spaces or tabs." editor_config_invisibles_description: "Zeigt unsichtbari Zeiche ah wie z.B. space und tab."
# editor_config_indentguides_label: "Show Indent Guides" editor_config_indentguides_label: "Izüg azeige"
# editor_config_indentguides_description: "Displays vertical lines to see indentation better." editor_config_indentguides_description: "Zeigt vertikali Linie zum de Zeileizug besser gseh."
# editor_config_behaviors_label: "Smart Behaviors" editor_config_behaviors_label: "Intelligents Verhalte"
# editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes." editor_config_behaviors_description: "Auto-vervollständigt Chlammere und Ahfüerigszeiche."
# keyboard_shortcuts: "Key Shortcuts" keyboard_shortcuts: "Shortcuts"
# loading_ready: "Ready!" # loading_ready: "Ready!"
# tip_insert_positions: "Shift+Click a point on the map to insert it into the spell editor." tip_insert_positions: "Shift+Klick uf en Punkt uf de Charte zums in Zauberspruch-Editor ifüege."
# tip_toggle_play: "Toggle play/paused with Ctrl+P." tip_toggle_play: "Play/Pausiert mit Ctrl+P ischalte."
# tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward." # tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward."
# tip_guide_exists: "Click the guide at the top of the page for useful info." tip_guide_exists: "Klick ufs Handbuech im obere Teil vo de Siite zum nützlichi Infos becho."
# tip_open_source: "CodeCombat is 100% open source!" tip_open_source: "CodeCombat isch 100% Open Source!"
# tip_beta_launch: "CodeCombat launched its beta in October, 2013." tip_beta_launch: "D CodeCombat Beta isch im Oktober 2013 online gange."
# tip_js_beginning: "JavaScript is just the beginning." tip_js_beginning: "JavaScript isch nur de Afang."
# tip_autocast_setting: "Adjust autocast settings by clicking the gear on the cast button." tip_autocast_setting: "Passe d Auto-Beschwöre Istellige ah, indem du ufs Zahrad bim Beschwöre-Chnopf drucksch."
# think_solution: "Think of the solution, not the problem." think_solution: "Denk über d Lösig noh, nid über s Problem."
# tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra" tip_theory_practice: "Theoretisch gits kein Unterschied zwüsche Theorie und Praxis. Praktisch aber scho. - Yogi Berra"
# tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis" tip_error_free: "Es git zwei Arte zum fehlerfreii Programm schriibe; nur di dritt funktioniert. - Alan Perils"
# tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra" tip_debugging_program: "Wenn Debugging de Prozess isch, mit dem mehr Bugs entfernt, denn mues Programmiere de sii, mit dem mer sie dri tuet. - Edsger W. Dijkstra"
# tip_forums: "Head over to the forums and tell us what you think!" tip_forums: "Chum übere is Forum und verzell üs, wa du denksch!"
# tip_baby_coders: "In the future, even babies will be Archmages." tip_baby_coders: "I de Zuekunft werded sogar Babies Erzmagier sii."
# tip_morale_improves: "Loading will continue until morale improves." tip_morale_improves: "Es ladet bis d Moral besser worde isch..."
# tip_all_species: "We believe in equal opportunities to learn programming for all species." tip_all_species: "Mir glaubed a gliichi Möglichkeite zum Programmiere lerne für alli Lebewese."
# tip_reticulating: "Reticulating spines." tip_reticulating: "Rückgrat isch am wachse..."
# tip_harry: "Yer a Wizard, " tip_harry: "Yer a Wizard, "
# tip_great_responsibility: "With great coding skill comes great debug responsibility." tip_great_responsibility: "Mit grosse Coding Skills chunt grossi Debug Verantwortig."
# tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep." tip_munchkin: "Wenn du dis Gmües nid issisch, chunt dich en Zwerg go hole wenn du schlofsch."
# tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't." tip_binary: "Es git 10 Arte vo Mensche uf de Welt: die wo s Binärsystem verstönd und die wos nid verstönd."
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" tip_commitment_yoda: "En Programmierer mues tüüfsti Higob ha, en konzentrierte Geist. - Yoda"
# tip_no_try: "Do. Or do not. There is no try. - Yoda" tip_no_try: "Machs. Oder machs nid. Probiere existiert nid. - Yoda"
# tip_patience: "Patience you must have, young Padawan. - Yoda" tip_patience: "Geduld du bruuchsch, junge Padawan. - Yoda"
# tip_documented_bug: "A documented bug is not a bug; it is a feature." tip_documented_bug: "En dokumentierte Bug isch kein Bug; es isch es Feature."
# tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" tip_impossible: "Es schiint immer unmöglich bis es gschafft isch. - Nelson Mandela"
# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" tip_talk_is_cheap: "Rede isch billig. Zeig mir de Code. - Linus Torvalds"
# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" tip_first_language: "S Katastrophalste wo du chasch lerne, isch dini erst Programmiersproch. - 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_hardware_problem: "Q: Wie viel Programmierer bruuchts zum e Glüehbire uswechsle? A: Keine, da isch es Hardware Problem."
# time_current: "Now:" time_current: "Jetzt:"
# time_total: "Max:" time_total: "Max:"
# time_goto: "Go to:" time_goto: "Goh zu:"
# infinite_loop_try_again: "Try Again" infinite_loop_try_again: "Versuechs nomol"
# infinite_loop_reset_level: "Reset Level" infinite_loop_reset_level: "Level zrugsetze"
# infinite_loop_comment_out: "Comment Out My Code" infinite_loop_comment_out: "Min Code uskommentiere"
# keyboard_shortcuts: keyboard_shortcuts:
# keyboard_shortcuts: "Keyboard Shortcuts" keyboard_shortcuts: "Shortcuts uf de Tastatur"
# space: "Space" space: "Space"
# enter: "Enter" enter: "Enter"
# escape: "Escape" escape: "Escape"
# cast_spell: "Cast current spell." cast_spell: "Aktuelle Zauberspruch beschwöre."
# continue_script: "Continue past current script." continue_script: "Nochem aktuelle Script fortsetze."
# skip_scripts: "Skip past all skippable scripts." skip_scripts: "Alli überspringbare Scripts überspringe."
# toggle_playback: "Toggle play/pause." toggle_playback: "Play/Pause istelle."
# scrub_playback: "Scrub back and forward through time." scrub_playback: "Reise vorwärts und zrugg i de Ziit."
# single_scrub_playback: "Scrub back and forward through time by a single frame." single_scrub_playback: "Reise eis einzels Frame vorwärts und zrugg i de Ziit."
# scrub_execution: "Scrub through current spell execution." scrub_execution: "Gang dur d Zauberusfüehrig."
# toggle_debug: "Toggle debug display." toggle_debug: "Debug Display ischalte/usschalte."
# toggle_grid: "Toggle grid overlay." toggle_grid: "Gitter ischalte/usschalte."
# toggle_pathfinding: "Toggle pathfinding overlay." toggle_pathfinding: "Wegfinder ischalte/usschalte."
# beautify: "Beautify your code by standardizing its formatting." beautify: "Mach din Code schöner, indem du sini Formatierig standartisiersch."
# move_wizard: "Move your Wizard around the level." move_wizard: "Beweg din Zauberer durs Level."
# admin: # admin:
# av_title: "Admin Views" # av_title: "Admin Views"
@ -482,12 +482,12 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# lg_title: "Latest Games" # lg_title: "Latest Games"
# clas: "CLAs" # clas: "CLAs"
# community: community:
# level_editor: "Level Editor" level_editor: "Level Editor"
# main_title: "CodeCombat Community" main_title: "CodeCombat Community"
# facebook: "Facebook" facebook: "Facebook"
# twitter: "Twitter" twitter: "Twitter"
# gplus: "Google+" gplus: "Google+"
# editor: # editor:
# main_title: "CodeCombat Editors" # main_title: "CodeCombat Editors"
@ -590,55 +590,55 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# hard: "Hard" # hard: "Hard"
# player: "Player" # player: "Player"
# about: about:
# who_is_codecombat: "Who is CodeCombat?" who_is_codecombat: "Wer isch CodeCombat?"
# why_codecombat: "Why CodeCombat?" why_codecombat: "Warum CodeCombat?"
# who_description_prefix: "together started CodeCombat in 2013. We also created " who_description_prefix: "hend im 2013 zeme CodeCombat gstartet. Mir hend au "
# who_description_suffix: "in 2008, growing it to the #1 web and iOS application for learning to write Chinese and Japanese characters." who_description_suffix: "im 2008 kreiert und drufabe isches zur Nummer 1 Web und iOS App zum Chinesischi und Japanischi Charakter schriibe worde."
# who_description_ending: "Now it's time to teach people to write code." who_description_ending: "Ez isches Ziit zum de Mensche biibringe wie sie Code schriibed."
# why_paragraph_1: "When making Skritter, George didn't know how to program and was constantly frustrated by his inability to implement his ideas. Afterwards, he tried learning, but the lessons were too slow. His housemate, wanting to reskill and stop teaching, tried Codecademy, but \"got bored.\" Each week another friend started Codecademy, then dropped off. We realized it was the same problem we'd solved with Skritter: people learning a skill via slow, intensive lessons when what they need is fast, extensive practice. We know how to fix that." why_paragraph_1: "Womer Skritter gmacht hend, het de George nid gwüsst wiemer programmiert und isch dauernd gfrustet gsi, will er unfähig gsi isch, sini Ideä z implementiere. Spöter het er probiert zums lerne, aber d Lektione sind z langsam gsi. Sin Mitbewohner, wo het wöle sini Fähigkeite uffrische und ufhöre sie öpperem biizbringe, het Codecademy probiert, aber ihm isch \"langwiilig worde\". Jedi Wuche het en andere Fründ agfange mit Codecademy und het wieder ufghört. Mir hend realisiert, dass es s gliiche Problem isch, wo mir mit Skitter glöst gha hend: Lüüt, wo öppis mit langsame, intensive Lektione lerned, obwohl sie schnelli, umfangriichi Üebig bruuched. Mir wüssed, wie mer das behebe."
# why_paragraph_2: "Need to learn to code? You don't need lessons. You need to write a lot of code and have a great time doing it." why_paragraph_2: "Du muesch Programmiere lerne? Du bruchsch kei Lektione. Wa du bruuchsch, isch ganz viel Code schriibe und viel Spass ha, während du das machsch."
# why_paragraph_3_prefix: "That's what programming is about. It's gotta be fun. Not fun like" why_paragraph_3_prefix: "Um da gohts bim Programmiere. Es mues Spass mache. Nid Spass wie"
# why_paragraph_3_italic: "yay a badge" why_paragraph_3_italic: "wuhu en Badge"
# why_paragraph_3_center: "but fun like" why_paragraph_3_center: "eher Spass wie"
# why_paragraph_3_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!" why_paragraph_3_italic_caps: "NEI MAMI, ICH MUES DAS LEVEL NO FERTIG MACHE!"
# why_paragraph_3_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing." why_paragraph_3_suffix: "Darum isch CodeCombat es Multiplayer Spiel, nid en gamifizierte Kurs mit Lektione. Mir stopped nid, bis du nümm chasch stoppe--aber damol isch da öppis guets."
# why_paragraph_4: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age." why_paragraph_4: "Wenn du süchtig wirsch nochme Spiel, wird süchtig noch dem Spiel und wird eine vo de Zauberer vom Tech-Ziitalter."
# why_ending: "And hey, it's free. " why_ending: "Und hey, es isch gratis. "
# why_ending_url: "Start wizarding now!" why_ending_url: "Fang ez a zaubere!"
# george_description: "CEO, business guy, web designer, game designer, and champion of beginning programmers everywhere." george_description: "CEO, Business-Typ, Web Designer, Game Designer und de Held für d Programmierafänger uf de ganze Welt."
# scott_description: "Programmer extraordinaire, software architect, kitchen wizard, and master of finances. Scott is the reasonable one." scott_description: "Programmierer extraordinaire, Software Architekt, Chuchi-Zauberer und de Meister vo de Finanze. De Scott isch de Vernünftig unter üs."
# nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick can do anything and chooses to build CodeCombat." nick_description: "Programmier-Zauberer, exzentrische Motivations-Magier und Chopfüber-Experimentierer. De Nick chönti alles mache und het sich entschiede zum CodeCombat baue."
# jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy." jeremy_description: "Kundesupport-Magier, Usability Tester und Community-Organisator; du hesch worschinli scho mitem Jeremy gredet."
# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." michael_description: "Programmierer, Systemadmin und es technisches Wunderchind ohni Studium. Michael isch die Person wo üsi Server am Laufe bhaltet."
# glen_description: "Programmer and passionate game developer, with the motivation to make this world a better place, by developing things that matter. The word impossible can't be found in his dictionary. Learning new skills is his joy!" glen_description: "Programmierer und passionierte Gameentwickler mit de Motivation, die Welt zumene bessere Ort zmache, indem mer Sache entwickled wo e Rolle spieled. S Wort unmöglich findet mer nid i sim Wortschatz. Neui Fähigkeite erlerne isch sini Freud!"
# legal: legal:
# page_title: "Legal" page_title: "Rechtlichs"
# opensource_intro: "CodeCombat is free to play and completely open source." opensource_intro: "CodeCombat isch free to play und komplett Open Source."
# opensource_description_prefix: "Check out " opensource_description_prefix: "Lueg dir "
# github_url: "our GitHub" github_url: "üsi GitHub Siite"
# opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " opensource_description_center: "ah und hilf mit, wennd magsch! CodeCombat isch uf dutzendi Open Source Projekt ufbaut und mir liebed sie. Lueg i "
# archmage_wiki_url: "our Archmage wiki" archmage_wiki_url: "üses Erzmagier-Wiki"
# opensource_description_suffix: "for a list of the software that makes this game possible." opensource_description_suffix: "ine zum d Liste a de Software finde, wo das Game möglich mached."
# practices_title: "Respectful Best Practices" practices_title: "Respektvolli bewährti Praxis"
# practices_description: "These are our promises to you, the player, in slightly less legalese." practices_description: "Das sind üsi Verspreche a dich, de Spieler, in bitz weniger Fachchinesisch."
# privacy_title: "Privacy" privacy_title: "Dateschutz"
# 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." privacy_description: "Mir verchaufed kei vo dine persönliche Informatione. Mir hend vor zum irgendwenn durch Rekrutierig Geld z verdiene, aber bis versicheret, dass mir nid dini persönliche Date a interessierti Firmene wiiter gebed ohni dis usdrücklich Iverständnis."
# security_title: "Security" security_title: "Sicherheit"
# 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." security_description: "Mir bemühed üs, dini persönliche Informatione sicher ufzbewahre. Als es Open Source Projekt isch üsi Siite offe für jede, wo gern möcht üsi Security System besichtige und verbessere."
# email_title: "Email" email_title: "E-Mail"
# email_description_prefix: "We will not inundate you with spam. Through" email_description_prefix: "Mir werded dich nid mit Spam überfluete. I dine"
# email_settings_url: "your email settings" email_settings_url: "E-Mail Istellige"
# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." email_description_suffix: "oder dur d Links i de E-Mails wo mir schicked, chasch du jederziit dini Preferänze ändere und dich ganz eifach us de Mailing-Liste neh."
# cost_title: "Cost" cost_title: "Chöste"
# cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:" cost_description: "Im Moment isch CodeCombat 100% gratis! Eis vo üsne Hauptziel isch, dass das so bliibt, damit so viel Lüüt wie möglich chönd spiele, egal wo sie sich im Lebe befinded. Sötted dunkli Wolke am Horizont ufzieh chas sii, dass mir müed en Teil vom Inhalt chostepflichtig mache, aber es isch üs lieber, wenn da nid passiert. Mit chli Glück werded mir fähig sii, s Unternehme ufrecht z erhalte und zwor mit:"
# recruitment_title: "Recruitment" recruitment_title: "Rekrutierig"
# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizardnot just in the game, but also in real life." recruitment_description_prefix: "Do uf CodeCombat wirsch du en mächtige Zauberer - nid nur ingame, sonder au im echte Lebe."
# url_hire_programmers: "No one can hire programmers fast enough" url_hire_programmers: "Niemer cha Programmierer schnell gnueg astelle"
# recruitment_description_suffix: "so once you've sharpened your skills and if you agree, we will demo your best coding accomplishments to the thousands of employers who are drooling for the chance to hire you. They pay us a little, they pay you" recruitment_description_suffix: "das heisst, sobald du dini Fähigkeite gschärft hesch, und wenn du zuestimmsch, werded mir dini beste Programmiererfolg de tuusige vo Arbeitgeber zeige, wo nur druf warted, dich chöne azstelle. Sie zahled üs es bitz öppis, sie zahled dir"
# recruitment_description_italic: "a lot" recruitment_description_italic: "ziemli viel"
# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan." recruitment_description_ending: "d Siite bliibt gratis und alli sind glücklich. Das isch de Plan."
# copyrights_title: "Copyrights and Licenses" # copyrights_title: "Copyrights and Licenses"
# contributor_title: "Contributor License Agreement" # contributor_title: "Contributor License Agreement"
# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our" # contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our"

View file

@ -6,18 +6,18 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
send: "전송" send: "전송"
cancel: "취소" cancel: "취소"
save: "저장" save: "저장"
# publish: "Publish" publish: "내보내기"
# create: "Create" create: "생성"
delay_1_sec: "1초" delay_1_sec: "1초"
delay_3_sec: "3초" delay_3_sec: "3초"
delay_5_sec: "5초" delay_5_sec: "5초"
manual: "수동" manual: "수동"
fork: "Fork" fork: "Fork"
play: "시작" play: "시작"
# retry: "Retry" retry: "재시도"
# watch: "Watch" watch: "보기"
# unwatch: "Unwatch" unwatch: "보기 해제"
# submit_patch: "Submit Patch" submit_patch: "패치 제출"
# units: # units:
# second: "second" # second: "second"
@ -36,8 +36,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# years: "years" # years: "years"
modal: modal:
close: "Close" close: "닫기"
okay: "Okay" okay: "확인"
not_found: not_found:
page_not_found: "페이지를 찾을 수 없습니다" page_not_found: "페이지를 찾을 수 없습니다"
@ -105,7 +105,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
coffeescript_blurb: "향상된 자바스크립트 문법." coffeescript_blurb: "향상된 자바스크립트 문법."
clojure_blurb: "현대적인 Lisp." clojure_blurb: "현대적인 Lisp."
lua_blurb: "게임 스크립팅 언어" lua_blurb: "게임 스크립팅 언어"
#io_blurb: "Simple but obscure." io_blurb: "간단하지만 아직 잘 알려지지 않은 언어."
play: play:
choose_your_level: "레벨을 선택하세요." choose_your_level: "레벨을 선택하세요."
@ -126,7 +126,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
contact: contact:
contact_us: "코드컴뱃에 전할 말" contact_us: "코드컴뱃에 전할 말"
welcome: "의견은 언제든지 환영합니다. 이 양식을 이메일에 사용해 주세요!" welcome: "언제든 의견을 보내주세요. 이 양식을 이메일에 사용해 주세요!"
contribute_prefix: "혹시 같이 코드컴뱃에 공헌하고 싶으시다면 홈페이지를 방문해주세요." contribute_prefix: "혹시 같이 코드컴뱃에 공헌하고 싶으시다면 홈페이지를 방문해주세요."
contribute_page: "참여하기 페이지" contribute_page: "참여하기 페이지"
contribute_suffix: "!" contribute_suffix: "!"
@ -134,8 +134,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
forum_page: "포럼" forum_page: "포럼"
forum_suffix: " 대신에." forum_suffix: " 대신에."
send: "의견 보내기" send: "의견 보내기"
# contact_candidate: "Contact Candidate" contact_candidate: "지원자에게 연락하기"
# 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: "인터뷰를 원하는 지원자에게 연락하고자 할 때, 이 양식을 사용해주세요. 코드 컴뱃에게 반드시 첫 해 연봉의 15%를 지급해야합니다. 수수료는 직원을 고용하자마자 즉시 지급되어야 합니다. 한편 90일 이내로 채용이 취소된다면 수수료를 환불받을 수 있습니다. 아르바이트, 재택근무, 계약직은 인턴의 경우와 마찬가지로 수수료가 없습니다."
diplomat_suggestion: diplomat_suggestion:
title: "코드 컴뱃 번역을 도와주세요!" title: "코드 컴뱃 번역을 도와주세요!"
@ -177,13 +177,13 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
new_password_verify: "확인(다시한번 입력해주세요)" new_password_verify: "확인(다시한번 입력해주세요)"
email_subscriptions: "이메일 구독" email_subscriptions: "이메일 구독"
email_announcements: "공지사항" email_announcements: "공지사항"
email_announcements_description: "코드 컴뱃의 개발 또는 진행상황을 이메일로 구독 하세요" email_announcements_description: "코드 컴뱃의 개발 및 진행 상황을 이메일로 구독하세요"
email_notifications: "알람" email_notifications: "알람"
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity." email_notifications_summary: "당신의 코드 컴뱃 활동과 관련된 자동 알림 메일을 설정할 수 있습니다."
# email_any_notes: "Any Notifications" email_any_notes: "모든 알림 받기"
# email_any_notes_description: "Disable to stop all activity notification emails." email_any_notes_description: "모든 알림 메일 받지 않기"
# email_recruit_notes: "Job Opportunities" email_recruit_notes: "구인 정보"
# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job." email_recruit_notes_description: "정말 실력이 좋으시다고 판단되면, 보다 좋은 구직 정보와 관련하여 연락드릴 수도 있습니다."
contributor_emails: "조력자들 이메일" contributor_emails: "조력자들 이메일"
contribute_prefix: "우리는 언제나 당신의 참여를 환영 합니다 : " contribute_prefix: "우리는 언제나 당신의 참여를 환영 합니다 : "
contribute_page: "참여하기 페이지" contribute_page: "참여하기 페이지"
@ -207,16 +207,16 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
profile_for_suffix: "" profile_for_suffix: ""
# featured: "Featured" # featured: "Featured"
# not_featured: "Not Featured" # not_featured: "Not Featured"
# looking_for: "Looking for:" looking_for: "희망 채용형태"
last_updated: "최근 업데이트:" last_updated: "최근 업데이트:"
contact: "연락하기" contact: "연락하기"
# active: "Looking for interview offers now" active: "구직희망"
# inactive: "Not looking for offers right now" inactive: "구직희망 안함"
complete: "완료" complete: "완료"
next: "다음으로" next: "다음으로"
# next_city: "city?" next_city: "도시?"
# next_country: "pick your country." next_country: "국가를 선택하세요."
# next_name: "name?" next_name: "성명?"
# next_short_description: "write a short description." # next_short_description: "write a short description."
# next_long_description: "describe your desired position." # next_long_description: "describe your desired position."
# next_skills: "list at least five skills." # next_skills: "list at least five skills."
@ -247,8 +247,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# basics_looking_for: "Looking For" # basics_looking_for: "Looking For"
basics_looking_for_full_time: "풀타임" basics_looking_for_full_time: "풀타임"
basics_looking_for_part_time: "파트타임" basics_looking_for_part_time: "파트타임"
# basics_looking_for_remote: "Remote" basics_looking_for_remote: "재택근무"
# basics_looking_for_contracting: "Contracting" basics_looking_for_contracting: "계약직"
basics_looking_for_internship: "인턴쉽" basics_looking_for_internship: "인턴쉽"
# basics_looking_for_help: "What kind of developer position do you want?" # basics_looking_for_help: "What kind of developer position do you want?"
name_header: "성명을 기재하여 주십시오." name_header: "성명을 기재하여 주십시오."
@ -382,7 +382,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
multiplayer_hint_label: "힌트:" multiplayer_hint_label: "힌트:"
multiplayer_hint: " 모두 선택하려면 링크를 클릭하세요, 그리고 ⌘-C 또는 Ctrl-C 를 눌러서 링크를 복사하세요." multiplayer_hint: " 모두 선택하려면 링크를 클릭하세요, 그리고 ⌘-C 또는 Ctrl-C 를 눌러서 링크를 복사하세요."
multiplayer_coming_soon: "곧 좀 더 다양한 멀티플레이어 모드가 업데이트 됩니다!" multiplayer_coming_soon: "곧 좀 더 다양한 멀티플레이어 모드가 업데이트 됩니다!"
# multiplayer_sign_in_leaderboard: "Sign in or create an account and get your solution on the leaderboard." multiplayer_sign_in_leaderboard: "로그인하시거나 계정을 만드시고 상위권 순위 차트에 이름을 올려보세요."
guide_title: "가이드" guide_title: "가이드"
tome_minion_spells: "미니언의 마법" tome_minion_spells: "미니언의 마법"
tome_read_only_spells: "읽기 전용 마법" tome_read_only_spells: "읽기 전용 마법"
@ -431,7 +431,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# tip_forums: "Head over to the forums and tell us what you think!" # 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_baby_coders: "In the future, even babies will be Archmages."
# tip_morale_improves: "Loading will continue until morale improves." # tip_morale_improves: "Loading will continue until morale improves."
# tip_all_species: "We believe in equal opportunities to learn programming for all species." tip_all_species: "우리는 모든 생물이 동등하게 프로그래밍을 배울 기회가 있어야 한다고 생각합니다."
# tip_reticulating: "Reticulating spines." # tip_reticulating: "Reticulating spines."
# tip_harry: "Yer a Wizard, " # tip_harry: "Yer a Wizard, "
# tip_great_responsibility: "With great coding skill comes great debug responsibility." # tip_great_responsibility: "With great coding skill comes great debug responsibility."
@ -441,23 +441,23 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# tip_no_try: "Do. Or do not. There is no try. - Yoda" # tip_no_try: "Do. Or do not. There is no try. - Yoda"
# tip_patience: "Patience you must have, young Padawan. - 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_documented_bug: "A documented bug is not a bug; it is a feature."
# tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" tip_impossible: "성공하기 전까진 불가능해 보이는 법이죠. - Nelson Mandela"
# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" tip_talk_is_cheap: "떠드는 건 가치가 없어요. 코드를 보여줘봐요. - Linus Torvalds"
# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" # 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_hardware_problem: "Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem."
# time_current: "Now:" # time_current: "Now:"
# time_total: "Max:" # time_total: "Max:"
# time_goto: "Go to:" # time_goto: "Go to:"
# infinite_loop_try_again: "Try Again" infinite_loop_try_again: "다시 시도해보세요."
# infinite_loop_reset_level: "Reset Level" infinite_loop_reset_level: "레벨 리셋"
# infinite_loop_comment_out: "Comment Out My Code" infinite_loop_comment_out: "내 코드를 일시적 주석처리하기"
# keyboard_shortcuts: keyboard_shortcuts:
# keyboard_shortcuts: "Keyboard Shortcuts" keyboard_shortcuts: "단축키"
# space: "Space" space: "스페이스"
# enter: "Enter" enter: "엔터"
# escape: "Escape" escape: "Esc"
# cast_spell: "Cast current spell." cast_spell: "현재 상태의 주문을 겁니다."
# continue_script: "Continue past current script." # continue_script: "Continue past current script."
# skip_scripts: "Skip past all skippable scripts." # skip_scripts: "Skip past all skippable scripts."
# toggle_playback: "Toggle play/pause." # toggle_playback: "Toggle play/pause."
@ -475,12 +475,12 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
av_entities_sub_title: "속성들" av_entities_sub_title: "속성들"
av_entities_users_url: "유저들" av_entities_users_url: "유저들"
av_entities_active_instances_url: "액티브 인스턴스들" av_entities_active_instances_url: "액티브 인스턴스들"
# av_entities_employer_list_url: "Employer List" av_entities_employer_list_url: "고용주 리스트"
av_other_sub_title: "다른 사람들" av_other_sub_title: "다른 사람들"
av_other_debug_base_url: "베이스 (base.jade 디버깅)" av_other_debug_base_url: "베이스 (base.jade 디버깅)"
u_title: "유저 목록" u_title: "유저 목록"
lg_title: "가장 최근 게임" lg_title: "가장 최근 게임"
# clas: "CLAs" clas: "컨트리뷰터 라이센스 약관"
community: community:
level_editor: "레벨 에디터" level_editor: "레벨 에디터"
@ -498,21 +498,21 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
thang_description: "유닛들, 기본적인 인공지능, 그래픽과 오디오등을 직접 빌드하세요. 현재는 백터 그래픽으로 추출된 플래시파일만 임폴트 가능합니다." thang_description: "유닛들, 기본적인 인공지능, 그래픽과 오디오등을 직접 빌드하세요. 현재는 백터 그래픽으로 추출된 플래시파일만 임폴트 가능합니다."
level_title: "레벨 에디터" level_title: "레벨 에디터"
level_description: "스크립팅, 오디오 업로드, 모든 레벨을 생성하기 위한 사용자 정의 로직등 우리가 사용하는 모든 것들을 구축하는 것을 위한 툴들을 포함합니다." level_description: "스크립팅, 오디오 업로드, 모든 레벨을 생성하기 위한 사용자 정의 로직등 우리가 사용하는 모든 것들을 구축하는 것을 위한 툴들을 포함합니다."
# achievement_title: "Achievement Editor" achievement_title: "업적 에디터"
# got_questions: "Questions about using the CodeCombat editors?" got_questions: "코드 컴뱃 에디터 사용법에 대해 질문이 있으신가요?"
contact_us: "연락하기!" contact_us: "연락하기!"
hipchat_prefix: "당신은 또한 우리를 여기에서 찾을 수 있습니다 : " hipchat_prefix: "당신은 또한 우리를 여기에서 찾을 수 있습니다 : "
hipchat_url: "힙챗 룸" hipchat_url: "힙챗 룸"
back: "뒤로" back: "뒤로"
revert: "되돌리기" revert: "되돌리기"
revert_models: "모델 되돌리기" revert_models: "모델 되돌리기"
# pick_a_terrain: "Pick A Terrain" pick_a_terrain: "지형을 선택하세요."
# small: "Small" small: "작게"
# grassy: "Grassy" grassy: "풀로 덮인"
# fork_title: "Fork New Version" fork_title: "새 버전 가져오기"
# fork_creating: "Creating Fork..." fork_creating: "포크 생성중..."
# randomize: "Randomize" # randomize: "Randomize"
# more: "More" more: "더 보기"
wiki: "위키" wiki: "위키"
live_chat: "실시간 채팅" live_chat: "실시간 채팅"
level_some_options: "다른 옵션들?" level_some_options: "다른 옵션들?"
@ -553,8 +553,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
article_search_title: "기사들은 여기에서 찾으세요" article_search_title: "기사들은 여기에서 찾으세요"
thang_search_title: "Thang 타입들은 여기에서 찾으세요" thang_search_title: "Thang 타입들은 여기에서 찾으세요"
level_search_title: "레벨들은 여기에서 찾으세요" level_search_title: "레벨들은 여기에서 찾으세요"
# achievement_search_title: "Search Achievements" achievement_search_title: "업적 검색"
# read_only_warning2: "Note: you can't save any edits here, because you're not logged in." read_only_warning2: "주의: 로그인하지 않으셨기 때문에 내용을 저장할 수 없습니다."
article: article:
edit_btn_preview: "미리보기" edit_btn_preview: "미리보기"
@ -566,7 +566,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
body: "구성" body: "구성"
version: "버전" version: "버전"
commit_msg: "커밋 메세지" commit_msg: "커밋 메세지"
# version_history: "Version History" version_history: "버전 히스토리"
version_history_for: "버전 히스토리 : " version_history_for: "버전 히스토리 : "
result: "결과" result: "결과"
results: "결과들" results: "결과들"
@ -613,7 +613,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
michael_description: "프로그래머, 시스템 관리자, 기술 신동(대학생이래요),Michael 은 우리 서버를 계속 무결점상태로 유지시켜주는 사람입니다." michael_description: "프로그래머, 시스템 관리자, 기술 신동(대학생이래요),Michael 은 우리 서버를 계속 무결점상태로 유지시켜주는 사람입니다."
glen_description: "프로그래머이자 열정적인 게임 개발자. 의미있는 것들을 개발함으로써 세상을 보다 더 나은 곳으로 변화시키고자 하는 개발자입니다. 그의 사전에 불가능이란 없습니다. 새로운 기술을 배우는 건 그에게 몹시 즐거운 일이죠!" glen_description: "프로그래머이자 열정적인 게임 개발자. 의미있는 것들을 개발함으로써 세상을 보다 더 나은 곳으로 변화시키고자 하는 개발자입니다. 그의 사전에 불가능이란 없습니다. 새로운 기술을 배우는 건 그에게 몹시 즐거운 일이죠!"
# legal: legal:
# page_title: "Legal" # page_title: "Legal"
opensource_intro: "코드 컴뱃은 무료이며 전적으로 오픈 소스를 기반으로 합니다." opensource_intro: "코드 컴뱃은 무료이며 전적으로 오픈 소스를 기반으로 합니다."
opensource_description_prefix: "코드 컴뱃의" opensource_description_prefix: "코드 컴뱃의"
@ -623,13 +623,13 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
opensource_description_suffix: "를 확인해보세요. 코드 컴뱃을 가능하게 만든 소프트웨어들을 찾아보실 수 있습니다." opensource_description_suffix: "를 확인해보세요. 코드 컴뱃을 가능하게 만든 소프트웨어들을 찾아보실 수 있습니다."
# practices_title: "Respectful Best Practices" # practices_title: "Respectful Best Practices"
# practices_description: "These are our promises to you, the player, in slightly less legalese." # practices_description: "These are our promises to you, the player, in slightly less legalese."
# privacy_title: "Privacy" privacy_title: "프라이버시"
# 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." # 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_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." # 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."
# email_title: "Email" email_title: "이메일"
# email_description_prefix: "We will not inundate you with spam. Through" # email_description_prefix: "We will not inundate you with spam. Through"
# email_settings_url: "your email settings" email_settings_url: "이메일 설정"
# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." # email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time."
# cost_title: "Cost" # cost_title: "Cost"
# cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:" # cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:"
@ -655,7 +655,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
art_music: "뮤직" art_music: "뮤직"
art_sound: "사운드" art_sound: "사운드"
art_artwork: "원화" art_artwork: "원화"
# art_sprites: "Sprites" art_sprites: "스프라이트"
# art_other: "Any and all other non-code creative works that are made available when creating Levels." # art_other: "Any and all other non-code creative works that are made available when creating Levels."
# art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible." # art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible."
# art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:" # art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:"
@ -773,47 +773,47 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
ambassador_title: "대사" ambassador_title: "대사"
ambassador_title_description: "(지원)" ambassador_title_description: "(지원)"
# ladder: ladder:
# please_login: "Please log in first before playing a ladder game." please_login: "토너먼트 게임을 시작하기 앞서 로그인해주세요."
# my_matches: "My Matches" my_matches: "나의 경기들"
# simulate: "Simulate" simulate: "시뮬레이션"
# simulation_explanation: "By simulating games you can get your game ranked faster!" simulation_explanation: "시뮬레이션을 통해 더 빨리 랭킹 평가를 받을 수 있습니다."
# simulate_games: "Simulate Games!" simulate_games: "시뮬레이션 실행!"
# simulate_all: "RESET AND SIMULATE GAMES" simulate_all: "리셋하고 시뮬레이션 하기"
# games_simulated_by: "Games simulated by you:" games_simulated_by: "내가 시뮬레이션한 게임 수:"
# games_simulated_for: "Games simulated for you:" games_simulated_for: "다른 사람에 의해 시뮬레이션된 게임 수:"
# games_simulated: "Games simulated" games_simulated: "시뮬레이션 실행된 게임"
# games_played: "Games played" games_played: "플레이한 게임"
# ratio: "Ratio" ratio: "비율"
# leaderboard: "Leaderboard" leaderboard: "상위권 순위 차트"
# battle_as: "Battle as " # battle_as: "Battle as "
# summary_your: "Your " summary_your: "당신의 "
# summary_matches: "Matches - " # summary_matches: "Matches - "
# summary_wins: " Wins, " # summary_wins: " Wins, "
# summary_losses: " Losses" # summary_losses: " Losses"
# rank_no_code: "No New Code to Rank" # rank_no_code: "No New Code to Rank"
# rank_my_game: "Rank My Game!" rank_my_game: "내 게임 순위 매기기!"
# rank_submitting: "Submitting..." rank_submitting: "제출중..."
# rank_submitted: "Submitted for Ranking" # rank_submitted: "Submitted for Ranking"
# rank_failed: "Failed to Rank" rank_failed: "순위 매기기 실패"
# rank_being_ranked: "Game Being Ranked" # rank_being_ranked: "Game Being Ranked"
# rank_last_submitted: "submitted " rank_last_submitted: "제출 완료"
# help_simulate: "Help simulate games?" # help_simulate: "Help simulate games?"
# code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." # code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in."
# no_ranked_matches_pre: "No ranked matches for the " # no_ranked_matches_pre: "No ranked matches for the "
# no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." # no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked."
# choose_opponent: "Choose an Opponent" # choose_opponent: "Choose an Opponent"
# select_your_language: "Select your language!" select_your_language: "언어를 고르세요!"
# tutorial_play: "Play Tutorial" tutorial_play: "튜토리얼 보기"
# tutorial_recommended: "Recommended if you've never played before" tutorial_recommended: "전에 플레이해본 적이 없으시다면 튜토리얼을 보시는 걸 권장합니다."
# tutorial_skip: "Skip Tutorial" tutorial_skip: "튜토리얼 넘기기"
# tutorial_not_sure: "Not sure what's going on?" # tutorial_not_sure: "Not sure what's going on?"
# tutorial_play_first: "Play the Tutorial first." tutorial_play_first: "튜토리얼을 먼저 플레이해보세요."
# simple_ai: "Simple AI" # simple_ai: "Simple AI"
# warmup: "Warmup" # warmup: "Warmup"
# vs: "VS" vs: "VS"
# friends_playing: "Friends Playing" # friends_playing: "Friends Playing"
# log_in_for_friends: "Log in to play with your friends!" log_in_for_friends: "로그인하시고 친구들과 게임을 즐기세요!"
# social_connect_blurb: "Connect and play against your friends!" # social_connect_blurb: "Connect and play against your friends!"
# invite_friends_to_battle: "Invite your friends to join you in battle!" # invite_friends_to_battle: "Invite your friends to join you in battle!"
# fight: "Fight!" # fight: "Fight!"
@ -824,10 +824,10 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# tournament_rules: "Tournament Rules" # 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: "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_blog: "on our blog" # tournament_blurb_blog: "on our blog"
# rules: "Rules" rules: "규칙"
# winners: "Winners" winners: "승리자"
# ladder_prizes: ladder_prizes:
# title: "Tournament Prizes" # title: "Tournament Prizes"
# blurb_1: "These prizes will be awarded according to" # blurb_1: "These prizes will be awarded according to"
# blurb_2: "the tournament rules" # blurb_2: "the tournament rules"
@ -844,7 +844,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# credits: "credits" # credits: "credits"
# one_month_coupon: "coupon: choose either Rails or HTML" # one_month_coupon: "coupon: choose either Rails or HTML"
# one_month_discount: "discount, 30% off: choose either Rails or HTML" # one_month_discount: "discount, 30% off: choose either Rails or HTML"
# license: "license" license: "라이센스"
# oreilly: "ebook of your choice" # oreilly: "ebook of your choice"
# multiplayer_launch: # multiplayer_launch:
@ -861,35 +861,35 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# new_to_programming: ". New to programming? Hit our beginner campaign to skill up." # new_to_programming: ". New to programming? Hit our beginner campaign to skill up."
# so_ready: "I Am So Ready for This" # so_ready: "I Am So Ready for This"
# loading_error: loading_error:
could_not_load: "서버로부터 로딩하는 데 문제가 발생했습니다." could_not_load: "서버로부터 로딩하는 데 문제가 발생했습니다."
connection_failure: "연결 실패" connection_failure: "연결 실패"
# unauthorized: "You need to be signed in. Do you have cookies disabled?" unauthorized: "로그인한 상태가 아닙니다. 혹시 쿠키를 사용하지 못하게 설정해놓으셨나요?"
forbidden: "권한이 필요합니다." forbidden: "권한이 필요합니다."
# not_found: "Not found." not_found: "찾을 수 없습니다."
# not_allowed: "Method not allowed." not_allowed: "잘못된 접근입니다."
timeout: "서버 타임아웃" timeout: "서버 타임아웃"
# conflict: "Resource conflict." conflict: "리소스 충돌"
# bad_input: "Bad input." # bad_input: "Bad input."
server_error: "서버 에러" server_error: "서버 에러"
unknown: "알 수 없는 에러 발생" unknown: "알 수 없는 에러 발생"
# resources: resources:
# your_sessions: "Your Sessions" # your_sessions: "Your Sessions"
# level: "Level" level: "레벨"
# social_network_apis: "Social Network APIs" # social_network_apis: "Social Network APIs"
# facebook_status: "Facebook Status" # facebook_status: "Facebook Status"
# facebook_friends: "Facebook Friends" facebook_friends: "페이스북 친구들"
# facebook_friend_sessions: "Facebook Friend Sessions" # facebook_friend_sessions: "Facebook Friend Sessions"
# gplus_friends: "G+ Friends" gplus_friends: "구글 플러스 친구들"
# gplus_friend_sessions: "G+ Friend Sessions" # gplus_friend_sessions: "G+ Friend Sessions"
# leaderboard: "Leaderboard" leaderboard: "상위권 순위 차트"
# user_schema: "User Schema" # user_schema: "User Schema"
# user_profile: "User Profile" user_profile: "유저 프로필"
# patches: "Patches" # patches: "Patches"
# patched_model: "Source Document" # patched_model: "Source Document"
# model: "Model" # model: "Model"
# system: "System" system: "시스템"
# component: "Component" # component: "Component"
# components: "Components" # components: "Components"
# thang: "Thang" # thang: "Thang"
@ -899,7 +899,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# article: "Article" # article: "Article"
# user_names: "User Names" # user_names: "User Names"
# thang_names: "Thang Names" # thang_names: "Thang Names"
# files: "Files" files: "파일들"
# top_simulators: "Top Simulators" # top_simulators: "Top Simulators"
# source_document: "Source Document" # source_document: "Source Document"
# document: "Document" # document: "Document"

View file

@ -14,7 +14,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
manual: "Manual" manual: "Manual"
fork: "Bifurcar" fork: "Bifurcar"
play: "Jogar" play: "Jogar"
retry: "Tentar novamente" retry: "Tentar Novamente"
watch: "Vigiar" watch: "Vigiar"
unwatch: "Desvigiar" unwatch: "Desvigiar"
submit_patch: "Submeter Versão" submit_patch: "Submeter Versão"
@ -185,7 +185,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
email_recruit_notes: "Oportunidades de Emprego" email_recruit_notes: "Oportunidades de Emprego"
email_recruit_notes_description: "Se joga muito bem, podemos contactá-lo para lhe arranjar um (melhor) emprego." email_recruit_notes_description: "Se joga muito bem, podemos contactá-lo para lhe arranjar um (melhor) emprego."
contributor_emails: "Subscrições de E-mail (Contribuintes)" contributor_emails: "Subscrições de E-mail (Contribuintes)"
contribute_prefix: "Estamos à procura de pessoas para se juntarem a nós! Visita a " contribute_prefix: "Estamos à procura de pessoas para se juntarem a nós! Visite a "
contribute_page: "página de contribuição" contribute_page: "página de contribuição"
contribute_suffix: " para mais informações." contribute_suffix: " para mais informações."
email_toggle: "Alternar Todos" email_toggle: "Alternar Todos"
@ -305,7 +305,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
# player_code: "Player Code" # player_code: "Player Code"
employers: employers:
hire_developers_not_credentials: "Contrate desenvolvedores, não cartas de recomendação." hire_developers_not_credentials: "Contrate programadores, não cartas de recomendação."
get_started: "Começar" get_started: "Começar"
already_screened: "Nós já selecionamos tecnicamente todos os nossos candidatos" already_screened: "Nós já selecionamos tecnicamente todos os nossos candidatos"
filter_further: ", mas ainda pode filtrar mais:" filter_further: ", mas ainda pode filtrar mais:"
@ -333,7 +333,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
# pass_screen_blurb: "Review each candidate's code before reaching out. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News." # pass_screen_blurb: "Review each candidate's code before reaching out. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News."
# make_hiring_easier: "Make my hiring easier, please." # make_hiring_easier: "Make my hiring easier, please."
what: "O que é o CodeCombat?" what: "O que é o CodeCombat?"
what_blurb: "O CodeCombat é um jogo de programação, no navegador e multijogador. Os jogadores escrevem código para controlar as forças deles em batalha contra outros desenvolvedores. Os nossos jogadores têm experiência com todos os conceitos tecnológicos principais." what_blurb: "O CodeCombat é um jogo de programação, no navegador e multijogador. Os jogadores escrevem código para controlar as forças deles em batalha contra outros programadores. Os nossos jogadores têm experiência com todos os conceitos tecnológicos principais."
cost: "Quanto é que cobramos?" cost: "Quanto é que cobramos?"
cost_blurb: "Cobramos 15% do salário do primeiro ano e ofereçemos uma garantia de devolução de 100% do dinheiro durante 90 dias. Não cobramos por candidatos que já estejam a ser ativamente entrevistados na sua companhia." cost_blurb: "Cobramos 15% do salário do primeiro ano e ofereçemos uma garantia de devolução de 100% do dinheiro durante 90 dias. Não cobramos por candidatos que já estejam a ser ativamente entrevistados na sua companhia."
candidate_name: "Nome" candidate_name: "Nome"
@ -344,9 +344,9 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
candidate_years_experience: "Anos de Experiência" candidate_years_experience: "Anos de Experiência"
candidate_last_updated: "Última Vez Atualizado" candidate_last_updated: "Última Vez Atualizado"
candidate_who: "Quem" candidate_who: "Quem"
featured_developers: "Desenvolvedores em Destaque" featured_developers: "Programadores em Destaque"
other_developers: "Outros Desenvolvedores" other_developers: "Outros Programadores"
inactive_developers: "Desenvolvedores Inativos" inactive_developers: "Programadores Inativos"
play_level: play_level:
done: "Concluir" done: "Concluir"
@ -375,112 +375,112 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
victory_play_next_level: "Jogar Próximo Nível" victory_play_next_level: "Jogar Próximo Nível"
victory_go_home: "Ir para o Início" victory_go_home: "Ir para o Início"
victory_review: "Conte-nos mais!" victory_review: "Conte-nos mais!"
victory_hour_of_code_done: "É Tudo?" victory_hour_of_code_done: "Terminou?"
victory_hour_of_code_done_yes: "Sim, a minha Hora de Código™ chegou ao fim!" victory_hour_of_code_done_yes: "Sim, terminei a minha Hora de Código™!"
multiplayer_title: "Definições de Multiplayer" multiplayer_title: "Definições Multijogador"
multiplayer_link_description: "Dá este link a alguém para se juntar a ti." multiplayer_link_description: "Dê esta ligação a alguém para se juntar a si."
multiplayer_hint_label: "Dica:" multiplayer_hint_label: "Dica:"
multiplayer_hint: " Carrega no link para seleccionar tudp, depois pressiona ⌘-C ou Ctrl-C para copiar o link." multiplayer_hint: " Clique na ligação para selecionar tudo. Depois carregue em ⌘-C ou Ctrl-C para copiá-la."
multiplayer_coming_soon: "Mais funcionalidades de multiplayer brevemente!" multiplayer_coming_soon: "Mais funcionalidades multijogador em breve!"
# multiplayer_sign_in_leaderboard: "Sign in or create an account and get your solution on the leaderboard." multiplayer_sign_in_leaderboard: "Inicie sessão ou crie uma conta para ter a sua solução na tabela de classificação."
guide_title: "Guia" guide_title: "Guia"
tome_minion_spells: "Feitiços dos teus Minions" tome_minion_spells: "Feitiços dos Seus Minions"
tome_read_only_spells: "Feitiços apenas de leitura" tome_read_only_spells: "Feitiços Apenas de Leitura"
tome_other_units: "Outras Unidades" tome_other_units: "Outras Unidades"
tome_cast_button_castable: "Lançar Feitiço" tome_cast_button_castable: "Lançar Feitiço"
tome_cast_button_casting: "A Lançar Feitiço" tome_cast_button_casting: "A Lançar"
tome_cast_button_cast: "Lançar Feitiço" tome_cast_button_cast: "Feitiço Lançado"
# tome_autocast_delay: "Autocast Delay" tome_autocast_delay: "Atraso de Auto-lançamento"
tome_select_spell: "Escolhe um Feitiço" tome_select_spell: "Selecione um Feitiço"
tome_select_a_thang: "Escolhe Alguém para " tome_select_a_thang: "Selecione Alguém para "
tome_available_spells: "Feitiços disponíveis" tome_available_spells: "Feitiços Disponíveis"
hud_continue: "Continuar (shift-espaço)" hud_continue: "Continuar (shift-espaço)"
spell_saved: "Feitiço Guardado" spell_saved: "Feitiço Guardado"
skip_tutorial: "Saltar (esc)" skip_tutorial: "Saltar (esc)"
editor_config: "Configurar Editor" editor_config: "Configurar Editor"
editor_config_title: "Configuração do Editor" editor_config_title: "Configurar Editor"
# editor_config_level_language_label: "Language for This Level" editor_config_level_language_label: "Linguagem para Este Nível"
# editor_config_level_language_description: "Define the programming language for this particular level." editor_config_level_language_description: "Define a linguagem de programação para este nível em particular."
# editor_config_default_language_label: "Default Programming Language" editor_config_default_language_label: "Linguagem de Programação Predefinida"
# editor_config_default_language_description: "Define the programming language you want to code in when starting new levels." editor_config_default_language_description: "Define a linguagem de programação na qual deseja programar aquando do começo de novos níveis."
editor_config_keybindings_label: "Atalhos de Teclado" editor_config_keybindings_label: "Atalhos do Teclado"
editor_config_keybindings_default: "Predefinição (Ace)" editor_config_keybindings_default: "Predefinição (Ace)"
editor_config_keybindings_description: "Adiciona atalhos de teclado de acordo com o editor escolhido" editor_config_keybindings_description: "Adiciona atalhos de teclado adicionais conhecidos dos editores comuns."
# editor_config_livecompletion_label: "Live Autocompletion" editor_config_livecompletion_label: "Auto-completação em Tempo Real"
# editor_config_livecompletion_description: "Displays autocomplete suggestions while typing." editor_config_livecompletion_description: "Mostra sugestões de auto-completação aquando da escrita."
editor_config_invisibles_label: "Mostrar Invisíveis" editor_config_invisibles_label: "Mostrar Invisíveis"
editor_config_invisibles_description: "Mostra caracteres invisíveis como espaços e tabulações" editor_config_invisibles_description: "Mostra invisíveis tais como espaços e tabulações."
editor_config_indentguides_label: "Mostrar Guias" editor_config_indentguides_label: "Mostrar Guias de Indentação"
editor_config_indentguides_description: "Mostra linhas verticais de acordo com a identação." editor_config_indentguides_description: "Mostra linhas verticais para se ver melhor a indentação."
editor_config_behaviors_label: "Comportamentos Inteligentes" editor_config_behaviors_label: "Comportamentos Inteligentes"
editor_config_behaviors_description: "Completa automaticamente chavetas, parêntesis e aspas" editor_config_behaviors_description: "Auto-completa parênteses, chavetas e aspas."
# keyboard_shortcuts: "Key Shortcuts" keyboard_shortcuts: "Atalhos do Teclado"
# loading_ready: "Ready!" loading_ready: "Pronto!"
# tip_insert_positions: "Shift+Click a point on the map to insert it into the spell editor." tip_insert_positions: "Pressione Shift e Clique num ponto do mapa para inseri-lo no editor de feitiços."
# tip_toggle_play: "Toggle play/paused with Ctrl+P." tip_toggle_play: "Alterne entre Jogar e Pausar com Ctrl+P."
# tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward." tip_scrub_shortcut: "Ctrl+[ rebobina e Ctrl+] 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 is 100% open source!" tip_open_source: "O CodeCombat é 100% open source!"
# tip_beta_launch: "CodeCombat launched its beta in October, 2013." tip_beta_launch: "O CodeCombat lançou o seu beta em outubro de 2013."
# tip_js_beginning: "JavaScript is just the beginning." tip_js_beginning: "O JavaScript é apenas o começo."
# tip_autocast_setting: "Adjust autocast settings by clicking the gear on the cast button." tip_autocast_setting: "Ajuste as definições de auto-lançamento ao clicar na engrenagem no botão lançar."
# think_solution: "Think of the solution, not the problem." 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_theory_practice: "Teoricamente, não há diferença entre a teoria e a prática. Mas na prática, há. - Yogi Berra"
# tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis" tip_error_free: "Há duas formas de escrever programas sem erros; apenas a terceira funciona. - 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_debugging_program: "Se depurar é o processo de remover erros, então programar deve ser o processo de os adicionar. - Edsger W. Dijkstra"
# tip_forums: "Head over to the forums and tell us what you think!" tip_forums: "Vá aos fóruns e diga-nos o que pensa!"
# tip_baby_coders: "In the future, even babies will be Archmages." tip_baby_coders: "No futuro, até os bebés serão Arcomagos."
# tip_morale_improves: "Loading will continue until morale improves." tip_morale_improves: "O carregamento irá continuar até que a moral melhore."
# tip_all_species: "We believe in equal opportunities to learn programming for all species." tip_all_species: "Acreditamos em oportunidades iguais para todas as espécies, em relação a aprenderem a programar."
# tip_reticulating: "Reticulating spines." tip_reticulating: "A reticular espinhas."
# tip_harry: "Yer a Wizard, " tip_harry: "Você é um Feitiçeiro, "
# tip_great_responsibility: "With great coding skill comes great debug responsibility." # 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_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_binary: "Há apenas 10 tipos de pessoas no mundo: aquelas que percebem binário e aquelas que não."
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" # 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_no_try: "Fazer. Ou não fazer. Não há nenhum tentar. - Yoda"
# tip_patience: "Patience you must have, young Padawan. - Yoda" tip_patience: "Paciência tu deves ter, jovem Padawan. - Yoda"
# tip_documented_bug: "A documented bug is not a bug; it is a feature." tip_documented_bug: "Um erro documentado não é um erro; é uma funcionalidade."
# tip_impossible: "It always seems impossible until it's done. - Nelson Mandela" tip_impossible: "Parece sempre impossível até ser feito. - Nelson Mandela"
# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" tip_talk_is_cheap: "Falar é fácil. Mostre-me o código. - Linus Torvalds"
# tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay" tip_first_language: "A coisa mais desastrosa que pode aprender é a sua primeira linguagem de programação. - 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_hardware_problem: "P: Quantos programadores são necessários para mudar uma lâmpada? R: Nenhum, é um problema de hardware."
# time_current: "Now:" time_current: "Agora:"
# time_total: "Max:" time_total: "Máximo:"
# time_goto: "Go to:" time_goto: "Ir para:"
# infinite_loop_try_again: "Try Again" infinite_loop_try_again: "Tentar Novamente"
# infinite_loop_reset_level: "Reset Level" infinite_loop_reset_level: "Reiniciar Nível"
# infinite_loop_comment_out: "Comment Out My Code" # infinite_loop_comment_out: "Comment Out My Code"
# keyboard_shortcuts: keyboard_shortcuts:
# keyboard_shortcuts: "Keyboard Shortcuts" keyboard_shortcuts: "Atalhos de Teclado"
# space: "Space" space: "Espaço"
# enter: "Enter" enter: "Enter"
# escape: "Escape" escape: "Esc"
# cast_spell: "Cast current spell." cast_spell: "Lançar feitiço atual."
# continue_script: "Continue past current script." # continue_script: "Continue past current script."
# skip_scripts: "Skip past all skippable scripts." # skip_scripts: "Skip past all skippable scripts."
# toggle_playback: "Toggle play/pause." toggle_playback: "Alternar entre Jogar e Pausar."
# scrub_playback: "Scrub back and forward through time." scrub_playback: "Andar para a frente e para trás no tempo."
# single_scrub_playback: "Scrub back and forward through time by a single frame." single_scrub_playback: "Andar para a frente e para trás no tempo um único frame."
# scrub_execution: "Scrub through current spell execution." # scrub_execution: "Scrub through current spell execution."
# toggle_debug: "Toggle debug display." # toggle_debug: "Toggle debug display."
# toggle_grid: "Toggle grid overlay." # toggle_grid: "Toggle grid overlay."
# toggle_pathfinding: "Toggle pathfinding overlay." # toggle_pathfinding: "Toggle pathfinding overlay."
# beautify: "Beautify your code by standardizing its formatting." # beautify: "Beautify your code by standardizing its formatting."
# move_wizard: "Move your Wizard around the level." move_wizard: "Mover o seu Feitiçeiro pelo nível."
admin: admin:
av_title: "Visualizações de Admin" av_title: "Vistas de Administrador"
av_entities_sub_title: "Entidades" av_entities_sub_title: "Entidades"
av_entities_users_url: "Utilizadores" av_entities_users_url: "Utilizadores"
av_entities_active_instances_url: "Activar Instâncias" av_entities_active_instances_url: "Activar Instâncias"
# av_entities_employer_list_url: "Employer List" av_entities_employer_list_url: "Lista de Empregadores"
av_other_sub_title: "Outro" av_other_sub_title: "Outro"
av_other_debug_base_url: "Base (para fazer debug base.jade)" av_other_debug_base_url: "Base (para depurar base.jade)"
u_title: "Lista de Utilizadores" u_title: "Lista de Utilizadores"
lg_title: "Últimos Jogos" lg_title: "Últimos Jogos"
# clas: "CLAs" clas: "CLA's"
community: community:
level_editor: "Editor de Níveis" level_editor: "Editor de Níveis"
@ -545,16 +545,16 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
new_article_title: "Criar um Novo Artigo" new_article_title: "Criar um Novo Artigo"
new_thang_title: "Criar um Novo Tipo de Thang" new_thang_title: "Criar um Novo Tipo de Thang"
new_level_title: "Criar um Novo Nível" new_level_title: "Criar um Novo Nível"
# new_article_title_login: "Log In to Create a New Article" new_article_title_login: "Inicie Sessão para Criar um Novo Artigo"
# new_thang_title_login: "Log In to Create a New Thang Type" new_thang_title_login: "Inicie Sessão para Criar um Novo Tipo de Thang"
# new_level_title_login: "Log In to Create a New Level" new_level_title_login: "Inicie Sessão para Criar um Novo Nível"
# new_achievement_title: "Create a New Achievement" new_achievement_title: "Criar uma Nova Conquista"
# new_achievement_title_login: "Log In to Create a New Achievement" new_achievement_title_login: "Inicie Sessão para Criar uma Nova Conquista"
article_search_title: "Procurar Artigos Aqui" article_search_title: "Procurar Artigos Aqui"
thang_search_title: "Procurar Thangs Aqui" thang_search_title: "Procurar Thangs Aqui"
level_search_title: "Procurar Níveis Aqui" level_search_title: "Procurar Níveis Aqui"
# achievement_search_title: "Search Achievements" achievement_search_title: "Procurar Conquistas"
# read_only_warning2: "Note: you can't save any edits here, because you're not logged in." read_only_warning2: "Nota: não pode guardar nenhuma edição feita aqui, porque não tem sessão iniciada."
article: article:
edit_btn_preview: "Pré-visualizar" edit_btn_preview: "Pré-visualizar"
@ -613,33 +613,33 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
# michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online." # michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online."
# glen_description: "Programmer and passionate game developer, with the motivation to make this world a better place, by developing things that matter. The word impossible can't be found in his dictionary. Learning new skills is his joy!" # glen_description: "Programmer and passionate game developer, with the motivation to make this world a better place, by developing things that matter. The word impossible can't be found in his dictionary. Learning new skills is his joy!"
# legal: legal:
# page_title: "Legal" page_title: "Legal"
# opensource_intro: "CodeCombat is free to play and completely open source." opensource_intro: "O CodeCombat é gratuito para jogar e é totalmente open source."
# opensource_description_prefix: "Check out " opensource_description_prefix: "Confira "
# github_url: "our GitHub" github_url: "o nosso GitHub"
# opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See " opensource_description_center: "e ajude se quiser! O CodeCombat é construído tendo por base dezenas de projetos open source, os quais nós amamos. Veja "
# archmage_wiki_url: "our Archmage wiki" archmage_wiki_url: "a nossa wiki dos Arcomagos"
# opensource_description_suffix: "for a list of the software that makes this game possible." opensource_description_suffix: "para uma lista do software que faz com que este jogo seja possível."
# practices_title: "Respectful Best Practices" practices_title: "Melhores Práticas Respeitosas"
# practices_description: "These are our promises to you, the player, in slightly less legalese." practices_description: "Estas são as nossas promessas para consigo, o jogador, com um pouco menos de politiquices."
# privacy_title: "Privacy" privacy_title: "Privacidade"
# 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." # 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_title: "Segurança"
# 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." # 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."
# email_title: "Email" email_title: "E-mail"
# email_description_prefix: "We will not inundate you with spam. Through" email_description_prefix: "Nós não o inundaremos com spam. Através das"
# email_settings_url: "your email settings" email_settings_url: "suas definições de e-mail"
# email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time." email_description_suffix: "ou através de ligações presentes nos e-mails que enviamos, pode mudar as suas preferências e parar a sua subscrição facilmente, em qualquer momento."
# cost_title: "Cost" cost_title: "Custo"
# cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:" # cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:"
# recruitment_title: "Recruitment" recruitment_title: "Recrutamento"
# recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizardnot just in the game, but also in real life." # recruitment_description_prefix: "Here on CodeCombat, you're going to become a powerful wizardnot just in the game, but also in real life."
# url_hire_programmers: "No one can hire programmers fast enough" # url_hire_programmers: "No one can hire programmers fast enough"
# recruitment_description_suffix: "so once you've sharpened your skills and if you agree, we will demo your best coding accomplishments to the thousands of employers who are drooling for the chance to hire you. They pay us a little, they pay you" # recruitment_description_suffix: "so once you've sharpened your skills and if you agree, we will demo your best coding accomplishments to the thousands of employers who are drooling for the chance to hire you. They pay us a little, they pay you"
# recruitment_description_italic: "a lot" # recruitment_description_italic: "a lot"
# recruitment_description_ending: "the site remains free and everybody's happy. That's the plan." # recruitment_description_ending: "the site remains free and everybody's happy. That's the plan."
# copyrights_title: "Copyrights and Licenses" copyrights_title: "Direitos Autorais e Licensas"
# contributor_title: "Contributor License Agreement" # contributor_title: "Contributor License Agreement"
# contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our" # contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our"
# cla_url: "CLA" # cla_url: "CLA"
@ -791,8 +791,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
summary_matches: "Partidas - " summary_matches: "Partidas - "
summary_wins: " Vitórias, " summary_wins: " Vitórias, "
summary_losses: " Derrotas" summary_losses: " Derrotas"
rank_no_code: "Sem código novo para classificar" rank_no_code: "Sem Código Novo para Classificar"
rank_my_game: "Classifica o meu jogo!" rank_my_game: "Classifique o Meu Jogo!"
rank_submitting: "A submeter..." rank_submitting: "A submeter..."
rank_submitted: "Submetido para Classificação" rank_submitted: "Submetido para Classificação"
rank_failed: "Falhou a Classificar" rank_failed: "Falhou a Classificar"
@ -805,9 +805,9 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
choose_opponent: "Escolhe um Adversário" choose_opponent: "Escolhe um Adversário"
# select_your_language: "Select your language!" # select_your_language: "Select your language!"
tutorial_play: "Jogar Tutorial" tutorial_play: "Jogar Tutorial"
tutorial_recommended: "Recomendado se nunca jogaste antes" tutorial_recommended: "Recomendado se nunca jogou antes"
tutorial_skip: "Saltar Tutorial" tutorial_skip: "Saltar Tutorial"
tutorial_not_sure: "Não tens a certeza do que se passa?" tutorial_not_sure: "Não tem a certeza do que se passa?"
tutorial_play_first: "Joga o Tutorial primeiro." tutorial_play_first: "Joga o Tutorial primeiro."
simple_ai: "Inteligência Artificial Simples" simple_ai: "Inteligência Artificial Simples"
warmup: "Aquecimento" warmup: "Aquecimento"
@ -824,8 +824,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
# tournament_rules: "Tournament Rules" # 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: "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_blog: "on our blog" # tournament_blurb_blog: "on our blog"
# rules: "Rules" rules: "Regras"
# winners: "Winners" winners: "Vencedores"
# ladder_prizes: # ladder_prizes:
# title: "Tournament Prizes" # title: "Tournament Prizes"
@ -849,30 +849,30 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
multiplayer_launch: multiplayer_launch:
introducing_dungeon_arena: "Introduzindo a Dungeon Arena" introducing_dungeon_arena: "Introduzindo a Dungeon Arena"
new_way: "Uma nova forma de competir com código." new_way: "A nova forma de competir com código."
to_battle: "Às armas, Programadores!" to_battle: "Para o Combate, Programadores!"
modern_day_sorcerer: "Sabes programar? És tão forte! És um feiticeiro dos tempos modernos! Será que não está na altura de usares os teus poderes mágicos de programação para comandar os teus servos em combates épicos? E não estamos a falar de robots." modern_day_sorcerer: "Sabe programar? Isso é demais! É um feiticeiro dos tempos modernos! Não estará na altura de usar os seus poderes mágicos de programação para comandar os seus minions em combates épicos? E não estamos a falar de robôs."
arenas_are_here: "As arenas mano-a-mano multiplayer de CodeCombat estão aqui." arenas_are_here: "As arenas multijogador do CodeCombat estão aqui."
ladder_explanation: "Escolhe os teus heróis, encanta os teus exércitos de ogres ou humanos, e constrói o teu caminho, derrotando outros Feiticeiros para chegares ao topo da classificação. Depois, desafia os teus amigos para gloriosas arenas de programação multijogador. Se te sentes criativo, podes até" ladder_explanation: "Escolha os seus heróis, enfeitice os seus exércitos de ogres ou de humanos e passe por cima de Feiticeiros derrotados para chegar ao topo da tabela classificativa - depois, compita contra os seus amigos nas nossas arenas de programação multijogador gloriosas. Se se sentir criativo, pode ainda"
fork_our_arenas: "alterar as nossas arenas" fork_our_arenas: "bifurcar as nossas arenas"
create_worlds: "e criar os teus próprios mundos." create_worlds: "e criar os seus próprios mundos."
javascript_rusty: "O teu JavaScript está enferrujado? Não te preocupes; Existe um" javascript_rusty: "O seu JavaScript está um pouco enferrujado? Não se preocupe; existe um"
tutorial: "tutorial" tutorial: "tutorial"
new_to_programming: ". Novo na programação? Faz a Campanha para Iniciantes para expandires as tuas capacidades." new_to_programming: ". Novo na programação? Faça a nossa Campanha para Iniciantes para melhorar as suas capacidades."
so_ready: "Estou mais que pronto para isto" so_ready: "Estou Mais Que Pronto Para Isto"
# loading_error: loading_error:
# could_not_load: "Error loading from server" could_not_load: "Erro ao carregar do servidor"
# connection_failure: "Connection failed." connection_failure: "A conexão falhou."
# unauthorized: "You need to be signed in. Do you have cookies disabled?" unauthorized: "Precisa de ter sessão iniciada. Tem os cookies desativados?"
# forbidden: "You do not have the permissions." forbidden: "Não tem as permissões."
# not_found: "Not found." not_found: "Não encontrado."
# not_allowed: "Method not allowed." not_allowed: "Método não permitido."
# timeout: "Server timeout." timeout: "O servidor expirou."
# conflict: "Resource conflict." conflict: "Conflito de recursos."
# bad_input: "Bad input." bad_input: "Má entrada."
# server_error: "Server error." server_error: "Erro do servidor."
# unknown: "Unknown error." unknown: "Erro desconhecido."
resources: resources:
your_sessions: "As Suas Sessões" your_sessions: "As Suas Sessões"
@ -895,14 +895,14 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
thang: "Thang" thang: "Thang"
thangs: "Thangs" thangs: "Thangs"
level_session: "A Sua Sessão" level_session: "A Sua Sessão"
opponent_session: "Sessão Do Oponente" opponent_session: "Sessão do Adversário"
article: "Artigo" article: "Artigo"
# user_names: "User Names" # user_names: "User Names"
# thang_names: "Thang Names" # thang_names: "Thang Names"
# files: "Files" # files: "Files"
# top_simulators: "Top Simulators" # top_simulators: "Top Simulators"
# source_document: "Source Document" # source_document: "Source Document"
# document: "Document" document: "Documento"
# sprite_sheet: "Sprite Sheet" # sprite_sheet: "Sprite Sheet"
# candidate_sessions: "Candidate Sessions" # candidate_sessions: "Candidate Sessions"
# user_remark: "User Remark" # user_remark: "User Remark"

View file

@ -41,6 +41,9 @@
bottom: 0 bottom: 0
overflow: scroll overflow: scroll
.treema-row .add-button
margin-left: 10px
#component-config-column-view #component-config-column-view
border-left: 1px solid black border-left: 1px solid black
border-right: 1px solid black border-right: 1px solid black

View file

@ -3,7 +3,7 @@
.choose-option .choose-option
margin-bottom: 15px margin-bottom: 15px
width: 100% width: 100%
height: 100px height: 200px
overflow: hidden overflow: hidden
background: white background: white
border: 1px solid #333 border: 1px solid #333
@ -126,3 +126,6 @@
.hard-option .preset-name .hard-option .preset-name
border-top: 25px solid black border-top: 25px solid black
color: white color: white
.capitalize
text-transform: capitalize

View file

@ -151,6 +151,8 @@ $mobile: 1050px
input input
width: $addPaletteWidth width: $addPaletteWidth
margin: 0 margin: 0
margin-top: 5px
padding-left: 5px
@media screen and (max-width: $mobile) @media screen and (max-width: $mobile)
margin: 0 5px margin: 0 5px
@ -209,6 +211,21 @@ $mobile: 1050px
width: 100% width: 100%
position: relative position: relative
#canvas-overlay
position: absolute
width: 100%
height: 100%
background: white
opacity: 0.5
text-align: center
#randomize-button
position: absolute
top: 45%
height: 40px
// Below snatched from play/level.sass; should refactor? // Below snatched from play/level.sass; should refactor?
canvas#surface canvas#surface

View file

@ -42,7 +42,6 @@ body.is-playing
position: fixed position: fixed
width: 100% width: 100%
height: 100% height: 100%
z-index: 20
#pointer #pointer
position: absolute position: absolute

View file

@ -8,7 +8,7 @@
right: 10px right: 10px
background: transparent background: transparent
border: 0 border: 0
padding: 18px 35px 18px 14px padding: 7px 20px
text-shadow: none text-shadow: none
color: white color: white
word-wrap: break-word word-wrap: break-word
@ -46,6 +46,7 @@ html.no-borderimage
border-image: none border-image: none
background: transparent url(/images/level/code_editor_error_background.png) no-repeat background: transparent url(/images/level/code_editor_error_background.png) no-repeat
background-size: 100% 100% background-size: 100% 100%
padding: 18px 35px 18px 14px
&.alert-warning &.alert-warning
background-image: url(/images/level/code_editor_warning_background.png) background-image: url(/images/level/code_editor_warning_background.png)

View file

@ -28,8 +28,8 @@
width: 100% width: 100%
span.code-background span.code-background
border-width: 22px border-width: 40px
border-image: url(/images/level/code_editor_background.png) 22 fill round border-image: url(/images/level/code_editor_background.png) 40 fill round
img.code-background img.code-background
display: none display: none

View file

@ -76,3 +76,11 @@ html.no-borderimage
background: transparent url(/images/level/popover_background.png) background: transparent url(/images/level/popover_background.png)
background-size: 100% 100% background-size: 100% 100%
border: 0 border: 0
#code-area.fullscreen-editor
#tome-view
.popover.pinned
min-width: 600px
bottom: inherit
right: 50%
margin-right: -300px

View file

@ -3,7 +3,10 @@ extends /templates/base
block content block content
if !allowedToEditJobProfile && me.get('anonymous') == true if !allowedToEditJobProfile && me.get('anonymous') == true
div(class="job-profile-container") div(class="job-profile-container")
h1#login-message Please login to view this profile. h1#login-message
|Please
a.auth-button login
| to view this profile.
else else
if allowedToEditJobProfile if allowedToEditJobProfile
.profile-control-bar .profile-control-bar
@ -191,7 +194,9 @@ block content
span.spl - #{session.team} span.spl - #{session.team}
if session.codeLanguage != 'javascript' if session.codeLanguage != 'javascript'
span.spl - #{{coffeescript: 'CoffeeScript', python: 'Python', lua: 'Lua', io: 'Io', clojure: 'Clojure'}[session.codeLanguage]} span.spl - #{{coffeescript: 'CoffeeScript', python: 'Python', lua: 'Lua', io: 'Io', clojure: 'Clojure'}[session.codeLanguage]}
if !editing && !sessions.length
h3(data-i18n="account_profile.player_code") Player Code
p This player hasn't submitted code to our more recent tournaments.
.middle-column.full-height-column .middle-column.full-height-column
.sub-column .sub-column
#name-container.editable-section #name-container.editable-section

View file

@ -22,9 +22,9 @@ block content
li li
a(href="/admin/users", data-i18n="admin.av_entities_users_url") Users a(href="/admin/users", data-i18n="admin.av_entities_users_url") Users
li li
a(href="/admin/level_sessions", data-i18n="admin.av_entities_active_instances_url") Active Instances a(href="/admin/level-sessions", data-i18n="admin.av_entities_active_instances_url") Active Instances
li li
a(href="/admin/employer_list", data-i18n="admin.av_entities_employer_list_url") Employer List a(href="/admin/employers", data-i18n="admin.av_entities_employer_list_url") Employer List
li li
a(href="/admin/candidates") Candidate List a(href="/admin/candidates") Candidate List

View file

@ -67,7 +67,7 @@ body
a(href='/contribute', title='Contribute', tabindex=-1, data-i18n="nav.contribute") Contribute a(href='/contribute', title='Contribute', tabindex=-1, data-i18n="nav.contribute") Contribute
a(href='/legal', title='Legal', tabindex=-1, data-i18n="nav.legal") Legal a(href='/legal', title='Legal', tabindex=-1, data-i18n="nav.legal") Legal
a(href='/about', title='About', tabindex=-1, data-i18n="nav.about") About a(href='/about', title='About', tabindex=-1, data-i18n="nav.about") About
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Contact a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
a(href='/editor', data-i18n="nav.editor") Editor a(href='/editor', data-i18n="nav.editor") Editor
a(href='http://blog.codecombat.com/', data-i18n="nav.blog") Blog a(href='http://blog.codecombat.com/', data-i18n="nav.blog") Blog
a(href='http://discourse.codecombat.com/', data-i18n="nav.forum") Forum a(href='http://discourse.codecombat.com/', data-i18n="nav.forum") Forum

View file

@ -31,7 +31,7 @@ block content
h4(data-i18n="contribute.how_to_join") How to Join h4(data-i18n="contribute.how_to_join") How to Join
p p
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contribute.contact_us_url") a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="contribute.contact_us_url")
| Contact us | Contact us
span , span ,
span(data-i18n="contribute.ambassador_join_desc") span(data-i18n="contribute.ambassador_join_desc")

View file

@ -48,7 +48,7 @@ block content
span(data-i18n="contribute.join_desc_2") span(data-i18n="contribute.join_desc_2")
| to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. | to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email.
| Want to chat about what to do or how to get more deeply involved? | Want to chat about what to do or how to get more deeply involved?
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contribute.join_url_email") a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="contribute.join_url_email")
| Email us | Email us
span(data-i18n="contribute.join_desc_3") span(data-i18n="contribute.join_desc_3")
| , or find us in our | , or find us in our

View file

@ -37,7 +37,7 @@ block content
h4(data-i18n="contribute.how_to_join") How To Join h4(data-i18n="contribute.how_to_join") How To Join
p p
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="contribute.contact_us_url") a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="contribute.contact_us_url")
| Contact us | Contact us
span , span ,
span(data-i18n="contribute.scribe_join_description") span(data-i18n="contribute.scribe_join_description")

View file

@ -1,4 +1,4 @@
extends /templates/base //extends /templates/base
block content block content

View file

@ -36,7 +36,7 @@ block content
p p
span(data-i18n="editor.got_questions") Questions about using the CodeCombat editors? span(data-i18n="editor.got_questions") Questions about using the CodeCombat editors?
| |
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="editor.contact_us") Contact us! a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="editor.contact_us") Contact us!
| |
span(data-i18n="editor.hipchat_prefix") You can also find us in our span(data-i18n="editor.hipchat_prefix") You can also find us in our
| |

View file

@ -11,7 +11,7 @@ block content
| #{article.attributes.name} | #{article.attributes.name}
button(data-i18n="general.version_history").btn.btn-primary#history-button Version History button(data-i18n="general.version_history").btn.btn-primary#history-button Version History
button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true").btn.btn-primary#revert-button Revert button(data-toggle="coco-modal", data-target="modal/RevertModal", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true").btn.btn-primary#revert-button Revert
button(data-i18n="article.edit_btn_preview", disabled=authorized === true ? undefined : "true").btn.btn-primary#preview-button Preview button(data-i18n="article.edit_btn_preview", disabled=authorized === true ? undefined : "true").btn.btn-primary#preview-button Preview
button(data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary#save-button Save button(data-i18n="common.save", disabled=authorized === true ? undefined : "true").btn.btn-primary#save-button Save

View file

@ -1,5 +1,5 @@
h3(data-i18n="editor.level_tab_thangs_add") Add Thangs h3(data-i18n="editor.level_tab_thangs_add") Add Thangs
input(type="search", id="thang-search") input(type="search", id="thang-search", placeholder="Search thangs")
div.editor-nano-container.nano div.editor-nano-container.nano
#thangs-list.nano-content #thangs-list.nano-content
for group in groups for group in groups

View file

@ -33,11 +33,18 @@ block header
- var patches = level.get('patches') - var patches = level.get('patches')
if patches && patches.length if patches && patches.length
span.badge= patches.length span.badge= patches.length
li
a(href="#docs-components-view", data-toggle="tab", data-i18n="editor.level_tab_docs") Documentation
.navbar-header .navbar-header
span.navbar-brand #{level.attributes.name} span.navbar-brand #{level.attributes.name}
ul.nav.navbar-nav.navbar-right ul.nav.navbar-nav.navbar-right
li#undo-button(title="Undo (Ctrl+Z)")
a
span.glyphicon-arrow-left.glyphicon
li#redo-button(title="Redo (Ctrl+Shift+Z)")
a
span.glyphicon-repeat.glyphicon
if authorized if authorized
li#commit-level-start-button li#commit-level-start-button
a a
@ -78,9 +85,9 @@ block header
li(class=anonymous ? "disabled": "") li(class=anonymous ? "disabled": "")
a(data-i18n="common.fork")#fork-level-start-button Fork a(data-i18n="common.fork")#fork-level-start-button Fork
li(class=anonymous ? "disabled": "") li(class=anonymous ? "disabled": "")
a(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert")#revert-button Revert a(data-toggle="coco-modal", data-target="modal/RevertModal", data-i18n="editor.revert")#revert-button Revert
li(class=anonymous ? "disabled": "") li(class=anonymous ? "disabled": "")
a(data-toggle="coco-modal", data-target="editor/level/modal/terrain_randomize", data-i18n="editor.randomize")#randomize-button Randomize a(data-toggle="coco-modal", data-target="editor/level/modals/TerrainRandomizeModal", data-i18n="editor.randomize")#randomize-button Randomize
li(class=anonymous ? "disabled": "") li(class=anonymous ? "disabled": "")
a(data-i18n="editor.pop_i18n")#pop-level-i18n-button Populate i18n a(data-i18n="editor.pop_i18n")#pop-level-i18n-button Populate i18n
li.divider li.divider
@ -96,7 +103,7 @@ block header
li li
a(href='http://discourse.codecombat.com/category/artisan', data-i18n="nav.forum", target="_blank") Forum a(href='http://discourse.codecombat.com/category/artisan', data-i18n="nav.forum", target="_blank") Forum
li li
a(data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Email a(data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Email
block outer_content block outer_content
.outer-content .outer-content
@ -114,6 +121,8 @@ block outer_content
div.tab-pane#editor-level-patches div.tab-pane#editor-level-patches
.patches-view .patches-view
div.tab-pane#docs-components-view
div#error-view div#error-view
block footer block footer

View file

@ -5,11 +5,12 @@ block modal-header-content
block modal-body-content block modal-body-content
div#normal-view div#normal-view
each sizeObject, size in presetSizes
each preset in presets
a(href="#") a(href="#")
div.choose-option(data-preset-type="grassy", data-preset-size="small") div.choose-option(data-preset-type=preset.type, data-preset-size=size, style="background:url(/images/pages/editor/level/preset_"+preset.type+"_"+size+".jpg) no-repeat center; background-size: cover")
div.preset-size.name-label div.preset-size.name-label.capitalize
span(data-i18n="editor.small") Small span(data-i18n="editor."+size) #{size}
div.preset-name div.preset-name.capitalize
span(data-i18n="editor.grassy") Grassy span(data-i18n="editor."+preset.type) #{preset.type}
//- for model in models
block modal-footer block modal-footer

View file

@ -23,6 +23,8 @@ button.navbar-toggle.toggle.btn-primary#thangs-palette-toggle(type="button", dat
.world-container.thangs-column .world-container.thangs-column
h3(data-i18n="editor.level_tab_thangs_conditions") Starting Conditions h3(data-i18n="editor.level_tab_thangs_conditions") Starting Conditions
#canvas-wrapper #canvas-wrapper
#canvas-overlay
button.btn.btn-primary(id="randomize-button", data-toggle="coco-modal", data-target="editor/level/modals/TerrainRandomizeModal", data-i18n="editor.randomize", title="Randomize Terrain") Randomize
ul.dropdown-menu#contextmenu ul.dropdown-menu#contextmenu
li#delete li#delete
a(data-i18n="editor.delete") Delete a(data-i18n="editor.delete") Delete

View file

@ -14,7 +14,7 @@ block content
button.btn.btn-secondary#history-button(data-i18n="general.version_history") Version History button.btn.btn-secondary#history-button(data-i18n="general.version_history") Version History
button.btn.btn-primary#save-button(data-i18n="common.save", disabled=authorized === true ? undefined : "true") Save button.btn.btn-primary#save-button(data-i18n="common.save", disabled=authorized === true ? undefined : "true") Save
button.btn.btn-primary#revert-button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true") Revert button.btn.btn-primary#revert-button(data-toggle="coco-modal", data-target="modal/RevertModal", data-i18n="editor.revert", disabled=authorized === true ? undefined : "true") Revert
h3 Edit Thang Type: "#{thangType.attributes.name}" h3 Edit Thang Type: "#{thangType.attributes.name}"

View file

@ -10,7 +10,7 @@ block content
| #{currentEditor} | #{currentEditor}
if me.get('anonymous') if me.get('anonymous')
a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/auth", role="button", data-i18n="#{currentNewSignup}") Log in to Create a New Content a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/AuthModal", role="button", data-i18n="#{currentNewSignup}") Log in to Create a New Content
else else
a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal", data-i18n="#{currentNew}") Create a New Something a.btn.btn-primary.open-modal-button(href='#new-model-modal', role="button", data-toggle="modal", data-i18n="#{currentNew}") Create a New Something
input#search(data-i18n="[placeholder]#{currentSearch}") input#search(data-i18n="[placeholder]#{currentSearch}")

View file

@ -74,4 +74,4 @@ block modal-footer
div.network-login div.network-login
.gplus-login-button#gplus-login-button .gplus-login-button#gplus-login-button
div#recover-account-wrapper div#recover-account-wrapper
a(data-toggle="coco-modal", data-target="modal/recover", data-i18n="login.recover")#link-to-recover recover account a(data-toggle="coco-modal", data-target="modal/RecoverModal", data-i18n="login.recover")#link-to-recover recover account

View file

@ -23,7 +23,7 @@ block modal-body-content
br br
br br
| Already have a CodeCombat account? | Already have a CodeCombat account?
a.login-link(data-toggle="coco-modal", data-target="modal/auth") Log in to continue! a.login-link(data-toggle="coco-modal", data-target="modal/AuthModal") Log in to continue!
else if !userIsAuthorized else if !userIsAuthorized
.modal-footer.linkedin .modal-footer.linkedin
p Please sign into your LinkedIn account to verify your identity. p Please sign into your LinkedIn account to verify your identity.
@ -50,7 +50,7 @@ block modal-footer
if userIsAnonymous if userIsAnonymous
if userIsAuthorized if userIsAuthorized
.modal-footer.linkedin .modal-footer.linkedin
a.login-link(data-toggle="coco-modal", data-target="modal/auth") Please log in to continue. a.login-link(data-toggle="coco-modal", data-target="modal/AuthModal") Please log in to continue.
else if !userIsAnonymous && !userIsAuthorized else if !userIsAnonymous && !userIsAuthorized
.modal-footer.linkedin .modal-footer.linkedin
else if userIsAuthorized && !userHasSignedContract else if userIsAuthorized && !userHasSignedContract

View file

@ -21,12 +21,12 @@ div#columns.row
for session, rank in topSessions for session, rank in topSessions
- var myRow = session.get('creator') == me.id - var myRow = session.get('creator') == me.id
tr(class=myRow ? "success" : "", data-player-id=session.get('creator'), data-session-id=session.id) tr(class=myRow ? "success" : "", data-player-id=session.get('creator'), data-session-id=session.id)
td.code-language-cell(style="background-image: url(/images/common/code_languages/" + session.get('submittedCodeLanguage') + "_icon.png)") td.code-language-cell(style="background-image: url(/images/common/code_languages/" + session.get('submittedCodeLanguage') + "_icon.png)" title=capitalize(session.get('submittedCodeLanguage')))
td.rank-cell= rank + 1 td.rank-cell= rank + 1
td.score-cell= Math.round(session.get('totalScore') * 100) td.score-cell= Math.round(session.get('totalScore') * 100)
td.name-col-cell= session.get('creatorName') || "Anonymous" td.name-col-cell= session.get('creatorName') || "Anonymous"
td.fight-cell td.fight-cell
a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}") a(href="/play/level/#{level.get('slug') || level.id}?team=#{team.otherTeam}&opponent=#{session.id}")
span(data-i18n="ladder.fight") Fight! span(data-i18n="ladder.fight") Fight!
if !showJustTop && team.leaderboard.nearbySessions().length if !showJustTop && team.leaderboard.nearbySessions().length
@ -40,7 +40,7 @@ div#columns.row
td.score-cell= Math.round(session.get('totalScore') * 100) td.score-cell= Math.round(session.get('totalScore') * 100)
td.name-col-cell= session.get('creatorName') || "Anonymous" td.name-col-cell= session.get('creatorName') || "Anonymous"
td.fight-cell td.fight-cell
a(href="/play/level/#{level.get('slug') || level.id}/?team=#{team.otherTeam}&opponent=#{session.id}") a(href="/play/level/#{level.get('slug') || level.id}?team=#{team.otherTeam}&opponent=#{session.id}")
span(data-i18n="ladder.fight") Fight! span(data-i18n="ladder.fight") Fight!
if teamIndex == 1 if teamIndex == 1
.btn.btn-sm.load-more-ladder-entries More .btn.btn-sm.load-more-ladder-entries More
@ -49,7 +49,7 @@ div#columns.row
h4.friends-header(data-i18n="ladder.friends_playing") Friends Playing h4.friends-header(data-i18n="ladder.friends_playing") Friends Playing
if me.get('anonymous') if me.get('anonymous')
div.alert.alert-info div.alert.alert-info
a(data-toggle="coco-modal", data-target="modal/auth", data-i18n="ladder.log_in_for_friends") Log in to play with your friends! a(data-toggle="coco-modal", data-target="modal/AuthModal", data-i18n="ladder.log_in_for_friends") Log in to play with your friends!
else else
if !onFacebook || !onGPlus if !onFacebook || !onGPlus

View file

@ -24,7 +24,7 @@
.footer .footer
.content .content
p(class='footer-link-text') p(class='footer-link-text')
a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Contact a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
if explainHourOfCode if explainHourOfCode
// Does not show up unless lang is en-US. // Does not show up unless lang is en-US.
div.hour-of-code-explanation div.hour-of-code-explanation

View file

@ -21,7 +21,7 @@ block modal-footer-content
a.btn.btn-primary(href="/", data-dismiss="modal", data-i18n="play_level.victory_go_home") Go Home a.btn.btn-primary(href="/", data-dismiss="modal", data-i18n="play_level.victory_go_home") Go Home
if me.get('anonymous') if me.get('anonymous')
p.sign-up-poke p.sign-up-poke
button.btn.btn-success.sign-up-button.btn-large(data-toggle="coco-modal", data-target="modal/signup", data-i18n="play_level.victory_sign_up") Sign Up to Save Progress 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! span(data-i18n="play_level.victory_sign_up_poke") Want to save your code? Create a free account!
p.clearfix p.clearfix
else else

View file

@ -1,3 +1,5 @@
img(src="/images/level/code_editor_tab_background.png").spell-tab-image-hidden.hidden
.btn.btn-small.spell-list-button(title="See all spells you can edit") .btn.btn-small.spell-list-button(title="See all spells you can edit")
i.icon-chevron-down i.icon-chevron-down
.thang-avatar-placeholder .thang-avatar-placeholder

View file

@ -13,4 +13,4 @@
.footer .footer
.content .content
p(class='footer-link-text') p(class='footer-link-text')
a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact", data-i18n="nav.contact") Contact a(title='Send CodeCombat a message', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact

View file

@ -24,7 +24,7 @@ block content
p More questions? Get in touch! Feature requests? We'd love to hear them! CodeCombat is new and needs to hear from you to learn what teachers would love to have in their classrooms of programming wizards-to-be. p More questions? Get in touch! Feature requests? We'd love to hear them! CodeCombat is new and needs to hear from you to learn what teachers would love to have in their classrooms of programming wizards-to-be.
h3 h3
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact") Contact Us a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal") Contact Us
.span5 .span5

View file

@ -1,11 +1,10 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
template = require 'templates/employers' template = require 'templates/employers'
app = require 'application'
User = require 'models/User' User = require 'models/User'
UserRemark = require 'models/UserRemark' UserRemark = require 'models/UserRemark'
{me} = require 'lib/auth' {me} = require 'lib/auth'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
EmployerSignupView = require 'views/modal/employer_signup_modal' EmployerSignupModal = require 'views/modal/EmployerSignupModal'
class CandidatesCollection extends CocoCollection class CandidatesCollection extends CocoCollection
url: '/db/user/x/candidates' url: '/db/user/x/candidates'
@ -75,7 +74,7 @@ module.exports = class EmployersView extends RootView
@applyFilters() @applyFilters()
openSignupModal: -> openSignupModal: ->
@openModalView new EmployerSignupView @openModalView new EmployerSignupModal
handleSelectAllChange: (e) -> handleSelectAllChange: (e) ->
checkedState = e.currentTarget.checked checkedState = e.currentTarget.checked
$('#filters :input').each -> $('#filters :input').each ->
@ -222,7 +221,7 @@ module.exports = class EmployersView extends RootView
checkForEmployerSignupHash: => checkForEmployerSignupHash: =>
if window.location.hash is '#employerSignupLoggingIn' and not ('employer' in me.get('permissions')) and not me.isAdmin() if window.location.hash is '#employerSignupLoggingIn' and not ('employer' in me.get('permissions')) and not me.isAdmin()
@openModalView application.router.getView('modal/employer_signup', '_modal') @openModalView new EmployerSignupModal
window.location.hash = '' window.location.hash = ''
sortTable: -> sortTable: ->
@ -356,4 +355,4 @@ module.exports = class EmployersView extends RootView
url = "/account/profile/#{id}" url = "/account/profile/#{id}"
window.open url, '_blank' window.open url, '_blank'
else else
@openModalView new EmployerSignupView @openModalView new EmployerSignupModal

View file

@ -4,7 +4,6 @@ WizardSprite = require 'lib/surface/WizardSprite'
ThangType = require 'models/ThangType' ThangType = require 'models/ThangType'
Simulator = require 'lib/simulator/Simulator' Simulator = require 'lib/simulator/Simulator'
{me} = require '/lib/auth' {me} = require '/lib/auth'
application = require 'application'
module.exports = class HomeView extends RootView module.exports = class HomeView extends RootView
id: 'home-view' id: 'home-view'

View file

@ -9,6 +9,7 @@ module.exports = TestView = class TestView extends CocoView
id: 'test-view' id: 'test-view'
template: template template: template
reloadOnClose: true reloadOnClose: true
loadedFileIDs: []
# INITIALIZE # INITIALIZE
@ -18,14 +19,20 @@ module.exports = TestView = class TestView extends CocoView
@loadTestingLibs() @loadTestingLibs()
loadTestingLibs: -> loadTestingLibs: ->
@queue = new createjs.LoadQueue() @queue = new createjs.LoadQueue() unless @queue
@queue.on('complete', @scriptsLoaded, @) @queue.on('complete', @scriptsLoaded, @)
@queue.on('fileload', @onFileLoad, @)
for f in ['jasmine', 'jasmine-html', 'boot', 'mock-ajax', 'test-app'] for f in ['jasmine', 'jasmine-html', 'boot', 'mock-ajax', 'test-app']
if f not in @loadedFileIDs
@queue.loadFile({ @queue.loadFile({
id: f
src: "/javascripts/#{f}.js" src: "/javascripts/#{f}.js"
type: createjs.LoadQueue.JAVASCRIPT type: createjs.LoadQueue.JAVASCRIPT
}) })
onFileLoad: (e) ->
@loadedFileIDs.push e.item.id if e.item.id
scriptsLoaded: -> scriptsLoaded: ->
@initSpecFiles() @initSpecFiles()
@render() @render()

View file

@ -3,12 +3,12 @@ template = require 'templates/account/settings'
{me} = require 'lib/auth' {me} = require 'lib/auth'
forms = require 'lib/forms' forms = require 'lib/forms'
User = require 'models/User' User = require 'models/User'
AuthModalView = require 'views/modal/auth_modal' AuthModal = require 'views/modal/AuthModal'
WizardSettingsView = require './wizard_settings_view' WizardSettingsView = require './WizardSettingsView'
JobProfileView = require './job_profile_view' JobProfileTreemaView = require './JobProfileTreemaView'
module.exports = class SettingsView extends RootView module.exports = class AccountSettingsView extends RootView
id: 'account-settings-view' id: 'account-settings-view'
template: template template: template
changedFields: [] # DOM input fields changedFields: [] # DOM input fields
@ -97,9 +97,9 @@ module.exports = class SettingsView extends RootView
@listenTo wizardSettingsView, 'change', @enableSaveButton @listenTo wizardSettingsView, 'change', @enableSaveButton
@insertSubView wizardSettingsView @insertSubView wizardSettingsView
@jobProfileView = new JobProfileView() @jobProfileTreemaView = new JobProfileTreemaView()
@listenTo @jobProfileView, 'change', @enableSaveButton @listenTo @jobProfileTreemaView, 'change', @enableSaveButton
@insertSubView @jobProfileView @insertSubView @jobProfileTreemaView
_.defer => @buildPictureTreema() # Not sure why, but the Treemas don't fully build without this if you reload the page. _.defer => @buildPictureTreema() # Not sure why, but the Treemas don't fully build without this if you reload the page.
afterInsert: -> afterInsert: ->
@ -107,7 +107,7 @@ module.exports = class SettingsView extends RootView
$('#email-pane input[type="checkbox"]').on 'change', -> $('#email-pane input[type="checkbox"]').on 'change', ->
$(@).addClass 'changed' $(@).addClass 'changed'
if me.get('anonymous') if me.get('anonymous')
@openModalView new AuthModalView() @openModalView new AuthModal()
@updateSavedValues() @updateSavedValues()
chooseTab: (category) -> chooseTab: (category) ->
@ -222,7 +222,7 @@ module.exports = class SettingsView extends RootView
jobProfile = me.get('jobProfile') ? {} jobProfile = me.get('jobProfile') ? {}
updated = false updated = false
for key, val of @jobProfileView.getData() for key, val of @jobProfileTreemaView.getData()
updated = updated or not _.isEqual jobProfile[key], val updated = updated or not _.isEqual jobProfile[key], val
jobProfile[key] = val jobProfile[key] = val
if updated if updated

View file

@ -1,7 +1,6 @@
ModalView = require 'views/kinds/ModalView' ModalView = require 'views/kinds/ModalView'
template = require 'templates/account/job_profile_code_modal' template = require 'templates/account/job_profile_code_modal'
LevelSessionCodeView = require 'views/common/LevelSessionCodeView' LevelSessionCodeView = require 'views/common/LevelSessionCodeView'
console.log 'template', template
module.exports = class JobProfileCodeModal extends ModalView module.exports = class JobProfileCodeModal extends ModalView
id: 'job_profile_code_modal' id: 'job_profile_code_modal'

File diff suppressed because one or more lines are too long

View file

@ -4,11 +4,11 @@ User = require 'models/User'
LevelSession = require 'models/LevelSession' LevelSession = require 'models/LevelSession'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
{me} = require 'lib/auth' {me} = require 'lib/auth'
JobProfileContactView = require 'views/modal/job_profile_contact_modal' JobProfileContactModal = require 'views/modal/JobProfileContactModal'
JobProfileView = require 'views/account/job_profile_view' JobProfileTreemaView = require 'views/account/JobProfileTreemaView'
UserRemark = require 'models/UserRemark' UserRemark = require 'models/UserRemark'
forms = require 'lib/forms' forms = require 'lib/forms'
ModelModal = require 'views/modal/model_modal' ModelModal = require 'views/modal/ModelModal'
JobProfileCodeModal = require './JobProfileCodeModal' JobProfileCodeModal = require './JobProfileCodeModal'
class LevelSessionsCollection extends CocoCollection class LevelSessionsCollection extends CocoCollection
@ -26,7 +26,7 @@ adminContacts = [
{id: '52a57252a89409700d0000d9', name: 'Ignore'} {id: '52a57252a89409700d0000d9', name: 'Ignore'}
] ]
module.exports = class ProfileView extends RootView module.exports = class JobProfileView extends RootView
id: 'profile-view' id: 'profile-view'
template: template template: template
showBackground: false showBackground: false
@ -317,7 +317,7 @@ module.exports = class ProfileView extends RootView
initializeAutocomplete: (container) -> initializeAutocomplete: (container) ->
(container ? @$el).find('input[data-autocomplete]').each -> (container ? @$el).find('input[data-autocomplete]').each ->
$(@).autocomplete(source: JobProfileView[$(@).data('autocomplete')], minLength: parseInt($(@).data('autocomplete-min-length')), delay: 0, autoFocus: true) $(@).autocomplete(source: JobProfileTreemaView[$(@).data('autocomplete')], minLength: parseInt($(@).data('autocomplete-min-length')), delay: 0, autoFocus: true)
toggleEditing: -> toggleEditing: ->
@editing = not @editing @editing = not @editing
@ -374,7 +374,7 @@ module.exports = class ProfileView extends RootView
null null
onContactCandidate: (e) -> onContactCandidate: (e) ->
@openModalView new JobProfileContactView recipientID: @user.id, recipientUserName: @user.get('name') @openModalView new JobProfileContactModal recipientID: @user.id, recipientUserName: @user.get('name')
showErrors: (errors) -> showErrors: (errors) ->
section = @$el.find '.saving' section = @$el.find '.saving'

File diff suppressed because one or more lines are too long

View file

@ -1,11 +1,10 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
template = require 'templates/admin/candidates' template = require 'templates/admin/candidates'
app = require 'application'
User = require 'models/User' User = require 'models/User'
UserRemark = require 'models/UserRemark' UserRemark = require 'models/UserRemark'
{me} = require 'lib/auth' {me} = require 'lib/auth'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
EmployerSignupView = require 'views/modal/employer_signup_modal' EmployerSignupModal = require 'views/modal/EmployerSignupModal'
class CandidatesCollection extends CocoCollection class CandidatesCollection extends CocoCollection
url: '/db/user/x/candidates' url: '/db/user/x/candidates'
@ -15,7 +14,7 @@ class UserRemarksCollection extends CocoCollection
url: '/db/user.remark?project=contact,contactName,user' url: '/db/user.remark?project=contact,contactName,user'
model: UserRemark model: UserRemark
module.exports = class EmployersView extends RootView module.exports = class CandidatesView extends RootView
id: "admin-candidates-view" id: "admin-candidates-view"
template: template template: template
@ -71,7 +70,7 @@ module.exports = class EmployersView extends RootView
checkForEmployerSignupHash: => checkForEmployerSignupHash: =>
if window.location.hash is "#employerSignupLoggingIn" and not ("employer" in me.get("permissions")) if window.location.hash is "#employerSignupLoggingIn" and not ("employer" in me.get("permissions"))
@openModalView application.router.getView("modal/employer_signup","_modal") @openModalView new EmployerSignupModal
window.location.hash = "" window.location.hash = ""
sortTable: -> sortTable: ->
@ -204,4 +203,4 @@ module.exports = class EmployersView extends RootView
url = "/account/profile/#{id}" url = "/account/profile/#{id}"
window.open url,"_blank" window.open url,"_blank"
else else
@openModalView new EmployerSignupView @openModalView new EmployerSignupModal

View file

@ -1,16 +1,15 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
template = require 'templates/admin/employer_list' template = require 'templates/admin/employer_list'
app = require 'application'
User = require 'models/User' User = require 'models/User'
{me} = require 'lib/auth' {me} = require 'lib/auth'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
ModelModal = require 'views/modal/model_modal' ModelModal = require 'views/modal/ModelModal'
class EmployersCollection extends CocoCollection class EmployersCollection extends CocoCollection
url: '/db/user/x/employers' url: '/db/user/x/employers'
model: User model: User
module.exports = class EmployersView extends RootView module.exports = class EmployersListView extends RootView
id: 'employers-view' id: 'employers-view'
template: template template: template

View file

@ -2,7 +2,7 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
template = require 'templates/admin' template = require 'templates/admin'
module.exports = class AdminView extends RootView module.exports = class MainAdminView extends RootView
id: 'admin-view' id: 'admin-view'
template: template template: template

View file

@ -1,6 +0,0 @@
RootView = require 'views/kinds/RootView'
template = require 'templates/base'
module.exports = class BaseView extends RootView
id: 'base-view'
template: template

View file

@ -1,4 +1,4 @@
SignupModalView = require 'views/modal/signup_modal' SignupModalView = require 'views/modal/SignupModal'
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
{me} = require 'lib/auth' {me} = require 'lib/auth'
contributorSignupAnonymousTemplate = require 'templates/contribute/contributor_signup_anonymous' contributorSignupAnonymousTemplate = require 'templates/contribute/contributor_signup_anonymous'

View file

@ -1,4 +1,5 @@
RootView = require 'views/kinds/RootView' #RootView = require 'views/kinds/RootView'
CocoView = require 'views/kinds/CocoView'
template = require 'templates/docs/components' template = require 'templates/docs/components'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
@ -7,9 +8,10 @@ class ComponentDocsCollection extends CocoCollection
url: '/db/level.component?project=name,description,dependencies,propertyDocumentation,code' url: '/db/level.component?project=name,description,dependencies,propertyDocumentation,code'
model: LevelComponent model: LevelComponent
module.exports = class UnnamedView extends RootView module.exports = class ComponentDocumentationView extends CocoView
id: 'docs-components-view' id: 'docs-components-view'
template: template template: template
className: 'tab-pane'
constructor: (options) -> constructor: (options) ->
super(options) super(options)

View file

@ -1,6 +1,6 @@
ModalView = require 'views/kinds/ModalView' ModalView = require 'views/kinds/ModalView'
template = require 'templates/editor/patch_modal' template = require 'templates/editor/patch_modal'
DeltaView = require 'views/editor/delta' DeltaView = require 'views/editor/DeltaView'
auth = require 'lib/auth' auth = require 'lib/auth'
module.exports = class PatchModal extends ModalView module.exports = class PatchModal extends ModalView

View file

@ -2,7 +2,7 @@ CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/patches' template = require 'templates/editor/patches'
PatchesCollection = require 'collections/PatchesCollection' PatchesCollection = require 'collections/PatchesCollection'
nameLoader = require 'lib/NameLoader' nameLoader = require 'lib/NameLoader'
PatchModal = require './patch_modal' PatchModal = require './PatchModal'
module.exports = class PatchesView extends CocoView module.exports = class PatchesView extends CocoView
template: template template: template

View file

@ -1,7 +1,7 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
template = require 'templates/editor/achievement/edit' template = require 'templates/editor/achievement/edit'
Achievement = require 'models/Achievement' Achievement = require 'models/Achievement'
ConfirmModal = require 'views/modal/confirm' ConfirmModal = require 'views/modal/ConfirmModal'
module.exports = class AchievementEditView extends RootView module.exports = class AchievementEditView extends RootView
id: 'editor-achievement-edit-view' id: 'editor-achievement-edit-view'

View file

@ -1,9 +1,9 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
VersionHistoryView = require './versions_view' VersionHistoryView = require './ArticleVersionsModal'
template = require 'templates/editor/article/edit' template = require 'templates/editor/article/edit'
Article = require 'models/Article' Article = require 'models/Article'
SaveVersionModal = require 'views/modal/save_version_modal' SaveVersionModal = require 'views/modal/SaveVersionModal'
PatchesView = require 'views/editor/patches_view' PatchesView = require 'views/editor/PatchesView'
module.exports = class ArticleEditView extends RootView module.exports = class ArticleEditView extends RootView
id: 'editor-article-edit-view' id: 'editor-article-edit-view'
@ -79,7 +79,7 @@ module.exports = class ArticleEditView extends RootView
@patchesView.load() @patchesView.load()
openPreview: -> openPreview: ->
@preview = window.open('/editor/article/x/preview', 'preview', 'height=800,width=600') @preview = window.open('/editor/article/preview', 'preview', 'height=800,width=600')
@preview.focus() if window.focus @preview.focus() if window.focus
@preview.onload = => @pushChangesToPreview() @preview.onload = => @pushChangesToPreview()
return false return false

View file

@ -1,6 +1,6 @@
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
template = require 'templates/editor/article/preview' template = require 'templates/editor/article/preview'
module.exports = class PreviewView extends RootView module.exports = class ArticlePreviewView extends RootView
id: 'editor-article-preview-view' id: 'editor-article-preview-view'
template: template template: template

View file

@ -1,6 +1,6 @@
SearchView = require 'views/kinds/SearchView' SearchView = require 'views/kinds/SearchView'
module.exports = class ThangTypeHomeView extends SearchView module.exports = class ArticleSearchView extends SearchView
id: 'editor-article-home-view' id: 'editor-article-home-view'
modelLabel: 'Article' modelLabel: 'Article'
model: require 'models/Article' model: require 'models/Article'

View file

@ -1,6 +1,6 @@
VersionsModalView = require 'views/modal/versions_modal' VersionsModal = require 'views/modal/VersionsModal'
module.exports = class ArticleVersionsView extends VersionsModalView module.exports = class ArticleVersionsModal extends VersionsModal
id: 'editor-article-versions-view' id: 'editor-article-versions-view'
url: '/db/article/' url: '/db/article/'
page: 'article' page: 'article'

View file

@ -1,6 +1,6 @@
VersionsModalView = require 'views/modal/versions_modal' VersionsModal = require 'views/modal/VersionsModal'
module.exports = class ComponentVersionsView extends VersionsModalView module.exports = class ComponentVersionsModal extends VersionsModal
id: 'editor-component-versions-view' id: 'editor-component-versions-view'
url: '/db/level.component/' url: '/db/level.component/'
page: 'component' page: 'component'

View file

@ -5,7 +5,7 @@ Level = require 'models/Level'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
nodes = require '../level/treema_nodes' nodes = require '../level/treema_nodes'
module.exports = class ComponentConfigView extends CocoView module.exports = class ThangComponentConfigView extends CocoView
id: 'component-config-column-view' id: 'component-config-column-view'
template: template template: template
className: 'column' className: 'column'
@ -69,4 +69,10 @@ module.exports = class ComponentConfigView extends CocoView
@changed = true @changed = true
@callback?(@data()) @callback?(@data())
undo: ->
@editThangTreema.undo()
redo: ->
@editThangTreema.redo()
data: -> @editThangTreema.data data: -> @editThangTreema.data

View file

@ -5,7 +5,7 @@ Level = require 'models/Level'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
LevelSystem = require 'models/LevelSystem' LevelSystem = require 'models/LevelSystem'
ComponentsCollection = require 'collections/ComponentsCollection' ComponentsCollection = require 'collections/ComponentsCollection'
ComponentConfigView = require './config' ComponentConfigView = require './ThangComponentConfigView'
module.exports = class ThangComponentEditView extends CocoView module.exports = class ThangComponentEditView extends CocoView
id: 'thang-components-edit-view' id: 'thang-components-edit-view'
@ -39,6 +39,10 @@ module.exports = class ThangComponentEditView extends CocoView
@extantComponentsTreema = @$el.find('#extant-components-column .treema').treema treemaOptions @extantComponentsTreema = @$el.find('#extant-components-column .treema').treema treemaOptions
@extantComponentsTreema.build() @extantComponentsTreema.build()
@$el.find('#extant-components-column .treema').droppable({
drop: =>
@onAddComponentEnterPressed @selectedRow
})
buildAddComponentTreema: -> buildAddComponentTreema: ->
return unless @componentCollection and @extantComponentsTreema return unless @componentCollection and @extantComponentsTreema
@ -55,7 +59,13 @@ module.exports = class ThangComponentEditView extends CocoView
supermodel: @supermodel supermodel: @supermodel
schema: {type: 'array', items: LevelComponent.schema} schema: {type: 'array', items: LevelComponent.schema}
data: ($.extend(true, {}, c) for c in components) data: ($.extend(true, {}, c) for c in components)
callbacks: {select: @onSelectAddableComponent, enter: @onAddComponentEnterPressed} callbacks: {
select: @onSelectAddableComponent
enter: @onAddComponentEnterPressed
dblclick: @onAddComponentDoubleClicked
mouseenter: @onAddComponentMouseEnter
mouseleave: @onAddComponentMouseLeave
}
readOnly: true readOnly: true
noSortable: true noSortable: true
nodeClasses: nodeClasses:
@ -65,6 +75,12 @@ module.exports = class ThangComponentEditView extends CocoView
_.defer (=> _.defer (=>
@addComponentsTreema = @$el.find('#add-component-column .treema').treema treemaOptions @addComponentsTreema = @$el.find('#add-component-column .treema').treema treemaOptions
@addComponentsTreema.build() @addComponentsTreema.build()
@$el.find('#add-component-column .treema-node').draggable({
revert: true
start: (e) ->
# Hack to ensure dragged treema node is selected
$(@).trigger('click') unless $(@).hasClass 'treema-selected'
})
@hideLoading() @hideLoading()
), 500 ), 500
@ -157,8 +173,6 @@ module.exports = class ThangComponentEditView extends CocoView
type: 'warning' type: 'warning'
}) })
currentSelection = @addComponentsTreema?.getLastSelectedTreema()?.data._id
id = node.data._id id = node.data._id
comp = _.find @componentCollection.models, id: id comp = _.find @componentCollection.models, id: id
unless comp unless comp
@ -174,16 +188,32 @@ module.exports = class ThangComponentEditView extends CocoView
majorVersion: c.get('version').major ? 0 majorVersion: c.get('version').major ? 0
} }
return unless currentSelection # reselect newly added child treema in the extantComponentsTreema
# reselect what was selected before the addComponentsTreema was rebuilt for index, treema of @extantComponentsTreema.childrenTreemas
for index, treema of @addComponentsTreema.childrenTreemas if treema.component.id is id
if treema.data._id is currentSelection
treema.select() treema.select()
@onSelectExtantComponent({}, [treema])
return
onAddComponentDoubleClicked: (e, treema) =>
@onAddComponentEnterPressed treema
onAddComponentMouseEnter: (e, treema) ->
treema.$el.find('.add-button').show()
onAddComponentMouseLeave: (e, treema) ->
treema.$el.find('.add-button').hide()
return return
reportChanges: -> reportChanges: ->
@callback?($.extend(true, [], @extantComponentsTreema.data)) @callback?($.extend(true, [], @extantComponentsTreema.data))
undo: ->
if @configView is null or @configView?.editing is false then @extantComponentsTreema.undo() else @configView.undo()
redo: ->
if @configView is null or @configView?.editing is false then @extantComponentsTreema.redo() else @configView.redo()
class ThangComponentsArrayNode extends TreemaArrayNode class ThangComponentsArrayNode extends TreemaArrayNode
valueClass: 'treema-thang-components-array' valueClass: 'treema-thang-components-array'
editable: false editable: false
@ -230,8 +260,18 @@ class ComponentArrayNode extends TreemaArrayNode
class ComponentNode extends TreemaObjectNode class ComponentNode extends TreemaObjectNode
valueClass: 'treema-component' valueClass: 'treema-component'
addButtonTemplate: '<button type="button" class="add-button btn btn-default btn-sm"><span class="glyphicon glyphicon-plus"></span></button>'
collection: false collection: false
build: ->
super()
@$el.find('> .treema-row').append @addButtonTemplate
addButton = @$el.find('.add-button')
addButton.hide()
addButton.click =>
@callbacks.enter?(@)
@$el
buildValueForDisplay: (valEl) -> buildValueForDisplay: (valEl) ->
s = @data.system + '.' + @data.name s = @data.system + '.' + @data.name
@buildValueForDisplaySimply valEl, s @buildValueForDisplaySimply valEl, s

View file

@ -6,18 +6,19 @@ World = require 'lib/world/world'
DocumentFiles = require 'collections/DocumentFiles' DocumentFiles = require 'collections/DocumentFiles'
LevelLoader = require 'lib/LevelLoader' LevelLoader = require 'lib/LevelLoader'
ThangsTabView = require './thangs_tab_view' ThangsTabView = require './thangs/ThangsTabView'
SettingsTabView = require './settings_tab_view' SettingsTabView = require './settings/SettingsTabView'
ScriptsTabView = require './scripts_tab_view' ScriptsTabView = require './scripts/ScriptsTabView'
ComponentsTabView = require './components_tab_view' ComponentsTabView = require './components/ComponentsTabView'
SystemsTabView = require './systems_tab_view' SystemsTabView = require './systems/SystemsTabView'
LevelSaveView = require './save_view' SaveLevelModal = require './modals/SaveLevelModal'
LevelForkView = require './fork_view' LevelForkView = require './modals/ForkLevelModal'
SaveVersionModal = require 'views/modal/save_version_modal' SaveVersionModal = require 'views/modal/SaveVersionModal'
PatchesView = require 'views/editor/patches_view' PatchesView = require 'views/editor/PatchesView'
VersionHistoryView = require './versions_view' VersionHistoryView = require './modals/LevelVersionsModal'
ComponentDocsView = require 'views/docs/ComponentDocumentationView'
module.exports = class EditorLevelView extends RootView module.exports = class LevelEditView extends RootView
id: 'editor-level-view' id: 'editor-level-view'
template: template template: template
cache: false cache: false
@ -29,8 +30,10 @@ module.exports = class EditorLevelView extends RootView
'click #commit-level-start-button': 'startCommittingLevel' 'click #commit-level-start-button': 'startCommittingLevel'
'click #fork-level-start-button': 'startForkingLevel' 'click #fork-level-start-button': 'startForkingLevel'
'click #level-history-button': 'showVersionHistory' 'click #level-history-button': 'showVersionHistory'
'click #undo-button': 'onUndo'
'click #redo-button': 'onRedo'
'click #patches-tab': -> @patchesView.load() 'click #patches-tab': -> @patchesView.load()
'click #components-tab': -> @componentsTab.refreshLevelThangsTreema @level.get('thangs') 'click #components-tab': -> @subviews.editor_level_components_tab_view.refreshLevelThangsTreema @level.get('thangs')
'click #level-patch-button': 'startPatchingLevel' 'click #level-patch-button': 'startPatchingLevel'
'click #level-watch-button': 'toggleWatchLevel' 'click #level-watch-button': 'toggleWatchLevel'
'click #pop-level-i18n-button': -> @level.populateI18N() 'click #pop-level-i18n-button': -> @level.populateI18N()
@ -66,11 +69,13 @@ module.exports = class EditorLevelView extends RootView
return unless @supermodel.finished() return unless @supermodel.finished()
@$el.find('a[data-toggle="tab"]').on 'shown.bs.tab', (e) => @$el.find('a[data-toggle="tab"]').on 'shown.bs.tab', (e) =>
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
@thangsTab = @insertSubView new ThangsTabView world: @world, supermodel: @supermodel, level: @level @insertSubView new ThangsTabView world: @world, supermodel: @supermodel, level: @level
@settingsTab = @insertSubView new SettingsTabView supermodel: @supermodel @insertSubView new SettingsTabView supermodel: @supermodel
@scriptsTab = @insertSubView new ScriptsTabView world: @world, supermodel: @supermodel, files: @files @insertSubView new ScriptsTabView world: @world, supermodel: @supermodel, files: @files
@componentsTab = @insertSubView new ComponentsTabView supermodel: @supermodel @insertSubView new ComponentsTabView supermodel: @supermodel
@systemsTab = @insertSubView new SystemsTabView supermodel: @supermodel @insertSubView new SystemsTabView supermodel: @supermodel
@insertSubView new ComponentDocsView supermodel: @supermodel
Backbone.Mediator.publish 'level-loaded', level: @level Backbone.Mediator.publish 'level-loaded', level: @level
@showReadOnly() if me.get('anonymous') @showReadOnly() if me.get('anonymous')
@patchesView = @insertSubView(new PatchesView(@level), @$el.find('.patches-view')) @patchesView = @insertSubView(new PatchesView(@level), @$el.find('.patches-view'))
@ -101,12 +106,25 @@ module.exports = class EditorLevelView extends RootView
@childWindow.onPlayLevelViewLoaded = (e) => sendLevel() # still a hack @childWindow.onPlayLevelViewLoaded = (e) => sendLevel() # still a hack
@childWindow.focus() @childWindow.focus()
onUndo: ->
@getCurrentView()?.undo?()
onRedo: ->
@getCurrentView()?.redo?()
getCurrentView: ->
tabText = _.string.underscored $('li.active')[0]?.textContent
currentView = @subviews["editor_level_#{tabText}_tab_view"]
if tabText is 'patches' then currentView = @patchesView
if tabText is 'documentation' then currentView = @subviews.docs_components_view
currentView
startPatchingLevel: (e) -> startPatchingLevel: (e) ->
@openModalView new SaveVersionModal({model: @level}) @openModalView new SaveVersionModal({model: @level})
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
startCommittingLevel: (e) -> startCommittingLevel: (e) ->
@openModalView new LevelSaveView level: @level, supermodel: @supermodel @openModalView new SaveLevelModal level: @level, supermodel: @supermodel
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
startForkingLevel: (e) -> startForkingLevel: (e) ->

View file

@ -1,6 +1,6 @@
SearchView = require 'views/kinds/SearchView' SearchView = require 'views/kinds/SearchView'
module.exports = class EditorSearchView extends SearchView module.exports = class LevelSearchView extends SearchView
id: 'editor-level-home-view' id: 'editor-level-home-view'
modelLabel: 'Level' modelLabel: 'Level'
model: require 'models/Level' model: require 'models/Level'

View file

@ -1,8 +1,8 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/components_tab' template = require 'templates/editor/level/components_tab'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
LevelComponentEditView = require './component/edit' LevelComponentEditView = require './LevelComponentEditView'
LevelComponentNewView = require './component/new' LevelComponentNewView = require './NewLevelComponentModal'
class LevelComponentCollection extends Backbone.Collection class LevelComponentCollection extends Backbone.Collection
url: '/db/level.component' url: '/db/level.component'

View file

@ -1,9 +1,9 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/component/edit' template = require 'templates/editor/level/component/edit'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
VersionHistoryView = require 'views/editor/component/versions_view' ComponentVersionsModal = require 'views/editor/component/ComponentVersionsModal'
PatchesView = require 'views/editor/patches_view' PatchesView = require 'views/editor/PatchesView'
SaveVersionModal = require 'views/modal/save_version_modal' SaveVersionModal = require 'views/modal/SaveVersionModal'
module.exports = class LevelComponentEditView extends CocoView module.exports = class LevelComponentEditView extends CocoView
id: 'editor-level-component-edit-view' id: 'editor-level-component-edit-view'
@ -108,8 +108,8 @@ module.exports = class LevelComponentEditView extends CocoView
null null
showVersionHistory: (e) -> showVersionHistory: (e) ->
versionHistoryView = new VersionHistoryView {}, @levelComponent.id componentVersionsModal = new ComponentVersionsModal {}, @levelComponent.id
@openModalView versionHistoryView @openModalView componentVersionsModal
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
startPatchingComponent: (e) -> startPatchingComponent: (e) ->

View file

@ -4,7 +4,7 @@ LevelComponent = require 'models/LevelComponent'
forms = require 'lib/forms' forms = require 'lib/forms'
{me} = require 'lib/auth' {me} = require 'lib/auth'
module.exports = class LevelComponentNewView extends ModalView module.exports = class NewLevelComponentModal extends ModalView
id: 'editor-level-component-new-modal' id: 'editor-level-component-new-modal'
template: template template: template
instant: false instant: false

View file

@ -1,191 +0,0 @@
ModalView = require 'views/kinds/ModalView'
template = require 'templates/editor/level/modal/terrain_randomize'
CocoModel = require 'models/CocoModel'
clusters = {
'rocks': ['Rock 1', 'Rock 2', 'Rock 3', 'Rock 4', 'Rock 5', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3']
'trees': ['Tree 1', 'Tree 2', 'Tree 3', 'Tree 4']
'shrubs': ['Shrub 1', 'Shrub 2', 'Shrub 3']
'houses': ['House 1', 'House 2', 'House 3', 'House 4']
'animals': ['Cow', 'Horse']
'wood': ['Firewood 1', 'Firewood 2', 'Firewood 3', 'Barrel']
'farm': ['Farm']
}
presets = {
# 'dungeon': {
# 'type':'dungeon'
# 'borders':['Dungeon Wall']
# 'floors':['Dungeon Floor']
# 'decorations':[]
# }
'grassy': {
'type':'grassy'
'borders':['Tree 1', 'Tree 2', 'Tree 3']
'floors':['Grass01', 'Grass02', 'Grass03', 'Grass04', 'Grass05']
'decorations': {
'house': {
'num':[1,2] #min-max
'width': 20
'height': 20
'clusters': {
'houses':[1,1]
'trees':[1,2]
'shrubs':[0,3]
'rocks':[1,2]
}
}
'farm': {
'num':[1,2] #min-max
'width': 20
'height': 20
'clusters': {
'farm':[1,1]
'shrubs':[2,3]
'wood':[2,4]
'animals':[2,3]
}
}
}
}
}
sizes = {
'small': {
'x':80
'y':68
}
'large': {
'x':160
'y':136
}
'floorSize': {
'x':20
'y':17
}
'borderSize': {
'x':4
'y':4
'thickness':3
}
}
module.exports = class TerrainRandomizeModal extends ModalView
id: 'terrain-randomize-modal'
template: template
thangs = []
events:
'click .choose-option': 'onRandomize'
onRevertModel: (e) ->
id = $(e.target).val()
CocoModel.backedUp[id].revert()
$(e.target).closest('tr').remove()
@reloadOnClose = true
onRandomize: (e) ->
target = $(e.target)
presetType = target.attr 'data-preset-type'
presetSize = target.attr 'data-preset-size'
@randomizeThangs presetType, presetSize
Backbone.Mediator.publish('randomize:terrain-generated',
'thangs': @thangs
)
@hide()
randomizeThangs: (presetName, presetSize) ->
preset = presets[presetName]
presetSize = sizes[presetSize]
@thangs = []
@randomizeFloor preset, presetSize
@randomizeBorder preset, presetSize
@randomizeDecorations preset, presetSize
randomizeFloor: (preset, presetSize) ->
for i in _.range(0, presetSize.x, sizes.floorSize.x)
for j in _.range(0, presetSize.y, sizes.floorSize.y)
@thangs.push {
'id': @getRandomThang(preset.floors)
'pos': {
'x': i + sizes.floorSize.x/2
'y': j + sizes.floorSize.y/2
}
}
randomizeBorder: (preset, presetSize) ->
for i in _.range(0, presetSize.x, sizes.borderSize.x)
for j in _.range(sizes.borderSize.thickness)
@thangs.push {
'id': @getRandomThang(preset.borders)
'pos': {
'x': i + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
'y': 0 + _.random(-sizes.borderSize.y/2, sizes.borderSize.y)
}
}
@thangs.push {
'id': @getRandomThang(preset.borders)
'pos': {
'x': i + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
'y': presetSize.y + _.random(-sizes.borderSize.y, sizes.borderSize.y/2)
}
}
for i in _.range(0, presetSize.y, sizes.borderSize.y)
for j in _.range(3)
@thangs.push {
'id': @getRandomThang(preset.borders)
'pos': {
'x': 0 + _.random(-sizes.borderSize.x/2, sizes.borderSize.x)
'y': i + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
}
}
@thangs.push {
'id': @getRandomThang(preset.borders)
'pos': {
'x': presetSize.x + _.random(-sizes.borderSize.x, sizes.borderSize.x/2)
'y': i + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
}
}
randomizeDecorations: (preset, presetSize)->
for name, decoration of preset.decorations
for num in _.range(_.random(decoration.num[0], decoration.num[1]))
center =
{
'x':_.random(decoration.width, presetSize.x - decoration.width),
'y':_.random(decoration.height, presetSize.y - decoration.height)
}
min =
{
'x':center.x - decoration.width/2
'y':center.y - decoration.height/2
}
max =
{
'x':center.x + decoration.width/2
'y':center.y + decoration.height/2
}
for cluster, range of decoration.clusters
for i in _.range(_.random(range[0], range[1]))
@thangs.push {
'id':@getRandomThang(clusters[cluster])
'pos':{
'x':_.random(min.x, max.x)
'y':_.random(min.y, max.y)
}
}
getRandomThang: (thangList) ->
return thangList[_.random(0, thangList.length-1)]
getRenderData: ->
c = super()
models = _.values CocoModel.backedUp
models = (m for m in models when m.hasLocalChanges())
c.models = models
c
onHidden: ->
location.reload() if @reloadOnClose

View file

@ -3,7 +3,7 @@ template = require 'templates/editor/level/fork'
forms = require 'lib/forms' forms = require 'lib/forms'
Level = require 'models/Level' Level = require 'models/Level'
module.exports = class LevelForkView extends ModalView module.exports = class ForkLevelModal extends ModalView
id: 'editor-level-fork-modal' id: 'editor-level-fork-modal'
template: template template: template
instant: false instant: false

View file

@ -1,6 +1,6 @@
VersionsModalView = require 'views/modal/versions_modal' VersionsModal = require 'views/modal/VersionsModal'
module.exports = class LevelVersionsView extends VersionsModalView module.exports = class LevelVersionsModal extends VersionsModal
id: 'editor-level-versions-view' id: 'editor-level-versions-view'
url: '/db/level/' url: '/db/level/'
page: 'level' page: 'level'

View file

@ -1,12 +1,12 @@
SaveVersionModal = require 'views/modal/save_version_modal' SaveVersionModal = require 'views/modal/SaveVersionModal'
template = require 'templates/editor/level/save' template = require 'templates/editor/level/save'
forms = require 'lib/forms' forms = require 'lib/forms'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
LevelSystem = require 'models/LevelSystem' LevelSystem = require 'models/LevelSystem'
DeltaView = require 'views/editor/delta' DeltaView = require 'views/editor/DeltaView'
PatchModal = require 'views/editor/patch_modal' PatchModal = require 'views/editor/PatchModal'
module.exports = class LevelSaveView extends SaveVersionModal module.exports = class SaveLevelModal extends SaveVersionModal
template: template template: template
instant: false instant: false
modalWidthPercent: 60 modalWidthPercent: 60

View file

@ -0,0 +1,364 @@
ModalView = require 'views/kinds/ModalView'
template = require 'templates/editor/level/modal/terrain_randomize'
CocoModel = require 'models/CocoModel'
clusters = {
'rocks': {
'thangs': ['Rock 1', 'Rock 2', 'Rock 3', 'Rock 4', 'Rock 5', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3']
'margin': 1
}
'trees': {
'thangs': ['Tree 1', 'Tree 2', 'Tree 3', 'Tree 4']
'margin': 0
}
'shrubs': {
'thangs': ['Shrub 1', 'Shrub 2', 'Shrub 3']
'margin': 0
}
'houses': {
'thangs': ['House 1', 'House 2', 'House 3', 'House 4']
'margin': 4
}
'animals': {
'thangs': ['Cow', 'Horse']
'margin': 1
}
'wood': {
'thangs': ['Firewood 1', 'Firewood 2', 'Firewood 3', 'Barrel']
'margin': 1
}
'farm': {
'thangs': ['Farm']
'margin': 9
}
'cave': {
'thangs': ['Cave']
'margin': 5
}
'stone': {
'thangs': ['Gargoyle', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3']
'margin': 1
}
'doors': {
'thangs': ['Dungeon Door']
'margin': -1
}
'grass_floor': {
'thangs': ['Grass01', 'Grass02', 'Grass03', 'Grass04', 'Grass05']
'margin': -1
}
'dungeon_wall': {
'thangs': ['Dungeon Wall']
'margin': -1
}
'dungeon_floor': {
'thangs': ['Dungeon Floor']
'margin': -1
}
}
presets = {
'dungeon': {
'type':'dungeon'
'borders':'dungeon_wall'
'borderNoise':0
'borderSize':4
'floors':'dungeon_floor'
'decorations': {
'cave': {
'num':[1,1]
'width': 10
'height': 10
'clusters': {
'cave':[1,1]
'stone':[2,4]
}
}
'Room': {
'num': [1,1]
'width': [12, 20]
'height': [8, 16]
'thickness': [2,2]
'cluster': 'dungeon_wall'
}
}
}
'grassy': {
'type':'grassy'
'borders':'trees'
'borderNoise':1
'borderSize':0
'floors':'grass_floor'
'decorations': {
'house': {
'num':[1,2] #min-max
'width': 15
'height': 15
'clusters': {
'houses':[1,1]
'trees':[1,2]
'shrubs':[0,3]
'rocks':[1,2]
}
}
'farm': {
'num':[1,1] #min-max
'width': 25
'height': 15
'clusters': {
'farm':[1,1]
'shrubs':[2,3]
'wood':[2,4]
'animals':[2,3]
}
}
}
}
}
presetSizes = {
'small': {
'x':80
'y':68
}
'large': {
'x':160
'y':136
}
}
thangSizes = {
'floorSize': {
'x':20
'y':17
}
'borderSize': {
'x':4
'y':4
'thickness':3
}
}
module.exports = class TerrainRandomizeModal extends ModalView
id: 'terrain-randomize-modal'
template: template
events:
'click .choose-option': 'onRandomize'
onRevertModel: (e) ->
id = $(e.target).val()
CocoModel.backedUp[id].revert()
$(e.target).closest('tr').remove()
@reloadOnClose = true
onRandomize: (e) ->
target = $(e.target)
presetType = target.attr 'data-preset-type'
presetSize = target.attr 'data-preset-size'
@randomizeThangs presetType, presetSize
Backbone.Mediator.publish('randomize:terrain-generated',
'thangs': @thangs
)
@hide()
randomizeThangs: (presetName, presetSize) ->
@falseCount = 0
preset = presets[presetName]
presetSize = presetSizes[presetSize]
@thangs = []
@rects = []
@randomizeFloor preset, presetSize
@randomizeBorder preset, presetSize, preset.borderNoise
@randomizeDecorations preset, presetSize
randomizeFloor: (preset, presetSize) ->
for i in _.range(0, presetSize.x, thangSizes.floorSize.x)
for j in _.range(0, presetSize.y, thangSizes.floorSize.y)
@thangs.push {
'id': @getRandomThang(clusters[preset.floors].thangs)
'pos': {
'x': i + thangSizes.floorSize.x/2
'y': j + thangSizes.floorSize.y/2
}
'margin': clusters[preset.floors].margin
}
randomizeBorder: (preset, presetSize, noiseFactor=1) ->
for i in _.range(0, presetSize.x, thangSizes.borderSize.x)
for j in _.range(thangSizes.borderSize.thickness)
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
'x': i + preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.x/2, thangSizes.borderSize.x/2)
'y': 0 + preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.y/2, thangSizes.borderSize.y)
}
'margin': clusters[preset.borders].margin
}
continue
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
'x': i + preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.x/2, thangSizes.borderSize.x/2)
'y': presetSize.y - preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.y, thangSizes.borderSize.y/2)
}
'margin': clusters[preset.borders].margin
}
continue
for i in _.range(0, presetSize.y, thangSizes.borderSize.y)
for j in _.range(3)
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
'x': 0 + preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.x/2, thangSizes.borderSize.x)
'y': i + preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.y/2, thangSizes.borderSize.y/2)
}
'margin': clusters[preset.borders].margin
}
continue
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
'x': presetSize.x - preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.x, thangSizes.borderSize.x/2)
'y': i + preset.borderSize/2 + noiseFactor * _.random(-thangSizes.borderSize.y/2, thangSizes.borderSize.y/2)
}
'margin': clusters[preset.borders].margin
}
continue
randomizeDecorations: (preset, presetSize)->
if presetSize is presetSizes['small'] then sizeFactor = 1 else sizeFactor = 2
for name, decoration of preset.decorations
for num in _.range(sizeFactor * _.random(decoration.num[0], decoration.num[1]))
if @['build'+name] isnt undefined
@['build'+name](preset, presetSize, decoration)
continue
while true
rect = {
'x':_.random(decoration.width/2 + preset.borderSize/2 + thangSizes.borderSize.x, presetSize.x - decoration.width/2 - preset.borderSize/2 - thangSizes.borderSize.x),
'y':_.random(decoration.height/2 + preset.borderSize/2 + thangSizes.borderSize.y, presetSize.y - decoration.height/2 - preset.borderSize/2 - thangSizes.borderSize.y)
'width':decoration.width
'height':decoration.height
}
break if @addRect rect
for cluster, range of decoration.clusters
for i in _.range(_.random(range[0], range[1]))
while not @addThang {
'id':@getRandomThang(clusters[cluster].thangs)
'pos':{
'x':_.random(rect.x - rect.width/2, rect.x + rect.width/2)
'y':_.random(rect.y - rect.height/2, rect.y + rect.height/2)
}
'margin':clusters[cluster].margin
}
continue
buildRoom: (preset, presetSize, room) ->
if presetSize is presetSizes['small'] then sizeFactor = 1 else sizeFactor = 2
while true
rect = {
'width':sizeFactor * (room.width[0] + preset.borderSize * _.random(0, (room.width[1] - room.width[0])/preset.borderSize))
'height':sizeFactor * (room.height[0] + preset.borderSize * _.random(0, (room.height[1] - room.height[0])/preset.borderSize))
}
roomThickness = _.random(room.thickness[0], room.thickness[1])
rect.x = _.random(rect.width/2 + preset.borderSize * (roomThickness+1), presetSize.x - rect.width/2 - preset.borderSize * (roomThickness+1))
rect.y = _.random(rect.height/2 + preset.borderSize * (roomThickness+1), presetSize.y - rect.height/2 - preset.borderSize * (roomThickness+1))
break if @addRect {
'x': rect.x
'y': rect.y
'width': rect.width + 2 * roomThickness * preset.borderSize
'height': rect.height + 2 * roomThickness * preset.borderSize
}
xRange = _.range(rect.x - rect.width/2 + preset.borderSize, rect.x + rect.width/2, preset.borderSize)
topDoor = _.random(1) > 0.5
topDoorX = xRange[_.random(0, xRange.length-1)]
bottomDoor = if not topDoor then true else _.random(1) > 0.5
bottomDoorX = xRange[_.random(0, xRange.length-1)]
for t in _.range(0, roomThickness+1)
for i in _.range(rect.x - rect.width/2 - (t-1) * preset.borderSize, rect.x + rect.width/2 + t * preset.borderSize, preset.borderSize)
thang = {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
'x': i
'y': rect.y - rect.height/2 - t * preset.borderSize
}
'margin': clusters[room.cluster].margin
}
if i is bottomDoorX and bottomDoor
thang.id = @getRandomThang(clusters['doors'].thangs)
thang.pos.y -= preset.borderSize/3
@addThang thang unless i is bottomDoorX and t isnt roomThickness and bottomDoor
thang = {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
'x': i
'y': rect.y + rect.height/2 + t * preset.borderSize
}
'margin': clusters[room.cluster].margin
}
if i is topDoorX and topDoor
thang.id = @getRandomThang(clusters['doors'].thangs)
thang.pos.y -= preset.borderSize
@addThang thang unless i is topDoorX and t isnt roomThickness and topDoor
for t in _.range(0, roomThickness)
for i in _.range(rect.y - rect.height/2 - t * preset.borderSize, rect.y + rect.height/2 + (t+1) * preset.borderSize, preset.borderSize)
@addThang {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
'x': rect.x - rect.width/2 - t * preset.borderSize
'y': i
}
'margin': clusters[room.cluster].margin
}
@addThang {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
'x': rect.x + rect.width/2 + t * preset.borderSize
'y': i
}
'margin': clusters[room.cluster].margin
}
addThang: (thang) ->
if @falseCount > 100
console.log 'infinite loop', thang
@falseCount = 0
return true
for existingThang in @thangs
if existingThang.margin is -1 or thang.margin is -1
continue
if Math.abs(existingThang.pos.x - thang.pos.x) <= thang.margin + existingThang.margin and Math.abs(existingThang.pos.y - thang.pos.y) <= thang.margin + existingThang.margin
@falseCount++
return false
@thangs.push thang
true
addRect: (rect) ->
if @falseCount > 100
console.log 'infinite loop', rect
@falseCount = 0
return true
for existingRect in @rects
if Math.abs(existingRect.x - rect.x) <= rect.width/2 + existingRect.width/2 and Math.abs(existingRect.y - rect.y) <= rect.height/2 + existingRect.height/2
@falseCount++
return false
@rects.push rect
true
getRandomThang: (thangList) ->
return thangList[_.random(0, thangList.length-1)]
getRenderData: ->
c = super()
c.presets = presets
c.presetSizes = presetSizes
c
onHidden: ->
location.reload() if @reloadOnClose

View file

@ -2,7 +2,7 @@ CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/scripts_tab' template = require 'templates/editor/level/scripts_tab'
Level = require 'models/Level' Level = require 'models/Level'
Surface = require 'lib/surface/Surface' Surface = require 'lib/surface/Surface'
nodes = require './treema_nodes' nodes = require './../treema_nodes'
module.exports = class ScriptsTabView extends CocoView module.exports = class ScriptsTabView extends CocoView
id: 'editor-level-scripts-tab-view' id: 'editor-level-scripts-tab-view'
@ -39,6 +39,22 @@ module.exports = class ScriptsTabView extends CocoView
onScriptsChanged: (e) => onScriptsChanged: (e) =>
@level.set 'scripts', @scriptsTreema.data @level.set 'scripts', @scriptsTreema.data
lastAction = @scriptsTreema.trackedActions[@scriptsTreema.trackedActions.length - 1]
return unless lastAction
if lastAction.action is 'insert' and lastAction.parentPath is '/'
newScript = @scriptsTreema.get lastAction.path
if newScript.id is undefined
@scriptsTreema.set lastAction.path+'/id', 'Script-' + @scriptsTreema.data.length
@scriptTreema.refreshDisplay()
if lastAction.action is 'delete' and lastAction.parentPath[0] is '/'
for key, treema of @scriptsTreema.childrenTreemas
key = parseInt(key)
if /Script-[0-9]*/.test treema.data.id
existingKey = parseInt(treema.data.id.substr(7))
if existingKey isnt key+1
treema.set 'id', 'Script-' + (key+1)
onScriptSelected: (e, selected) => onScriptSelected: (e, selected) =>
selected = if selected.length > 1 then selected[0].getLastSelectedTreema() else selected[0] selected = if selected.length > 1 then selected[0].getLastSelectedTreema() else selected[0]
@ -86,6 +102,12 @@ module.exports = class ScriptsTabView extends CocoView
onScriptChanged: => onScriptChanged: =>
@scriptsTreema.set(@selectedScriptPath, @scriptTreema.data) @scriptsTreema.set(@selectedScriptPath, @scriptTreema.data)
undo: ->
@scriptsTreema.undo() if @scriptTreema.undo() is undefined
redo: ->
@scriptsTreema.redo() if @scriptTreema.redo() is undefined
class ScriptNode extends TreemaObjectNode class ScriptNode extends TreemaObjectNode
valueClass: 'treema-script' valueClass: 'treema-script'
collection: false collection: false
@ -118,7 +140,14 @@ class EventPropsNode extends TreemaNode.nodeMap.string
joined = '(unset)' if not joined.length joined = '(unset)' if not joined.length
@buildValueForDisplaySimply valEl, joined @buildValueForDisplaySimply valEl, joined
buildValueForEditing: (valEl) -> @buildValueForEditingSimply(valEl, @arrayToString()) buildValueForEditing: (valEl) ->
super(valEl)
channel = @getRoot().data.channel
channelSchema = Backbone.Mediator.channelSchemas[channel]
autocompleteValues = []
autocompleteValues.push key for key, val of channelSchema?.properties
valEl.find('input').autocomplete(source: autocompleteValues, minLength: 0, delay: 0, autoFocus: true).autocomplete('search')
valEl
saveChanges: (valEl) -> saveChanges: (valEl) ->
@data = (s for s in $('input', valEl).val().split('.') when s.length) @data = (s for s in $('input', valEl).val().split('.') when s.length)

View file

@ -2,7 +2,7 @@ CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/settings_tab' template = require 'templates/editor/level/settings_tab'
Level = require 'models/Level' Level = require 'models/Level'
Surface = require 'lib/surface/Surface' Surface = require 'lib/surface/Surface'
nodes = require './treema_nodes' nodes = require './../treema_nodes'
{me} = require 'lib/auth' {me} = require 'lib/auth'
module.exports = class SettingsTabView extends CocoView module.exports = class SettingsTabView extends CocoView
@ -53,3 +53,9 @@ module.exports = class SettingsTabView extends CocoView
for key in @editableSettings for key in @editableSettings
continue if @settingsTreema.data[key] is undefined continue if @settingsTreema.data[key] is undefined
@level.set key, @settingsTreema.data[key] @level.set key, @settingsTreema.data[key]
undo: ->
@settingsTreema.undo()
redo: ->
@settingsTreema.redo()

View file

@ -8,7 +8,7 @@ class LevelSystemSearchCollection extends CocoCollection
url: '/db/level_system' url: '/db/level_system'
model: LevelSystem model: LevelSystem
module.exports = class LevelSystemAddView extends ModalView module.exports = class AddLevelSystemModal extends ModalView
id: 'editor-level-system-add-modal' id: 'editor-level-system-add-modal'
template: template template: template
instant: true instant: true

View file

@ -1,9 +1,9 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/system/edit' template = require 'templates/editor/level/system/edit'
LevelSystem = require 'models/LevelSystem' LevelSystem = require 'models/LevelSystem'
VersionHistoryView = require 'views/editor/system/versions_view' SystemVersionsModal = require 'views/editor/level/systems/SystemVersionsModal'
PatchesView = require 'views/editor/patches_view' PatchesView = require 'views/editor/PatchesView'
SaveVersionModal = require 'views/modal/save_version_modal' SaveVersionModal = require 'views/modal/SaveVersionModal'
module.exports = class LevelSystemEditView extends CocoView module.exports = class LevelSystemEditView extends CocoView
id: 'editor-level-system-edit-view' id: 'editor-level-system-edit-view'
@ -101,8 +101,8 @@ module.exports = class LevelSystemEditView extends CocoView
null null
showVersionHistory: (e) -> showVersionHistory: (e) ->
versionHistoryView = new VersionHistoryView {}, @levelSystem.id systemVersionsModal = new SystemVersionsModal {}, @levelSystem.id
@openModalView versionHistoryView @openModalView systemVersionsModal
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
startPatchingSystem: (e) -> startPatchingSystem: (e) ->
@ -115,6 +115,18 @@ module.exports = class LevelSystemEditView extends CocoView
@levelSystem.watch(button.find('.watch').is(':visible')) @levelSystem.watch(button.find('.watch').is(':visible'))
button.find('> span').toggleClass('secret') button.find('> span').toggleClass('secret')
undo: ->
if @$el.find('li.active > a#system-config-schema-tab')
@configSchemaTreema.undo()
if @$el.find('li.active > a#system-settings-tab')
@systemSettingsTreema.undo()
redo: ->
if @$el.find('li.active > a#system-config-schema-tab')
@configSchemaTreema.redo()
if @$el.find('li.active > a#system-settings-tab')
@systemSettingsTreema.redo()
destroy: -> destroy: ->
@editor?.destroy() @editor?.destroy()
super() super()

View file

@ -4,7 +4,7 @@ LevelSystem = require 'models/LevelSystem'
forms = require 'lib/forms' forms = require 'lib/forms'
{me} = require 'lib/auth' {me} = require 'lib/auth'
module.exports = class LevelSystemNewView extends ModalView module.exports = class NewLevelSystemModal extends ModalView
id: 'editor-level-system-new-modal' id: 'editor-level-system-new-modal'
template: template template: template
instant: false instant: false

View file

@ -1,6 +1,6 @@
VersionsModalView = require 'views/modal/versions_modal' VersionsModal = require 'views/modal/VersionsModal'
module.exports = class SystemVersionsView extends VersionsModalView module.exports = class SystemVersionsModal extends VersionsModal
id: 'editor-system-versions-view' id: 'editor-system-versions-view'
url: '/db/level.system/' url: '/db/level.system/'
page: 'system' page: 'system'

View file

@ -2,10 +2,10 @@ CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/systems_tab' template = require 'templates/editor/level/systems_tab'
Level = require 'models/Level' Level = require 'models/Level'
LevelSystem = require 'models/LevelSystem' LevelSystem = require 'models/LevelSystem'
LevelSystemEditView = require './system/edit' LevelSystemEditView = require './LevelSystemEditView'
LevelSystemNewView = require './system/new' NewLevelSystemModal = require './NewLevelSystemModal'
LevelSystemAddView = require './system/add' AddLevelSystemModal = require './AddLevelSystemModal'
{ThangTypeNode} = require './treema_nodes' {ThangTypeNode} = require './../treema_nodes'
module.exports = class SystemsTabView extends CocoView module.exports = class SystemsTabView extends CocoView
id: 'editor-level-systems-tab-view' id: 'editor-level-systems-tab-view'
@ -49,7 +49,7 @@ module.exports = class SystemsTabView extends CocoView
insertedDefaults = true insertedDefaults = true
systems = @getSortedByName systems systems = @getSortedByName systems
treemaOptions = treemaOptions =
# TODO: somehow get rid of the + button, or repurpose it to open the LevelSystemAddView instead # TODO: somehow get rid of the + button, or repurpose it to open the AddLevelSystemModal instead
supermodel: @supermodel supermodel: @supermodel
schema: Level.schema.properties.systems schema: Level.schema.properties.systems
data: systems data: systems
@ -90,11 +90,11 @@ module.exports = class SystemsTabView extends CocoView
@systemsTreema.insert '/', e.system @systemsTreema.insert '/', e.system
addLevelSystem: (e) -> addLevelSystem: (e) ->
@openModalView new LevelSystemAddView supermodel: @supermodel, extantSystems: _.cloneDeep @systemsTreema.data @openModalView new AddLevelSystemModal supermodel: @supermodel, extantSystems: _.cloneDeep @systemsTreema.data
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
createNewLevelSystem: (e) -> createNewLevelSystem: (e) ->
@openModalView new LevelSystemNewView supermodel: @supermodel @openModalView new NewLevelSystemModal supermodel: @supermodel
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
editLevelSystem: (e) -> editLevelSystem: (e) ->
@ -125,6 +125,13 @@ module.exports = class SystemsTabView extends CocoView
{original: '528114e60268d018e300001a', majorVersion: 0} # UI {original: '528114e60268d018e300001a', majorVersion: 0} # UI
{original: '528114040268d018e3000011', majorVersion: 0} # Physics {original: '528114040268d018e3000011', majorVersion: 0} # Physics
] ]
undo: ->
return unless @levelSystemEditView
@levelSystemEditView.undo()
redo: ->
return unless @levelSystemEditView
@levelSystemEditView.redo()
class LevelSystemNode extends TreemaObjectNode class LevelSystemNode extends TreemaObjectNode
valueClass: 'treema-level-system' valueClass: 'treema-level-system'

View file

@ -1,6 +1,6 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
template = require 'templates/editor/level/thang/edit' template = require 'templates/editor/level/thang/edit'
ThangComponentEditView = require 'views/editor/components/main' ThangComponentEditView = require 'views/editor/component/ThangComponentEditView'
ThangType = require 'models/ThangType' ThangType = require 'models/ThangType'
module.exports = class LevelThangEditView extends CocoView module.exports = class LevelThangEditView extends CocoView
@ -92,3 +92,11 @@ module.exports = class LevelThangEditView extends CocoView
onComponentsChanged: (components) => onComponentsChanged: (components) =>
@thangData.components = components @thangData.components = components
@saveThang() @saveThang()
undo: ->
return unless @thangComponentEditView
@thangComponentEditView.undo()
redo: ->
return unless @thangComponentEditView
@thangComponentEditView.redo()

View file

@ -1,5 +1,5 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
AddThangsView = require './add_thangs_view' AddThangsView = require './AddThangsView'
thangs_template = require 'templates/editor/level/thangs_tab' thangs_template = require 'templates/editor/level/thangs_tab'
Level = require 'models/Level' Level = require 'models/Level'
ThangType = require 'models/ThangType' ThangType = require 'models/ThangType'
@ -8,7 +8,7 @@ CocoCollection = require 'collections/CocoCollection'
{isObjectID} = require 'models/CocoModel' {isObjectID} = require 'models/CocoModel'
Surface = require 'lib/surface/Surface' Surface = require 'lib/surface/Surface'
Thang = require 'lib/world/thang' Thang = require 'lib/world/thang'
LevelThangEditView = require './thang/edit' LevelThangEditView = require './LevelThangEditView'
ComponentsCollection = require 'collections/ComponentsCollection' ComponentsCollection = require 'collections/ComponentsCollection'
# Moving the screen while dragging thangs constants # Moving the screen while dragging thangs constants
@ -58,8 +58,8 @@ module.exports = class ThangsTabView extends CocoView
'delete, del, backspace': 'deleteSelectedExtantThang' 'delete, del, backspace': 'deleteSelectedExtantThang'
'left': -> @moveAddThangSelection -1 'left': -> @moveAddThangSelection -1
'right': -> @moveAddThangSelection 1 'right': -> @moveAddThangSelection 1
'ctrl+z': 'undoAction' 'ctrl+z': 'undo'
'ctrl+shift+z': 'redoAction' 'ctrl+shift+z': 'redo'
constructor: (options) -> constructor: (options) ->
super options super options
@ -116,6 +116,8 @@ module.exports = class ThangsTabView extends CocoView
$(window).resize @onWindowResize $(window).resize @onWindowResize
@addThangsView = @insertSubView new AddThangsView world: @world, supermodel: @supermodel @addThangsView = @insertSubView new AddThangsView world: @world, supermodel: @supermodel
@buildInterface() # refactor to not have this trigger when this view re-renders? @buildInterface() # refactor to not have this trigger when this view re-renders?
if @thangsTreema.data.length
@$el.find('#canvas-overlay').css('display', 'none')
onFilterExtantThangs: (e) -> onFilterExtantThangs: (e) ->
@$el.find('#extant-thangs-filter button.active').button('toggle') @$el.find('#extant-thangs-filter button.active').button('toggle')
@ -233,6 +235,8 @@ module.exports = class ThangsTabView extends CocoView
@addThang @addThangType, thang.pos, true @addThang @addThangType, thang.pos, true
@batchInsert() @batchInsert()
@selectAddThangType null @selectAddThangType null
@$el.find('#canvas-overlay').css('display', 'none')
# 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 # 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) -> onExtantThangSelected: (e) ->
@ -473,11 +477,11 @@ module.exports = class ThangsTabView extends CocoView
$('#add-thangs-column').toggle() $('#add-thangs-column').toggle()
@onWindowResize e @onWindowResize e
undoAction: (e) -> undo: (e) ->
@thangsTreema.undo() if not @editThangView then @thangsTreema.undo() else @editThangView.undo()
redoAction: (e) -> redo: (e) ->
@thangsTreema.redo() if not @editThangView then @thangsTreema.redo() else @editThangView.redo()
class ThangsNode extends TreemaNode.nodeMap.array class ThangsNode extends TreemaNode.nodeMap.array
valueClass: 'treema-array-replacement' valueClass: 'treema-array-replacement'

View file

@ -1,4 +1,4 @@
WorldSelectModal = require './modal/world_select' WorldSelectModal = require './modals/WorldSelectModal'
ThangType = require '/models/ThangType' ThangType = require '/models/ThangType'
makeButton = -> $('<a class="btn btn-primary btn-xs treema-map-button"><span class="glyphicon glyphicon-screenshot"></span></a>') makeButton = -> $('<a class="btn btn-primary btn-xs treema-map-button"><span class="glyphicon glyphicon-screenshot"></span></a>')

View file

@ -3,7 +3,7 @@ template = require 'templates/editor/thang/colors_tab'
SpriteBuilder = require 'lib/sprites/SpriteBuilder' SpriteBuilder = require 'lib/sprites/SpriteBuilder'
{hexToHSL} = require 'lib/utils' {hexToHSL} = require 'lib/utils'
module.exports = class ColorsTabView extends CocoView module.exports = class ThangTypeColorsTabView extends CocoView
id: 'editor-thang-colors-tab-view' id: 'editor-thang-colors-tab-view'
template: template template: template
className: 'tab-pane' className: 'tab-pane'

View file

@ -6,11 +6,11 @@ Camera = require 'lib/surface/Camera'
DocumentFiles = require 'collections/DocumentFiles' DocumentFiles = require 'collections/DocumentFiles'
RootView = require 'views/kinds/RootView' RootView = require 'views/kinds/RootView'
ThangComponentEditView = require 'views/editor/components/main' ThangComponentEditView = require 'views/editor/component/ThangComponentEditView'
VersionHistoryView = require './versions_view' ThangTypeVersionsModal = require './ThangTypeVersionsModal'
ColorsTabView = require './colors_tab_view' ThangTypeColorsTabView = require './ThangTypeColorsTabView'
PatchesView = require 'views/editor/patches_view' PatchesView = require 'views/editor/PatchesView'
SaveVersionModal = require 'views/modal/save_version_modal' SaveVersionModal = require 'views/modal/SaveVersionModal'
template = require 'templates/editor/thang/edit' template = require 'templates/editor/thang/edit'
CENTER = {x: 200, y: 300} CENTER = {x: 200, y: 300}
@ -73,7 +73,7 @@ module.exports = class ThangTypeEditView extends RootView
@buildTreema() @buildTreema()
@initSliders() @initSliders()
@initComponents() @initComponents()
@insertSubView(new ColorsTabView(@thangType)) @insertSubView(new ThangTypeColorsTabView(@thangType))
@patchesView = @insertSubView(new PatchesView(@thangType), @$el.find('.patches-view')) @patchesView = @insertSubView(new PatchesView(@thangType), @$el.find('.patches-view'))
@showReadOnly() if me.get('anonymous') @showReadOnly() if me.get('anonymous')
@ -400,8 +400,8 @@ module.exports = class ThangTypeEditView extends RootView
@showingSelectedNode = false @showingSelectedNode = false
showVersionHistory: (e) -> showVersionHistory: (e) ->
versionHistoryView = new VersionHistoryView thangType: @thangType, @thangTypeID versionHistoryModal = new ThangTypeVersionsModal thangType: @thangType, @thangTypeID
@openModalView versionHistoryView @openModalView versionHistoryModal
Backbone.Mediator.publish 'level:view-switched', e Backbone.Mediator.publish 'level:view-switched', e
openSaveModal: -> openSaveModal: ->

View file

@ -1,6 +1,6 @@
SearchView = require 'views/kinds/SearchView' SearchView = require 'views/kinds/SearchView'
module.exports = class ThangTypeHomeView extends SearchView module.exports = class ThangTypeSearchView extends SearchView
id: 'thang-type-home-view' id: 'thang-type-home-view'
modelLabel: 'Thang Type' modelLabel: 'Thang Type'
model: require 'models/ThangType' model: require 'models/ThangType'

Some files were not shown because too many files have changed in this diff Show more