{"id":33233,"date":"2016-07-12T09:01:34","date_gmt":"2016-07-12T13:01:34","guid":{"rendered":"http:\/\/www.shamusyoung.com\/twentysidedtale\/?p=33233"},"modified":"2016-07-12T09:01:34","modified_gmt":"2016-07-12T13:01:34","slug":"good-robot-postmortem-1-introduction","status":"publish","type":"post","link":"https:\/\/www.shamusyoung.com\/twentysidedtale\/?p=33233","title":{"rendered":"Good Robot Postmortem #1: Introduction"},"content":{"rendered":"<p>AAA game publishers love to muzzle their developers and send out their marketing robots to tell us EVERYTHING IS FINE. SALES ARE ALWAYS UP. WE BELIEVE IN OUR TEAM. SADLY, ECONOMICS BEYOND OUR CONTROL MEANS WE HAVE TO LAY OFF THIS TEAM. EVERYTHING CONTINUES TO BE FINE. WE ARE PROUD OF THIS GAME. WE ARE DISAPPOINTED IN ITS RECEPTION. SALES ARE UP. WE VALUE YOUR FEEDBACK. <\/p>\n<p>We&#8217;re trying to invent a new industry and a new medium, and instead of learning from each other&#8217;s mistakes, everyone pretends they don&#8217;t make mistakes. I think that&#8217;s bad for everyone. On the other hand, documenting your mistakes in public is no fun, and publicly saying, &#8220;Here is how we wasted some of your investment money&#8221; might make it less likely that people will entrust you with money in the future. And writing stuff like this takes time away from stuff like patching your game or starting on the next one.<\/p>\n<p>So I understand why only a small percent of games get a postmortem. And given the odd, meandering path this game took to release, I&#8217;m not sure how valuable this postmortem will be to other devs. But in an effort to Do The Right Thing, here is our story.<\/p>\n<h3>Who Did What<\/h3>\n<p><a href=\"http:\/\/www.shamusyoung.com\/twentysidedtale\/\">Shamus<\/a>: Engine programming, music, game design, &#8220;writing&#8221;.<\/p>\n<p><a href=\"https:\/\/www.patreon.com\/rutskarn\">Rutskarn<\/a>: <em>Actual<\/em> writing.<\/p>\n<p><a href=\"http:\/\/pyrodactyl.com\/\">Arvind<\/a>: Game Programming, Game Design, UI, Level Generation, Business &#038; Promotion<\/p>\n<p><a href=\"http:\/\/www.seventh-house.org\/\">Ross<\/a>: Game Design, Scripting, Misc. Art<\/p>\n<p>Mikk and Rashi: Art<\/p>\n<p>Over the next few entries, Arvind, Ross, Rutskarn and myself (Shamus) will take turns talking about the development of this game. <span style=\"color:#060\">Arvind&#8217;s text will be in green<\/span> and <span style=\"color:#008\">Ross will be in blue<\/span>. <span style=\"color:#500\">Rutskarn will be in red<\/span>.<\/p>\n<p><!--more--><\/p>\n<h3>Origins<\/h3>\n<p><a href=\"http:\/\/www.shamusyoung.com\/twentysidedtale\/?p=20649\">Good Robot began in the summer of 2013 as a personal hobby project<\/a>. I observed that there was a lack of Descent-style gameplay where the player would fly through caves, shooting robots. This was an interesting gap, since this seems like a really attractive target from a development standpoint. <\/p>\n<p>Blocky robots are easier to model and animate than (say) ambulatory bipeds. Making AI float around is easier than making AI that needs to navigate terrain. Indoor spaces are easier to build than outdoor ones. They&#8217;re also easier to render. (Which  is way so many 90&#8217;s games took place inside of buildings.) And the indoor, corridor-based design automatically provides a way to keep the player focused on their immediate goals and not wandering around bored and aimless, which is a danger for open environments. Industrial \/ organic caves and tunnels are easier to build than (say) residential, urban, or retail locations because you can take more artistic license. Aside from market size, everything about the Descent design and gameplay screams out &#8220;This is an ideal target for indies!&#8221;<\/p>\n<p>Apparently I&#8217;m not the only person who saw this opportunity. Since I began Good Robot, at least three other supposed &#8220;Descent successors&#8221; have begun or completed development: <a href=\"https:\/\/www.kickstarter.com\/projects\/revivalprod\/overload-the-ultimate-six-degree-of-freedom-shoote\">Overload<\/a>, <a href=\"http:\/\/store.steampowered.com\/app\/327880\/\">Sublevel Zero<\/a>, and <a href=\"http:\/\/store.steampowered.com\/app\/360950\/\">Descent Underground<\/a>.<\/p>\n<p>But I knew that making a full 3D game was probably still too much for me to take on all on my lonesome. I wanted to play around with gameplay concepts, but when you&#8217;re working in 3D, a lot of time goes into fussing with technology. So I decided to see how far I could get with just 2D.<\/p>\n<p>Six months later, I&#8217;d finished the core technology: AI, level generation, a particle system, flying bullets, a stat-based level-up system, per-pixel hit detection on 2D sprites. I had a procedurally generated world where the player flew through caves and shot robots. Unfortunately, it was basically a mild diversion of a game. <a href=\"http:\/\/www.shamusyoung.com\/twentysidedtale\/?p=21973\">It just wasn&#8217;t interesting<\/a>. Also, the interface was a horrible mess. I hate writing GUI interface code, and it really showed.<\/p>\n<p>In January 2015 I teamed up with Pyrodactyl games. The goal was to fix the above problems and bring the game the rest of the way to market. In April 2016, after a year of steady part-time development, we released the game on Steam. The reception was very positive.<\/p>\n<p>The final game had almost nothing in common with the original &#8220;2D Descent&#8221; concept, and instead wound up as a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Shoot_%27em_up\">SHMUP<\/a> \/ <a href=\"https:\/\/en.wikipedia.org\/wiki\/Roguelike\">Rogelike<\/a> \/ RPG mashup.<\/p>\n<h3>Pyrodactyl Joins<\/h3>\n<p><a href='images\/gr46_compare.jpg'><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr46_compare_small.jpg' width=100% alt='Top: The original design from Shamus. Bottom: After Pyrodactyl joined.' title='Top: The original design from Shamus. Bottom: After Pyrodactyl joined.'\/><\/div><\/a><div class='mouseover-alt'>Top: The original design from Shamus. Bottom: After Pyrodactyl joined.<\/div><\/p>\n<div style=\"color:#060\">\n<a href=\"http:\/\/pyrodactyl.com\/\"><img decoding=\"async\" src=\"images\/profile_arvind.jpg\" align=\"left\" title=\"Arvind\" alt=\"Arvind\"\/><\/a> The game as we got it was more akin to a framework &#8211; the shooting already felt great, the movement was responsive and there was a clear visual style present. However, a lot of areas &#8211; enemy design, exploration, level generation and layout, balance, progression etc etc &#8211; needed work. <a href=\"?p=31287\">I&#39;ve already discussed some of those topics in an earlier blog post<\/a>, which I recommend you read before continuing here.<\/p>\n<h3>Level Generation<\/h3>\n<p>When I got my hands on the game, the individual segments of the caverns were procedurally generated but the eventual path the player took was always the same. If you were to draw a diagram of the levels, it would always look like this:<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/grpost_path.jpg' width=100% alt='It didn&apos;t LOOK this simple, because individual rooms were pretty complicated.' title='It didn&apos;t LOOK this simple, because individual rooms were pretty complicated.'\/><\/div><div class='mouseover-alt'>It didn&apos;t LOOK this simple, because individual rooms were pretty complicated.<\/div><\/p>\n<p>The boxes are the individual rooms which were procedurally generated, while the line in the middle is the path the player takes. The change in color indicates different levels. <\/p>\n<p>The problem here was that the arrangement of the rooms was undermining the entire idea of procedurally generating your game. If the overarching arrangement stays the same every time, then the rooms themselves being different is similar to changing the building textures in GTA every time you load the game, but keeping the street layout the same.<\/p>\n<p>As soon as we made it so that the rooms now could have exits in any direction and the path was different each time, the game became a lot more enjoyable to play. Now, the player had to actually explore and find the path to the next level, instead of figuring out the path once and then just following that for every playthrough.<\/p>\n<p>I also entirely remade the way the rooms themselves were generated, which is explained in the guide inside the game files (look for it in <Game Install Location>\/core\/maps\/). Essentially, there are about 50 &#8220;reference layouts&#8221; to which procedural generation is applied. This way, we can design custom maps for special enemy types and bosses while otherwise making sure a specific room type does not repeat itself.<\/p>\n<p>After that, we made a system to put together these rooms in a fashion similar to a music playlist set to play X random songs out of Y. This led to the random caverns you see in Good Robot today.<\/p>\n<h3>Overall Design Philosophy<\/h3>\n<p><a href='images\/GoodRobot_WGIF10.gif'><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/GoodRobot_WGIF10_sub5MB.gif' width=100% alt='Click for larger image.' title='Click for larger image.'\/><\/div><\/a><div class='mouseover-alt'>Click for larger image.<\/div><\/p>\n<p>If I had to distill my key design goals for Good Robot, they would be:<\/p>\n<ol>\n<li>Present the player with interesting decisions at every turn.\n<li>Alternate between action segments and quiet segments.\n<li>The player should learn more about the game and be able to apply that knowledge in subsequent playthroughs.\n<\/ol>\n<p>Once you list it out like that, you can piece together why:<\/p>\n<ol>\n<li>Each level is divided into multiple zones, and you have to choose from one of 3 doors.\n<li>Door symbol meanings become apparent after a couple of times you choose that door.\n<li>The vending machines are always at the end of a zone, so you can enjoy a little bit of downtime while making a strategic decision about your upgrade\/weapon\/warranty\/etc purchases.\n<\/ol>\n<p>If any of you fancy becoming game designers, feel free to dissect the game&#39;s design and see if you can identify some other pillars of Good Robot&#39;s structure.\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>AAA game publishers love to muzzle their developers and send out their marketing robots to tell us EVERYTHING IS FINE. SALES ARE ALWAYS UP. WE BELIEVE IN OUR TEAM. SADLY, ECONOMICS BEYOND OUR CONTROL MEANS WE HAVE TO LAY OFF THIS TEAM. EVERYTHING CONTINUES TO BE FINE. WE ARE PROUD OF THIS GAME. WE ARE [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[498],"tags":[],"class_list":["post-33233","post","type-post","status-publish","format-standard","hentry","category-good-robot"],"_links":{"self":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/33233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=33233"}],"version-history":[{"count":0,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/33233\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=33233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}