mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-28 10:06:08 -05:00
Merge branch 'master' into production
This commit is contained in:
commit
7fb0784921
7 changed files with 262 additions and 37 deletions
|
@ -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: {}
|
||||
|
|
|
@ -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:"
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
|
|
|
@ -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: ->
|
||||
|
|
|
@ -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('.')
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue