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