diff --git a/app/lib/LevelOptions.coffee b/app/lib/LevelOptions.coffee index b26d43086..e1bf89da7 100644 --- a/app/lib/LevelOptions.coffee +++ b/app/lib/LevelOptions.coffee @@ -311,3 +311,36 @@ module.exports = LevelOptions = 'oasis': requiredGear: {} restrictedGear: {} + 'sarven-road': + requiredGear: {} + restrictedGear: {} + 'sarven-gaps': + requiredGear: {} + restrictedGear: {} + 'thunderhooves': + requiredGear: {} + restrictedGear: {} + 'medical-attention': + requiredGear: {} # sense stone + restrictedGear: {} + 'minesweeper': + requiredGear: {} + restrictedGear: {} + 'sarven-sentry': + requiredGear: {'right-hand': 'crude-builders-hammer'} + restrictedGear: {} + 'keeping-time': + requiredGear: {} # watch + restrictedGear: {} + 'hoarding-gold': + requiredGear: {} + restrictedGear: {} + 'decoy-drill': + requiredGear: {} # new builder's hammer + restrictedGear: {} + 'yakstraction': + requiredGear: {} # new builder's hammer + restrictedGear: {} + 'sarven-brawl': + requiredGear: {} + restrictedGear: {} diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee index 573bd1a05..18e7ef221 100644 --- a/app/locale/fr.coffee +++ b/app/locale/fr.coffee @@ -69,7 +69,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t change_hero: "Changer le Héro" # Go back from choose inventory to choose hero choose_inventory: "Équiper des objets" buy_gems: "Acheter des gemmes" -# campaign_desert: "Desert Campaign" + campaign_desert: "Campagne Desert" campaign_forest: "Campagne de la forêt" campaign_dungeon: "Compagne du donjon" subscription_required: "Enregistrement nécessaire" @@ -146,13 +146,13 @@ module.exports = nativeDescription: "français", englishDescription: "French", t fork: "Fork" play: "Jouer" # When used as an action verb, like "Play next level" retry: "Reessayer" -# actions: "Actions" -# info: "Info" -# help: "Help" + actions: "Actions" + info: "Info" + help: "Aide" watch: "Regarder" unwatch: "Ne plus regarder" submit_patch: "Soumettre un correctif" -# submit_changes: "Submit Changes" + submit_changes: "Soumettre des Changements" general: and: "et" @@ -160,17 +160,17 @@ module.exports = nativeDescription: "français", englishDescription: "French", t date: "Date" body: "Corps" version: "Version" -# submitter: "Submitter" -# submitted: "Submitted" + submitter: "Soumissionnaire" + submitted: "Soumis" commit_msg: "Message de mise à jour" -# review: "Review" + review: "Examen" #review version_history: "Historique des versions" version_history_for: "Historique des versions pour : " -# select_changes: "Select two changes below to see the difference." -# undo: "Undo (Ctrl+Z)" -# redo: "Redo (Ctrl+Shift+Z)" -# play_preview: "Play preview of current level" - result: "Resultat" + select_changes: "Sélectionner deux changements plus bas pour voir la différence." + undo: "Annuler (Ctrl+Z)" + redo: "Refaire (Ctrl+Shift+Z)" + play_preview: "Jouer un aperçu du niveau actuel" + result: "Résultat" results: "Résultats" description: "Description" or: "ou" @@ -228,10 +228,10 @@ module.exports = nativeDescription: "français", englishDescription: "French", t click_to_select: "Clique sur une unité pour la sélectionner." control_bar_multiplayer: "Multi joueurs" control_bar_join_game: "Rejoindre la partie" - reload: "Recharger" - reload_title: "Recharger tout le code?" - reload_really: "Êtes-vous sûr de vouloir recharger ce niveau et retourner au début?" - reload_confirm: "Tout recharger" + reload: "Recommencer" + reload_title: "Recommencer tout le code?" + reload_really: "Êtes-vous sûr de vouloir recommencer ce niveau et retourner au début?" + reload_confirm: "Tout recommencer" victory: "Victoire" victory_title_prefix: "" victory_title_suffix: " Terminé" @@ -253,7 +253,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t tome_other_units: "Autres unités" # Only in old-style levels. tome_cast_button_run: "Exécuter" tome_cast_button_running: "En cours d'exécution" - tome_cast_button_ran: "Exécuté" + tome_cast_button_ran: "Exécuter" tome_submit_button: "Envoyer" tome_reload_method: "Recharger le code original pour cette méthode" # Title text for individual method reload button. tome_select_method: "Selectionner une méthode" @@ -268,7 +268,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t skip_tutorial: "Passer (esc)" keyboard_shortcuts: "Raccourcis Clavier" loading_ready: "Pret!" - loading_start: "Démarrer le niveau" + loading_start: "Démarrer niveau" problem_alert_title: "Corriger votre Code" time_current: "Maintenant:" time_total: "Max:" @@ -344,7 +344,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t prompt_title: "Pas assez de gemmes" prompt_body: "En voulez-vous plus?" prompt_button: "Entrer dans la boutique" -# recovered: "Previous gems purchase recovered. Please refresh the page." + recovered: "Gemmes précédemment achetées récupérées. Merci de rafraîchir la page." subscribe: subscribe_title: "Inscription" @@ -366,7 +366,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t choose_hero: "Choisissez votre Héro" programming_language: "Langage de programmation" programming_language_description: "Quel langage de programmation voullez-vous utiliser?" -# default: "Default" + default: "Défaut" experimental: "Expérimental" python_blurb: "Simple mais puissant, idéal pour les débutants et les experts." javascript_blurb: "Le langage du web. (Pas le même que Java.)" @@ -392,7 +392,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t restricted_to_certain_heroes: "Seulement certains héros peuvent jouer ce niveau." skill_docs: -# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this + writable: "éditable" # Hover over "attack" in Your Skills while playing a level to see most of this read_only: "lecture seulement" action_name: "nom" action_cooldown: "Encaisse" @@ -480,7 +480,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t forum_prefix: "Pour tout sujet d'ordre publique, merci d'utiliser " forum_page: "notre forum" forum_suffix: " À la place." -# where_reply: "Where should we reply?" + where_reply: "Où devons-nous répondre?" send: "Envoyer un commentaire" contact_candidate: "Contacter le candidat" # Deprecated recruitment_reminder: "Utilisez ce formulaire pour entrer en contact avec le candidat qui vous interesse. Souvenez-vous que CodeCombat facture 15% de la première année de salaire. Ces frais sont dues à l'embauche de l'employé, ils sont remboursable pendant 90 jours si l'employé ne reste pas employé. Les employés à temps partiel, à distance ou contractuel sont gratuits en tant que stagiaires." # Deprecated @@ -593,9 +593,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t more: "Plus" wiki: "Wiki" live_chat: "Chat en live" -# thang_main: "Main" -# thang_spritesheets: "Spritesheets" -# thang_colors: "Colors" + thang_main: "Principal" + thang_spritesheets: "Feuilles des sprites" #SpriteSheets + thang_colors: "Couleurs" level_some_options: "Quelques options?" level_tab_thangs: "Thangs" level_tab_scripts: "Scripts" @@ -827,8 +827,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t recently_played: "Jouées récemment" no_recent_games: "Aucunes parties jouées au cours des deux dernières semaines." payments: "Paiements" -# purchased: "Purchased" -# subscription: "Subscription" + purchased: "Acheté" + subscription: "Souscrit" service_apple: "Apple" service_web: "Web" paid_on: "Payé" @@ -1118,14 +1118,14 @@ module.exports = nativeDescription: "français", englishDescription: "French", t filter_visa_no: "Non autorisé" filter_education_top: "Ecole supérieure" filter_education_other: "Autre" - filter_role_web_developer: "Développeur Webr" + filter_role_web_developer: "Développeur Web" filter_role_software_developer: "Développeur logiciel" filter_role_mobile_developer: "Développeur mobile" filter_experience: "Expérience" filter_experience_senior: "Senior" filter_experience_junior: "Junior" # filter_experience_recent_grad: "Recent Grad" -# filter_experience_student: "College Student" + filter_experience_student: "Étudiant" filter_results: "Résultats" start_hiring: "Commencer à embaucher." # reasons: "Three reasons you should hire through us:" diff --git a/app/views/editor/level/modals/GenerateTerrainModal.coffee b/app/views/editor/level/modals/GenerateTerrainModal.coffee index 3c6b8de2e..4159014cf 100644 --- a/app/views/editor/level/modals/GenerateTerrainModal.coffee +++ b/app/views/editor/level/modals/GenerateTerrainModal.coffee @@ -87,6 +87,18 @@ clusters = { 'thangs': ['Bookshelf', 'Chair', 'Table', 'Candle', 'Treasure Chest'] 'margin': -1 } + 'desert_walls': { + 'thangs': ['Desert Wall 1', 'Desert Wall 2', 'Desert Wall 3', 'Desert Wall 4', 'Desert Wall 5', 'Desert Wall 6', 'Desert Wall 7', 'Desert Wall 8'] + 'margin': 6 + } + 'desert_floor': { + 'thangs': ['Sand 01', 'Sand 02', 'Sand 03', 'Sand 04', 'Sand 05', 'Sand 06'] + 'margin': -1 + } + 'oases': { + 'thangs': ['Oasis 1', 'Oasis 2', 'Oasis 3'] + 'margin': 4 + } } presets = { @@ -207,6 +219,35 @@ presets = { } } } + 'desert': { + 'terrainName': 'Desert' + 'type':'desert' + 'borders':'desert_walls' + 'borderNoise':2 + 'borderSize':4 + 'borderThickness':4 + 'floors':'desert_floor' + 'decorations': { + 'hero': { + 'num': [1, 1] + 'width': 2 + 'height': 2 + 'clusters': { + 'hero': [1, 1] + } + } + 'oasis': { + 'num':[1,2] #min-max + 'width': 10 + 'height': 10 + 'clusters': { + 'oases':[1,1] + 'shrubs':[0,5] + 'rocks':[0,2] + } + } + } + } } presetSizes = { diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee index f474a249b..897071565 100644 --- a/app/views/play/WorldMapView.coffee +++ b/app/views/play/WorldMapView.coffee @@ -988,13 +988,164 @@ desert = [ id: 'oasis' original: '5480ba761bf0b10000711c64' description: 'Run a gauntlet of sand yaks to reach oasis and quench your thirst!' - #nextLevels: - # continue: '' + nextLevels: + continue: 'sarven-road' x: 23.35 y: 31.60 adventurer: true requiresSubscription: false } + { + name: 'Sarven Road' + type: 'hero' + id: 'sarven-road' + original: '548c82360ffdc235e80ef04b' + description: 'Coming Soon' + nextLevels: + continue: 'sarven-gaps' + x: 28.36 + y: 24.59 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Sarven Gaps' + type: 'hero' + id: 'sarven-gaps' + original: '548c8f4a0ffdc235e80ef0a8' + description: 'Coming Soon' + nextLevels: + continue: 'thunderhooves' + x: 21.13 + y: 9.29 + adventurer: true + requiresSubscription: true + } + { + name: 'Thunderhooves' + type: 'hero' + id: 'thunderhooves' + original: '548c90020ffdc235e80ef0ad' + description: 'Coming Soon' + nextLevels: + continue: 'medical-attention' + x: 35.08 + y: 20.48 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Medical Attention' + type: 'hero' + id: 'medical-attention' + original: '548ce3300ffdc235e80ef0b2' + description: 'Coming Soon' + nextLevels: + continue: 'minesweeper' + x: 42.84 + y: 21.82 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Minesweeper' + type: 'hero' + id: 'minesweeper' + original: '' + description: 'Coming Soon' + nextLevels: + continue: 'sarven-sentry' + x: 47.64 + y: 12.40 + adventurer: true + requiresSubscription: true + } + { + name: 'Sarven Sentry' + type: 'hero' + id: 'sarven-sentry' + original: '548cef7f0ffdc235e80ef0cc' + description: 'Coming Soon' + nextLevels: + continue: 'keeping-time' + x: 51.48 + y: 26.09 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Keeping Time' + type: 'hero' + id: 'keeping-time' + original: '548cf1a90ffdc235e80ef0d1' + description: 'Coming Soon' + nextLevels: + continue: 'hoarding-gold' + x: 58.42 + y: 34.14 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Hoarding Gold' + type: 'hero' + id: 'hoarding-gold' + original: '' + description: 'Coming Soon' + nextLevels: + continue: 'decoy-drill' + x: 61.73 + y: 29.51 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Decoy Drill' + type: 'hero' + id: 'decoy-drill' + original: '' + description: 'Coming Soon' + nextLevels: + continue: 'yakstraction' + x: 62.05 + y: 40.44 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } + { + name: 'Yakstraction' + type: 'hero' + id: 'yakstraction' + original: '' + description: 'Coming Soon' + nextLevels: + continue: 'sarven-brawl' + x: 66.46 + y: 48.87 + adventurer: true + requiresSubscription: true + } + { + name: 'Sarven Brawl' + type: 'hero' + id: 'sarven-brawl' + original: '548cf2850ffdc235e80ef0d6' + description: 'Coming Soon' + #nextLevels: + # continue: '' + x: 69.01 + y: 33.80 + adventurer: true + requiresSubscription: false + disabled: not me.isAdmin() + } ] diff --git a/app/views/play/level/LevelLoadingView.coffee b/app/views/play/level/LevelLoadingView.coffee index 3c45d6ab4..c736ac332 100644 --- a/app/views/play/level/LevelLoadingView.coffee +++ b/app/views/play/level/LevelLoadingView.coffee @@ -110,7 +110,7 @@ module.exports = class LevelLoadingView extends CocoView onClickStartSubscription: (e) -> @openModalView new SubscribeModal() - window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'level loading', level: @options.level ? 'unknown' + window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'level loading', level: @options.level.get('name') ? 'unknown' window.tracker?.trackPageView "subscription/show-modal", ['Google Analytics'] onSubscribed: -> diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee index 0fdf72179..a2771e280 100644 --- a/server/commons/Handler.coffee +++ b/server/commons/Handler.coffee @@ -53,7 +53,7 @@ module.exports = class Handler return false unless delta.o.length is 1 index = delta.deltaPath.indexOf('i18n') return false if index is -1 - return false if delta.deltaPath[index+1] is 'en-US' + return false if delta.deltaPath[index+1] in ['en-US', 'en-UK', 'en-AU'] # English speakers are most likely just spamming, so always treat those as patches, not saves. return true formatEntity: (req, document) -> document?.toObject() @@ -300,7 +300,7 @@ module.exports = class Handler getLatestVersion: (req, res, original, version) -> # can get latest overall version, latest of a major version, or a specific version return @sendBadInputError(res, 'Invalid MongoDB id: '+original) if not Handler.isID(original) - + query = { 'original': mongoose.Types.ObjectId(original) } if version? version = version.split('.') diff --git a/server/routes/db.coffee b/server/routes/db.coffee index 9d7a0b5dc..42b3b8573 100644 --- a/server/routes/db.coffee +++ b/server/routes/db.coffee @@ -7,7 +7,7 @@ hipchat = require '../hipchat' module.exports.setup = (app) -> # This is hacky and should probably get moved somewhere else, I dunno app.get '/db/cla.submissions', (req, res) -> - return errors.unauthorized(res, 'You must be an admin to view that information') unless req.user?.isAdmin() + return errors.unauthorized(res, 'You must be an admin to view that information') unless req.user?.isAdmin() or ('github' in req.user?.permissions ? []) res.setHeader('Content-Type', 'application/json') collection = mongoose.connection.db.collection 'cla.submissions', (err, collection) -> return log.error "Couldn't fetch CLA submissions because #{err}" if err @@ -26,7 +26,7 @@ module.exports.setup = (app) -> parts = module.split('/') module = parts[0] return getSchema(req, res, module) if parts[1] is 'schema' - if (not req.user) and req.route.method isnt 'get' + 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