{"id":20732,"date":"2013-08-26T06:03:50","date_gmt":"2013-08-26T11:03:50","guid":{"rendered":"http:\/\/www.shamusyoung.com\/twentysidedtale\/?p=20732"},"modified":"2015-07-01T03:44:02","modified_gmt":"2015-07-01T08:44:02","slug":"project-good-robot-part-5-taking-shape","status":"publish","type":"post","link":"https:\/\/www.shamusyoung.com\/twentysidedtale\/?p=20732","title":{"rendered":"Project Good Robot 5: Taking Shape"},"content":{"rendered":"<p>As much as I&#8217;d like to ship the game right now, I&#8217;m thinking there&#8217;s probably a really limited market for games where you fight the same enemy forever for no reason, where you can&#8217;t lose, you have no goal, there&#8217;s no score, and nowhere to go. And like all my <a href=\"?page_id=16458\">past projects<\/a>, we should probably avoid getting our hopes up with regards to shipping a game. Barring a steady paycheck, I tend to code as a way of teaching myself how to solve coding problems. This is both personally enriching and financially impoverishing.<\/p>\n<p>But while we&#8217;re waiting for me to lose interest, let&#8217;s see if we can&#8217;t add some more features to this alleged game. <\/p>\n<p><!--more-->As I said <a href=\"?p=20671\">last week<\/a>, I&#8217;ve got this AI system where I can shuffle around simple priorities and behaviors. So one robot will charge you. Another will circle-strafe you. Another stands at a distance and throws long-range attacks at you. (I&#8217;m thinking of making these attacks missiles.) Another will run in, fire of a burst of projectiles for you to deal with, and dart away again.<\/p>\n<p>None of these are terribly interesting on their own, but in groups they make for some really chaotic play.  The hit-and-run guy (which I&#8217;ve called a &#8220;sniper&#8221; in the code for some reason) is a real attention-getter. I can settle into a rhythm dodging bullets and killing regular robots, but when a sniper shows up the burst of fire tends to create a momentary &#8220;no fly zone&#8221; right where I&#8217;m fighting, cutting my available space in half until the volley of shots pass. So I naturally prioritize the sniper over other targets. It&#8217;s not damaging me directly, but it&#8217;s interfering with my ability to avoid other damage. So I chase it, which drags me out of the open area where I have room to move and into little side-tunnels where I can be ambushed. There are lots of little emergent things going on here, all driven by this moron AI. <\/p>\n<p>I&#8217;m still making new foes, shuffling around priorities and seeing if it leads to interesting play.<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level7.jpg' class='insetimage'   alt='gr5_level7.jpg' title='gr5_level7.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>Although, I&#8217;m worried that fighting in just one area like this is leading me away from one of my core ideas, which is that the player should be fighting <em>through<\/em> someplace.  So I make a level generator to create a maze for me to run through.  It&#8217;s not a &#8220;get lost&#8221; kind of maze, but a &#8220;constantly twisting path&#8221; kind of maze. The walls are lumpy and random, but in a broad sense there&#8217;s just one tunnel to follow and it winds its way through the level. <\/p>\n<p>The game is suddenly a lot harder, but not in a good way. I&#8217;m getting insta-killed by suicide bombers or running face-first into a stream of projectiles that I didn&#8217;t see coming. To be clear, I&#8217;m not dying in the &#8220;game over&#8221; sense. There is no game over state. But it is tracking damage now, and I&#8217;m counting myself as having died every time I take 100 damage. And now I see I&#8217;m dying a lot more than I was when I was fighting in an arena against respawning foes. Sometimes it&#8217;s easy and sometimes it&#8217;s hard. After some more testing I realize that the difficulty spikes are happening when the maze calls for vertical movement.<\/p>\n<p>When I first envisioned this thing I was thinking about a game where you would fight your way down. I always liked that &#8220;deep underground&#8221; feel of Descent. I imagined the player would fight their way down most of the time, with little lateral shifts now and then just to keep things interesting.  This gameplay concept would probably have worked fine in the day of 4:3 monitors, but now the world is filled with 16:9 (or in my case an oddball 16:10) screens.  When I&#8217;m moving up and down, I can&#8217;t see nearly as far as when I move horizontally. I don&#8217;t have enough time to dodge projectiles and being shot by off-screen foes doesn&#8217;t feel nearly as exciting as fighting stuff you can see. It feels cheap.  It feels like the game designer is exploiting my screen aspect ratio to gain an advantage over me. <\/p>\n<p>And it&#8217;s not just that it&#8217;s hard. It&#8217;s also driving me away from fun gameplay. Instead of dogfighting with foes all around, I find myself moving down and just spamming projectiles into the off-screen void. Instead of flying around fast, I&#8217;m creeping along, taking a few steps at a time and then hosing the place down with bullets to make sure it&#8217;s safe to take a few more. The game is less interesting when moving up and down. Then I hit a horizontal section and it turns fun again.<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level1.jpg' class='insetimage'   alt='gr5_level1.jpg' title='gr5_level1.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>Sure, I could just pull the camera back a bit or slow down projectiles so that there&#8217;s proper time and room to engage foes when moving vertically, but then horizontal movement will seem slow and dull. Worse, it basically means all the gameplay will take place in the square region in the center of the screen and the stuff on the sides ends up being wasted space. I&#8217;ll be designing a game for square displays.<\/p>\n<p>There are a lot of ways I could fix this, but the most expedient way to get back to the gameplay I want is to just drop the idea of constant vertical fighting. So I design the level builder to create horizontal gamespace. You fight going right for some distance.  Then there&#8217;s a &#8220;Breather&#8221; screen where you move down without too many foes around.  Then you fight going left.<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level2.jpg' class='insetimage'   alt='gr5_level2.jpg' title='gr5_level2.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>This looks kind of dull when you see the map like this, but in the thick of things it&#8217;s fine. The tunnels branch and twist enough that I can&#8217;t really &#8220;feel&#8221; the back-and-forth movement of the level. <\/p>\n<p>The other thing that&#8217;s taking shape is the art style. Every few hours I get an idea and dabble with the sprites for a bit. I feel myself gravitating towards this idea where everything is done in black silhouette. (I know <a href=\"?p=20649\">I mentioned Twisted Shadow Planet back in part 2<\/a>, but it might be at this part of the project where I really settled on the idea. It&#8217;s hard to tell. I remember my programming decisions and thought processes a lot better than I remember my artistic decisions.) I try using lower resolution textures, experimenting with a faux 8-bit look:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level4.jpg' class='insetimage'   alt='gr5_level4.jpg' title='gr5_level4.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>And I try higher resolution versions of the same assets:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level3.jpg' class='insetimage'   alt='gr5_level3.jpg' title='gr5_level3.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>And as I expected, 8-bit is one of those styles that looks easy, but turns out to be really hard for the artistically inept. Someone with more skill could probably really make this giant pixel motif work, but not me. I&#8217;m leaning more and more towards crisp silhouettes with glowing lights. Although it&#8217;s kind of interesting to mix blocky lights with hi-res outlines. <\/p>\n<p>This &#8220;glowing lights on black shapes&#8221; motif places some interesting limits on what I can do. What we seem to be heading for is a game where black outline shapes shoot glowing neon projectiles at each other. That&#8217;s pretty cool, but it means the background needs to be really muted. If it&#8217;s too dark then we can&#8217;t tell the projectiles from the bad guys. If it&#8217;s too bright then the projectiles will blend in with the background. And if it&#8217;s too colorful then some projectiles will be hard to see, and the rest won&#8217;t seem nearly as vibrant. <\/p>\n<p>Having figured this out over the course of a couple of days, I&#8217;m reasonably comfortable settling on this as my art style. I didn&#8217;t start this project to make art, and even if it becomes a game someday it probably won&#8217;t be a game that stands on its art. Our standards for art right now are &#8220;not horrible&#8221;, and I think this idea can get us there. <\/p>\n<p>In the long run, we probably want layered scenery. Perhaps a black silhouette foreground and a muted and blurry scrolling background.  But I&#8217;m not going to muck around with the background just yet.  <\/p>\n<p>We&#8217;re using marching squares for our scenery. That means our gamespace is a grid of points that are either empty space or solid.  A group of adjacent points forms a square, where each corner is either open or solid. There are fifteen possible combinations for these four points.  I make a texture to represent all 15 possible patterns:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_tileset.jpg' class='insetimage'   alt='gr5_tileset.jpg' title='gr5_tileset.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>Putting it into the world, it looks like this:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level6.jpg' class='insetimage'   alt='gr5_level6.jpg' title='gr5_level6.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>Ignore the strange bright halo around my character. That&#8217;s a feature I&#8217;ll talk about in a couple of entries. Anyway, up close it looks like this:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr5_level5.jpg' class='insetimage'   alt='gr5_level5.jpg' title='gr5_level5.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>It might not be good, but it&#8217;s definitely good enough. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>As much as I&#8217;d like to ship the game right now, I&#8217;m thinking there&#8217;s probably a really limited market for games where you fight the same enemy forever for no reason, where you can&#8217;t lose, you have no goal, there&#8217;s no score, and nowhere to go. And like all my past projects, we should probably [&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-20732","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\/20732","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=20732"}],"version-history":[{"count":0,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/20732\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=20732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=20732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=20732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}