{"id":21507,"date":"2013-11-04T07:04:15","date_gmt":"2013-11-04T12:04:15","guid":{"rendered":"http:\/\/www.shamusyoung.com\/twentysidedtale\/?p=21507"},"modified":"2015-07-01T04:49:09","modified_gmt":"2015-07-01T09:49:09","slug":"project-good-robot-28-art-creep","status":"publish","type":"post","link":"https:\/\/www.shamusyoung.com\/twentysidedtale\/?p=21507","title":{"rendered":"Project Good Robot 28: Art Creep"},"content":{"rendered":"<p>I&#8217;d guess that most people have heard the phrase &#8220;feature creep&#8221;, and I&#8217;m willing to bet everyone has been a victim of the mindset behind it, even if they&#8217;re not a programmer. You get amazing results experimenting with idea X, so you decide to turn idea X into feature X. But production code is more expensive than prototype code, so what was originally a one-hour experiment becomes a four-day job to add a feature that wasn&#8217;t originally planned or budgeted and which eventually has side-effects that impact the features you <em>did<\/em> plan.<\/p>\n<p>In this case, I&#8217;m suffering from an art-based version of cascading feature creep.  It began innocently enough:<\/p>\n<p><!--more-->For most of this project, my game environments have been pretty organic. There was rock, dirt, and plants. I made these lumpy tilesets that hid the underlying grid and made the gameworld feel a lot more random than it really was. But now I&#8217;ve added the factory level:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_factory.jpg' class='insetimage'   alt='gr28_factory.jpg' title='gr28_factory.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>That was a quick experimental tileset that instantly became the most interesting part of the game. Several of my testers said it was their favorite part. So maybe I should expand on this idea and add another &#8220;man-made&#8221; tileset?  I figure a factory needs workers, so I&#8217;ll make a tileset that looks like buildings. I&#8217;ll add some windows to the tiles and maybe it will look kind of like an underground city? As a test, I&#8217;ll just take one of my existing levels:<\/p>\n<p><table width='600'  cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_city1.jpg' class='insetimage' width='600' alt='A cave.' title='A cave.'\/><\/td><\/tr><\/table><\/p>\n<p>&#8230;and drop in my &#8220;city&#8221; tileset:<\/p>\n<p><table width='600'  cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_city2.jpg' class='insetimage' width='600' alt='A cave disguised as buildings. Or perhaps buildings in the shape of a cave. I dunno.' title='A cave disguised as buildings. Or perhaps buildings in the shape of a cave. I dunno.'\/><\/td><\/tr><\/table><\/p>\n<p>Wow. That doesn&#8217;t look &#8220;kind of&#8221; like an underground city. That just looks like a city. It also looks kind of&#8230; gothic? I guess? Whatever. That&#8217;s cool. Even using this cave-style layout, it manages to look a lot like a city. Let&#8217;s write some logic to generate proper building shapes:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_city3.jpg' class='insetimage'   alt='gr28_city3.jpg' title='gr28_city3.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>That looks even more like a city. In fact, it looks so much like a city that it feels strange to have it underground. And now that I&#8217;m thinking about it, this is a lot more interesting than the tileset I&#8217;m using for the start of the game, which is just generic green hills and fields. The start of the game 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\/gr28_start.jpg' class='insetimage'   alt='gr28_start.jpg' title='gr28_start.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>It feels like you&#8217;re starting in the middle of nowhere, with no sense of time or place. I could put this new city at the start of the game to make the first level more engaging and to give the player needed context: <em>You&#8217;re on someplace that feels like modern-ish Earth, but with robots<\/em>. Let&#8217;s try putting the city at the top of the game:<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_city4.jpg' class='insetimage'   alt='gr28_city4.jpg' title='gr28_city4.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>That&#8217;s a huge improvement. Except&#8230;<\/p>\n<p>Now that I&#8217;m looking at the city here in the open with the stars in the background, it feels like something is missing. The buildings feel a little dull. Or dark? Hm. It feels like the city should be brighter, somehow.  You know, I&#8217;ve got these glow effects in the factory. They wouldn&#8217;t really work here, since they&#8217;re based on this special tileset designed to have light fixtures attached.  But I could change that. I could make it so any level could have an optional backlight effect. Let me just add that and re-work the atlas texture&#8230;<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_city5.jpg' class='insetimage'   alt='gr28_city5.jpg' title='gr28_city5.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>That&#8217;s more like it!  Except&#8230;<\/p>\n<p>Now that I&#8217;m flying around, all the buildings are starting to feel a bit barren and empty. Shouldn&#8217;t cities have signage? Or towers? Or something like that?<\/p>\n<p>Maybe I could add a new section to the tileset that would define little doodads that could be stuck on flat surfaces?<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_city6.jpg' class='insetimage'   alt='gr28_city6.jpg' title='gr28_city6.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>Yeah. Stuff like that. I&#8217;ll just add billboards and radio towers and crap that can be randomly stuck on top of these buildings. <\/p>\n<p>Of course, now that I see how much better this looks I&#8217;m kind of thinking I should do it for all the other tilesets. Maybe that green grass tileset wouldn&#8217;t look so boring if I put some decorations on it&#8230;<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_park.jpg' class='insetimage'   alt='gr28_park.jpg' title='gr28_park.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>And the jungle tileset? I should add some stuff to that&#8230;<\/p>\n<p><table   class=\"\" cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr28_jungle.jpg' class='insetimage'   alt='gr28_jungle.jpg' title='gr28_jungle.jpg'\/><\/td><\/tr><\/table><\/p>\n<p>You know, this is pretty amazing. But this approach is kind of limited. I mean, I&#8217;m looking for spots where we&#8217;ve got three tiles of flat floor next to each other and placing doodads on the level surface, and spots like this are a bit rare. What if I also made it able to attach different tiles to the walls? Or the ceiling? I could have pipes sticking out of the walls, Mario-style. I could have vertical signs on the sides of buildings. I could even add space to the backlight area of the texture so the doodads could give off &#8220;light&#8221;.  Maybe lit-up arrow signs could guide the player. <\/p>\n<p>Let&#8217;s see.  I&#8217;ll need to expand and re-map the texture atlas to make room for the tiles. I&#8217;ll need to add the logic to place the doodads. Then I need to make to 4 varieties of doodads, times the four directions (left wall, right wall, ceiling, floor) times my eight tilesets. I&#8217;ll need to add some system to control the density of doodads so that they don&#8217;t crowd the game space. <\/p>\n<p>Hang on. What was I doing again? Didn&#8217;t I start out trying to add a new section to the END of the game, to make it longer? And instead of doing that, I replaced an existing section of the game and created a bunch of code and new art obligations. This was supposed to take an hour or so and I&#8217;ve blown three days on it, and the game has exactly the same amount of content and gameplay as before. Actually, I arguably have <strong>less<\/strong>, since these changes likely have introduced bugs to systems that were previously fine. I messed with the wall-building logic, which means a need to do some thorough testing to make sure nothing broke. <\/p>\n<p>(Testing randomly generated space is more time-consuming than pre-fab space. In fact, you can&#8217;t ever guarantee it&#8217;s 100% correct. You just test it repeatedly and your confidence in the code goes up each time you don&#8217;t find something wrong.)<\/p>\n<p>Yes, the game looks better.  Of course, it&#8217;s ALWAYS possible to make a game look better if you&#8217;re willing to throw tons of time at it. If I were to make these changes it would basically double the cost of making tilesets. <\/p>\n<p>Worse, I think I&#8217;m basically redlining it in terms of my artistic ability. I&#8217;m not an artist, and up until now I&#8217;ve been using tricks and hacks to cover up my artistic shortcomings. It&#8217;s easier to draw a silhouette of a thing than it is to draw the thing. With these doodads I&#8217;m moving away from that idea, and if I keep going I&#8217;ll end up with an art pipeline that I can&#8217;t use. I won&#8217;t be skilled enough to make art for my own game. <\/p>\n<p>It would be stupid to throw away all this work and revert to how the game looked before I started. On the other hand, I&#8217;m only partway through an overhaul and this is a lot of work that doesn&#8217;t advance my goals. Right now I sort of regret this entire enterprise, but it&#8217;s too late to go back.<\/p>\n<p>Suddenly I see how AAA games blow through their budgets and get mired in production difficulties. It&#8217;s hard to leave things ugly when you know you could improve them, but if you don&#8217;t put limits on the project you&#8217;ll never finish. <\/p>\n<p>Once I get through this I need to put a lock on the art and make a deliberate decision to live with what I have, warts and all. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;d guess that most people have heard the phrase &#8220;feature creep&#8221;, and I&#8217;m willing to bet everyone has been a victim of the mindset behind it, even if they&#8217;re not a programmer. You get amazing results experimenting with idea X, so you decide to turn idea X into feature X. But production code is more [&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-21507","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\/21507","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=21507"}],"version-history":[{"count":0,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/21507\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}