This commit is contained in:
George Saines 2014-09-02 15:33:28 -07:00
commit e0b49ba2aa
82 changed files with 723 additions and 547 deletions

View file

@ -35,7 +35,6 @@ module.exports = class LevelLoader extends CocoClass
@worldNecessities = [] @worldNecessities = []
@listenTo @supermodel, 'resource-loaded', @onWorldNecessityLoaded @listenTo @supermodel, 'resource-loaded', @onWorldNecessityLoaded
@loadSession()
@loadLevel() @loadLevel()
@loadAudio() @loadAudio()
@playJingle() @playJingle()
@ -44,14 +43,19 @@ module.exports = class LevelLoader extends CocoClass
else else
@listenToOnce @supermodel, 'loaded-all', @onSupermodelLoaded @listenToOnce @supermodel, 'loaded-all', @onSupermodelLoaded
playJingle: -> # Supermodel (Level) Loading
return if @headless
# Apparently the jingle, when it tries to play immediately during all this loading, you can't hear it. loadLevel: ->
# Add the timeout to fix this weird behavior. @level = @supermodel.getModel(Level, @levelID) or new Level _id: @levelID
f = -> if @level.loaded
jingles = ['ident_1', 'ident_2'] @onLevelLoaded()
AudioPlayer.playInterfaceSound jingles[Math.floor Math.random() * jingles.length] else
setTimeout f, 500 @level = @supermodel.loadModel(@level, 'level').model
@listenToOnce @level, 'sync', @onLevelLoaded
onLevelLoaded: ->
@loadSession()
@populateLevel()
# Session Loading # Session Loading
@ -83,29 +87,19 @@ module.exports = class LevelLoader extends CocoClass
@listenToOnce @opponentSession, 'sync', @loadDependenciesForSession @listenToOnce @opponentSession, 'sync', @loadDependenciesForSession
loadDependenciesForSession: (session) -> loadDependenciesForSession: (session) ->
return if @levelID is 'sky-span' # TODO return unless @level.get('type', true) is 'hero'
# TODO: I think this runs afoul of https://github.com/codecombat/codecombat/issues/1108 heroConfig = session.get('heroConfig')
# TODO: this shouldn't happen when it's not a hero level, but we don't have level loaded yet, unless heroConfig
# and the sessions are being created with default hero config regardless of whether it's a hero level. heroConfig = {inventory: {}, thangType: '529ffbf1cf1818f2be000001'} # Temp: assign Tharin as the hero
if heroConfig = session.get('heroConfig') session.set 'heroConfig', heroConfig
url = "/db/thang.type/#{heroConfig.thangType}/version?project=name,components,original" url = "/db/thang.type/#{heroConfig.thangType}/version?project=name,components,original"
@worldNecessities.push @maybeLoadURL(url, ThangType, 'thang') @worldNecessities.push @maybeLoadURL(url, ThangType, 'thang')
for itemThangType in _.values(heroConfig.inventory) for itemThangType in _.values(heroConfig.inventory)
url = "/db/thang.type/#{itemThangType}/version?project=name,components,original" url = "/db/thang.type/#{itemThangType}/version?project=name,components,original"
@worldNecessities.push @maybeLoadURL(url, ThangType, 'thang') @worldNecessities.push @maybeLoadURL(url, ThangType, 'thang')
# Supermodel (Level) Loading
loadLevel: -> # Grabbing the rest of the required data for the level
@level = @supermodel.getModel(Level, @levelID) or new Level _id: @levelID
if @level.loaded
@populateLevel()
else
@level = @supermodel.loadModel(@level, 'level').model
@listenToOnce @level, 'sync', @onLevelLoaded
onLevelLoaded: ->
@populateLevel()
populateLevel: -> populateLevel: ->
thangIDs = [] thangIDs = []
@ -167,6 +161,7 @@ module.exports = class LevelLoader extends CocoClass
@loadThangsRequiredFromComponentList thangType.get('components') @loadThangsRequiredFromComponentList thangType.get('components')
loadThangsRequiredFromComponentList: (components) -> loadThangsRequiredFromComponentList: (components) ->
return unless components
requiredThangTypes = [] requiredThangTypes = []
for component in components when component.config for component in components when component.config
if component.original is LevelComponent.EquipsID if component.original is LevelComponent.EquipsID
@ -331,6 +326,15 @@ module.exports = class LevelLoader extends CocoClass
# Initial Sound Loading # Initial Sound Loading
playJingle: ->
return if @headless
# Apparently the jingle, when it tries to play immediately during all this loading, you can't hear it.
# Add the timeout to fix this weird behavior.
f = ->
jingles = ['ident_1', 'ident_2']
AudioPlayer.playInterfaceSound jingles[Math.floor Math.random() * jingles.length]
setTimeout f, 500
loadAudio: -> loadAudio: ->
return if @headless return if @headless
AudioPlayer.preloadInterfaceSounds ['victory'] AudioPlayer.preloadInterfaceSounds ['victory']

View file

@ -428,7 +428,7 @@ module.exports = Surface = class Surface extends CocoClass
pageHeight = $('#page-container').height() - $('#control-bar-view').outerHeight() - $('#playback-view').outerHeight() pageHeight = $('#page-container').height() - $('#control-bar-view').outerHeight() - $('#playback-view').outerHeight()
newWidth = Math.min pageWidth, pageHeight * aspectRatio newWidth = Math.min pageWidth, pageHeight * aspectRatio
newHeight = newWidth / aspectRatio newHeight = newWidth / aspectRatio
else if $('#editor-level-thangs-tab-view') else if $('#thangs-tab-view')
newWidth = $('#canvas-wrapper').width() newWidth = $('#canvas-wrapper').width()
newHeight = newWidth / aspectRatio newHeight = newWidth / aspectRatio
else else

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "български език", englishDescri
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "български език", englishDescri
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
campaign_multiplayer_description: "... on programes cara a cara contra altres jugadors." campaign_multiplayer_description: "... on programes cara a cara contra altres jugadors."
campaign_player_created: "Creats pel Jugador" campaign_player_created: "Creats pel Jugador"
campaign_player_created_description: "... on lluites contra la creativitat dels teus companys <a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... on lluites contra la creativitat dels teus companys <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Dificultat: " level_difficulty: "Dificultat: "
play_as: "Jugar com" play_as: "Jugar com"
spectate: "Spectate" spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
campaign_multiplayer_description: "...ve které programujete proti jiným hráčům." campaign_multiplayer_description: "...ve které programujete proti jiným hráčům."
campaign_player_created: "Uživatelsky vytvořené úrovně" campaign_player_created: "Uživatelsky vytvořené úrovně"
campaign_player_created_description: "...ve kterých bojujete proti kreativitě ostatních <a href=\"/contribute#artisan\">Zdatných Kouzelníků</a>." campaign_player_created_description: "...ve kterých bojujete proti kreativitě ostatních <a href=\"/contribute#artisan\">Zdatných Kouzelníků</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Obtížnost: " level_difficulty: "Obtížnost: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
campaign_multiplayer_description: "... hvor du koder ansigt-til-ansigt imod andre spillere." campaign_multiplayer_description: "... hvor du koder ansigt-til-ansigt imod andre spillere."
campaign_player_created: "Spillerkreerede" campaign_player_created: "Spillerkreerede"
campaign_player_created_description: "... hvor du kæmper mod dine med-<a href=\"/contribute#artisan\">Kunsthåndværker-troldmænd</a>s kreativitet." campaign_player_created_description: "... hvor du kæmper mod dine med-<a href=\"/contribute#artisan\">Kunsthåndværker-troldmænd</a>s kreativitet."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Sværhedsgrad: " level_difficulty: "Sværhedsgrad: "
play_as: "Spil Som " play_as: "Spil Som "
spectate: "Observér" spectate: "Observér"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
campaign_multiplayer_description: "... in der Du Kopf-an-Kopf gegen andere Spieler programmierst." campaign_multiplayer_description: "... in der Du Kopf-an-Kopf gegen andere Spieler programmierst."
campaign_player_created: "Von Spielern erstellt" campaign_player_created: "Von Spielern erstellt"
campaign_player_created_description: "... in welchem Du gegen die Kreativität eines <a href=\"/contribute#artisan\">Artisan Zauberers</a> kämpfst." campaign_player_created_description: "... in welchem Du gegen die Kreativität eines <a href=\"/contribute#artisan\">Artisan Zauberers</a> kämpfst."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Schwierigkeit: " level_difficulty: "Schwierigkeit: "
play_as: "Spiele als " play_as: "Spiele als "
spectate: "Zuschauen" spectate: "Zuschauen"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
delta: delta:
added: "hinzugefügt" added: "hinzugefügt"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
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: "Vo Spieler erstellti Level" campaign_player_created: "Vo Spieler erstellti Level"
campaign_player_created_description: "... i dene du gege d Kreativität vome <a href=\"/contribute#artisan\">Handwerker Zauberer</a> kämpfsch." campaign_player_created_description: "... i dene du gege d Kreativität vome <a href=\"/contribute#artisan\">Handwerker Zauberer</a> kämpfsch."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Schwierigkeit: " level_difficulty: "Schwierigkeit: "
play_as: "Spiel als" play_as: "Spiel als"
spectate: "Zueluege" spectate: "Zueluege"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
campaign_multiplayer_description: "... in der Du Kopf-an-Kopf gegen andere Spieler programmierst." campaign_multiplayer_description: "... in der Du Kopf-an-Kopf gegen andere Spieler programmierst."
campaign_player_created: "Von Spielern erstellt" campaign_player_created: "Von Spielern erstellt"
campaign_player_created_description: "... in welchem Du gegen die Kreativität eines <a href=\"/contribute#artisan\">Artisan Zauberers</a> kämpfst." campaign_player_created_description: "... in welchem Du gegen die Kreativität eines <a href=\"/contribute#artisan\">Artisan Zauberers</a> kämpfst."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Schwierigkeit: " level_difficulty: "Schwierigkeit: "
play_as: "Spiele als " play_as: "Spiele als "
spectate: "Zuschauen" spectate: "Zuschauen"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
delta: delta:
added: "hinzugefügt" added: "hinzugefügt"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre
campaign_multiplayer_description: "... στο οποίο μπορείτε να προγραμματίσετε σώμα με σώμα έναντι άλλων παικτών." campaign_multiplayer_description: "... στο οποίο μπορείτε να προγραμματίσετε σώμα με σώμα έναντι άλλων παικτών."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Δυσκολία: " level_difficulty: "Δυσκολία: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "ελληνικά", englishDescription: "Gre
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@
campaign_multiplayer_description: "... in which you code head-to-head against other players." campaign_multiplayer_description: "... in which you code head-to-head against other players."
campaign_player_created: "Player-Created" campaign_player_created: "Player-Created"
campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
campaign_classic_algorithms: "Classic Algorithms"
campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Difficulty: " level_difficulty: "Difficulty: "
play_as: "Play As" play_as: "Play As"
spectate: "Spectate" spectate: "Spectate"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
campaign_multiplayer_description: "... en las que programas cara-a-cara contra otros jugadores." campaign_multiplayer_description: "... en las que programas cara-a-cara contra otros jugadores."
campaign_player_created: "Creados-Por-Jugadores" campaign_player_created: "Creados-Por-Jugadores"
campaign_player_created_description: "... en los que luchas contra la creatividad de tus compañeros <a href=\"/contribute#artisan\">Hechiceros Artesanales</a>." campaign_player_created_description: "... en los que luchas contra la creatividad de tus compañeros <a href=\"/contribute#artisan\">Hechiceros Artesanales</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Dificultad: " level_difficulty: "Dificultad: "
play_as: "Jugar Como " play_as: "Jugar Como "
spectate: "Observar" spectate: "Observar"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
campaign_multiplayer_description: "... en las que tu código se enfrentará al de otros jugadores." campaign_multiplayer_description: "... en las que tu código se enfrentará al de otros jugadores."
campaign_player_created: "Creaciones de los Jugadores" campaign_player_created: "Creaciones de los Jugadores"
campaign_player_created_description: "... en las que luchas contra la creatividad de tus compañeros <a href=\"/contribute#artisa\">Magos Artesanos</a>." campaign_player_created_description: "... en las que luchas contra la creatividad de tus compañeros <a href=\"/contribute#artisa\">Magos Artesanos</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Dificultad: " level_difficulty: "Dificultad: "
play_as: "Jugar como" play_as: "Jugar como"
spectate: "Observar" spectate: "Observar"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
delta: delta:
added: "Añadido" added: "Añadido"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
campaign_multiplayer_description: "... جایی که کد رو به رو شدن با بقیه بازیکنان رو مینویسید." campaign_multiplayer_description: "... جایی که کد رو به رو شدن با بقیه بازیکنان رو مینویسید."
campaign_player_created: "ایجاد بازیکن" campaign_player_created: "ایجاد بازیکن"
campaign_player_created_description: "... جایی که در مقابل خلاقیت نیرو هاتون قرار میگیرید <a href=\"/contribute#artisan\">جادوگران آرتیزان</a>." campaign_player_created_description: "... جایی که در مقابل خلاقیت نیرو هاتون قرار میگیرید <a href=\"/contribute#artisan\">جادوگران آرتیزان</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "سختی: " level_difficulty: "سختی: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
campaign_multiplayer_description: "... dans laquelle vous coderez en face à face contre d'autres joueurs." campaign_multiplayer_description: "... dans laquelle vous coderez en face à face contre d'autres joueurs."
campaign_player_created: "Niveaux créés par les joueurs" campaign_player_created: "Niveaux créés par les joueurs"
campaign_player_created_description: "... Dans laquelle vous serez confrontés à la créativité des votres.<a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... Dans laquelle vous serez confrontés à la créativité des votres.<a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Difficulté: " level_difficulty: "Difficulté: "
play_as: "Jouer comme " play_as: "Jouer comme "
spectate: "Spectateur" spectate: "Spectateur"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
delta: delta:
added: "Ajouté" added: "Ajouté"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
campaign_multiplayer_description: "..." campaign_multiplayer_description: "..."
campaign_player_created: "תוצרי השחקנים" campaign_player_created: "תוצרי השחקנים"
campaign_player_created_description: "... שבהם תילחם נגד היצירתיות של <a href=\"/contribute#artisan\">בעלי-המלאכה</a>." campaign_player_created_description: "... שבהם תילחם נגד היצירתיות של <a href=\"/contribute#artisan\">בעלי-המלאכה</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "רמת קושי: " level_difficulty: "רמת קושי: "
play_as: "שחק בתור " play_as: "שחק בתור "
spectate: "צופה" spectate: "צופה"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
campaign_multiplayer_description: "... amelyekben a kódod felveheti a versenyt más játékosok kódjával" campaign_multiplayer_description: "... amelyekben a kódod felveheti a versenyt más játékosok kódjával"
campaign_player_created: "Játékosok pályái" campaign_player_created: "Játékosok pályái"
campaign_player_created_description: "...melyekben <a href=\"/contribute#artisan\">Művészi Varázsló</a> társaid ellen kűzdhetsz." campaign_player_created_description: "...melyekben <a href=\"/contribute#artisan\">Művészi Varázsló</a> társaid ellen kűzdhetsz."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Nehézség: " level_difficulty: "Nehézség: "
play_as: "Játssz mint" play_as: "Játssz mint"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
campaign_multiplayer_description: "... nelle quali programmi faccia a faccia contro altri giocatori." campaign_multiplayer_description: "... nelle quali programmi faccia a faccia contro altri giocatori."
campaign_player_created: "Creati dai giocatori" campaign_player_created: "Creati dai giocatori"
campaign_player_created_description: "... nei quali affronterai la creatività dei tuoi compagni <a href=\"/contribute#artisan\">Stregoni Artigiani</a>." campaign_player_created_description: "... nei quali affronterai la creatività dei tuoi compagni <a href=\"/contribute#artisan\">Stregoni Artigiani</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Difficoltà: " level_difficulty: "Difficoltà: "
play_as: "Gioca come " play_as: "Gioca come "
spectate: "Spettatore" spectate: "Spettatore"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "難易度: " level_difficulty: "難易度: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
campaign_multiplayer_description: "... 이곳에서 당신은 다른 인간 플레이어들과 직접 결투할 수 있습니다." campaign_multiplayer_description: "... 이곳에서 당신은 다른 인간 플레이어들과 직접 결투할 수 있습니다."
campaign_player_created: "사용자 직접 제작" campaign_player_created: "사용자 직접 제작"
campaign_player_created_description: "... 당신 동료가 고안한 레벨에 도전하세요 <a href=\"/contributeartisan\">마법사 장인</a>." campaign_player_created_description: "... 당신 동료가 고안한 레벨에 도전하세요 <a href=\"/contributeartisan\">마법사 장인</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "난이도: " level_difficulty: "난이도: "
play_as: "Play As " play_as: "Play As "
spectate: "관중모드" spectate: "관중모드"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
campaign_multiplayer_description: "... hvor du spiller direkte mot andre spillere." campaign_multiplayer_description: "... hvor du spiller direkte mot andre spillere."
campaign_player_created: "Spiller-Lagde" campaign_player_created: "Spiller-Lagde"
campaign_player_created_description: "... hvor du kjemper mot kreativiteten til en av dine medspillende <a href=\"/contribute#artisan\">Artisan Trollmenn</a>." campaign_player_created_description: "... hvor du kjemper mot kreativiteten til en av dine medspillende <a href=\"/contribute#artisan\">Artisan Trollmenn</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Vanskelighetsgrad: " level_difficulty: "Vanskelighetsgrad: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
campaign_multiplayer_description: "... waarin je direct tegen andere spelers speelt." campaign_multiplayer_description: "... waarin je direct tegen andere spelers speelt."
campaign_player_created: "Door-spelers-gemaakt" campaign_player_created: "Door-spelers-gemaakt"
campaign_player_created_description: "... waarin je ten strijde trekt tegen de creativiteit van andere <a href=\"/contribute#artisan\">Ambachtelijke Tovenaars</a>." campaign_player_created_description: "... waarin je ten strijde trekt tegen de creativiteit van andere <a href=\"/contribute#artisan\">Ambachtelijke Tovenaars</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Moeilijkheidsgraad: " level_difficulty: "Moeilijkheidsgraad: "
play_as: "Speel als " play_as: "Speel als "
spectate: "Toeschouwen" spectate: "Toeschouwen"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
campaign_multiplayer_description: "... waarin je direct tegen andere spelers speelt." campaign_multiplayer_description: "... waarin je direct tegen andere spelers speelt."
campaign_player_created: "Door-spelers-gemaakt" campaign_player_created: "Door-spelers-gemaakt"
campaign_player_created_description: "... waarin je ten strijde trekt tegen de creativiteit van andere <a href=\"/contribute#artisan\">Ambachtelijke Tovenaars</a>." campaign_player_created_description: "... waarin je ten strijde trekt tegen de creativiteit van andere <a href=\"/contribute#artisan\">Ambachtelijke Tovenaars</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Moeilijkheidsgraad: " level_difficulty: "Moeilijkheidsgraad: "
play_as: "Speel als " play_as: "Speel als "
spectate: "Toeschouwen" spectate: "Toeschouwen"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
campaign_multiplayer_description: "... hvor du spiller direkte mot andre spillere." campaign_multiplayer_description: "... hvor du spiller direkte mot andre spillere."
campaign_player_created: "Brett laget av andre brukere" campaign_player_created: "Brett laget av andre brukere"
campaign_player_created_description: "... hvor du kjemper mot kreativiteten til en av dine medspillende <a href=\"/contribute#artisan\">Artisan Trollmenn</a>." campaign_player_created_description: "... hvor du kjemper mot kreativiteten til en av dine medspillende <a href=\"/contribute#artisan\">Artisan Trollmenn</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Vanskelighetsgrad: " level_difficulty: "Vanskelighetsgrad: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
campaign_multiplayer_description: "... w których konkurujesz z innymi graczami." campaign_multiplayer_description: "... w których konkurujesz z innymi graczami."
campaign_player_created: "Stworzone przez graczy" campaign_player_created: "Stworzone przez graczy"
campaign_player_created_description: "... w których walczysz przeciwko dziełom <a href=\"/contribute#artisan\">Czarodziejów Rękodzielnictwa</a>" campaign_player_created_description: "... w których walczysz przeciwko dziełom <a href=\"/contribute#artisan\">Czarodziejów Rękodzielnictwa</a>"
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Poziom trudności: " level_difficulty: "Poziom trudności: "
play_as: "Graj jako " play_as: "Graj jako "
spectate: "Oglądaj" spectate: "Oglądaj"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
campaign_multiplayer_description: "... nas quais você programará cara-a-cara contra outros jogadores." campaign_multiplayer_description: "... nas quais você programará cara-a-cara contra outros jogadores."
campaign_player_created: "Criados por Jogadores" campaign_player_created: "Criados por Jogadores"
campaign_player_created_description: "... nos quais você batalhará contra a criatividade dos seus companheiros <a href=\"/contribute#artisan\">feiticeiros Artesãos</a>." campaign_player_created_description: "... nos quais você batalhará contra a criatividade dos seus companheiros <a href=\"/contribute#artisan\">feiticeiros Artesãos</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Dificuldade: " level_difficulty: "Dificuldade: "
play_as: "Jogar Como " play_as: "Jogar Como "
spectate: "Assistir" spectate: "Assistir"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
campaign_multiplayer_description: "... onde programa frente-a-frente contra outros jogadores." campaign_multiplayer_description: "... onde programa frente-a-frente contra outros jogadores."
campaign_player_created: "Criados por Jogadores" campaign_player_created: "Criados por Jogadores"
campaign_player_created_description: "... onde combate contra a criatividade dos seus colegas <a href=\"/contribute#artisan\">Feiticeiros Artesãos</a>." campaign_player_created_description: "... onde combate contra a criatividade dos seus colegas <a href=\"/contribute#artisan\">Feiticeiros Artesãos</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Dificuldade: " level_difficulty: "Dificuldade: "
play_as: "Jogar Como" play_as: "Jogar Como"
spectate: "Espectar" spectate: "Espectar"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
achievement: "Conquista" achievement: "Conquista"
clas: "CLAs" clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
delta: delta:
added: "Adicionados/as" added: "Adicionados/as"

View file

@ -3,21 +3,21 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
loading: "Se incarcă..." loading: "Se incarcă..."
saving: "Se salvează..." saving: "Se salvează..."
sending: "Se trimite..." sending: "Se trimite..."
# send: "Send" send: "Trimite"
cancel: "Anulează" cancel: "Anulează"
save: "Salvează" save: "Salvează"
# publish: "Publish" publish: "Publica"
create: "Crează" create: "Creează"
delay_1_sec: "1 secundă" delay_1_sec: "1 secundă"
delay_3_sec: "3 secunde" delay_3_sec: "3 secunde"
delay_5_sec: "5 secunde" delay_5_sec: "5 secunde"
manual: "Manual" manual: "Manual"
fork: "Fork" fork: "Fork"
play: "Joacă" play: "Joacă"
# retry: "Retry" retry: "Reîncearca"
# watch: "Watch" # watch: "Watch"
# unwatch: "Unwatch" # unwatch: "Unwatch"
# submit_patch: "Submit Patch" submit_patch: "Înainteaza Patch"
units: units:
second: "secundă" second: "secundă"
@ -26,14 +26,14 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
minutes: "minute" minutes: "minute"
hour: "oră" hour: "oră"
hours: "ore" hours: "ore"
# day: "day" day: "zi"
# days: "days" days: "zile"
# week: "week" week: "săptămână"
# weeks: "weeks" weeks: "săptămâni"
# month: "month" month: "luna"
# months: "months" months: "luni"
# year: "year" year: "an"
# years: "years" years: "ani"
modal: modal:
close: "Inchide" close: "Inchide"
@ -44,16 +44,16 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
nav: nav:
play: "Nivele" play: "Nivele"
# community: "Community" community: "Communitate"
editor: "Editor" editor: "Editor"
blog: "Blog" blog: "Blog"
forum: "Forum" forum: "Forum"
# account: "Account" account: "Cont"
# profile: "Profile" profile: "Profil"
# stats: "Stats" stats: "Statistică"
# code: "Code" code: "Cod"
admin: "Admin" admin: "Admin"
home: "Acasa" home: "Acasă"
contribute: "Contribuie" contribute: "Contribuie"
legal: "Confidențialitate și termeni" legal: "Confidențialitate și termeni"
about: "Despre" about: "Despre"
@ -89,8 +89,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
creating: "Se creează contul..." creating: "Se creează contul..."
sign_up: "Înscrie-te" sign_up: "Înscrie-te"
log_in: "loghează-te cu parola" log_in: "loghează-te cu parola"
# social_signup: "Or, you can sign up through Facebook or G+:" social_signup: "Sau, te poți inregistra cu Facebook sau G+:"
# required: "You need to log in before you can go that way." required: "Trebuie să te înregistrezi înaite să parcurgi acest drum."
home: home:
slogan: "Învață sa scrii cod jucându-te" slogan: "Învață sa scrii cod jucându-te"
@ -103,12 +103,12 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
for_beginners: "Pentru Începători" for_beginners: "Pentru Începători"
multiplayer: "Multiplayer" multiplayer: "Multiplayer"
for_developers: "Pentru dezvoltatori" for_developers: "Pentru dezvoltatori"
# javascript_blurb: "The language of the web. Great for writing websites, web apps, HTML5 games, and servers." javascript_blurb: "Limbajul web-ului. Perfect pentru crearea website-urilor, web applicații, jocuri HTML5, si servere. The language of the web. Great for writing websites, web apps, HTML5 games, and servers."
# python_blurb: "Simple yet powerful, Python is a great general purpose programming language." python_blurb: "Simplu dar puternic, Python este un limbaj de uz general extraordinar!"
# coffeescript_blurb: "Nicer JavaScript syntax." coffeescript_blurb: "JavaScript cu o syntaxă mai placută! Nicer JavaScript syntax."
# clojure_blurb: "A modern Lisp." clojure_blurb: "Un Lisp modern."
# lua_blurb: "Game scripting language." lua_blurb: "Limbaj de scripting pentru jocuri."
# io_blurb: "Simple but obscure." io_blurb: "Simplu dar obscur."
play: play:
choose_your_level: "Alege nivelul" choose_your_level: "Alege nivelul"
@ -123,11 +123,13 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
campaign_multiplayer_description: "... în care te lupți cap-la-cap contra alti jucători." campaign_multiplayer_description: "... în care te lupți cap-la-cap contra alti jucători."
campaign_player_created: "Create de jucători" campaign_player_created: "Create de jucători"
campaign_player_created_description: "... în care ai ocazia să testezi creativitatea colegilor tai <a href=\"/contribute#artisan\">Artisan Wizards</a>." campaign_player_created_description: "... în care ai ocazia să testezi creativitatea colegilor tai <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Dificultate: " level_difficulty: "Dificultate: "
play_as: "Alege-ți echipa" play_as: "Alege-ți echipa"
spectate: "Spectator" spectate: "Spectator"
# players: "players" players: "jucători"
# hours_played: "hours played" hours_played: "ore jucate"
contact: contact:
contact_us: "Contact CodeCombat" contact_us: "Contact CodeCombat"
@ -139,8 +141,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
forum_page: "forumul nostru" forum_page: "forumul nostru"
forum_suffix: " în schimb." forum_suffix: " în schimb."
send: "Trimite Feedback" send: "Trimite Feedback"
# contact_candidate: "Contact Candidate" contact_candidate: "Contacteaza Candidatul"
# 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: "Folosiți acest formular pentru a ajunge la candidații care va intereseaza pentru interviu. CodeCombat percepe 15% din salariu în primul an. Taxa este datorată la angajare și este rambursabilă pentru 90 de zile în cazul în care salariatul nu rămâne angajat. Cele part time, și angajați cu contract la distanță sunt gratuite, așa cum sunt stagiari."
diplomat_suggestion: diplomat_suggestion:
title: "Ajută-ne să traducem CodeCombat!" title: "Ajută-ne să traducem CodeCombat!"
@ -153,16 +155,16 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
wizard_settings: wizard_settings:
title: "Setări Wizard" title: "Setări Wizard"
customize_avatar: "Personalizează-ți Avatarul" customize_avatar: "Personalizează-ți Avatarul"
# active: "Active" active: "Activ"
# color: "Color" color: "Culoare"
# group: "Group" group: "Grup"
clothes: "Haine" clothes: "Haine"
trim: "Margine" trim: "Margine"
cloud: "Nor" cloud: "Nor"
# team: "Team" team: "Echipa"
spell: "Vrajă" spell: "Vrajă"
boots: "Încălțăminte" boots: "Încălțăminte"
hue: "Culoare" hue: "Nuanță"
saturation: "Saturație" saturation: "Saturație"
lightness: "Luminozitate" lightness: "Luminozitate"
@ -172,7 +174,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
autosave: "Modificările se salvează automat" autosave: "Modificările se salvează automat"
me_tab: "Eu" me_tab: "Eu"
picture_tab: "Poză" picture_tab: "Poză"
# upload_picture: "Upload a picture" upload_picture: "Uploadeaza o imagine"
wizard_tab: "Wizard" wizard_tab: "Wizard"
password_tab: "Parolă" password_tab: "Parolă"
emails_tab: "Email-uri" emails_tab: "Email-uri"
@ -181,16 +183,16 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
new_password: "Parolă nouă" new_password: "Parolă nouă"
new_password_verify: "Verifică" new_password_verify: "Verifică"
email_subscriptions: "Subscripție Email" email_subscriptions: "Subscripție Email"
# email_subscriptions_none: "No Email Subscriptions." email_subscriptions_none: "Nu ai subscripții Email."
email_announcements: "Anunțuri" email_announcements: "Anunțuri"
email_announcements_description: "Primește email-uri cu ultimele știri despre CodeCombat." email_announcements_description: "Primește email-uri cu ultimele știri despre CodeCombat."
email_notifications: "Notificări" email_notifications: "Notificări"
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity." email_notifications_summary: "Control pentru notificări email personalizate, legate de activitatea CodeCombat."
# email_any_notes: "Any Notifications" email_any_notes: "Orice Notificări"
# email_any_notes_description: "Disable to stop all activity notification emails." email_any_notes_description: "Dezactivați pentru a opri toate e-mailurile de notificare a activității. Disable to stop all activity notification emails."
# email_news: "News" email_news: "Noutăți"
# email_recruit_notes: "Job Opportunities" email_recruit_notes: "Oportunități de job-uri"
# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job." email_recruit_notes_description: "Daca joci foarte bine, este posibil sa te contactăm pentru obținerea unui loc (mai bun) de muncă."
contributor_emails: "Contributor Class Emails" contributor_emails: "Contributor Class Emails"
contribute_prefix: "Căutăm oameni să se alăture distracției! Intră pe " contribute_prefix: "Căutăm oameni să se alăture distracției! Intră pe "
contribute_page: "pagina de contribuție" contribute_page: "pagina de contribuție"
@ -199,49 +201,49 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
error_saving: "Salvare erori" error_saving: "Salvare erori"
saved: "Modificări salvate" saved: "Modificări salvate"
password_mismatch: "Parola nu se potrivește." password_mismatch: "Parola nu se potrivește."
# password_repeat: "Please repeat your password." password_repeat: "Te rugăm sa repeți parola."
# job_profile: "Job Profile" # job_profile: "Job Profile"
# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks." # job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." # job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
# sample_profile: "See a sample profile" sample_profile: "Vezi un profil exemplu"
# view_profile: "View Your Profile" view_profile: "Vizualizează Profilul"
account_profile: account_profile:
# settings: "Settings" settings: "Setări"
# edit_profile: "Edit Profile" edit_profile: "Modifica Profil"
# done_editing: "Done Editing" done_editing: "Am terminat modificările."
profile_for_prefix: "Profil pentru " profile_for_prefix: "Profil pentru "
profile_for_suffix: "" profile_for_suffix: ""
# featured: "Featured" featured: "Recomandate"
# not_featured: "Not Featured" # not_featured: "Not Featured"
# looking_for: "Looking for:" # looking_for: "Looking for:"
# last_updated: "Last updated:" # last_updated: "Last updated:"
# contact: "Contact" # contact: "Contact"
# active: "Looking for interview offers now" active: "Caut oferte de interviu."
# inactive: "Not looking for offers right now" inactive: "Nu caut oferte"
# complete: "complete" complete: "complet"
# next: "Next" next: "Urmatorul"
# next_city: "city?" next_city: "oras?"
# next_country: "pick your country." next_country: "alege țara."
# next_name: "name?" next_name: "nume?"
# next_short_description: "write a short description." next_short_description: "scrie o scurta descriere."
# next_long_description: "describe your desired position." next_long_description: "descrie poziția dorită."
# next_skills: "list at least five skills." next_skills: "listeaza cel puțin cinci competențe."
# next_work: "chronicle your work history." next_work: "cronica istoricului dvs. de lucru."
# next_education: "recount your educational ordeals." next_education: "povesteste-ne de chinurile educaționale"
# next_projects: "show off up to three projects you've worked on." next_projects: "scoate in evidență pana la 3 proiecte la care ai lucrat."
# next_links: "add any personal or social links." next_links: "adăuga orice link-uri personale sau sociale."
# next_photo: "add an optional professional photo." next_photo: "adăuga o fotografie profesionala opțională."
# next_active: "mark yourself open to offers to show up in searches." next_active: "indica că esti deschis la oferte ca să apară în căutări."
# example_blog: "Blog" example_blog: "Blog"
# example_personal_site: "Personal Site" example_personal_site: "Site Personal"
# links_header: "Personal Links" links_header: "Link-uri Personale"
# links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog." links_blurb: "Link către orice alte site-uri sau profiluri pe care doriți să se sublinieze, ca GitHub, LinkedIn, sau blog-ul personal."
# links_name: "Link Name" links_name: "Nume Link"
# links_name_help: "What are you linking to?" links_name_help: "Catre ce faci link?"
# links_link_blurb: "Link URL" links_link_blurb: "Link URL"
# basics_header: "Update basic info" basics_header: "Actualizați informații de bază"
# basics_active: "Open to Offers" basics_active: "Deschis la Oferte"
# basics_active_help: "Want interview offers right now?" # basics_active_help: "Want interview offers right now?"
# basics_job_title: "Desired Job Title" # basics_job_title: "Desired Job Title"
# basics_job_title_help: "What role are you looking for?" # basics_job_title_help: "What role are you looking for?"
@ -359,15 +361,15 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
done: "Gata" done: "Gata"
customize_wizard: "Personalizează Wizard-ul" customize_wizard: "Personalizează Wizard-ul"
home: "Acasă" home: "Acasă"
# stop: "Stop" stop: "Stop"
# game_menu: "Game Menu" game_menu: "Meniul Jocului"
guide: "Ghid" guide: "Ghid"
restart: "Restart" restart: "Restart"
goals: "Obiective" goals: "Obiective"
# success: "Success!" success: "Success!"
# incomplete: "Incomplete" incomplete: "Incomplet"
# timed_out: "Ran out of time" timed_out: "Ai ramas fara timp"
# failing: "Failing" failing: "Eşec"
action_timeline: "Timeline-ul acțiunii" action_timeline: "Timeline-ul acțiunii"
click_to_select: "Apasă pe o unitate pentru a o selecta." click_to_select: "Apasă pe o unitate pentru a o selecta."
reload_title: "Reîncarcă tot codul?" reload_title: "Reîncarcă tot codul?"
@ -397,7 +399,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
hud_continue: "Continuă (apasă shift-space)" hud_continue: "Continuă (apasă shift-space)"
spell_saved: "Vrajă salvată" spell_saved: "Vrajă salvată"
skip_tutorial: "Sari peste (esc)" skip_tutorial: "Sari peste (esc)"
# keyboard_shortcuts: "Key Shortcuts" keyboard_shortcuts: "Scurtături Keyboard"
loading_ready: "Gata!" loading_ready: "Gata!"
tip_insert_positions: "Shift+Click oriunde pe harta pentru a insera punctul în editorul de vrăji." tip_insert_positions: "Shift+Click oriunde pe harta pentru a insera punctul în editorul de vrăji."
tip_toggle_play: "Pune sau scoate pauza cu Ctrl+P." tip_toggle_play: "Pune sau scoate pauza cu Ctrl+P."
@ -421,7 +423,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't." # tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't."
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda" # tip_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: "Do. Or do not. There is no try. - Yoda"
# tip_patience: "Patience you must have, young Padawan. - Yoda" tip_patience: "Să ai rabdare trebuie, tinere 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: "It always seems impossible until it's done. - Nelson Mandela"
# tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds" # tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds"
@ -444,9 +446,9 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# inventory_caption: "Equip your hero" # inventory_caption: "Equip your hero"
# choose_hero_caption: "Choose hero, language" # choose_hero_caption: "Choose hero, language"
# save_load_caption: "... and view history" # save_load_caption: "... and view history"
# options_caption: "Configure settings" options_caption: "Configurarea setărilor"
# guide_caption: "Docs and tips" guide_caption: "Documentație si sfaturi"
# multiplayer_caption: "Play with friends!" multiplayer_caption: "Joaca cu prieteni!"
# inventory: # inventory:
# temp: "Temp" # temp: "Temp"
@ -660,7 +662,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick poate să facă orice si a ales să dezvolte CodeCombat." nick_description: "Programming wizard, eccentric motivation mage, and upside-down experimenter. Nick poate să facă orice si a ales să dezvolte CodeCombat."
jeremy_description: "Customer support mage, usability tester, and community organizer; probabil ca ați vorbit deja cu Jeremy." jeremy_description: "Customer support mage, usability tester, and community organizer; probabil ca ați vorbit deja cu Jeremy."
michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael este cel care ține serverele in picioare." michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael este cel care ține serverele in picioare."
# matt_description: "Bicyclist, Software Engineer, reader of heroic fantasy, connoisseur of peanut butter, sipper of coffee." matt_description: "Bicyclist, Software Engineer, cititor de fantezie eroică, cunoscator de unt de arahide, sorbitor de cafea."
legal: legal:
page_title: "Aspecte Legale" page_title: "Aspecte Legale"
@ -831,9 +833,9 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
simulate_all: "RESETEAZĂ ȘI SIMULEAZĂ JOCURI" simulate_all: "RESETEAZĂ ȘI SIMULEAZĂ JOCURI"
games_simulated_by: "Jocuri simulate de tine:" games_simulated_by: "Jocuri simulate de tine:"
games_simulated_for: "Jocuri simulate pentru tine:" games_simulated_for: "Jocuri simulate pentru tine:"
# games_simulated: "Games simulated" games_simulated: "Jocuri simulate"
# games_played: "Games played" games_played: "Jocuri jucate"
# ratio: "Ratio" ratio: "Ratie"
leaderboard: "Clasament" leaderboard: "Clasament"
battle_as: "Luptă ca " battle_as: "Luptă ca "
summary_your: "Al tău " summary_your: "Al tău "
@ -852,7 +854,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
no_ranked_matches_pre: "Nici un meci de clasament pentru " no_ranked_matches_pre: "Nici un meci de clasament pentru "
no_ranked_matches_post: " echipă! Joacă împotriva unor concurenți și revino apoi aici pentr a-ți plasa meciul in clasament." no_ranked_matches_post: " echipă! Joacă împotriva unor concurenți și revino apoi aici pentr a-ți plasa meciul in clasament."
choose_opponent: "Alege un adversar" choose_opponent: "Alege un adversar"
# select_your_language: "Select your language!" select_your_language: "Alege limbă!"
tutorial_play: "Joacă Tutorial-ul" tutorial_play: "Joacă Tutorial-ul"
tutorial_recommended: "Recomandat dacă nu ai mai jucat niciodată înainte" tutorial_recommended: "Recomandat dacă nu ai mai jucat niciodată înainte"
tutorial_skip: "Sari peste Tutorial" tutorial_skip: "Sari peste Tutorial"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
campaign_multiplayer_description: "... в которых вы соревнуетесь в программировании с другими игроками." campaign_multiplayer_description: "... в которых вы соревнуетесь в программировании с другими игроками."
campaign_player_created: "Уровни игроков" campaign_player_created: "Уровни игроков"
campaign_player_created_description: "... в которых вы сражаетесь с креативностью ваших друзей <a href=\"/contribute#artisan\">Ремесленников</a>." campaign_player_created_description: "... в которых вы сражаетесь с креативностью ваших друзей <a href=\"/contribute#artisan\">Ремесленников</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Сложность: " level_difficulty: "Сложность: "
play_as: "Играть за " play_as: "Играть за "
spectate: "Наблюдать" spectate: "Наблюдать"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
delta: delta:
added: "Добавлено" added: "Добавлено"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
campaign_multiplayer_description: "... v ktorej si zmeriaš svoje programátorské sily proti ostatným hráčom." campaign_multiplayer_description: "... v ktorej si zmeriaš svoje programátorské sily proti ostatným hráčom."
campaign_player_created: "Hráčmi vytvorené úrovne" campaign_player_created: "Hráčmi vytvorené úrovne"
campaign_player_created_description: "... v ktorých sa popasuješ s kreativitou svojich <a href=\"/contribute#artisan\">kúzelníckych súdruhov</a>." campaign_player_created_description: "... v ktorých sa popasuješ s kreativitou svojich <a href=\"/contribute#artisan\">kúzelníckych súdruhov</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Obtiažnosť." level_difficulty: "Obtiažnosť."
play_as: "Hraj ako" play_as: "Hraj ako"
spectate: "Sleduj" spectate: "Sleduj"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
campaign_multiplayer_description: "... у којима кодираш 1 на 1 мечеве против осталих играча." campaign_multiplayer_description: "... у којима кодираш 1 на 1 мечеве против осталих играча."
campaign_player_created: "Направљено од стране играча" campaign_player_created: "Направљено од стране играча"
campaign_player_created_description: "... у којима се бориш против креативности својих колега." campaign_player_created_description: "... у којима се бориш против креативности својих колега."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Тежина: " level_difficulty: "Тежина: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
campaign_multiplayer_description: "... i vilken du tävlar i kodande mot andra spelare" campaign_multiplayer_description: "... i vilken du tävlar i kodande mot andra spelare"
campaign_player_created: "Spelarskapade" campaign_player_created: "Spelarskapade"
campaign_player_created_description: "... i vilken du tävlar mot kreativiteten hos andra <a href=\"/contribute#artisan\">Hantverkare</a>." campaign_player_created_description: "... i vilken du tävlar mot kreativiteten hos andra <a href=\"/contribute#artisan\">Hantverkare</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Svårighetsgrad: " level_difficulty: "Svårighetsgrad: "
play_as: "Spela som " play_as: "Spela som "
spectate: "Titta på" spectate: "Titta på"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
campaign_multiplayer_description: "Diğer oyuncularla kafa kafaya verip kodlamak için..." campaign_multiplayer_description: "Diğer oyuncularla kafa kafaya verip kodlamak için..."
campaign_player_created: "Oyuncuların Oluşturdukları" campaign_player_created: "Oyuncuların Oluşturdukları"
campaign_player_created_description: "<a href=\"/contribute#artisan\">Zanaatkâr Büyücüler</a>in yaratıcılıklarına karşı mücadele etmek için..." campaign_player_created_description: "<a href=\"/contribute#artisan\">Zanaatkâr Büyücüler</a>in yaratıcılıklarına karşı mücadele etmek için..."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Zorluk: " level_difficulty: "Zorluk: "
play_as: "Olarak Oyna" play_as: "Olarak Oyna"
spectate: "İzleyici olarak katıl" spectate: "İzleyici olarak katıl"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "українська мова", englishDesc
campaign_multiplayer_description: "... в яких ви програмуєте віч-на-віч із іншими гравцями." campaign_multiplayer_description: "... в яких ви програмуєте віч-на-віч із іншими гравцями."
campaign_player_created: "Рівні, створені гравцями" campaign_player_created: "Рівні, створені гравцями"
campaign_player_created_description: "... у яких ви змагаєтесь у креативності із вашими друзями-<a href=\"/contribute#artisan\">Архітекторами</a>." campaign_player_created_description: "... у яких ви змагаєтесь у креативності із вашими друзями-<a href=\"/contribute#artisan\">Архітекторами</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Складність: " level_difficulty: "Складність: "
play_as: "Грати як" play_as: "Грати як"
spectate: "Спостерігати" spectate: "Спостерігати"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
campaign_player_created: "Tạo người chơi" campaign_player_created: "Tạo người chơi"
# 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: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "Khó: " level_difficulty: "Khó: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
campaign_multiplayer_description: "……在这里你可以与其他玩家进行代码肉搏战。" campaign_multiplayer_description: "……在这里你可以与其他玩家进行代码肉搏战。"
campaign_player_created: "创建玩家" campaign_player_created: "创建玩家"
campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>." campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "难度:" level_difficulty: "难度:"
play_as: "Play As" play_as: "Play As"
spectate: "旁观他人的游戏" spectate: "旁观他人的游戏"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
campaign_multiplayer_description: "...在這裡你可以和其他玩家進行對戰。" campaign_multiplayer_description: "...在這裡你可以和其他玩家進行對戰。"
campaign_player_created: "玩家建立的關卡" campaign_player_created: "玩家建立的關卡"
campaign_player_created_description: "...挑戰同伴的創意 <a href=\"/contribute#artisan\">技術指導</a>." campaign_player_created_description: "...挑戰同伴的創意 <a href=\"/contribute#artisan\">技術指導</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "難度" level_difficulty: "難度"
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# campaign_multiplayer_description: "... in which you code head-to-head against other players." # campaign_multiplayer_description: "... in which you code head-to-head against other players."
# campaign_player_created: "Player-Created" # campaign_player_created: "Player-Created"
# campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>." # campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
# level_difficulty: "Difficulty: " # level_difficulty: "Difficulty: "
# play_as: "Play As" # play_as: "Play As"
# spectate: "Spectate" # spectate: "Spectate"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -123,6 +123,8 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
campaign_multiplayer_description: "……徠箇搭爾好搭別人代碼捉跤。" campaign_multiplayer_description: "……徠箇搭爾好搭別人代碼捉跤。"
campaign_player_created: "造玩家" campaign_player_created: "造玩家"
campaign_player_created_description: "……徠箇搭爾好搭爾夥計造起來個賭打 <a href=\"/contribute#artisan\">技術相幫</a>." campaign_player_created_description: "……徠箇搭爾好搭爾夥計造起來個賭打 <a href=\"/contribute#artisan\">技術相幫</a>."
# campaign_classic_algorithms: "Classic Algorithms"
# campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
level_difficulty: "難度:" level_difficulty: "難度:"
play_as: "Play As" play_as: "Play As"
spectate: "望別人攪遊戲" spectate: "望別人攪遊戲"
@ -953,6 +955,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# achievement: "Achievement" # achievement: "Achievement"
# clas: "CLAs" # clas: "CLAs"
# play_counts: "Play Counts" # play_counts: "Play Counts"
# feedback: "Feedback"
# delta: # delta:
# added: "Added" # added: "Added"

View file

@ -12,12 +12,12 @@ module.exports = class Level extends CocoModel
o = @denormalize supermodel, session o = @denormalize supermodel, session
# Figure out Components # Figure out Components
o.levelComponents = _.cloneDeep (lc.attributes for lc in supermodel.getModels LevelComponent) o.levelComponents = $.extend true, [], (lc.attributes for lc in supermodel.getModels LevelComponent)
@sortThangComponents o.thangs, o.levelComponents, 'Level Thang' @sortThangComponents o.thangs, o.levelComponents, 'Level Thang'
@fillInDefaultComponentConfiguration o.thangs, o.levelComponents @fillInDefaultComponentConfiguration o.thangs, o.levelComponents
# Figure out Systems # Figure out Systems
systemModels = _.cloneDeep (ls.attributes for ls in supermodel.getModels LevelSystem) systemModels = $.extend true, [], (ls.attributes for ls in supermodel.getModels LevelSystem)
o.systems = @sortSystems o.systems, systemModels o.systems = @sortSystems o.systems, systemModels
@fillInDefaultSystemConfiguration o.systems @fillInDefaultSystemConfiguration o.systems
@ -30,7 +30,7 @@ module.exports = class Level extends CocoModel
denormalize: (supermodel, session) -> denormalize: (supermodel, session) ->
o = $.extend true, {}, @attributes o = $.extend true, {}, @attributes
if @get('type') is 'hero' if @get('type', true) is 'hero'
# TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization. # TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization.
for levelThang in o.thangs for levelThang in o.thangs
@denormalizeThang(levelThang, supermodel, session) @denormalizeThang(levelThang, supermodel, session)
@ -93,7 +93,7 @@ module.exports = class Level extends CocoModel
system2 = _.find levelSystems, {original: d.original} system2 = _.find levelSystems, {original: d.original}
visit system2 visit system2
#console.log 'sorted systems adding', systemModel.name #console.log 'sorted systems adding', systemModel.name
sorted.push {model: systemModel, config: _.cloneDeep system.config} sorted.push {model: systemModel, config: $.extend true, {}, system.config}
originalsSeen[system.original] = true originalsSeen[system.original] = true
visit system for system in levelSystems ? [] visit system for system in levelSystems ? []
sorted sorted
@ -140,7 +140,7 @@ module.exports = class Level extends CocoModel
for component in thang.components or [] for component in thang.components or []
continue unless lc = _.find levelComponents, {original: component.original} continue unless lc = _.find levelComponents, {original: component.original}
component.config ?= {} component.config ?= {}
TreemaUtils.populateDefaults(component.config, lc.configSchema) TreemaUtils.populateDefaults(component.config, lc.configSchema, tv4)
@lastType = 'component' @lastType = 'component'
@lastOriginal = component.original @lastOriginal = component.original
@walkDefaults component.config, lc.configSchema.properties @walkDefaults component.config, lc.configSchema.properties
@ -148,7 +148,7 @@ module.exports = class Level extends CocoModel
fillInDefaultSystemConfiguration: (levelSystems) -> fillInDefaultSystemConfiguration: (levelSystems) ->
for system in levelSystems ? [] for system in levelSystems ? []
system.config ?= {} system.config ?= {}
TreemaUtils.populateDefaults(system.config, system.model.configSchema) TreemaUtils.populateDefaults(system.config, system.model.configSchema, tv4)
@lastType = 'system' @lastType = 'system'
@lastOriginal = system.model.name @lastOriginal = system.model.name
@walkDefaults system.config, system.model.configSchema.properties @walkDefaults system.config, system.model.configSchema.properties

View file

@ -7,6 +7,10 @@ module.exports = class LevelComponent extends CocoModel
@EquipsID: '53e217d253457600003e3ebb' @EquipsID: '53e217d253457600003e3ebb'
@ItemID: '53e12043b82921000051cdf9' @ItemID: '53e12043b82921000051cdf9'
@AttacksID: '524b7ba57fc0f6d519000016' @AttacksID: '524b7ba57fc0f6d519000016'
@PhysicalID: '524b75ad7fc0f6d519000001'
@ExistsID: '524b4150ff92f1f4f8000024'
@LandID: '524b7aff7fc0f6d519000006'
@CollidesID: '524b7b857fc0f6d519000012'
urlRoot: '/db/level.component' urlRoot: '/db/level.component'
set: (key, val, options) -> set: (key, val, options) ->

View file

@ -212,6 +212,11 @@ LevelSchema = c.object {
thangs: [] thangs: []
systems: [] systems: []
victory: {} victory: {}
type: 'hero'
goals: [
{id: 'ogres-die', name: 'Ogres must die.', killThangs: ['ogres'], worldEndsAfter: 3}
{id: 'humans-survive', name: 'Humans must survive.', saveThangs: ['humans'], howMany: 1, worldEndsAfter: 3, hiddenGoal: true}
]
} }
c.extendNamedProperties LevelSchema # let's have the name be the first property c.extendNamedProperties LevelSchema # let's have the name be the first property
_.extend LevelSchema.properties, _.extend LevelSchema.properties,
@ -240,6 +245,7 @@ _.extend LevelSchema.properties,
banner: {type: 'string', format: 'image-file', title: 'Banner'} banner: {type: 'string', format: 'image-file', title: 'Banner'}
goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero']) type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero'])
terrain: c.terrainString
showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always']) showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
c.extendBasicProperties LevelSchema, 'level' c.extendBasicProperties LevelSchema, 'level'

View file

@ -106,6 +106,7 @@ _.extend ThangTypeSchema.properties,
containers: c.object {title: 'Containers', additionalProperties: ContainerObjectSchema} containers: c.object {title: 'Containers', additionalProperties: ContainerObjectSchema}
animations: c.object {title: 'Animations', additionalProperties: RawAnimationObjectSchema} animations: c.object {title: 'Animations', additionalProperties: RawAnimationObjectSchema}
kind: c.shortString {enum: ['Unit', 'Floor', 'Wall', 'Doodad', 'Misc', 'Mark', 'Item'], default: 'Misc', title: 'Kind'} kind: c.shortString {enum: ['Unit', 'Floor', 'Wall', 'Doodad', 'Misc', 'Mark', 'Item'], default: 'Misc', title: 'Kind'}
terrains: c.array {title: 'Terrains', description: 'If specified, limits this ThangType to levels with matching terrains.', uniqueItems: true}, c.terrainString
actions: c.object {title: 'Actions', additionalProperties: {$ref: '#/definitions/action'}} actions: c.object {title: 'Actions', additionalProperties: {$ref: '#/definitions/action'}}
soundTriggers: c.object {title: 'Sound Triggers', additionalProperties: c.array({}, {$ref: '#/definitions/sound'})}, soundTriggers: c.object {title: 'Sound Triggers', additionalProperties: c.array({}, {$ref: '#/definitions/sound'})},

View file

@ -200,3 +200,5 @@ me.activity = me.object {description: 'Stats on an activity'},
first: me.date() first: me.date()
last: me.date() last: me.date()
count: {type: 'integer', minimum: 0} count: {type: 'integer', minimum: 0}
me.terrainString = me.shortString {enum: ['Grass', 'Dungeon', 'Indoor'], title: 'Terrain', description: 'Which terrain type this is.'}

View file

@ -43,5 +43,19 @@ module.exports =
'level:reload-thang-type': c.object {required: ['thangType']}, 'level:reload-thang-type': c.object {required: ['thangType']},
thangType: {type: 'object'} thangType: {type: 'object'}
'editor:random-terrain-generated': c.object {required: ['thangs']}, 'editor:random-terrain-generated': c.object {required: ['thangs', 'terrain']},
thangs: c.array {}, {type: 'object'} thangs: c.array {}, {type: 'object'}
terrain: c.terrainString
'editor:terrain-changed': c.object {required: ['terrain']},
terrain:
oneOf: [
c.terrainString
{type: ['null', 'undefined']}
]
'editor:thang-type-kind-changed': c.object {required: ['kind']},
kind: {type: 'string'}
'editor:thang-type-color-groups-changed': c.object {required: ['colorGroups']},
colorGroups: {type: 'object'}

View file

@ -25,7 +25,7 @@ module.exports =
viewClass: {type: 'function'} viewClass: {type: 'function'}
viewArgs: {type: 'array'} viewArgs: {type: 'array'}
'achievements:new': c.object {required: 'earnedAchievements'}, 'achievements:new': c.object {required: ['earnedAchievements']},
earnedAchievements: {type: 'object'} earnedAchievements: {type: 'object'}
'ladder:game-submitted': c.object {required: ['session', 'level']}, 'ladder:game-submitted': c.object {required: ['session', 'level']},

View file

@ -0,0 +1,76 @@
@import "../../bootstrap/mixins"
#add-thangs-view
$addPaletteIconColumns: 6
$addPaletteIconWidth: 40px
$addPaletteIconPadding: 0px
$addPaletteIconMargin: 4px
$addPaletteWidth: ($addPaletteIconWidth + 2 * $addPaletteIconPadding + 2 * $addPaletteIconMargin) * $addPaletteIconColumns + 20
width: $addPaletteWidth
background: white
box-sizing: border-box
position: absolute
right: 0
top: 0
bottom: 0
padding: 5px
border: 1px solid
input
width: 100%
margin-top: 5px
#thangs-list
position: absolute
left: 8px
top: 80px
bottom: 0px
overflow: scroll
margin: 0
h3
margin: 0 0 10px
width: 100%
h4
margin: 0 0 10px
clear: both
padding: 5px
background: rgba(150, 150, 150, 0.5)
width: $addPaletteWidth - 20px
box-sizing: border-box
.clearfix
margin-bottom: 20px
.add-thang-palette-icon
position: relative
float: left
background: white
padding: $addPaletteIconPadding
margin: $addPaletteIconMargin
cursor: pointer
width: $addPaletteIconWidth
height: $addPaletteIconWidth
img
position: absolute
width: $addPaletteIconWidth
height: $addPaletteIconWidth
transition: box-shadow 0.25s ease-out
&:hover
$hoverScaleIncreaseFactor: 0.2
outline: 1px dotted blue
img
left: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth
top: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth
width: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth
height: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth
&.selected
outline: 1px solid blue
@include box-shadow(0px 5px 25px rgba(79, 79, 213, 0.6))
background: #add8e6

View file

@ -0,0 +1,85 @@
@import "../../bootstrap/mixins"
#thangs-tab-view
$extantThangsWidth: 300px
position: absolute
top: 0
bottom: 0
overflow: hidden
left: 0
right: 0
#thangs-container-toggle
left: 0
#thangs-palette-toggle
right: 0
.toggle
position: absolute
z-index: 12
padding: 8px
.thangs-container
background: white
width: $extantThangsWidth
position: absolute
left: 0
top: 0
bottom: 0
z-index: 11
padding: 5px
border: 1px solid black
h3
text-align: right
margin: 0
.editor-nano-container
height: 90%
position: relative
top: 20px
#thangs-treema
position: absolute
top: 37px
left: 0
right: 0
bottom: 0
overflow: scroll
margin: 0
outline: thin
border: none
border-top: 1px solid black
.treema-children .treema-row *
cursor: pointer !important
.world-container
margin-left: 0
margin-right: 0
box-sizing: border-box
.world-container
position: relative
#canvas-wrapper
width: 100%
position: relative
text-align: center
#randomize-button
position: absolute
top: 45%
height: 40px
// Below snatched from play/level.sass; should refactor?
canvas#surface
background-color: #ddd
width: 100%
display: block
z-index: 1
border: 1px solid black

View file

@ -1,265 +0,0 @@
@import "../../bootstrap/mixins"
$mobile: 1050px
#editor-level-thangs-tab-view
$addPaletteIconColumns: 3
$extantThangsWidth: 300px
$addPaletteIconWidth: 40px
$addPaletteIconPadding: 0px
$addPaletteIconMargin: 4px
$addPaletteWidth: ($addPaletteIconWidth + 2 * $addPaletteIconPadding + 2 * $addPaletteIconMargin) * $addPaletteIconColumns + 20
#toggle
display: none
position: absolute
z-index: 11
left: -14px
@media screen and (max-width: $mobile)
display: block
.toggle
left: 0
.toggle
display: none
float: none
z-index: 11
position: absolute
right: -14px
z-index: 11
margin: 0
padding: 8px
@media screen and (max-width: $mobile)
display: block
.thangs-column
background-color: #E4CF8C
@media screen and (max-width: $mobile)
display: block
h3
@media screen and (max-width: $mobile)
display: none
#all-thangs
display: block
@media screen and (max-width: $mobile)
display: none
.thangs-container
width: $extantThangsWidth
position: absolute
left: 0
top: 0
bottom: 0
z-index: 11
@media screen and (max-width: $mobile)
width: auto
left: 18px
bottom: -18px
.btn-group
margin: 0
@media screen and (max-width: $mobile)
margin: 5px
h3
margin: 0 -20px 0 0
.editor-nano-container
height: 90%
position: relative
top: 20px
#thangs-treema
height: 100%
width: 100%
position: absolute
left: 0
right: 0
bottom: 0
overflow: scroll
margin: 0
outline: thin
@media screen and (max-width: $mobile)
margin: 5px
top: 40px
&.hide-except-Unit
.treema-node
display: none
.treema-node.treema-Unit
display: block
&.hide-except-Doodad
.treema-node
display: none
.treema-node.treema-Doodad
display: block
&.hide-except-Floor
.treema-node
display: none
.treema-node.treema-Floor
display: block
&.hide-except-Wall
.treema-node
display: none
.treema-node.treema-Wall
display: block
&.hide-except-Item
.treema-node
display: none
.treema-node.treema-Item
display: block
&.hide-except-Misc
.treema-node
display: none
.treema-node.treema-Misc
display: block
.treema-children .treema-row *
cursor: pointer !important
.world-container
margin-left: $extantThangsWidth
margin-right: $addPaletteWidth
@media screen and (max-width: $mobile)
margin-left: 0
margin-right: 0
padding: 0 20px
box-sizing: border-box
h3
margin: 0 -10px 0 0
text-align: center
.add-thangs-palette
width: $addPaletteWidth
box-sizing: border-box
position: absolute
right: 0
top: 0
bottom: 0
@media screen and (max-width: $mobile)
display: none
right: 18px
z-index: 11
width: $addPaletteWidth + 10
bottom: -15px
//height: auto
//padding-bottom: 10px
input
width: $addPaletteWidth
margin: 0
margin-top: 5px
padding-left: 5px
@media screen and (max-width: $mobile)
margin: 0 5px
#thangs-list-container
height: 90%
#thangs-list
position: relative
right: 0
top: 10px
bottom: 10px
overflow: scroll
height: 100%
margin: 0
@media screen and (max-width: $mobile)
margin: 0 5px
h3
margin: 0 -20px 0 0
width: 100%
h4
margin: 0 0 10px
clear: both
padding: 5px
background: rgba(150, 150, 150, 0.5)
width: $addPaletteWidth - 20px
box-sizing: border-box
.clearfix
margin-bottom: 20px
.add-thang-palette-icon
position: relative
float: left
background: white
padding: $addPaletteIconPadding
margin: $addPaletteIconMargin
cursor: pointer
width: $addPaletteIconWidth
height: $addPaletteIconWidth
img
position: absolute
width: $addPaletteIconWidth
height: $addPaletteIconWidth
transition: box-shadow 0.25s ease-out
&:hover
$hoverScaleIncreaseFactor: 0.2
outline: 1px dotted blue
img
left: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth
top: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth
width: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth
height: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth
&.selected
outline: 1px solid blue
@include box-shadow(0px 5px 25px rgba(79, 79, 213, 0.6))
background: #add8e6
.world-container
position: relative
#canvas-wrapper
width: 100%
position: relative
text-align: center
#randomize-button
position: absolute
top: 45%
height: 40px
// Below snatched from play/level.sass; should refactor?
canvas#surface
background-color: #ddd
width: 100%
display: block
z-index: 1
$GI: 0.5 // gradient intensity; can tweak this 0-1
.gradient
position: absolute
z-index: 10
#canvas-left-gradient
left: 0px
width: 5px
background: linear-gradient(to left, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%)
bottom: 0
top: 0
#canvas-top-gradient
top: 0
height: 5px
left: 0
right: 0
background: linear-gradient(to top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%)

View file

@ -18,7 +18,7 @@ block header
ul.nav.navbar-nav.nav-tabs ul.nav.navbar-nav.nav-tabs
li.active li.active
a(href="#editor-level-thangs-tab-view", data-toggle="tab", data-i18n="editor.level_tab_thangs") Thangs a(href="#thangs-tab-view", data-toggle="tab", data-i18n="editor.level_tab_thangs") Thangs
li li
a(href="#editor-level-scripts-tab-view", data-toggle="tab", data-i18n="editor.level_tab_scripts") Scripts a(href="#editor-level-scripts-tab-view", data-toggle="tab", data-i18n="editor.level_tab_scripts") Scripts
li li
@ -115,7 +115,7 @@ block header
block outer_content block outer_content
.outer-content .outer-content
div.tab-content#level-editor-tabs div.tab-content#level-editor-tabs
div.tab-pane.active#editor-level-thangs-tab-view div.tab-pane.active#thangs-tab-view
div.tab-pane#editor-level-scripts-tab-view div.tab-pane#editor-level-scripts-tab-view

View file

@ -21,3 +21,8 @@ block modal-body-content
label label
input(type="checkbox", name="queryOptions" id="#{goal.id}" value="#{goal.id}") input(type="checkbox", name="queryOptions" id="#{goal.id}" value="#{goal.id}")
span.spl= goal.name span.spl= goal.name
block modal-footer
.modal-footer
button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel
button#save-new-achievement-link.btn.btn-primary.new-model-submit(data-i18n="common.create") Create

View file

@ -0,0 +1,22 @@
button.toggle.btn-primary#thangs-container-toggle
span.icon-list
button.toggle.btn-primary#thangs-palette-toggle
span.icon-plus
.thangs-container.hide#all-thangs
h3(data-i18n="editor.level_tab_thangs_title") Current Thangs
#thangs-treema(title="Double click to configure a thang")
.world-container
#canvas-wrapper
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
li#delete
a(data-i18n="editor.delete") Delete
li#duplicate
a(data-i18n="editor.duplicate") Duplicate
canvas(width=924, height=589)#surface
#canvas-left-gradient.gradient
#canvas-top-gradient.gradient
#add-thangs-view
#level-thang-edit-view.secret

View file

@ -1,39 +0,0 @@
div#toggle
button.navbar-toggle.toggle.btn-primary#thangs-container-toggle(type="button", data-toggle="collapse", data-target="#all-thangs")
span.icon-list
button.navbar-toggle.toggle.btn-primary#thangs-palette-toggle(type="button", data-toggle="collapse", data-target="#add-thangs-column")
span.icon-plus
.thangs-container.thangs-column#all-thangs
h3(data-i18n="editor.level_tab_thangs_title") Current Thangs
.btn-group(data-toggle="buttons-radio")#extant-thangs-filter
button.btn.btn-primary(data-i18n="editor.level_tab_thangs_all") All
button.btn.btn-primary(value="Unit", title="Unit")
i.icon-user
button.btn.btn-primary(value="Wall", title="Wall")
i.icon-home
button.btn.btn-primary(value="Floor", title="Floor")
i.icon-globe
button.btn.btn-primary(value="Doodad", title="Doodad")
i.icon-leaf
button.btn.btn-primary(value="Item", title="Item")
i.icon-gift
button.btn.btn-primary(value="Misc", title="Misc")
i.icon-question-sign
.editor-nano-container.nano
#thangs-treema.nano-content(title="Double click to configure a thang")
.world-container.thangs-column
h3(data-i18n="editor.level_tab_thangs_conditions") Starting Conditions
#canvas-wrapper
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
li#delete
a(data-i18n="editor.delete") Delete
li#duplicate
a(data-i18n="editor.duplicate") Duplicate
canvas(width=924, height=589)#surface
#canvas-left-gradient.gradient
#canvas-top-gradient.gradient
.add-thangs-palette.thangs-column#add-thangs-column
#level-thang-edit-view.secret

View file

@ -8,8 +8,9 @@ block modal-body-content
- if (!showDevBits) { // Not done yet. - if (!showDevBits) { // Not done yet.
- submenus.splice(4, 1); - submenus.splice(4, 1);
- submenus.splice(2, 1); - submenus.splice(2, 1);
- submenus.splice(0, 1);
- } - }
- if (!showInventory)
- submenus.splice(0, 1);
ul.nav.nav-tabs ul.nav.nav-tabs
for submenu, index in submenus for submenu, index in submenus
li(class=index ? "" : "active") li(class=index ? "" : "active")
@ -19,10 +20,6 @@ block modal-body-content
.tab-content .tab-content
for submenu, index in submenus for submenu, index in submenus
.tab-pane(id=submenu + '-view') .tab-pane(id=submenu + '-view')
h3= submenu + submenu + submenu
p
| Lorem ipsum dolor sit amet, charetra varius quam sit amet vulputate.
| Quisque mauris augue, molestie tincidunt condimentum vitae, gravida a libero.
.clearfix .clearfix
block modal-footer block modal-footer

View file

@ -19,7 +19,8 @@ block modal-body-content
tr tr
td td
input(type="checkbox", value=data._id).select input(type="checkbox", value=data._id).select
td #{data.version.major}.#{data.version.minor} td
a(href="/editor/#{page}/#{data._id}") #{data.version.major}.#{data.version.minor}
td= moment(data.created).format('l') td= moment(data.created).format('l')
td= data.creator td= data.creator
td #{data.commitMessage} td #{data.commitMessage}

View file

@ -12,6 +12,28 @@ nodes = require '../level/treema_nodes'
ThangType = require 'models/ThangType' ThangType = require 'models/ThangType'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
LC = (componentName, config) -> original: LevelComponent[componentName + 'ID'], majorVersion: 0, config: config
DEFAULT_COMPONENTS =
Unit: [LC('Equips')]
Floor: [
LC('Exists', stateless: true)
LC('Physical', width: 20, height: 17, depth: 2, shape: 'sheet', pos: {x: 10, y: 8.5, z: 1})
LC('Land')
]
Wall: [
LC('Exists', stateless: true)
LC('Physical', width: 4, height: 4, depth: 12, shape: 'box', pos: {x: 2, y: 2, z: 6})
LC('Collides', collisionType: 'static', collisionCategory: 'obstacles', mass: 1000, fixedRotation: true, restitution: 1)
]
Doodad: [
LC('Exists', stateless: true)
LC('Physical')
LC('Collides', collisionType: 'static', fixedRotation: true)
]
Misc: [LC('Exists'), LC('Physical')]
Mark: []
Item: [LC('Item')]
class ItemThangTypeSearchCollection extends CocoCollection class ItemThangTypeSearchCollection extends CocoCollection
url: '/db/thang.type?view=items&project=original,name,version,slug,kind,components' url: '/db/thang.type?view=items&project=original,name,version,slug,kind,components'
model: ThangType model: ThangType
@ -20,6 +42,9 @@ module.exports = class ThangComponentsEditView extends CocoView
id: 'thang-components-edit-view' id: 'thang-components-edit-view'
template: template template: template
subscriptions:
'editor:thang-type-kind-changed': 'onThangTypeKindChanged'
events: events:
'click #add-components-button': 'onAddComponentsButtonClicked' 'click #add-components-button': 'onAddComponentsButtonClicked'
@ -345,6 +370,12 @@ module.exports = class ThangComponentsEditView extends CocoView
@components = @components.concat(sparseComponents) @components = @components.concat(sparseComponents)
@onComponentsChanged() @onComponentsChanged()
onThangTypeKindChanged: (e) ->
return unless defaultComponents = DEFAULT_COMPONENTS[e.kind]
for component in defaultComponents when not _.find(@components, original: component.original)
@components.push component
@onComponentsAdded()
destroy: -> destroy: ->
@componentsTreema?.destroy() @componentsTreema?.destroy()
super() super()

View file

@ -35,7 +35,9 @@ module.exports = class RelatedAchievementsView extends CocoView
c c
onNewAchievementSaved: (achievement) -> onNewAchievementSaved: (achievement) ->
app.router.navigate('/editor/achievement/' + (achievement.get('slug') or achievement.id), {trigger: true}) # We actually open the new tab in NewAchievementModal, so we don't replace this window.
#url = '/editor/achievement/' + (achievement.get('slug') or achievement.id)
#app.router.navigate(, {trigger: true}) # Let's open a new tab instead.
makeNewAchievement: -> makeNewAchievement: ->
modal = new NewAchievementModal model: Achievement, modelLabel: 'Achievement', level: @level modal = new NewAchievementModal model: Achievement, modelLabel: 'Achievement', level: @level

View file

@ -8,6 +8,9 @@ module.exports = class NewAchievementModal extends NewModelModal
template: template template: template
plain: false plain: false
events:
'click #save-new-achievement-link': 'onAchievementSubmitted'
constructor: (options) -> constructor: (options) ->
super options super options
@level = options.level @level = options.level
@ -18,6 +21,11 @@ module.exports = class NewAchievementModal extends NewModelModal
console.debug 'level', c.level console.debug 'level', c.level
c c
onAchievementSubmitted: (e) ->
slug = _.string.slugify @$el.find('#name').val()
url = "/editor/achievement/#{slug}"
window.open url, '_blank'
createQuery: -> createQuery: ->
checked = @$el.find('[name=queryOptions]:checked') checked = @$el.find('[name=queryOptions]:checked')
checkedValues = ($(check).val() for check in checked) checkedValues = ($(check).val() for check in checked)

View file

@ -3,17 +3,21 @@ template = require 'templates/editor/level/modal/terrain_randomize'
CocoModel = require 'models/CocoModel' CocoModel = require 'models/CocoModel'
clusters = { clusters = {
'hero': {
'thangs': ['Hero Placeholder']
'margin': 1
}
'rocks': { 'rocks': {
'thangs': ['Rock 1', 'Rock 2', 'Rock 3', 'Rock 4', 'Rock 5', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3'] 'thangs': ['Rock 1', 'Rock 2', 'Rock 3', 'Rock 4', 'Rock 5', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3']
'margin': 1 'margin': 1
} }
'trees': { 'trees': {
'thangs': ['Tree 1', 'Tree 2', 'Tree 3', 'Tree 4'] 'thangs': ['Tree 1', 'Tree 2', 'Tree 3', 'Tree 4']
'margin': 0 'margin': 0.5
} }
'shrubs': { 'shrubs': {
'thangs': ['Shrub 1', 'Shrub 2', 'Shrub 3'] 'thangs': ['Shrub 1', 'Shrub 2', 'Shrub 3']
'margin': 0 'margin': 0.5
} }
'houses': { 'houses': {
'thangs': ['House 1', 'House 2', 'House 3', 'House 4'] 'thangs': ['House 1', 'House 2', 'House 3', 'House 4']
@ -83,6 +87,7 @@ clusters = {
presets = { presets = {
'dungeon': { 'dungeon': {
'terrainName': 'Dungeon'
'type':'dungeon' 'type':'dungeon'
'borders':'dungeon_wall' 'borders':'dungeon_wall'
'borderNoise':0 'borderNoise':0
@ -97,6 +102,14 @@ presets = {
'thickness': [2,2] 'thickness': [2,2]
'cluster': 'dungeon_wall' 'cluster': 'dungeon_wall'
} }
'hero': {
'num': [1, 1]
'width': 2
'height': 2
'clusters': {
'hero': [1, 1]
}
}
'Barrels': { 'Barrels': {
'num': [1,1] 'num': [1,1]
'width': [8, 12] 'width': [8, 12]
@ -116,6 +129,7 @@ presets = {
} }
} }
'indoor': { 'indoor': {
'terrainName': 'Indoor'
'type':'indoor' 'type':'indoor'
'borders':'indoor_wall' 'borders':'indoor_wall'
'borderNoise':0 'borderNoise':0
@ -130,6 +144,14 @@ presets = {
'thickness': [2,2] 'thickness': [2,2]
'cluster': 'indoor_wall' 'cluster': 'indoor_wall'
} }
'hero': {
'num': [1, 1]
'width': 2
'height': 2
'clusters': {
'hero': [1, 1]
}
}
'furniture': { 'furniture': {
'num':[1,2] 'num':[1,2]
'width': 15 'width': 15
@ -141,6 +163,7 @@ presets = {
} }
} }
'grassy': { 'grassy': {
'terrainName': 'Grass'
'type':'grassy' 'type':'grassy'
'borders':'trees' 'borders':'trees'
'borderNoise':1 'borderNoise':1
@ -148,6 +171,14 @@ presets = {
'borderThickness':3 'borderThickness':3
'floors':'grass_floor' 'floors':'grass_floor'
'decorations': { 'decorations': {
'hero': {
'num': [1, 1]
'width': 2
'height': 2
'clusters': {
'hero': [1, 1]
}
}
'house': { 'house': {
'num':[1,2] #min-max 'num':[1,2] #min-max
'width': 15 'width': 15
@ -195,8 +226,8 @@ thangSizes = {
'borderSize': { 'borderSize': {
'x':4 'x':4
'y':4 'y':4
} }}
}
module.exports = class TerrainRandomizeModal extends ModalView module.exports = class TerrainRandomizeModal extends ModalView
id: 'terrain-randomize-modal' id: 'terrain-randomize-modal'
@ -215,7 +246,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
presetType = target.attr 'data-preset-type' presetType = target.attr 'data-preset-type'
presetSize = target.attr 'data-preset-size' presetSize = target.attr 'data-preset-size'
@randomizeThangs presetType, presetSize @randomizeThangs presetType, presetSize
Backbone.Mediator.publish 'editor:random-terrain-generated', thangs: @thangs Backbone.Mediator.publish 'editor:random-terrain-generated', thangs: @thangs, terrain: presets[presetType].terrainName
@hide() @hide()
randomizeThangs: (presetName, presetSize) -> randomizeThangs: (presetName, presetSize) ->
@ -280,7 +311,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
'id': @getRandomThang(clusters['torch'].thangs) 'id': @getRandomThang(clusters['torch'].thangs)
'pos': { 'pos': {
'x': i + preset.borderSize 'x': i + preset.borderSize
'y': presetSize.y - preset.borderSize 'y': presetSize.y - preset.borderSize / 2
} }
'margin': clusters['torch'].margin 'margin': clusters['torch'].margin
} }
@ -289,7 +320,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
'id': @getRandomThang(clusters['chains'].thangs) 'id': @getRandomThang(clusters['chains'].thangs)
'pos': { 'pos': {
'x': i + preset.borderSize 'x': i + preset.borderSize
'y': presetSize.y - preset.borderSize 'y': presetSize.y - preset.borderSize / 2
} }
'margin': clusters['chains'].margin 'margin': clusters['chains'].margin
} }
@ -346,53 +377,57 @@ module.exports = class TerrainRandomizeModal extends ModalView
continue continue
buildRoom: (preset, presetSize, room) -> buildRoom: (preset, presetSize, room) ->
grid = preset.borderSize
while true while true
rect = { rect = {
'width':presetSize.sizeFactor * (room.width[0] + preset.borderSize * _.random(0, (room.width[1] - room.width[0])/preset.borderSize)) 'width':presetSize.sizeFactor * (room.width[0] + grid * _.random(0, (room.width[1] - room.width[0])/grid))
'height':presetSize.sizeFactor * (room.height[0] + preset.borderSize * _.random(0, (room.height[1] - room.height[0])/preset.borderSize)) 'height':presetSize.sizeFactor * (room.height[0] + grid * _.random(0, (room.height[1] - room.height[0])/grid))
} }
# This logic isn't quite right--it makes the rooms bigger than intended--but it's snapping correctly, which is fine for now.
rect.width = Math.round((rect.width - grid) / (2 * grid)) * 2 * grid + grid
rect.height = Math.round((rect.height - grid) / (2 * grid)) * 2 * grid + grid
roomThickness = _.random(room.thickness[0], room.thickness[1]) roomThickness = _.random(room.thickness[0], room.thickness[1])
rect.x = _.random(rect.width/2 + preset.borderSize * (roomThickness+1.5), presetSize.x - rect.width/2 - preset.borderSize * (roomThickness+1.5)) rect.x = _.random(rect.width/2 + grid * (roomThickness+1.5), presetSize.x - rect.width/2 - grid * (roomThickness+1.5))
rect.y = _.random(rect.height/2 + preset.borderSize * (roomThickness+2.5), presetSize.y - rect.height/2 - preset.borderSize * (roomThickness+3.5)) rect.y = _.random(rect.height/2 + grid * (roomThickness+2.5), presetSize.y - rect.height/2 - grid * (roomThickness+3.5))
# Snap room walls to the wall grid. # Snap room walls to the wall grid.
rect.x = Math.round((rect.x - preset.borderSize / 2) / preset.borderSize) * preset.borderSize + preset.borderSize / 2 rect.x = Math.round((rect.x - grid / 2) / grid) * grid
rect.y = Math.round((rect.y - preset.borderSize / 2) / preset.borderSize) * preset.borderSize + preset.borderSize / 2 rect.y = Math.round((rect.y - grid / 2) / grid) * grid
break if @addRect { break if @addRect {
'x': rect.x 'x': rect.x
'y': rect.y 'y': rect.y
'width': rect.width + 2.5 * roomThickness * preset.borderSize 'width': rect.width + 2.5 * roomThickness * grid
'height': rect.height + 2.5 * roomThickness * preset.borderSize 'height': rect.height + 2.5 * roomThickness * grid
} }
xRange = _.range(rect.x - rect.width/2 + preset.borderSize, rect.x + rect.width/2, preset.borderSize) xRange = _.range(rect.x - rect.width/2 + grid, rect.x + rect.width/2, grid)
topDoor = _.random(1) > 0.5 topDoor = _.random(1) > 0.5
topDoorX = xRange[_.random(0, xRange.length-1)] topDoorX = xRange[_.random(0, xRange.length-1)]
bottomDoor = if not topDoor then true else _.random(1) > 0.5 bottomDoor = if not topDoor then true else _.random(1) > 0.5
bottomDoorX = xRange[_.random(0, xRange.length-1)] bottomDoorX = xRange[_.random(0, xRange.length-1)]
for t in _.range(0, roomThickness+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) for i in _.range(rect.x - rect.width/2 - (t-1) * grid, rect.x + rect.width/2 + t * grid, grid)
# Bottom wall # Bottom wall
thang = { thang = {
'id': @getRandomThang(clusters[room.cluster].thangs) 'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': { 'pos': {
'x': i 'x': i
'y': rect.y - rect.height/2 - t * preset.borderSize 'y': rect.y - rect.height/2 - t * grid
} }
'margin': clusters[room.cluster].margin 'margin': clusters[room.cluster].margin
} }
if i is bottomDoorX and bottomDoor if i is bottomDoorX and bottomDoor
thang.id = @getRandomThang(clusters['doors'].thangs) thang.id = @getRandomThang(clusters['doors'].thangs)
thang.pos.y -= preset.borderSize/3 thang.pos.y -= grid/3
@addThang thang unless i is bottomDoorX and t isnt roomThickness and bottomDoor @addThang thang unless i is bottomDoorX and t isnt roomThickness and bottomDoor
if t is roomThickness and i isnt rect.x - rect.width/2 - (t-1) * preset.borderSize and preset.type is 'dungeon' if t is roomThickness and i isnt rect.x - rect.width/2 - (t-1) * grid and preset.type is 'dungeon'
if ( i isnt bottomDoorX and i isnt bottomDoorX + preset.borderSize ) or not bottomDoor if ( i isnt bottomDoorX and i isnt bottomDoorX + grid ) or not bottomDoor
@addThang { @addThang {
'id': @getRandomThang(clusters['torch'].thangs) 'id': @getRandomThang(clusters['torch'].thangs)
'pos': { 'pos': {
'x': thang.pos.x - preset.borderSize / 2 'x': thang.pos.x - grid / 2
'y': thang.pos.y + preset.borderSize / 2 'y': thang.pos.y + grid
} }
'margin': clusters['torch'].margin 'margin': clusters['torch'].margin
} }
@ -402,22 +437,22 @@ module.exports = class TerrainRandomizeModal extends ModalView
'id': @getRandomThang(clusters[room.cluster].thangs) 'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': { 'pos': {
'x': i 'x': i
'y': rect.y + rect.height/2 + t * preset.borderSize 'y': rect.y + rect.height/2 + t * grid
} }
'margin': clusters[room.cluster].margin 'margin': clusters[room.cluster].margin
} }
if i is topDoorX and topDoor if i is topDoorX and topDoor
thang.id = @getRandomThang(clusters['doors'].thangs) thang.id = @getRandomThang(clusters['doors'].thangs)
thang.pos.y -= preset.borderSize thang.pos.y -= grid
@addThang thang unless i is topDoorX and t isnt roomThickness and topDoor @addThang thang unless i is topDoorX and t isnt roomThickness and topDoor
for t in _.range(0, roomThickness) 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) for i in _.range(rect.y - rect.height/2 - t * grid, rect.y + rect.height/2 + (t+1) * grid, grid)
# Left wall # Left wall
@addThang { @addThang {
'id': @getRandomThang(clusters[room.cluster].thangs) 'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': { 'pos': {
'x': rect.x - rect.width/2 - t * preset.borderSize 'x': rect.x - rect.width/2 - t * grid
'y': i 'y': i
} }
'margin': clusters[room.cluster].margin 'margin': clusters[room.cluster].margin
@ -427,7 +462,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
@addThang { @addThang {
'id': @getRandomThang(clusters[room.cluster].thangs) 'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': { 'pos': {
'x': rect.x + rect.width/2 + t * preset.borderSize 'x': rect.x + rect.width/2 + t * grid
'y': i 'y': i
} }
'margin': clusters[room.cluster].margin 'margin': clusters[room.cluster].margin

View file

@ -13,12 +13,13 @@ module.exports = class SettingsTabView extends CocoView
# not thangs or scripts or the backend stuff # not thangs or scripts or the backend stuff
editableSettings: [ editableSettings: [
'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals', 'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals',
'type', 'showsGuide', 'banner', 'employerDescription' 'type', 'terrain', 'showsGuide', 'banner', 'employerDescription'
] ]
subscriptions: subscriptions:
'editor:level-loaded': 'onLevelLoaded' 'editor:level-loaded': 'onLevelLoaded'
'editor:thangs-edited': 'onThangsEdited' 'editor:thangs-edited': 'onThangsEdited'
'editor:random-terrain-generated': 'onRandomTerrainGenerated'
constructor: (options) -> constructor: (options) ->
super options super options
@ -47,6 +48,7 @@ module.exports = class SettingsTabView extends CocoView
@settingsTreema = @$el.find('#settings-treema').treema treemaOptions @settingsTreema = @$el.find('#settings-treema').treema treemaOptions
@settingsTreema.build() @settingsTreema.build()
@settingsTreema.open() @settingsTreema.open()
@lastTerrain = data.terrain
getThangIDs: -> getThangIDs: ->
(t.id for t in @level.get('thangs') ? []) (t.id for t in @level.get('thangs') ? [])
@ -56,11 +58,17 @@ 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]
if (terrain = @settingsTreema.data.terrain) isnt @lastTerrain
@lastTerrain = terrain
Backbone.Mediator.publish 'editor:terrain-changed', terrain: terrain
onThangsEdited: (e) -> onThangsEdited: (e) ->
# Update in-place so existing Treema nodes refer to the same array. # Update in-place so existing Treema nodes refer to the same array.
@thangIDs?.splice(0, @thangIDs.length, @getThangIDs()...) @thangIDs?.splice(0, @thangIDs.length, @getThangIDs()...)
onRandomTerrainGenerated: (e) ->
@settingsTreema.set '/terrain', e.terrain
destroy: -> destroy: ->
@settingsTreema?.destroy() @settingsTreema?.destroy()
super() super()

View file

@ -17,6 +17,7 @@ module.exports = class SystemsTabView extends CocoView
'editor:edit-level-system': 'editLevelSystem' 'editor:edit-level-system': 'editLevelSystem'
'editor:level-system-editing-ended': 'onLevelSystemEditingEnded' 'editor:level-system-editing-ended': 'onLevelSystemEditingEnded'
'editor:level-loaded': 'onLevelLoaded' 'editor:level-loaded': 'onLevelLoaded'
'editor:terrain-changed': 'onTerrainChanged'
events: events:
'click #add-system-button': 'addLevelSystem' 'click #add-system-button': 'addLevelSystem'
@ -103,6 +104,20 @@ module.exports = class SystemsTabView extends CocoView
@removeSubView @levelSystemEditView @removeSubView @levelSystemEditView
@levelSystemEditView = null @levelSystemEditView = null
onTerrainChanged: (e) ->
defaultPathfinding = e.terrain in ['Dungeon', 'Indoor']
return unless AI = @systemsTreema.get 'original=528110f30268d018e3000001'
return if AI.config?.findsPaths is defaultPathfinding
AI.config ?= {}
AI.config.findsPaths = defaultPathfinding
@systemsTreema.set 'original=528110f30268d018e3000001', AI
noty {
text: "AI System defaulted pathfinding to #{defaultPathfinding} for terrain #{e.terrain}."
layout: 'topCenter'
timeout: 5000
type: 'information'
}
buildDefaultSystems: -> buildDefaultSystems: ->
[ [
{original: '528112c00268d018e3000008', majorVersion: 0} # Event {original: '528112c00268d018e3000008', majorVersion: 0} # Event
@ -120,6 +135,9 @@ module.exports = class SystemsTabView extends CocoView
{original: '528111b30268d018e3000004', majorVersion: 0} # Alliance {original: '528111b30268d018e3000004', majorVersion: 0} # Alliance
{original: '528114e60268d018e300001a', majorVersion: 0} # UI {original: '528114e60268d018e300001a', majorVersion: 0} # UI
{original: '528114040268d018e3000011', majorVersion: 0} # Physics {original: '528114040268d018e3000011', majorVersion: 0} # Physics
{original: '52ae4f02a4dcd4415200000b', majorVersion: 0} # Display
{original: '52e953e81b2028d102000004', majorVersion: 0} # Effect
{original: '52f1354370fb890000000005', majorVersion: 0} # Magic
] ]
destroy: -> destroy: ->
@ -146,8 +164,9 @@ class LevelSystemNode extends TreemaObjectNode
buildValueForDisplay: (valEl, data) -> buildValueForDisplay: (valEl, data) ->
return super valEl unless data.original and @system return super valEl unless data.original and @system
name = "#{@system.get('name')} v#{@system.get('version').major}" name = @system.get 'name'
@buildValueForDisplaySimply valEl, "#{name}" name += " v#{@system.get('version').major}" if @system.get('version').major
@buildValueForDisplaySimply valEl, name
onEnterPressed: (e) -> onEnterPressed: (e) ->
super e super e

View file

@ -1,5 +1,5 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
add_thangs_template = require 'templates/editor/level/add_thangs' add_thangs_template = require 'templates/editor/level/add-thangs-view'
ThangType = require 'models/ThangType' ThangType = require 'models/ThangType'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
@ -11,8 +11,8 @@ class ThangTypeSearchCollection extends CocoCollection
@url += "&term=#{term}" if term @url += "&term=#{term}" if term
module.exports = class AddThangsView extends CocoView module.exports = class AddThangsView extends CocoView
id: 'add-thangs-column' id: 'add-thangs-view'
className: 'add-thangs-palette thangs-column' className: 'add-thangs-palette hide'
template: add_thangs_template template: add_thangs_template
events: events:

View file

@ -1,6 +1,6 @@
CocoView = require 'views/kinds/CocoView' CocoView = require 'views/kinds/CocoView'
AddThangsView = require './AddThangsView' AddThangsView = require './AddThangsView'
thangs_template = require 'templates/editor/level/thangs_tab' thangs_template = require 'templates/editor/level/thangs-tab-view'
Level = require 'models/Level' Level = require 'models/Level'
ThangType = require 'models/ThangType' ThangType = require 'models/ThangType'
LevelComponent = require 'models/LevelComponent' LevelComponent = require 'models/LevelComponent'
@ -15,17 +15,15 @@ ComponentsCollection = require 'collections/ComponentsCollection'
MOVE_MARGIN = 0.15 MOVE_MARGIN = 0.15
MOVE_SPEED = 13 MOVE_SPEED = 13
# Essential component original ids # Let us place these on top of other Thangs
componentOriginals = overlappableThangTypeNames = ['Torch', 'Chains', 'Bird', 'Cloud 1', 'Cloud 2', 'Cloud 3', 'Waterfall', 'Obstacle']
'existence.Exists': '524b4150ff92f1f4f8000024'
'physics.Physical': '524b75ad7fc0f6d519000001'
class ThangTypeSearchCollection extends CocoCollection class ThangTypeSearchCollection extends CocoCollection
url: '/db/thang.type?project=original,name,version,slug,kind,components' url: '/db/thang.type?project=original,name,version,slug,kind,components'
model: ThangType model: ThangType
module.exports = class ThangsTabView extends CocoView module.exports = class ThangsTabView extends CocoView
id: 'editor-level-thangs-tab-view' id: 'thangs-tab-view'
className: 'tab-pane active' className: 'tab-pane active'
template: thangs_template template: thangs_template
@ -40,6 +38,7 @@ module.exports = class ThangsTabView extends CocoView
'editor:view-switched': 'onViewSwitched' 'editor:view-switched': 'onViewSwitched'
'sprite:dragged': 'onSpriteDragged' 'sprite:dragged': 'onSpriteDragged'
'sprite:mouse-up': 'onSpriteMouseUp' 'sprite:mouse-up': 'onSpriteMouseUp'
'sprite:mouse-down': 'onSpriteMouseDown'
'sprite:double-clicked': 'onSpriteDoubleClicked' 'sprite:double-clicked': 'onSpriteDoubleClicked'
'surface:stage-mouse-up': 'onStageMouseUp' 'surface:stage-mouse-up': 'onStageMouseUp'
'editor:random-terrain-generated': 'onRandomTerrainGenerated' 'editor:random-terrain-generated': 'onRandomTerrainGenerated'
@ -49,7 +48,7 @@ module.exports = class ThangsTabView extends CocoView
'click #delete': 'onDeleteClicked' 'click #delete': 'onDeleteClicked'
'click #duplicate': 'onDuplicateClicked' 'click #duplicate': 'onDuplicateClicked'
'click #thangs-container-toggle': 'toggleThangsContainer' 'click #thangs-container-toggle': 'toggleThangsContainer'
# 'click #thangs-palette-toggle': 'toggleThangsPalette' 'click #thangs-palette-toggle': 'toggleThangsPalette'
# 'click .add-thang-palette-icon': 'toggleThangsPalette' # 'click .add-thang-palette-icon': 'toggleThangsPalette'
shortcuts: shortcuts:
@ -96,17 +95,6 @@ module.exports = class ThangsTabView extends CocoView
context.groups = groups context.groups = groups
context context
onWindowResize: (e) ->
$('#thangs-list').height('100%')
thangsHeaderHeight = $('#thangs-header').height()
oldHeight = $('#thangs-list').height()
if $(document).width() < 1050
$('#thangs-list').height(oldHeight - thangsHeaderHeight - 40)
else
$('#thangs-list').height(oldHeight - thangsHeaderHeight - 80)
$('#all-thangs').collapse 'show'
$('#add-thangs-column').collapse 'show'
undo: (e) -> undo: (e) ->
if not @editThangView then @thangsTreema.undo() else @editThangView.undo() if not @editThangView then @thangsTreema.undo() else @editThangView.undo()
@ -190,10 +178,11 @@ module.exports = class ThangsTabView extends CocoView
super() super()
onViewSwitched: (e) -> onViewSwitched: (e) ->
@selectAddThang() @selectAddThang null, true
@surface?.spriteBoss?.selectSprite null, null @surface?.spriteBoss?.selectSprite null, null
onSpriteMouseDown: (e) -> onSpriteMouseDown: (e) ->
@dragged = false
# Sprite clicks happen after stage clicks, but we need to know whether a sprite is being clicked. # Sprite clicks happen after stage clicks, but we need to know whether a sprite is being clicked.
# clearTimeout @backgroundAddClickTimeout # clearTimeout @backgroundAddClickTimeout
# if e.originalEvent.nativeEvent.button == 2 # if e.originalEvent.nativeEvent.button == 2
@ -208,6 +197,7 @@ module.exports = class ThangsTabView extends CocoView
onSpriteDragged: (e) -> onSpriteDragged: (e) ->
return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id
@dragged = true
@surface.camera.dragDisabled = true @surface.camera.dragDisabled = true
{stageX, stageY} = e.originalEvent {stageX, stageY} = e.originalEvent
wop = @surface.camera.screenToWorld x: stageX, y: stageY wop = @surface.camera.screenToWorld x: stageX, y: stageY
@ -226,14 +216,13 @@ module.exports = class ThangsTabView extends CocoView
@surface.camera.dragDisabled = false @surface.camera.dragDisabled = false
return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id
pos = @selectedExtantThang.pos pos = @selectedExtantThang.pos
physicalOriginal = componentOriginals['physics.Physical'] path = "id=#{@selectedExtantThang.id}/components/original=#{LevelComponent.PhysicalID}"
path = "id=#{@selectedExtantThang.id}/components/original=#{physicalOriginal}" # TODO: hack
physical = @thangsTreema.get path physical = @thangsTreema.get path
return if not physical or (physical.config.pos.x is pos.x and physical.config.pos.y is pos.y) return if not physical or (physical.config.pos.x is pos.x and physical.config.pos.y is pos.y)
@thangsTreema.set path + '/config/pos', x: pos.x, y: pos.y, z: pos.z @thangsTreema.set path + '/config/pos', x: pos.x, y: pos.y, z: pos.z
onSpriteDoubleClicked: (e) -> onSpriteDoubleClicked: (e) ->
return unless e.thang return unless e.thang and not @dragged
@editThang thangID: e.thang.id @editThang thangID: e.thang.id
onRandomTerrainGenerated: (e) -> onRandomTerrainGenerated: (e) ->
@ -255,9 +244,12 @@ module.exports = class ThangsTabView extends CocoView
if e.thang and (key.alt or key.meta) if e.thang and (key.alt or key.meta)
# We alt-clicked, so create a clone addThang # We alt-clicked, so create a clone addThang
@selectAddThangType e.thang.spriteName, @selectedExtantThang @selectAddThangType e.thang.spriteName, @selectedExtantThang
else if e.thang and not (@addThangSprite and @addThangType is 'Blood Torch Test') # TODO: figure out which Thangs can be placed on other Thangs else if @justAdded()
# Skip double insert due to extra selection event
null
else if e.thang and not (@addThangSprite and @addThangType.get('name') in overlappableThangTypeNames)
# We clicked on a Thang (or its Treema), so select the Thang # We clicked on a Thang (or its Treema), so select the Thang
@selectAddThang null @selectAddThang null, true
@selectedExtantThangClickTime = new Date() @selectedExtantThangClickTime = new Date()
treemaThang = _.find @thangsTreema.childrenTreemas, (treema) => treema.data.id is @selectedExtantThang.id treemaThang = _.find @thangsTreema.childrenTreemas, (treema) => treema.data.id is @selectedExtantThang.id
if treemaThang if treemaThang
@ -270,16 +262,13 @@ module.exports = class ThangsTabView extends CocoView
else if @addThangSprite else if @addThangSprite
# We clicked on the background when we had an add Thang selected, so add it # We clicked on the background when we had an add Thang selected, so add it
@addThang @addThangType, @addThangSprite.thang.pos @addThang @addThangType, @addThangSprite.thang.pos
@lastAddTime = new Date()
# Commented out this bit so the extant thangs treema editor can select invisible thangs like arrows. justAdded: -> @lastAddTime and (new Date() - @lastAddTime) < 150
# Couldn't spot any bugs... But if there are any, better come up with a better solution.
# else
# # We clicked on the background, so deselect anything selected
# @thangsTreema.deselectAll()
selectAddThang: (e) => selectAddThang: (e, forceDeselect=false) =>
return if e? and $(e.target).closest('#thang-search').length # Ignore if you're trying to search thangs return if e? and $(e.target).closest('#thang-search').length # Ignore if you're trying to search thangs
return unless e? and $(e.target).closest('#editor-level-thangs-tab-view').length or key.isPressed('esc') return unless (e? and $(e.target).closest('#thangs-tab-view').length) or key.isPressed('esc') or forceDeselect
if e then target = $(e.target) else target = @$el.find('.add-thangs-palette') # pretend to click on background if no event if e then target = $(e.target) else target = @$el.find('.add-thangs-palette') # pretend to click on background if no event
return true if target.attr('id') is 'surface' return true if target.attr('id') is 'surface'
target = target.closest('.add-thang-palette-icon') target = target.closest('.add-thang-palette-icon')
@ -316,11 +305,11 @@ module.exports = class ThangsTabView extends CocoView
createEssentialComponents: (defaultComponents) -> createEssentialComponents: (defaultComponents) ->
physicalConfig = {pos: {x: 10, y: 10, z: 1}} physicalConfig = {pos: {x: 10, y: 10, z: 1}}
if physicalOriginal = _.find(defaultComponents ? [], original: componentOriginals['physics.Physical']) if physicalOriginal = _.find(defaultComponents ? [], original: LevelComponent.PhysicalID)
physicalConfig.pos.z = physicalOriginal.config?.pos?.z ? 1 # Get the z right physicalConfig.pos.z = physicalOriginal.config?.pos?.z ? 1 # Get the z right
[ [
{original: componentOriginals['existence.Exists'], majorVersion: 0, config: {}} {original: LevelComponent.ExistsID, majorVersion: 0, config: {}}
{original: componentOriginals['physics.Physical'], majorVersion: 0, config: physicalConfig} {original: LevelComponent.PhysicalID, majorVersion: 0, config: physicalConfig}
] ]
createAddThang: -> createAddThang: ->
@ -405,6 +394,11 @@ module.exports = class ThangsTabView extends CocoView
thang.isSelectable = not thang.isLand for thang in @world.thangs # let us select walls and such thang.isSelectable = not thang.isLand for thang in @world.thangs # let us select walls and such
@surface?.setWorld @world @surface?.setWorld @world
@selectAddThangType @addThangType, @cloneSourceThang if @addThangType # make another addThang sprite, since the World just refreshed @selectAddThangType @addThangType, @cloneSourceThang if @addThangType # make another addThang sprite, since the World just refreshed
# update selection, since the thangs have been remade
if @selectedExtantThang
@selectedExtantSprite = @surface.spriteBoss.sprites[@selectedExtantThang.id]
@selectedExtantThang = @selectedExtantSprite?.thang
Backbone.Mediator.publish 'editor:thangs-edited', thangs: @world.thangs Backbone.Mediator.publish 'editor:thangs-edited', thangs: @world.thangs
onTreemaThangSelected: (e, selectedTreemas) => onTreemaThangSelected: (e, selectedTreemas) =>
@ -423,12 +417,15 @@ module.exports = class ThangsTabView extends CocoView
addThang: (thangType, pos, batchInsert=false) -> addThang: (thangType, pos, batchInsert=false) ->
@$el.find('#randomize-button').hide() @$el.find('#randomize-button').hide()
if batchInsert if batchInsert
if thangType.get('name') is 'Hero Placeholder'
thangID = 'Hero Placeholder'
return if @level.get('type') isnt 'hero' or @thangsTreema.get "id=#{thangID}"
else
thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}" thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}"
else else
thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @thangsTreema.get "id=#{thangID}" thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @thangsTreema.get "id=#{thangID}"
if @cloneSourceThang if @cloneSourceThang
components = _.cloneDeep @thangsTreema.get "id=#{@cloneSourceThang.id}/components" components = _.cloneDeep @thangsTreema.get "id=#{@cloneSourceThang.id}/components"
@selectAddThang null
else if @level.get('type') is 'hero' else if @level.get('type') is 'hero'
components = [] # Load them all from default ThangType Components components = [] # Load them all from default ThangType Components
else else
@ -450,7 +447,8 @@ module.exports = class ThangsTabView extends CocoView
thangData = @thangsTreema.get "id=#{e.thangID}" thangData = @thangsTreema.get "id=#{e.thangID}"
@editThangView = new LevelThangEditView thangData: thangData, level: @level, world: @world, supermodel: @supermodel # supermodel needed for checkForMissingSystems @editThangView = new LevelThangEditView thangData: thangData, level: @level, world: @world, supermodel: @supermodel # supermodel needed for checkForMissingSystems
@insertSubView @editThangView @insertSubView @editThangView
@$el.find('.thangs-column').hide() @$el.find('>').hide()
@editThangView.$el.show()
Backbone.Mediator.publish 'editor:view-switched', {} Backbone.Mediator.publish 'editor:view-switched', {}
onLevelThangEdited: (e) -> onLevelThangEdited: (e) ->
@ -461,7 +459,7 @@ module.exports = class ThangsTabView extends CocoView
@removeSubView @editThangView @removeSubView @editThangView
@editThangView = null @editThangView = null
@onThangsChanged() @onThangsChanged()
@$el.find('.thangs-column').show() @$el.find('>').show()
preventDefaultContextMenu: (e) -> preventDefaultContextMenu: (e) ->
return unless $(e.target).closest('#canvas-wrapper').length return unless $(e.target).closest('#canvas-wrapper').length
@ -485,11 +483,10 @@ module.exports = class ThangsTabView extends CocoView
@selectAddThangType @selectedExtantThang.spriteName, @selectedExtantThang @selectAddThangType @selectedExtantThang.spriteName, @selectedExtantThang
toggleThangsContainer: (e) -> toggleThangsContainer: (e) ->
$('#all-thangs').toggle() $('#all-thangs').toggleClass('hide')
toggleThangsPalette: (e) -> toggleThangsPalette: (e) ->
$('#add-thangs-column').toggle() $('#add-thangs-view').toggleClass('hide')
@onWindowResize e
class ThangsNode extends TreemaNode.nodeMap.array class ThangsNode extends TreemaNode.nodeMap.array
valueClass: 'treema-array-replacement' valueClass: 'treema-array-replacement'
@ -518,11 +515,8 @@ class ThangNode extends TreemaObjectNode
s = "#{data.thangType}" s = "#{data.thangType}"
if isObjectID s if isObjectID s
unless name = ThangNode.thangNameMap[s] unless name = ThangNode.thangNameMap[s]
thangType = _.find @settings.supermodel.getModels(ThangType), (m) -> m.get('original') is s and m.get('kind') thangType = _.find @settings.supermodel.getModels(ThangType), (m) -> m.get('original') is s
name = ThangNode.thangNameMap[s] = thangType.get 'name' name = ThangNode.thangNameMap[s] = thangType.get 'name'
ThangNode.thangKindMap[s] = thangType.get 'kind'
kind = ThangNode.thangKindMap[s]
@$el.addClass "treema-#{kind}"
s = name s = name
s += ' - ' + data.id if data.id isnt s s += ' - ' + data.id if data.id isnt s
if pos if pos

View file

@ -136,6 +136,7 @@ module.exports = class ThangTypeColorsTabView extends CocoView
onColorGroupsChanged: => onColorGroupsChanged: =>
@thangType.set('colorGroups', @colorGroups.data) @thangType.set('colorGroups', @colorGroups.data)
Backbone.Mediator.publish 'editor:thang-type-color-groups-changed', colorGroups: @colorGroups.data
onColorGroupSelected: (e, selected) => onColorGroupSelected: (e, selected) =>
@$el.find('#color-group-settings').toggle selected.length > 0 @$el.find('#color-group-settings').toggle selected.length > 0

View file

@ -44,6 +44,7 @@ module.exports = class ThangTypeEditView extends RootView
'keyup .play-with-level-input': 'onPlayLevelKeyUp' 'keyup .play-with-level-input': 'onPlayLevelKeyUp'
subscriptions: subscriptions:
'editor:thang-type-color-groups-changed': 'onColorGroupsChanged'
'editor:save-new-version': 'saveNewThangType' 'editor:save-new-version': 'saveNewThangType'
# init / render # init / render
@ -102,6 +103,11 @@ module.exports = class ThangTypeEditView extends RootView
onComponentsChanged: (components) => onComponentsChanged: (components) =>
@thangType.set 'components', components @thangType.set 'components', components
onColorGroupsChanged: (e) ->
@temporarilyIgnoringChanges = true
@treema.set 'colorGroups', e.colorGroups
@temporarilyIgnoringChanges = false
makeDot: (color) -> makeDot: (color) ->
circle = new createjs.Shape() circle = new createjs.Shape()
circle.graphics.beginFill(color).beginStroke('black').drawCircle(0, 0, 5) circle.graphics.beginFill(color).beginStroke('black').drawCircle(0, 0, 5)
@ -380,8 +386,10 @@ module.exports = class ThangTypeEditView extends RootView
el = @$el.find('#thang-type-treema') el = @$el.find('#thang-type-treema')
@treema = @$el.find('#thang-type-treema').treema(options) @treema = @$el.find('#thang-type-treema').treema(options)
@treema.build() @treema.build()
@lastKind = data.kind
pushChangesToPreview: => pushChangesToPreview: =>
return if @temporarilyIgnoringChanges
# TODO: This doesn't delete old Treema keys you deleted # TODO: This doesn't delete old Treema keys you deleted
for key, value of @treema.data for key, value of @treema.data
@thangType.set(key, value) @thangType.set(key, value)
@ -389,6 +397,11 @@ module.exports = class ThangTypeEditView extends RootView
@refreshAnimation() @refreshAnimation()
@updateDots() @updateDots()
@updatePortrait() @updatePortrait()
if (kind = @treema.data.kind) isnt @lastKind
@lastKind = kind
Backbone.Mediator.publish 'editor:thang-type-kind-changed', kind: kind
if kind in ['Doodad', 'Floor', 'Wall'] and not @treema.data.terrains
@treema.set '/terrains', ['Grass', 'Dungeon', 'Indoor'] # So editors know to set them.
onSelectNode: (e, selected) => onSelectNode: (e, selected) =>
selected = selected[0] selected = selected[0]

View file

@ -18,6 +18,7 @@ module.exports = class GameMenuModal extends ModalView
constructor: (options) -> constructor: (options) ->
super options super options
@options.showDevBits = me.isAdmin() or /https?:\/\/localhost/.test(window.location.href) @options.showDevBits = me.isAdmin() or /https?:\/\/localhost/.test(window.location.href)
@options.showInventory = @options.level.get('type', true) is 'hero'
events: events:
'change input.select': 'onSelectionChanged' 'change input.select': 'onSelectionChanged'
@ -25,13 +26,14 @@ module.exports = class GameMenuModal extends ModalView
getRenderData: (context={}) -> getRenderData: (context={}) ->
context = super(context) context = super(context)
context.showDevBits = @options.showDevBits context.showDevBits = @options.showDevBits
context.showInventory = @options.showInventory
context context
afterRender: -> afterRender: ->
super() super()
@$el.toggleClas @$el.toggleClas
@insertSubView new submenuView @options for submenuView in submenuViews @insertSubView new submenuView @options for submenuView in submenuViews
(if @options.showDevBits then @subviews.inventory_view else @subviews.choose_hero_view).$el.addClass 'active' (if @options.showInventory then @subviews.inventory_view else @subviews.choose_hero_view).$el.addClass 'active'
onHidden: -> onHidden: ->
subview.onHidden?() for subviewKey, subview of @subviews subview.onHidden?() for subviewKey, subview of @subviews

View file

@ -1,6 +1,5 @@
ModalView = require 'views/kinds/ModalView' ModalView = require 'views/kinds/ModalView'
template = require 'templates/modal/versions' template = require 'templates/modal/versions'
tableTemplate = require 'templates/kinds/table'
DeltaView = require 'views/editor/DeltaView' DeltaView = require 'views/editor/DeltaView'
PatchModal = require 'views/editor/PatchModal' PatchModal = require 'views/editor/PatchModal'
nameLoader = require 'lib/NameLoader' nameLoader = require 'lib/NameLoader'

View file

@ -117,7 +117,9 @@ describe 'LevelLoader', ->
levelLoader = new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'}) levelLoader = new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'})
# first load Tharin by the 'normal' session load # first load Tharin by the 'normal' session load
responses = { '/db/level_session/id': sessionWithTharinWithHelmet } responses = '/db/level/id': levelWithOgreWithMace
jasmine.Ajax.requests.sendResponses(responses)
responses = '/db/level_session/id': sessionWithTharinWithHelmet
jasmine.Ajax.requests.sendResponses(responses) jasmine.Ajax.requests.sendResponses(responses)
numRequestsBefore = jasmine.Ajax.requests.count() numRequestsBefore = jasmine.Ajax.requests.count()
@ -127,7 +129,7 @@ describe 'LevelLoader', ->
levelLoader.loadDependenciesForSession(session) levelLoader.loadDependenciesForSession(session)
levelLoader.loadDependenciesForSession(session) levelLoader.loadDependenciesForSession(session)
numRequestsAfter = jasmine.Ajax.requests.count() numRequestsAfter = jasmine.Ajax.requests.count()
expect(numRequestsBefore).toBe(numRequestsAfter) expect(numRequestsAfter).toBe(numRequestsBefore)
it 'loads thangs for items that the level thangs have in their Equips component configs', -> it 'loads thangs for items that the level thangs have in their Equips component configs', ->
new LevelLoader({supermodel:supermodel = new SuperModel(), sessionID: 'id', levelID: 'id'}) new LevelLoader({supermodel:supermodel = new SuperModel(), sessionID: 'id', levelID: 'id'})