Merge pull request #449 from codecombat/master

Master into production
This commit is contained in:
Michael Schmatz 2014-03-01 13:08:38 -08:00
commit 0db74c6da5
19 changed files with 221 additions and 136 deletions

View file

@ -20,6 +20,36 @@ Whether you're novice or pro, the CodeCombat team is ready to help you implement
[MIT](https://github.com/codecombat/codecombat/blob/master/LICENSE) for the code, and [CC-BY](http://codecombat.com/legal) for the art and music. Please also [sign the CodeCombat contributor license agreement](http://codecombat.com/cla) so we can accept your pull requests. It is easy. [MIT](https://github.com/codecombat/codecombat/blob/master/LICENSE) for the code, and [CC-BY](http://codecombat.com/legal) for the art and music. Please also [sign the CodeCombat contributor license agreement](http://codecombat.com/cla) so we can accept your pull requests. It is easy.
### [Join Us!](http://blog.codecombat.com/why-you-should-open-source-your-startup)
![George Saines](http://codecombat.com/images/pages/about/george_small.png)
![Scott Erickson](http://codecombat.com/images/pages/about/scott_small.png)
![Nick Winter](http://codecombat.com/images/pages/about/nick_small.png)
![Michael Schmatz](http://codecombat.com/images/pages/about/michael_small.png)
![Jeremy Arns](http://codecombat.com/images/pages/about/jeremy_small.png)
![Tom Steinbrecher](http://codecombat.com/images/pages/contribute/archmage/tom_small.png)
![Glen De Cauwsemaecker](http://codecombat.com/images/pages/contribute/archmage/glen_small.png)
![Sébastien Moratinos](http://codecombat.com/images/pages/contribute/archmage/sebastien_small.png)
![deepak1556](http://codecombat.com/images/pages/contribute/archmage/deepak_small.png)
![Ronnie Cheng](http://codecombat.com/images/pages/contribute/archmage/ronald_small.png)
![Chloe Fan](http://codecombat.com/images/pages/contribute/archmage/chloe_small.png)
![Rachel Xiang](http://codecombat.com/images/pages/contribute/archmage/rachel_small.png)
![Dan Ristic](http://codecombat.com/images/pages/contribute/archmage/dan_small.png)
![Brad Dickason](http://codecombat.com/images/pages/contribute/archmage/brad_small.png)
![Rebecca Saines](http://codecombat.com/images/pages/contribute/archmage/becca_small.png)
![Laura Watiker](http://codecombat.com/images/pages/contribute/archmage/laura_small.png)
![Shiying Zheng](http://codecombat.com/images/pages/contribute/archmage/shiying_small.png)
![Mischa Lewis-Norelle](http://codecombat.com/images/pages/contribute/archmage/mischa_small.png)
![Paul Buser](http://codecombat.com/images/pages/contribute/archmage/paul_small.png)
![Benjamin Stern](http://codecombat.com/images/pages/contribute/archmage/ben_small.png)
![Alex Cotsarelis](http://codecombat.com/images/pages/contribute/archmage/alex_small.png)
![Ken Stanley](http://codecombat.com/images/pages/contribute/archmage/ken_small.png)
![Robert Moreton](http://codecombat.com/images/pages/contribute/artisan/rob_small.png)
![Andrew Witcher](http://codecombat.com/images/pages/contribute/artisan/andrew_small.png)
![Axandre Oge](http://codecombat.com/images/pages/contribute/artisan/axandre_small.png)
![Katharine Chan](http://codecombat.com/images/pages/contribute/artisan/katharine_small.png)
![Derek Wong](http://codecombat.com/images/pages/contribute/artisan/derek_small.png)
---------- ----------
[![](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/challengepost.png)](http://codecombat.challengepost.com/?utm_source-github&utm_medium-oswidget&utm_campaign-codecombat) [![](https://dl.dropboxusercontent.com/u/138899/GitHub%20Wikis/challengepost.png)](http://codecombat.challengepost.com/?utm_source-github&utm_medium-oswidget&utm_campaign-codecombat)

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View file

@ -255,7 +255,7 @@ class Angel
testWorker: => testWorker: =>
unless @worker.initialized unless @worker.initialized
console.warning "Worker", @id, "hadn't even loaded the scripts yet after", @infiniteLoopIntervalDuration, "ms." console.warn "Worker", @id, "hadn't even loaded the scripts yet after", @infiniteLoopIntervalDuration, "ms."
return return
@worker.postMessage {func: 'reportIn'} @worker.postMessage {func: 'reportIn'}
@condemnTimeout = _.delay @condemnWorker, @infiniteLoopTimeoutDuration @condemnTimeout = _.delay @condemnWorker, @infiniteLoopTimeoutDuration

View file

@ -38,7 +38,6 @@ module.exports = Surface = class Surface extends CocoClass
worldLoaded: false worldLoaded: false
scrubbing: false scrubbing: false
debug: false debug: false
frameRate: 60
defaults: defaults:
wizards: true wizards: true
@ -49,6 +48,7 @@ module.exports = Surface = class Surface extends CocoClass
coords: true coords: true
playJingle: false playJingle: false
showInvisible: false showInvisible: false
frameRate: 60 # Best as a divisor of 60, like 15, 30, 60, with RAF_SYNCHED timing.
subscriptions: subscriptions:
'level-disable-controls': 'onDisableControls' 'level-disable-controls': 'onDisableControls'
@ -374,7 +374,8 @@ module.exports = Surface = class Surface extends CocoClass
@stage.addEventListener 'stagemousedown', @onMouseDown @stage.addEventListener 'stagemousedown', @onMouseDown
@canvas.on 'mousewheel', @onMouseWheel @canvas.on 'mousewheel', @onMouseWheel
@hookUpChooseControls() if @options.choosing @hookUpChooseControls() if @options.choosing
createjs.Ticker.setFPS @frameRate createjs.Ticker.timingMode = createjs.Ticker.RAF_SYNCHED
createjs.Ticker.setFPS @options.frameRate
showLevel: -> showLevel: ->
return if @dead return if @dead
@ -500,7 +501,7 @@ module.exports = Surface = class Surface extends CocoClass
@trailmaster.tick() if @trailmaster @trailmaster.tick() if @trailmaster
# Skip some frame updates unless we're playing and not at end (or we haven't drawn much yet) # Skip some frame updates unless we're playing and not at end (or we haven't drawn much yet)
frameAdvanced = (@playing and @currentFrame < @world.totalFrames) or @totalFramesDrawn < 2 frameAdvanced = (@playing and @currentFrame < @world.totalFrames) or @totalFramesDrawn < 2
@currentFrame += @world.frameRate / @frameRate if frameAdvanced @currentFrame += @world.frameRate / @options.frameRate if frameAdvanced and @playing
newWorldFrame = Math.floor @currentFrame newWorldFrame = Math.floor @currentFrame
worldFrameAdvanced = newWorldFrame isnt oldWorldFrame worldFrameAdvanced = newWorldFrame isnt oldWorldFrame
if worldFrameAdvanced if worldFrameAdvanced
@ -517,7 +518,7 @@ module.exports = Surface = class Surface extends CocoClass
@drawCurrentFrame e @drawCurrentFrame e
@onFrameChanged() @onFrameChanged()
@updatePaths() if (@totalFramesDrawn % 4) is 0 or createjs.Ticker.getMeasuredFPS() > createjs.Ticker.getFPS() - 5 @updatePaths() if (@totalFramesDrawn % 4) is 0 or createjs.Ticker.getMeasuredFPS() > createjs.Ticker.getFPS() - 5
Backbone.Mediator.publish('surface:ticked', {dt: 1 / @frameRate}) Backbone.Mediator.publish('surface:ticked', {dt: 1 / @options.frameRate})
mib = @stage.mouseInBounds mib = @stage.mouseInBounds
if @mouseInBounds isnt mib if @mouseInBounds isnt mib
Backbone.Mediator.publish('surface:mouse-' + (if mib then "over" else "out"), {}) Backbone.Mediator.publish('surface:mouse-' + (if mib then "over" else "out"), {})

View file

@ -104,14 +104,14 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
wizard_settings: wizard_settings:
title: "Tovenaar instellingen" title: "Tovenaar instellingen"
customize_avatar: "Bewerk jouw avatar" customize_avatar: "Bewerk jouw avatar"
# clothes: "Clothes" clothes: "Kleren"
# trim: "Trim" trim: "Trim"
# cloud: "Cloud" cloud: "Wolk"
# spell: "Spell" spell: "Spreuk"
# boots: "Boots" boots: "Laarzen"
# hue: "Hue" hue: "Hue"
# saturation: "Saturation" saturation: "Saturation"
# lightness: "Lightness" lightness: "Lightness"
account_settings: account_settings:
title: "Account Instellingen" title: "Account Instellingen"
@ -122,19 +122,19 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
wizard_tab: "Tovenaar" wizard_tab: "Tovenaar"
password_tab: "Wachtwoord" password_tab: "Wachtwoord"
emails_tab: "Emails" emails_tab: "Emails"
gravatar_select: "Select which Gravatar photo to use" gravatar_select: "Selecteer welke Gravatar foto je wilt gebruiken"
gravatar_add_photos: "Voeg thumbnails en foto's toe aan je Gravatar account, gekoppeld aan jouw email-adres, om een afbeelding te kiezen." gravatar_add_photos: "Voeg thumbnails en foto's toe aan je Gravatar account, gekoppeld aan jouw email-adres, om een afbeelding te kiezen."
gravatar_add_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken." gravatar_add_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken."
wizard_color: "Tovenaar Kleding Kleur" wizard_color: "Tovenaar Kleding Kleur"
new_password: "Nieuw Wachtwoord" new_password: "Nieuw Wachtwoord"
new_password_verify: "Verifieer" new_password_verify: "Verifieer"
email_subscriptions: "Email Abonnementen" email_subscriptions: "E-mail Abonnementen"
email_announcements: "Aankondegingen" email_announcements: "Aankondigingen"
email_notifications_description: "Krijg periodieke meldingen voor jouw account." email_notifications_description: "Krijg periodieke meldingen voor jouw account."
email_announcements_description: "Verkrijg emails over het laatste nieuws en de ontwikkelingen bij CodeCombat." email_announcements_description: "Verkrijg emails over het laatste nieuws en de ontwikkelingen bij CodeCombat."
contributor_emails: "Medewerker Klasse emails" contributor_emails: "Medewerker Klasse emails"
contribute_prefix: "We zoeken mensen om bij ons feest aan te voegen! Bekijk de " contribute_prefix: "We zoeken mensen om bij ons feest aan te voegen! Bekijk de "
contribute_page: "contributie pagina" contribute_page: "contributiepagina"
contribute_suffix: " om meer te weten te komen." contribute_suffix: " om meer te weten te komen."
email_toggle: "Vink alles aan/af" email_toggle: "Vink alles aan/af"
error_saving: "Fout Tijdens Het Opslaan" error_saving: "Fout Tijdens Het Opslaan"
@ -150,8 +150,8 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
gravatar_not_found_mine: "We konden geen account vinden gekoppeld met:" gravatar_not_found_mine: "We konden geen account vinden gekoppeld met:"
gravatar_not_found_email_suffix: "." gravatar_not_found_email_suffix: "."
gravatar_signup_prefix: "Registreer op " gravatar_signup_prefix: "Registreer op "
# gravatar_signup_suffix: " to get set up!" gravatar_signup_suffix: " om alles in orde te maken!"
gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." gravatar_not_found_other: "Helaas, er is geen profiel geassocieerd met dit e-mail adres."
gravatar_contact: "Contact" gravatar_contact: "Contact"
gravatar_websites: "Websites" gravatar_websites: "Websites"
gravatar_accounts: "Zoals Gezien Op" gravatar_accounts: "Zoals Gezien Op"
@ -175,7 +175,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
# victory_title_prefix: "" # victory_title_prefix: ""
victory_title_suffix: " Compleet" victory_title_suffix: " Compleet"
victory_sign_up: "Schrijf je in om je progressie op te slaan" victory_sign_up: "Schrijf je in om je progressie op te slaan"
victory_sign_up_poke: "Wil jje jouw code opslaan? Maak een gratis account aan!" victory_sign_up_poke: "Wil je jouw code opslaan? Maak een gratis account aan!"
victory_rate_the_level: "Beoordeel het level: " victory_rate_the_level: "Beoordeel het level: "
victory_play_next_level: "Speel Volgend Level" victory_play_next_level: "Speel Volgend Level"
victory_go_home: "Ga naar Home" victory_go_home: "Ga naar Home"
@ -186,7 +186,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
multiplayer_link_description: "Geef deze url aan iemand om hem/haar te laten meedoen met jou." multiplayer_link_description: "Geef deze url aan iemand om hem/haar te laten meedoen met jou."
multiplayer_hint_label: "Hint:" multiplayer_hint_label: "Hint:"
multiplayer_hint: " Klik de link om alles te selecteren, druk dan op Apple-C of Ctrl-C om de link te kopiëren." multiplayer_hint: " Klik de link om alles te selecteren, druk dan op Apple-C of Ctrl-C om de link te kopiëren."
multiplayer_coming_soon: "Binnenkort komen er meer Multiplayer mogelijkheden!" multiplayer_coming_soon: "Binnenkort komen er meer Multiplayermogelijkheden!"
guide_title: "Handleiding" guide_title: "Handleiding"
tome_minion_spells: "Jouw Minions' Spreuken" tome_minion_spells: "Jouw Minions' Spreuken"
tome_read_only_spells: "Read-Only Spreuken" tome_read_only_spells: "Read-Only Spreuken"
@ -213,14 +213,14 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
editor: editor:
main_title: "CodeCombat Editors" main_title: "CodeCombat Editors"
main_description: "Maak je eigen levels, campagnes, eenheden en leermateriaal. Wij bieden alle programmas die u nodig heeft!" main_description: "Maak je eigen levels, campagnes, eenheden en leermateriaal. Wij bieden alle programma's die u nodig heeft!"
article_title: "Artikel Editor" article_title: "Artikel Editor"
article_description: "Schrijf artikels dat spelers een overzicht geven over programmeer concepten die kunnen gebruikt worden over een variateit van levels en campagnes." article_description: "Schrijf artikels dat spelers een overzicht geven over programmeer concepten die kunnen gebruikt worden over een variëteit van levels en campagnes."
thang_title: "Thang Editor" thang_title: "Thang Editor"
thang_description: "Maak eenheden, beschrijf hun default logica, graphics en audio. Momenteel is enkel het importeren van vector graphics geëxporteerd in Flash ondersteunt." thang_description: "Maak eenheden, beschrijf hun default logica, graphics en audio. Momenteel is enkel het importeren van vector graphics geëxporteerd in Flash ondersteunt."
level_title: "Level Editor" level_title: "Level Editor"
level_description: "Bevat programmers om te programmeren, audio te uploaden, en om aangepaste logica om alle soorten levels te maken. Het is alles wat wijzelf ook gebruiken!" level_description: "Bevat programmeurs om te programmeren, audio te uploaden, en om aangepaste logica om alle soorten levels te maken. Het is alles wat wijzelf ook gebruiken!"
security_notice: "Veel belangrijke elementen in deze editors zijn momenteel niet actief. Met dat wij de veiligheid van deze systemen verbeteren, zullen ook deze elementen beschikbaar zijn. Indien u deze elementen al eerder wil gebruiken, " security_notice: "Veel belangrijke elementen in deze editors zijn momenteel niet actief. Met dat wij de veiligheid van deze systemen verbeteren, zullen ook deze elementen beschikbaar worden. Indien u deze elementen al eerder wil gebruiken, "
contact_us: "contacteer ons!" contact_us: "contacteer ons!"
hipchat_prefix: "Je kan ons ook vinden in ons" hipchat_prefix: "Je kan ons ook vinden in ons"
hipchat_url: "(Engelstalig) HipChat kanaal." hipchat_url: "(Engelstalig) HipChat kanaal."
@ -275,9 +275,9 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
why_paragraph_3_prefix: "Dat is waar programmeren om draait. Het moet tof zijn. Niet tof zoals" why_paragraph_3_prefix: "Dat is waar programmeren om draait. Het moet tof zijn. Niet tof zoals"
why_paragraph_3_italic: "joepie een medaille" why_paragraph_3_italic: "joepie een medaille"
why_paragraph_3_center: "maar tof zoals" why_paragraph_3_center: "maar tof zoals"
why_paragraph_3_italic_caps: "NEE MAMA IK MOET DIT LEVEL AFMAKEN!" why_paragraph_3_italic_caps: "NEE MAMA IK MOET DIT LEVEL AF MAKEN!"
why_paragraph_3_suffix: "Dat is waarom CodeCombat een numtiplayer game is, en niet zomaar lessen gegoten in spelformaat. We zullen niet stoppen totdat jij niet meer kan stoppen--maar deze keer, is dat een goed." why_paragraph_3_suffix: "Dat is waarom CodeCombat een multiplayergame is, en niet zomaar lessen gegoten in spelformaat. We zullen niet stoppen totdat jij niet meer kan stoppen--maar deze keer, is dat een goed."
why_paragraph_4: "Als je verslaafbaar gaat zijn aan een spel, dan is het beter om hieraan verslaafd te worden en een tovenaar van het technisch tijdperk te worden." why_paragraph_4: "Als je verslaafd gaat zijn aan een spel, dan is het beter om hieraan verslaafd te raken en een tovenaar van het technisch tijdperk te worden."
why_ending: "En hallo, het is gratis." why_ending: "En hallo, het is gratis."
why_ending_url: "Start nu met toveren!" why_ending_url: "Start nu met toveren!"
george_description: "CEO, zakenman, web designer, game designer, en kampioen van alle beginnende programmeurs." george_description: "CEO, zakenman, web designer, game designer, en kampioen van alle beginnende programmeurs."
@ -360,7 +360,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
alert_account_message_pref: "Om je te abonneren voor de klasse e-mails, moet je eerst " alert_account_message_pref: "Om je te abonneren voor de klasse e-mails, moet je eerst "
alert_account_message_suf: "." alert_account_message_suf: "."
alert_account_message_create_url: "een account aanmaken" alert_account_message_create_url: "een account aanmaken"
# archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever." archmage_summary: "Geïnteresserd in werken aan game graphics, user interface design, database- en serverorganisatie, multiplayer networking, physics, geluid of game engine prestaties? Wil jij helpen een game te bouwen wat anderen leert waar jij goed in bent? We moeten nog veel doen en als jij een ervaren programmeur bent en wil ontwikkelen voor CodeCombat, dan is dit de klasse voor jou. We zouden graag je hulp hebben bij het maken van de beste programmeergame ooit."
archmage_introduction: "Een van de beste aspecten aan het maken van spelletjes is dat zij zoveel verschillende zaken omvatten. Visualisaties, geluid, real-time netwerken, sociale netwerken, en natuurlijk veel van de voorkomende aspecten van programmeren, van low-level database beheer en server administratie tot gebruiksvriendelijke interfaces maken. Er is veel te doen, en als jij een ervaren programmeur bent met de motivatie om je handen veel te maken met CodeCombat, dan ben je de tovenaar die wij zoeken! We zouden graag jouw help hebben met het bouwen aan het allerbeste programmeerspel ooit." archmage_introduction: "Een van de beste aspecten aan het maken van spelletjes is dat zij zoveel verschillende zaken omvatten. Visualisaties, geluid, real-time netwerken, sociale netwerken, en natuurlijk veel van de voorkomende aspecten van programmeren, van low-level database beheer en server administratie tot gebruiksvriendelijke interfaces maken. Er is veel te doen, en als jij een ervaren programmeur bent met de motivatie om je handen veel te maken met CodeCombat, dan ben je de tovenaar die wij zoeken! We zouden graag jouw help hebben met het bouwen aan het allerbeste programmeerspel ooit."
class_attributes: "Klasse kenmerken" class_attributes: "Klasse kenmerken"
archmage_attribute_1_pref: "Ervaring met " archmage_attribute_1_pref: "Ervaring met "
@ -375,8 +375,8 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
join_url_hipchat: "ons publiek (Engelstalig) HipChat kanaal" join_url_hipchat: "ons publiek (Engelstalig) HipChat kanaal"
more_about_archmage: "Leer meer over hoe je een Machtige Tovenaar kan worden" more_about_archmage: "Leer meer over hoe je een Machtige Tovenaar kan worden"
archmage_subscribe_desc: "Ontvang e-mails met nieuwe codeer oppurtiniteiten en aankondigingen." archmage_subscribe_desc: "Ontvang e-mails met nieuwe codeer oppurtiniteiten en aankondigingen."
# artisan_summary_pref: "Want to design levels and expand CodeCombat's arsenal? People are playing through our content at a pace faster than we can build! Right now, our level editor is barebone, so be wary. Making levels will be a little challenging and buggy. If you have visions of campaigns spanning for-loops to" artisan_summary_pref: "Wil je levels ontwerpen en CodeCombat's arsenaal vergroten? Mensen spelen sneller door onze content dan wij bij kunnen houden! Op dit moment is onze level editor nog wat kaal, dus wees daarvan bewust. Levels maken zal een beetje uitdagend en buggy zijn. Als jij een visie van campagnes hebt van for-loops tot"
# artisan_summary_suf: "then this class is for you." artisan_summary_suf: "dan is dit de klasse voor jou."
artisan_introduction_pref: "We moeten meer levels bouwen! Mensen schreeuwen om meer inhoud, en er zijn ook maar zoveel levels dat wij kunnen maken. Momenteel is jouw werkplaats level een; onze level editor is amper gebruikt door zelfs ons, wees dus voorzichtig. Indien je visioenen hebt van campagnes, gaande van for-loops tot" artisan_introduction_pref: "We moeten meer levels bouwen! Mensen schreeuwen om meer inhoud, en er zijn ook maar zoveel levels dat wij kunnen maken. Momenteel is jouw werkplaats level een; onze level editor is amper gebruikt door zelfs ons, wees dus voorzichtig. Indien je visioenen hebt van campagnes, gaande van for-loops tot"
artisan_introduction_suf: "dan is deze klasse waarschijnlijk iets voor jou." artisan_introduction_suf: "dan is deze klasse waarschijnlijk iets voor jou."
artisan_attribute_1: "Enige ervaring in het maken van gelijkbare inhoud. Bijvoorbeeld ervaring het gebruiken van Blizzard's level editor. Maar dit is niet vereist!" artisan_attribute_1: "Enige ervaring in het maken van gelijkbare inhoud. Bijvoorbeeld ervaring het gebruiken van Blizzard's level editor. Maar dit is niet vereist!"
@ -389,50 +389,50 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
artisan_join_step4: "Maak een bericht over jou level op ons forum voor feedback." artisan_join_step4: "Maak een bericht over jou level op ons forum voor feedback."
more_about_artisan: "Leer meer over hoe je een Creatieve Ambachtsman kan worden." more_about_artisan: "Leer meer over hoe je een Creatieve Ambachtsman kan worden."
artisan_subscribe_desc: "Ontvang e-mails met nieuws over de Level Editor." artisan_subscribe_desc: "Ontvang e-mails met nieuws over de Level Editor."
# adventurer_sumamry: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you." adventurer_sumamry: "Laten we duidelijk zijn over je rol: jij bent de tank. Jij krijgt de zware klappen te verduren. We hebben mensen nodig om spiksplinternieuwe levels te proberen en te kijken hoe deze beter kunnen. De pijn zal groot zijn, het maken van een goede game is een lang proces en niemand doet het de eerste keer goed. Als jij dit kan verduren en een hoge constitution score hebt, dan is dit de klasse voor jou."
adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you." adventurer_introduction: "Laten we duidelijk zijn over je rol: jij bent de tank. Jij krijgt de zware klappen te verduren. We hebben mensen nodig om spiksplinternieuwe levels te proberen en te kijken hoe deze beter kunnen. De pijn zal groot zijn, het maken van een goede game is een lang proces en niemand doet het de eerste keer goed. Als jij dit kan verduren en een hoge constitution score hebt, dan is dit de klasse voor jou."
adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though." adventurer_attribute_1: "Een wil om te leren. Jij wilt leren hoe je programmeert en wij willen het jou leren. Je zal overigens zelf het meeste leren doen."
adventurer_attribute_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." adventurer_attribute_2: "Charismatisch. Wees netjes maar duidelijk over wat er beter kan en geef suggesties over hoe het beter kan."
adventurer_join_pref: "Either get together with (or recruit!) an Artisan and work with them, or check the box below to receive emails when there are new levels to test. We'll also be posting about levels to review on our networks like" adventurer_join_pref: "Werk samen met een Ambachtsman of recruteer er een, of tik het veld hieronder aan om e-mails te ontvangen wanneer er nieuwe levels zijn om te testen. We zullen ook posten over levels die beoordeeld moeten worden op onze netwerken zoals"
adventurer_forum_url: "our forum" adventurer_forum_url: "ons forum"
adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!" adventurer_join_suf: "dus als je liever op deze manier wordt geïnformeerd, schrijf je daar in!"
more_about_adventurer: "Learn More About Becoming A Brave Adventurer" more_about_adventurer: "Leer meer over hoe je een dappere avonturier kunt worden."
adventurer_subscribe_desc: "Get emails when there are new levels to test." adventurer_subscribe_desc: "Ontvang e-mails wanneer er nieuwe levels zijn die getest moeten worden."
# scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the " scribe_summary_pref: "CodeCombat is meer dan slechts een aantal levels, het zal ook een bron van kennis kennis zijn en een wiki met programmeerconcepten waar levels op in kunnen gaan. Op die manier zal een Ambachtslied een link kunnen geven naar een artikel wat past bij een level. Net zoiets als het "
# scribe_summary_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." scribe_summary_sufx: " heeft gebouwd. Als jij het leuk vindt programmeerconcepten uit te leggen, dan is deze klasse iets voor jou."
scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the " scribe_introduction_pref: "CodeCombat is meer dan slechts een aantal levels, het zal ook een bron van kennis kennis zijn en een wiki met programmeerconcepten waar levels op in kunnen gaan. Op die manier zal elk Ambachtslied niet in detail hoeven uit te leggen wat een vergelijkingsoperator is, maar een link kunnen geven naar een artikel wat deze informatie bevat voor de speler. Net zoiets als het "
scribe_introduction_url_mozilla: "Mozilla Developer Network" scribe_introduction_url_mozilla: "Mozilla Developer Network"
scribe_introduction_suf: " has built. If your idea of fun is articulating the concepts of programming in Markdown form, then this class might be for you." scribe_introduction_suf: " heeft gebouwd. Als jij het leuk vindt om programmeerconcepten uit te leggen in Markdown-vorm, dan is deze klasse wellicht iets voor jou."
scribe_attribute_1: "Skill in words is pretty much all you need. Not only grammar and spelling, but able to convey complicated ideas to others." scribe_attribute_1: "Taal-skills zijn praktisch alles wat je nodig hebt. Niet alleen grammatica of spelling, maar ook moeilijke ideas overbrengen aan anderen."
contact_us_url: "Contact us" contact_us_url: "Contacteer ons"
scribe_join_description: "tell us a little about yourself, your experience with programming and what sort of things you'd like to write about. We'll go from there!" scribe_join_description: "vertel ons wat over jezelf, je ervaring met programmeren en over wat voor soort dingen je graag zou schrijven. Verder zien we wel!"
more_about_scribe: "Learn More About Becoming A Diligent Scribe" more_about_scribe: "Leer meer over het worden van een ijverige Klerk."
scribe_subscribe_desc: "Get emails about article writing announcements."
# diplomat_summary: "There is a large interest in CodeCombat in other countries that do not speak English! We are looking for translators who are willing to spend their time translating the site's corpus of words so that CodeCombat is accessible across the world as soon as possible. If you'd like to help getting CodeCombat international, then this class is for you." scribe_subscribe_desc: "Ontvang e-mails met aankondigingen over het schrijven van artikelen."
diplomat_introduction_pref: "So, if there's one thing we learned from the " diplomat_summary: "Er is grote interesse in CodeCombat in landen waar geen Engels wordt gesproken! We zijn op zoek naar vertalers wie tijd willen spenderen aan het vertalen van de site's corpus aan woorden zodat CodeCombat zo snel mogelijk toegankelijk wordt voor heel de wereld. Als jij wilt helpen met CodeCombat internationaal maken, dan is dit de klasse voor jou."
diplomat_launch_url: "launch in October" diplomat_introduction_pref: "Dus, als er iets is wat we geleerd hebben van de "
diplomat_introduction_suf: "it's that there is sizeable interest in CodeCombat in other countries, particularly Brazil! We're building a corps of translators eager to turn one set of words into another set of words to get CodeCombat as accessible across the world as possible. If you like getting sneak peeks at upcoming content and getting these levels to your fellow nationals ASAP, then this class might be for you." diplomat_launch_url: "release in oktober"
diplomat_attribute_1: "Fluency in English and the language you would like to translate to. When conveying complicated ideas, it's important to have a strong grasp in both!" diplomat_introduction_suf: "dan is het wel dat er een significante interesse is in CodeCombat in andere landen, vooral Brazilïe! We zijn een corps aan vertalers aan het creëren dat ijverig de ene set woorden in een andere omzet om CodeCombat zo toegankelijk te maken als mogelijk in hel de wereld. Als jij het leuk vindt glimpsen op te vangen van aankomende content en deze levels zo snel mogelijk naar je landgenoten te krijgen, dan is dit de klasse voor jou."
# diplomat_join_pref_github: "Find your language locale file " diplomat_attribute_1: "Vloeiend Engels en de taal waar naar je wilt vertalen kunnen spreken. Wanneer je moeilijke ideas wilt overbrengen, is het belangrijk beide goed te kunnen!"
# diplomat_github_url: "on GitHub" diplomat_join_pref_github: "Vind jouw taal haar locale bestand "
# diplomat_join_suf_github: ", edit it online, and submit a pull request. Also, check this box below to keep up-to-date on new internationalization developments!" diplomat_github_url: "op GitHub"
more_about_diplomat: "Learn More About Becoming A Great Diplomat" diplomat_join_suf_github: ", edit het online, en submit een pull request. Daarnaast kun je hieronder aanvinken alsj e up-to-date wilt worden gehouden met nieuwe internationalisatie-ontwikkelingen."
diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate." more_about_diplomat: "Leer meer over het worden van een geweldige Diplomaat"
# ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you." diplomat_subscribe_desc: "Ontvang e-mails over i18n ontwikkelingen en levels om te vertalen."
ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you." ambassador_summary: "We proberen een gemeenschap te bouwen en elke gemeenschap heeft een supportteam nodig wanneer er problemen zijn. We hebben chats, e-mails en sociale netwerken met een hoop mensen om mee te praten en wie je kunt helpen bekend te worden met het spel en er van te leren. Als jij mensen wilt helpen betrokken te raken en plezier te hebben, én een goed gevoel van de levenslijn van CodeCombat te krijgen en waar we naar toe gaan, dan is dit wellicht de klasse voor jou."
ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!" ambassador_attribute_1: "Communicatieskills. Problemen die spelers hebben kunnen identificeren en ze helpen deze op te lossen. Verder zul je ook de rest van ons geïnformeerd houden over wat de spelers zeggen, wat ze leuk vinden, wat ze minder vinden en waar er meer van moet zijn!"
ambassador_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll go from there!" ambassador_join_desc: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag zou doen. We zien verder wel!"
ambassador_join_note_strong: "Note" ambassador_join_note_strong: "Opmerking"
ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!" ambassador_join_note_desc: "Een van onze topprioriteiten is om een multiplayer te bouwen waar spelers die moeite hebben een level op te lossen een wizard met een hoger level kunnen oproepen om te helpen. Dit zal een goede manier zijn voor ambassadeurs om hun ding te doen. We houden je op de hoogte!"
more_about_ambassador: "Learn More About Becoming A Helpful Ambassador" more_about_ambassador: "Leer meer over het worden van een behulpzame Ambassadeur"
ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." ambassador_subscribe_desc: "Ontvang e-mails met updates over ondersteuning en multiplayer-ontwikkelingen."
# counselor_summary: "None of the above roles fit what you are interested in? Do not worry, we are on the lookout for anybody who wants a hand in the development of CodeCombat! If you are interested in teaching, game development, open source management, or anything else that you think will be relevant to us, then this class is for you." counselor_summary: "Geen van de rollen hierboven in jouw interessegebied? Maak je geen zorgen, we zijn op zoek naar iedereen die wil helpen met het ontwikkelen van CodeCombat! Als je geïnteresseerd bent in lesgeven, gameontwikkeling, open source management of iets anders waarvan je denk dat het relevant voor ons is, dan is dit de klasse voor jou."
counselor_introduction_1: "Do you have life experience? A different perspective on things that can help us decide how to shape CodeCombat? Of all these roles, this will probably take the least time, but individually you may make the most difference. We're on the lookout for wisened sages, particularly in areas like: teaching, game development, open source project management, technical recruiting, entrepreneurship, or design." counselor_introduction_1: "Heb jij levenservaring? Een afwijkend perspectief op zaken die ons kunnen helpen CodeCombat te vormen? Van alle rollen neemt deze wellicht de minste tijd in, maar individiueel maak je misschien het grootste verschil. We zijn op zoek naar wijze tovenaars, vooral in het gebied van lesgeven, gameontwikkeling, open source projectmanagement, technische recrutering, ondernemerschap of design."
counselor_introduction_2: "Or really anything that is relevant to the development of CodeCombat. If you have knowledge and want to share it to help grow this project, then this class might be for you." counselor_introduction_2: "Of eigenlijk alles wat relevant is voor de ontwikkeling van CodeCombat. Als jij kennis hebt en deze wilt dezen om dit project te laten groeien, dan is dit misschien de klasse voor jou."
counselor_attribute_1: "Experience, in any of the areas above or something you think might be helpful." counselor_attribute_1: "Ervaring, in enig van de bovenstaande gebieden of iets anders waarvan je denkt dat het behulpzaam zal zijn."
counselor_attribute_2: "A little bit of free time!" counselor_attribute_2: "Een beetje vrije tijd!"
counselor_join_desc: "tell us a little about yourself, what you've done and what you'd be interested in doing. We'll put you in our contact list and be in touch when we could use advice (not too often)." counselor_join_desc: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag wilt doen. We zullen je in onze contactlijst zetten en je benaderen wanneer we je advies kunnen gebruiken (niet te vaak)."
more_about_counselor: "Learn More About Becoming A Valuable Counselor" more_about_counselor: "Leer meer over het worden van een waardevolle Raadgever"
changes_auto_save: "Veranderingen worden automatisch opgeslagen wanneer je het vierkantje aan- of afvinkt." changes_auto_save: "Veranderingen worden automatisch opgeslagen wanneer je het vierkantje aan- of afvinkt."
diligent_scribes: "Onze ijverige Klerks:" diligent_scribes: "Onze ijverige Klerks:"
powerful_archmages: "Onze machtige Tovenaars:" powerful_archmages: "Onze machtige Tovenaars:"
@ -443,7 +443,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
classes: classes:
archmage_title: "Tovenaar" archmage_title: "Tovenaar"
archmage_title_description: "(codeur)" archmage_title_description: "(Programmeur)"
artisan_title: "Ambachtsman" artisan_title: "Ambachtsman"
artisan_title_description: "(Level Bouwer)" artisan_title_description: "(Level Bouwer)"
adventurer_title: "Avonturier" adventurer_title: "Avonturier"

View file

@ -86,49 +86,51 @@
@include gradient-radial-custom-stops(hsla(116,80%,74%,1), 20%, hsla(116,80%,31%,1), 70%) @include gradient-radial-custom-stops(hsla(116,80%,74%,1), 20%, hsla(116,80%,31%,1), 70%)
.thang-props .thang-props
width: 144px
height: 100px
margin: 8px 8px 0 0 margin: 8px 8px 0 0
overflow-y: auto
float: left float: left
@include user-select(text)
.prop .thang-props-column
img float: left
margin-right: 5px width: 144px
width: 16px height: 100px
height: 16px @include user-select(text)
.text-prop .prop
width: 50% img
margin-right: 5px
width: 16px
height: 16px
.prop-value.bar-prop .text-prop
width: 100px width: 50%
display: inline-block
height: 6px
background: #ddd
border: 1px solid black
border-radius: 6px
overflow: hidden
.bar .prop-value.bar-prop
background: black width: 100px
width: 100% display: inline-block
height: 6px
background: #ddd
border: 1px solid black
border-radius: 6px
overflow: hidden
.bar
background: black
width: 100%
height: 100%
.prop[name="health"] .bar
background: #C5362B
.message
text-align: center
display: table
height: 100% height: 100%
width: 100%
.prop[name="health"] .bar p
background: #C5362B display: table-cell
vertical-align: middle
.message font-size: 20px
text-align: center
display: table
height: 100%
width: 100%
p
display: table-cell
vertical-align: middle
font-size: 20px
.thang-actions .thang-actions
width: 212px width: 212px

View file

@ -28,3 +28,9 @@
.share-buttons .share-buttons
clear: both clear: both
.modal-header
text-align: center
.victory-banner
width: 200px

View file

@ -124,19 +124,6 @@ block content
| and upside-down experimenter. | and upside-down experimenter.
| Nick can do anything and chooses to build CodeCombat. | Nick can do anything and chooses to build CodeCombat.
li.row
img(src="/images/pages/about/jeremy_small.png").img-thumbnail
.col-sm-8
h3 Jeremy Arns
p(data-i18n="about.jeremy_description")
| Customer support mage, usability tester,
| and community organizer; you've probably
| already spoken with Jeremy.
li.row li.row
a(href="http://michaelschmatz.com") a(href="http://michaelschmatz.com")
@ -151,4 +138,17 @@ block content
| Programmer, sys-admin, and undergrad technical wunderkind, | Programmer, sys-admin, and undergrad technical wunderkind,
| Michael is the person keeping our servers online. | Michael is the person keeping our servers online.
li.row
img(src="/images/pages/about/jeremy_small.png").img-thumbnail
.col-sm-8
h3 Jeremy Arns
p(data-i18n="about.jeremy_description")
| Customer support mage, usability tester,
| and community organizer; you've probably
| already spoken with Jeremy.

View file

@ -1,6 +1,15 @@
extends /templates/base extends /templates/base
block content block content
div
ol.breadcrumb
li
a(href="/editor", data-i18n="editor.main_title") CodeCombat Editors
li
a(href="/editor/thang", data-i18n="editor.article_title") Article Editor
li.active
| #{article.attributes.name}
button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="revert.revert").btn.btn-primary#revert-button Revert button(data-toggle="coco-modal", data-target="modal/revert", data-i18n="revert.revert").btn.btn-primary#revert-button Revert
button(data-i18n="article.edit_btn_preview").btn.btn-primary#preview-button Preview button(data-i18n="article.edit_btn_preview").btn.btn-primary#preview-button Preview
button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save").btn.btn-primary#save-button Save button(data-toggle="coco-modal", data-target="modal/save_version", data-i18n="common.save").btn.btn-primary#save-button Save

View file

@ -1,6 +1,14 @@
extends /templates/base extends /templates/base
block content block content
div
ol.breadcrumb
li
a(href="/editor", data-i18n="editor.main_title") CodeCombat Editors
li
a(href="/editor/thang", data-i18n="editor.thang_title") Thang Editor
li.active
| #{thangType.attributes.name}
img#portrait.img-thumbnail img#portrait.img-thumbnail

View file

@ -1,5 +1,12 @@
extends /templates/base extends /templates/base
block content block content
div
ol.breadcrumb
li
a(href="/editor", data-i18n="editor.main_title") CodeCombat Editors
li.active(data-i18n="#{currentEditor}")
| #{currentEditor}
if me.get('anonymous') if me.get('anonymous')
a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/signup", role="button") Sign Up to Create a New #{modelLabel} a.btn.btn-primary.open-modal-button(data-toggle="coco-modal", data-target="modal/signup", role="button") Sign Up to Create a New #{modelLabel}
else else

View file

@ -7,6 +7,8 @@
span= levelName span= levelName
span(data-i18n="play_level.victory_title_suffix") Complete span(data-i18n="play_level.victory_title_suffix") Complete
img.victory-banner(src="/images/level/victory.png", alt="")
.modal-body!= body .modal-body!= body
.modal-footer .modal-footer

View file

@ -140,6 +140,7 @@ module.exports = class ThangsTabView extends View
navigateToSelection: false navigateToSelection: false
thangTypes: @supermodel.getModels(ThangType) thangTypes: @supermodel.getModels(ThangType)
showInvisible: true showInvisible: true
frameRate: 15
} }
@surface.playing = false @surface.playing = false
@surface.setWorld @world @surface.setWorld @world

View file

@ -27,9 +27,16 @@ module.exports = class ThangTypeHomeView extends View
'hidden.bs.modal #new-model-modal': 'onModalHidden' 'hidden.bs.modal #new-model-modal': 'onModalHidden'
getRenderData: -> getRenderData: ->
c = super() context = super()
c.modelLabel = @modelLabel context.modelLabel = @modelLabel
c switch @modelLabel
when 'Level'
context.currentEditor = 'editor.level_title'
when 'Thang Type'
context.currentEditor = 'editor.thang_title'
when 'Article'
context.currentEditor = 'editor.article_title'
context
constructor: (options) -> constructor: (options) ->
@runSearch = _.debounce(@runSearch, 500) @runSearch = _.debounce(@runSearch, 500)

View file

@ -135,13 +135,18 @@ module.exports = class HUDView extends View
props = @$el.find('.thang-props') props = @$el.find('.thang-props')
props.find(":not(.thang-name)").remove() props.find(":not(.thang-name)").remove()
props.find('.thang-name').text(if @thang.type then "#{@thang.id} - #{@thang.type}" else @thang.id) props.find('.thang-name').text(if @thang.type then "#{@thang.id} - #{@thang.type}" else @thang.id)
column = null
for prop in @thang.hudProperties ? [] for prop in @thang.hudProperties ? []
continue if prop is 'action'
pel = @createPropElement prop pel = @createPropElement prop
continue unless pel? continue unless pel?
if pel.find('.bar').is('*') and props.find('.bar').is('*') if pel.find('.bar').is('*') and props.find('.bar').is('*')
props.find('.bar-prop').last().after pel # Keep bars together props.find('.bar-prop').last().after pel # Keep bars together
else else
props.append pel column ?= $('<div class="thang-props-column"></div>').appendTo props
column.append pel
column = null if column.find('.prop').length is 5
null
createActions: -> createActions: ->
actions = @$el.find('.thang-actions tbody').empty() actions = @$el.find('.thang-actions tbody').empty()
@ -248,6 +253,8 @@ module.exports = class HUDView extends View
updatePropElement: (prop, val) -> updatePropElement: (prop, val) ->
pel = @$el.find '.thang-props *[name=' + prop + ']' pel = @$el.find '.thang-props *[name=' + prop + ']'
if prop in ["maxHealth"]
return # Don't show maxes--they're built into bar labels.
if prop in ["health"] if prop in ["health"]
max = @thang["max" + prop.charAt(0).toUpperCase() + prop.slice(1)] max = @thang["max" + prop.charAt(0).toUpperCase() + prop.slice(1)]
regen = @thang[prop + "ReplenishRate"] regen = @thang[prop + "ReplenishRate"]
@ -256,13 +263,15 @@ module.exports = class HUDView extends View
labelText = prop + ": " + @formatValue(prop, val) + " / " + @formatValue(prop, max) labelText = prop + ": " + @formatValue(prop, val) + " / " + @formatValue(prop, max)
if regen if regen
labelText += " (+" + @formatValue(prop, regen) + "/s)" labelText += " (+" + @formatValue(prop, regen) + "/s)"
pel.attr 'title', labelText
else if prop in ["maxHealth"]
return
else else
s = @formatValue(prop, val) s = @formatValue(prop, val)
labelText = "#{prop}: #{s}"
if prop is 'attackDamage'
cooldown = @thang.actions.attack.cooldown
dps = @thang.attackDamage / cooldown
labelText += " / #{cooldown.toFixed(2)}s (DPS: #{dps.toFixed(2)})"
pel.find('.prop-value').text s pel.find('.prop-value').text s
pel.attr 'title', "#{prop}: #{s}" pel.attr 'title', labelText
pel pel
formatValue: (prop, val) -> formatValue: (prop, val) ->
@ -271,6 +280,8 @@ module.exports = class HUDView extends View
val = null if val?.isZero() val = null if val?.isZero()
if prop is "rotation" if prop is "rotation"
return (val * 180 / Math.PI).toFixed(0) + "˚" return (val * 180 / Math.PI).toFixed(0) + "˚"
if prop.search(/Range$/) isnt -1
return val + 'm'
if typeof val is 'number' if typeof val is 'number'
if Math.round(val) == val or prop is 'gold' then return val.toFixed(0) # int if Math.round(val) == val or prop is 'gold' then return val.toFixed(0) # int
if -10 < val < 10 then return val.toFixed(2) if -10 < val < 10 then return val.toFixed(2)

View file

@ -53,6 +53,7 @@ module.exports = class SpellPaletteView extends View
more: 'moreProgrammableProperties' more: 'moreProgrammableProperties'
Math: 'programmableMathProperties' Math: 'programmableMathProperties'
Array: 'programmableArrayProperties' Array: 'programmableArrayProperties'
Object: 'programmableObjectProperties'
String: 'programmableStringProperties' String: 'programmableStringProperties'
Vector: 'programmableVectorProperties' Vector: 'programmableVectorProperties'
snippets: 'programmableSnippets' snippets: 'programmableSnippets'