diff --git a/README.md b/README.md index 192b6ff31..7ec226f6e 100644 --- a/README.md +++ b/README.md @@ -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. +### [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) diff --git a/app/assets/images/level/victory.png b/app/assets/images/level/victory.png new file mode 100644 index 000000000..e220c19ff Binary files /dev/null and b/app/assets/images/level/victory.png differ diff --git a/app/assets/images/pages/not_found/404_1.png b/app/assets/images/pages/not_found/404_1.png new file mode 100644 index 000000000..0eab89857 Binary files /dev/null and b/app/assets/images/pages/not_found/404_1.png differ diff --git a/app/assets/images/pages/not_found/404_2.png b/app/assets/images/pages/not_found/404_2.png new file mode 100644 index 000000000..156de14e1 Binary files /dev/null and b/app/assets/images/pages/not_found/404_2.png differ diff --git a/app/assets/images/pages/not_found/404_3.png b/app/assets/images/pages/not_found/404_3.png new file mode 100644 index 000000000..a990d55dd Binary files /dev/null and b/app/assets/images/pages/not_found/404_3.png differ diff --git a/app/lib/God.coffee b/app/lib/God.coffee index 18039a68d..3f80500bf 100644 --- a/app/lib/God.coffee +++ b/app/lib/God.coffee @@ -255,7 +255,7 @@ class Angel testWorker: => 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 @worker.postMessage {func: 'reportIn'} @condemnTimeout = _.delay @condemnWorker, @infiniteLoopTimeoutDuration diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee index 7d9cf0c08..5ce3bf29c 100644 --- a/app/lib/surface/Surface.coffee +++ b/app/lib/surface/Surface.coffee @@ -38,7 +38,6 @@ module.exports = Surface = class Surface extends CocoClass worldLoaded: false scrubbing: false debug: false - frameRate: 60 defaults: wizards: true @@ -49,6 +48,7 @@ module.exports = Surface = class Surface extends CocoClass coords: true playJingle: false showInvisible: false + frameRate: 60 # Best as a divisor of 60, like 15, 30, 60, with RAF_SYNCHED timing. subscriptions: 'level-disable-controls': 'onDisableControls' @@ -374,7 +374,8 @@ module.exports = Surface = class Surface extends CocoClass @stage.addEventListener 'stagemousedown', @onMouseDown @canvas.on 'mousewheel', @onMouseWheel @hookUpChooseControls() if @options.choosing - createjs.Ticker.setFPS @frameRate + createjs.Ticker.timingMode = createjs.Ticker.RAF_SYNCHED + createjs.Ticker.setFPS @options.frameRate showLevel: -> return if @dead @@ -500,7 +501,7 @@ module.exports = Surface = class Surface extends CocoClass @trailmaster.tick() if @trailmaster # 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 - @currentFrame += @world.frameRate / @frameRate if frameAdvanced + @currentFrame += @world.frameRate / @options.frameRate if frameAdvanced and @playing newWorldFrame = Math.floor @currentFrame worldFrameAdvanced = newWorldFrame isnt oldWorldFrame if worldFrameAdvanced @@ -517,7 +518,7 @@ module.exports = Surface = class Surface extends CocoClass @drawCurrentFrame e @onFrameChanged() @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 if @mouseInBounds isnt mib Backbone.Mediator.publish('surface:mouse-' + (if mib then "over" else "out"), {}) diff --git a/app/locale/nl.coffee b/app/locale/nl.coffee index bf9d9d650..dd5904abe 100644 --- a/app/locale/nl.coffee +++ b/app/locale/nl.coffee @@ -104,14 +104,14 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t wizard_settings: title: "Tovenaar instellingen" customize_avatar: "Bewerk jouw avatar" -# clothes: "Clothes" -# trim: "Trim" -# cloud: "Cloud" -# spell: "Spell" -# boots: "Boots" -# hue: "Hue" -# saturation: "Saturation" -# lightness: "Lightness" + clothes: "Kleren" + trim: "Trim" + cloud: "Wolk" + spell: "Spreuk" + boots: "Laarzen" + hue: "Hue" + saturation: "Saturation" + lightness: "Lightness" account_settings: title: "Account Instellingen" @@ -122,19 +122,19 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t wizard_tab: "Tovenaar" password_tab: "Wachtwoord" 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_more_photos: "Voeg meer afbeeldingen toe aan je Gravatar account om ze hier te gebruiken." wizard_color: "Tovenaar Kleding Kleur" new_password: "Nieuw Wachtwoord" new_password_verify: "Verifieer" - email_subscriptions: "Email Abonnementen" - email_announcements: "Aankondegingen" + email_subscriptions: "E-mail Abonnementen" + email_announcements: "Aankondigingen" email_notifications_description: "Krijg periodieke meldingen voor jouw account." email_announcements_description: "Verkrijg emails over het laatste nieuws en de ontwikkelingen bij CodeCombat." contributor_emails: "Medewerker Klasse emails" 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." email_toggle: "Vink alles aan/af" 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_email_suffix: "." gravatar_signup_prefix: "Registreer op " -# gravatar_signup_suffix: " to get set up!" - gravatar_not_found_other: "Alas, there's no profile associated with this person's email address." + gravatar_signup_suffix: " om alles in orde te maken!" + gravatar_not_found_other: "Helaas, er is geen profiel geassocieerd met dit e-mail adres." gravatar_contact: "Contact" gravatar_websites: "Websites" gravatar_accounts: "Zoals Gezien Op" @@ -175,7 +175,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t # victory_title_prefix: "" victory_title_suffix: " Compleet" 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_play_next_level: "Speel Volgend Level" 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_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_coming_soon: "Binnenkort komen er meer Multiplayer mogelijkheden!" + multiplayer_coming_soon: "Binnenkort komen er meer Multiplayermogelijkheden!" guide_title: "Handleiding" tome_minion_spells: "Jouw Minions' Spreuken" tome_read_only_spells: "Read-Only Spreuken" @@ -213,14 +213,14 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t editor: 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_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_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_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!" - 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, " + 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 worden. Indien u deze elementen al eerder wil gebruiken, " contact_us: "contacteer ons!" hipchat_prefix: "Je kan ons ook vinden in ons" 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_italic: "joepie een medaille" why_paragraph_3_center: "maar tof zoals" - why_paragraph_3_italic_caps: "NEE MAMA IK MOET DIT LEVEL AFMAKEN!" - 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_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_3_italic_caps: "NEE MAMA IK MOET DIT LEVEL AF MAKEN!" + 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 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_url: "Start nu met toveren!" 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_suf: "." 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." class_attributes: "Klasse kenmerken" 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" 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." -# 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_suf: "then this class is for you." + 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: "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_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!" @@ -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." 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." -# 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_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_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_2: "Charismatic. Be gentle but articulate about what needs improving, and offer suggestions on how to improve." - 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_forum_url: "our forum" - adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!" - more_about_adventurer: "Learn More About Becoming A Brave Adventurer" - adventurer_subscribe_desc: "Get emails when there are new levels to test." -# 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_sufx: " has built. If you enjoy explaining programming concepts, then this class is for you." - 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 " + 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: "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: "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: "Charismatisch. Wees netjes maar duidelijk over wat er beter kan en geef suggesties over hoe het beter kan." + 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: "ons forum" + adventurer_join_suf: "dus als je liever op deze manier wordt geïnformeerd, schrijf je daar in!" + more_about_adventurer: "Leer meer over hoe je een dappere avonturier kunt worden." + adventurer_subscribe_desc: "Ontvang e-mails wanneer er nieuwe levels zijn die getest moeten worden." + 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: " heeft gebouwd. Als jij het leuk vindt programmeerconcepten uit te leggen, dan is deze klasse iets voor jou." + 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_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_attribute_1: "Skill in words is pretty much all you need. Not only grammar and spelling, but able to convey complicated ideas to others." - contact_us_url: "Contact us" - 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!" - more_about_scribe: "Learn More About Becoming A Diligent Scribe" - 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." - diplomat_introduction_pref: "So, if there's one thing we learned from the " - diplomat_launch_url: "launch in October" - 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_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_join_pref_github: "Find your language locale file " -# diplomat_github_url: "on GitHub" -# 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!" - more_about_diplomat: "Learn More About Becoming A Great Diplomat" - diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate." -# 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." - 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_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_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_note_strong: "Note" - 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!" - more_about_ambassador: "Learn More About Becoming A Helpful Ambassador" - ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments." -# 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_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_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_attribute_1: "Experience, in any of the areas above or something you think might be helpful." - counselor_attribute_2: "A little bit of free time!" - 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)." - more_about_counselor: "Learn More About Becoming A Valuable Counselor" + 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: "Taal-skills zijn praktisch alles wat je nodig hebt. Niet alleen grammatica of spelling, maar ook moeilijke ideas overbrengen aan anderen." + contact_us_url: "Contacteer ons" + 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: "Leer meer over het worden van een ijverige Klerk." + + scribe_subscribe_desc: "Ontvang e-mails met aankondigingen over het schrijven van artikelen." + 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_introduction_pref: "Dus, als er iets is wat we geleerd hebben van de " + diplomat_launch_url: "release in oktober" + 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_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_join_pref_github: "Vind jouw taal haar locale bestand " + diplomat_github_url: "op GitHub" + 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." + more_about_diplomat: "Leer meer over het worden van een geweldige Diplomaat" + diplomat_subscribe_desc: "Ontvang e-mails over i18n ontwikkelingen en levels om te vertalen." + 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: "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: "vertel ons wat over jezelf, wat je hebt gedaan en wat je graag zou doen. We zien verder wel!" + ambassador_join_note_strong: "Opmerking" + 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: "Leer meer over het worden van een behulpzame Ambassadeur" + ambassador_subscribe_desc: "Ontvang e-mails met updates over ondersteuning en multiplayer-ontwikkelingen." + 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: "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: "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: "Ervaring, in enig van de bovenstaande gebieden of iets anders waarvan je denkt dat het behulpzaam zal zijn." + counselor_attribute_2: "Een beetje vrije tijd!" + 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: "Leer meer over het worden van een waardevolle Raadgever" changes_auto_save: "Veranderingen worden automatisch opgeslagen wanneer je het vierkantje aan- of afvinkt." diligent_scribes: "Onze ijverige Klerks:" powerful_archmages: "Onze machtige Tovenaars:" @@ -443,7 +443,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t classes: archmage_title: "Tovenaar" - archmage_title_description: "(codeur)" + archmage_title_description: "(Programmeur)" artisan_title: "Ambachtsman" artisan_title_description: "(Level Bouwer)" adventurer_title: "Avonturier" diff --git a/app/styles/play/level/hud.sass b/app/styles/play/level/hud.sass index a3bed782b..7858f0365 100644 --- a/app/styles/play/level/hud.sass +++ b/app/styles/play/level/hud.sass @@ -86,49 +86,51 @@ @include gradient-radial-custom-stops(hsla(116,80%,74%,1), 20%, hsla(116,80%,31%,1), 70%) .thang-props - width: 144px - height: 100px margin: 8px 8px 0 0 - overflow-y: auto float: left - @include user-select(text) - .prop - img - margin-right: 5px - width: 16px - height: 16px - - .text-prop - width: 50% - - .prop-value.bar-prop - width: 100px - display: inline-block - height: 6px - background: #ddd - border: 1px solid black - border-radius: 6px - overflow: hidden - - .bar - background: black - width: 100% + .thang-props-column + float: left + width: 144px + height: 100px + @include user-select(text) + + .prop + img + margin-right: 5px + width: 16px + height: 16px + + .text-prop + width: 50% + + .prop-value.bar-prop + width: 100px + 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% - - .prop[name="health"] .bar - background: #C5362B - - .message - text-align: center - display: table - height: 100% - width: 100% - - p - display: table-cell - vertical-align: middle - font-size: 20px + width: 100% + + p + display: table-cell + vertical-align: middle + font-size: 20px .thang-actions width: 212px diff --git a/app/styles/play/level/modal/victory.sass b/app/styles/play/level/modal/victory.sass index 4a803fadc..d29b67bcd 100644 --- a/app/styles/play/level/modal/victory.sass +++ b/app/styles/play/level/modal/victory.sass @@ -27,4 +27,10 @@ box-sizing: border-box .share-buttons - clear: both \ No newline at end of file + clear: both + + .modal-header + text-align: center + + .victory-banner + width: 200px diff --git a/app/templates/about.jade b/app/templates/about.jade index 7a5cf0653..e6f0e6afb 100644 --- a/app/templates/about.jade +++ b/app/templates/about.jade @@ -124,19 +124,6 @@ block content | and upside-down experimenter. | 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 a(href="http://michaelschmatz.com") @@ -151,4 +138,17 @@ block content | Programmer, sys-admin, and undergrad technical wunderkind, | 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. + diff --git a/app/templates/editor/article/edit.jade b/app/templates/editor/article/edit.jade index cf9bb17a7..a729bf67a 100644 --- a/app/templates/editor/article/edit.jade +++ b/app/templates/editor/article/edit.jade @@ -1,6 +1,15 @@ extends /templates/base 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-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 diff --git a/app/templates/editor/thang/edit.jade b/app/templates/editor/thang/edit.jade index 73ec06cb5..c7b80fea0 100644 --- a/app/templates/editor/thang/edit.jade +++ b/app/templates/editor/thang/edit.jade @@ -1,6 +1,14 @@ extends /templates/base 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 diff --git a/app/templates/kinds/search.jade b/app/templates/kinds/search.jade index 89d64d25b..24547e166 100644 --- a/app/templates/kinds/search.jade +++ b/app/templates/kinds/search.jade @@ -1,5 +1,12 @@ extends /templates/base 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') 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 diff --git a/app/templates/play/level/modal/victory.jade b/app/templates/play/level/modal/victory.jade index acdd48e93..3509e4fe9 100644 --- a/app/templates/play/level/modal/victory.jade +++ b/app/templates/play/level/modal/victory.jade @@ -6,6 +6,8 @@ span(data-i18n="play_level.victory_title_prefix") span= levelName span(data-i18n="play_level.victory_title_suffix") Complete + + img.victory-banner(src="/images/level/victory.png", alt="") .modal-body!= body diff --git a/app/views/editor/level/thangs_tab_view.coffee b/app/views/editor/level/thangs_tab_view.coffee index 7fedf7d8f..af5ee3c07 100644 --- a/app/views/editor/level/thangs_tab_view.coffee +++ b/app/views/editor/level/thangs_tab_view.coffee @@ -140,6 +140,7 @@ module.exports = class ThangsTabView extends View navigateToSelection: false thangTypes: @supermodel.getModels(ThangType) showInvisible: true + frameRate: 15 } @surface.playing = false @surface.setWorld @world diff --git a/app/views/kinds/SearchView.coffee b/app/views/kinds/SearchView.coffee index 5e150c43a..e89d080e4 100644 --- a/app/views/kinds/SearchView.coffee +++ b/app/views/kinds/SearchView.coffee @@ -27,9 +27,16 @@ module.exports = class ThangTypeHomeView extends View 'hidden.bs.modal #new-model-modal': 'onModalHidden' getRenderData: -> - c = super() - c.modelLabel = @modelLabel - c + context = super() + context.modelLabel = @modelLabel + 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) -> @runSearch = _.debounce(@runSearch, 500) diff --git a/app/views/play/level/hud_view.coffee b/app/views/play/level/hud_view.coffee index bb49e2a70..79aad4e7c 100644 --- a/app/views/play/level/hud_view.coffee +++ b/app/views/play/level/hud_view.coffee @@ -135,13 +135,18 @@ module.exports = class HUDView extends View props = @$el.find('.thang-props') props.find(":not(.thang-name)").remove() props.find('.thang-name').text(if @thang.type then "#{@thang.id} - #{@thang.type}" else @thang.id) + column = null for prop in @thang.hudProperties ? [] + continue if prop is 'action' pel = @createPropElement prop continue unless pel? if pel.find('.bar').is('*') and props.find('.bar').is('*') props.find('.bar-prop').last().after pel # Keep bars together else - props.append pel + column ?= $('
').appendTo props + column.append pel + column = null if column.find('.prop').length is 5 + null createActions: -> actions = @$el.find('.thang-actions tbody').empty() @@ -248,6 +253,8 @@ module.exports = class HUDView extends View updatePropElement: (prop, val) -> 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"] max = @thang["max" + prop.charAt(0).toUpperCase() + prop.slice(1)] regen = @thang[prop + "ReplenishRate"] @@ -256,13 +263,15 @@ module.exports = class HUDView extends View labelText = prop + ": " + @formatValue(prop, val) + " / " + @formatValue(prop, max) if regen labelText += " (+" + @formatValue(prop, regen) + "/s)" - pel.attr 'title', labelText - else if prop in ["maxHealth"] - return else 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.attr 'title', "#{prop}: #{s}" + pel.attr 'title', labelText pel formatValue: (prop, val) -> @@ -271,6 +280,8 @@ module.exports = class HUDView extends View val = null if val?.isZero() if prop is "rotation" return (val * 180 / Math.PI).toFixed(0) + "˚" + if prop.search(/Range$/) isnt -1 + return val + 'm' if typeof val is 'number' if Math.round(val) == val or prop is 'gold' then return val.toFixed(0) # int if -10 < val < 10 then return val.toFixed(2) diff --git a/app/views/play/level/tome/spell_palette_view.coffee b/app/views/play/level/tome/spell_palette_view.coffee index f4c708a18..8085b6145 100644 --- a/app/views/play/level/tome/spell_palette_view.coffee +++ b/app/views/play/level/tome/spell_palette_view.coffee @@ -53,6 +53,7 @@ module.exports = class SpellPaletteView extends View more: 'moreProgrammableProperties' Math: 'programmableMathProperties' Array: 'programmableArrayProperties' + Object: 'programmableObjectProperties' String: 'programmableStringProperties' Vector: 'programmableVectorProperties' snippets: 'programmableSnippets'