{"id":21146,"date":"2013-09-23T01:35:15","date_gmt":"2013-09-23T06:35:15","guid":{"rendered":"http:\/\/www.shamusyoung.com\/twentysidedtale\/?p=21146"},"modified":"2015-07-01T04:46:33","modified_gmt":"2015-07-01T09:46:33","slug":"project-good-robot-17-the-next-stage","status":"publish","type":"post","link":"https:\/\/www.shamusyoung.com\/twentysidedtale\/?p=21146","title":{"rendered":"Project Good Robot 17: The Next Stage"},"content":{"rendered":"<p>Tomorrow will mark the 8 week point of this project. I&#8217;ve been coy about where I&#8217;m going with this all along. Am I going to sell this game? Will it be on Steam? Linux? Will it support [esoteric thing]? Will I do a Kickstarter? Humble bundle? Mobile port? <\/p>\n<p>So far I haven&#8217;t answered these questions because I don&#8217;t know myself. Eating is good, which means money is useful, which means selling the game would be really nice. But I have no idea what&#8217;s involved with that. I haven&#8217;t worked on commercial software in several years, and even when I did I had a company handling all the messy product-marketing, money-collecting, customer-servicing, tax-paying, digital-distributing crap. All I had to do was program and some mysterious process converted the code into paychecks. <\/p>\n<p>But now I&#8217;m more or less working alone. I need to do all that crap if I want to ship this thing. <\/p>\n<p>Oh, I also need to finish it. <\/p>\n<p><!--more--><table width='600'  cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr17_screen1.jpg' class='insetimage' width='600' alt='Someone suggested moving the shield and energy bars so they fill outward, so your eyes don&#8217;t need to be in as many places at once. Your avatar also offers some cues. The laser arm dims as you run low of power. The missile arm goes dark when you&#8217;re out. The circle in the torso fades with your shields. It&#8217;s usually subtle, but when all three go dark it really drives home how screwed you are.' title='Someone suggested moving the shield and energy bars so they fill outward, so your eyes don&#8217;t need to be in as many places at once. Your avatar also offers some cues. The laser arm dims as you run low of power. The missile arm goes dark when you&#8217;re out. The circle in the torso fades with your shields. It&#8217;s usually subtle, but when all three go dark it really drives home how screwed you are.'\/><\/td><\/tr><tr><td class='insetcaption'>Someone suggested moving the shield and energy bars so they fill outward, so your eyes don&#8217;t need to be in as many places at once. Your avatar also offers some cues. The laser arm dims as you run low of power. The missile arm goes dark when you&#8217;re out. The circle in the torso fades with your shields. It&#8217;s usually subtle, but when all three go dark it really drives home how screwed you are.<\/td><\/tr><\/table><\/p>\n<p>The problem with working on a video game like this is that there&#8217;s no upper limit on how much time I <em>could<\/em> put into it. I could keep adding features forever, but at some point those features will no longer help the product sell. At some further point adding more features won&#8217;t even make the game better. I&#8217;ve passed on a bit of paying work in the last couple of months, so it&#8217;s costing me money to work on this.<\/p>\n<p>I&#8217;m okay with that because I&#8217;m basically obsessed and I can&#8217;t think about anything else anyway, but in order to keep up the pretense of being a responsible adult I should at least acknowledge the costs as I&#8217;m incurring them. I&#8217;ve found that being irresponsible is a lot more tolerable to people if you just point out that you&#8217;re doing it. <\/p>\n<p>But fine. I can just look at the opportunity costs of not writing prose while I finish the game and use that to figure out how much time I should put into the project.  I&#8217;ll just compare how much I&#8217;m missing now with how much I can expect to make and use that to budget my time.<\/p>\n<p>Except&#8230; I have no idea how much I can expect to make from this. None at all. I don&#8217;t even have a reasonable guess. A thousand? Twenty thousand? A hundred bucks? <\/p>\n<p>I don&#8217;t know how much an &#8220;average&#8221; indie game sells, I don&#8217;t know what the after-tax, after-distro net is, and I don&#8217;t have any idea if my game will be above or below average. We have multiple layers of unknowns. Our margin for error is as large as the thing we&#8217;re trying to measure, which is just a fancy way of saying we&#8217;re making numbers up. <\/p>\n<p>Worse, I also don&#8217;t know the numbers on the other side of the balance sheet. How long does it take to bring an indie game to market? Sod if I know. Headliners like Braid and Fez took a couple of years. My project is less ambitious than those, but I don&#8217;t know how much time that lack of ambition will save me. <\/p>\n<p>What features are needed? How long will it take to write those features? <\/p>\n<p>So basically I have to write an unknown number of features that will take an unknown amount of time so I can sell an unknowable number of copies for an unknown amount of money over an unknown period of time. I plugged those numbers into a spreadsheet and they formed a graph in the shape of a middle finger. <\/p>\n<p>I am amazed any indie games get made at all.  I suppose this explains why most indie games are made by adventurous unmarried twenty-somethings. <\/p>\n<p><table width='600'  cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr17_screen2.jpg' class='insetimage' width='600' alt='I&#8217;m surprised at how many insect and worm robots are in the game. I keep adding more because they&#8217;re visually striking compared to the static sprites I used to have flying all over the place.' title='I&#8217;m surprised at how many insect and worm robots are in the game. I keep adding more because they&#8217;re visually striking compared to the static sprites I used to have flying all over the place.'\/><\/td><\/tr><tr><td class='insetcaption'>I&#8217;m surprised at how many insect and worm robots are in the game. I keep adding more because they&#8217;re visually striking compared to the static sprites I used to have flying all over the place.<\/td><\/tr><\/table><\/p>\n<p>But let&#8217;s try to cobble together some sort of to-do list:<\/p>\n<ol>\n<li>More playtesting. And I mean really <strong>play<\/strong> testing, not <strong>bug<\/strong> testing. I&#8217;ve already gone through two rounds of this with the Spoiler Warning cast, and the resulting feedback had a large impact on how the game plays. I should probably loop through these tests until the feedback stops changing the design.  Basically, I need to keep this up until I fix the broken mechanics or decide they&#8217;re broken on purpose.\n<p>Example: Originally your weapon would stop firing when you didn&#8217;t have enough murder juice to fire at your current power level. You then had to wait a couple of frustrating seconds for the next shot. Chris suggested that the weapon should automatically step down to whatever power level you can support. So instead of having your gun stop firing, it just starts pumping out lower and lower power bullets. That small change had a huge impact on how protracted battles play out. The player can still defend themselves, which means less running away and sucking their thumb. There are probably a lot of these types of adjustments that I can discover if I spend enough time shoving people through the game and taking notes.<\/p>\n<li>More art. Right now there are only 2 tilesets and some of the robot graphics are a little dodgy.\n<li>I need to buy music. I&#8217;ve been putting this off because I don&#8217;t want to sink money into this thing if I&#8217;m not going to finish it. On the other hand, I can&#8217;t expand my pool of testers until I have real music. The stuff I&#8217;m using now is Creative Commons and stuff ripped from Descent, which means distributing the game to testers could technically qualify as music piracy or violations of Creative Commons terms.\n<li>I need to write the &#8220;story&#8221;, such as it is.  It&#8217;s really just little boxes of flavor text (that also dispense XP) scattered around each level. It&#8217;s a place to shove two or three sentences of text to give players a slight breather and give some sort of lighthearted context to the action. No big deal, but I probably need 50-ish of the things.\n<li>Need to make a tutorial.\n<li>Some kind of save system.  The game saves automatically on exit and just dumps you back into the game when you launch it. (It&#8217;s like Diablo, where it saves your character state and puts you at the most recent waypoint.) There&#8217;s only one slot and there&#8217;s no way to backtrack to previous areas once you reload. Maybe players will want to be able to re-visit previous areas. Maybe they&#8217;ll want to be able to jump back to old chapters, like the chapter select in Half-Life 2.\n<p>More testing needed to figure out what makes sense and is fun. <\/p>\n<li>Need an options screen. Fullscreen options, sound and music volume, mouse sensitivity, resolution, etc.\n<li>Multi-threading. The game is lightweight enough that I don&#8217;t need to juggle constant concurrent threads. I don&#8217;t have to put AI in one thread, physics in another, and rendering in a third.  However, there are a couple of annoying processes that cause hitching.  Loading a new level is something like a quarter second to procedurally generate the whole thing, and it takes about three quarters of a second to load in one of the ogg vorbis music files. It&#8217;s ugly to have the game stutter when you fly over an invisible line and trigger one of these events, so they need to be put into some background thread.\n<li>I <strong>Should<\/strong> probably add a feature to let the player remap their controls, although something like that can take as long as the rest of the interface combined. The game then needs to &#8220;know&#8221; what all keys are called on every possible keyboard and joystick, and must allow you to change any of them to any other while recognizing collisions, confirming changes, and gracefully handling people who switch between keyboard and joystick. None of this is difficult in a technical sense, but it&#8217;s CRAZY time consuming to get it just right.\n<p>Worse, it&#8217;s a really time-consuming feature that will only be used by a minority of players. This isn&#8217;t System Shock 2, where you have complex inventory screens and weapon selection and powersets.  You move and you shoot. That shouldn&#8217;t need to be re-mapped. Except that many people are using (say) AZERTY keyboards where WASD aren&#8217;t arranged in a gameplay-friendly inverted T. It would save me days of work if I could detect keyboards and select reasonable presets, but I&#8217;m not sure how to do it or how reliable it would be. I could also support the arrow keys as a way of avoiding this problem, but then what about laptops?  <\/p>\n<p>Basically, the costs and benefits are all over the place. There&#8217;s no way it&#8217;s worth days and days of fussy interface-building work to make key-mapping available for the one potential customer who is using an AZERTY laptop with no arrow keys who doesn&#8217;t own a USB dual analog controller. But I have no idea what other kinds of esoteric usability issues might be out there. <\/p>\n<li>Translations. I need to round up all the in-game text, yank out the lazily hard-coded messages, and stuff those into a text file that can be translated into those jibber-jabber languages they have in foreign lands. This might mean messing with Unicode. Unicode is a pain in the ass.\n<p><a href=\"http:\/\/www.joelonsoftware.com\/articles\/Unicode.html\">Joel Spolsky insists that &#8220;It&#8217;s not that hard.&#8221;<\/a> but then he writes 3,600 words just outlining the problem. It&#8217;s hard. I don&#8217;t mean &#8220;This is too complex for the brains of mere mortals!&#8221;  I mean it takes a lot of reading docs, <a href=\"?p=15956#forums\" title=\"Project Octant Part 11: Shaders\">digging through forums<\/a> for answers, and doing extended testing cycles with people in foreign lands who are many time zones out of sync with you. <\/p>\n<p>I might do another post outlining why Unicode is a pain, but the short version is that (at least using Microsoft dev tools) you can&#8217;t just make a couple of user-exposed bits Unicode. Every stupid string in your program ends up being Unicode, which adds a lot of really ugly clutter to the code and requires an insane number of trivial edits over over the place. <\/p>\n<p>(Actually, maybe not. Back in my Activeworlds days we had to put ugly casting around almost <em>every single<\/em> string literal in code, and the development environment couldn&#8217;t display the contents of Unicode strings.  So code was verbose, ugly, and you couldn&#8217;t see what you were doing when debugging. But I&#8217;m using SDL to talk to windows, my tools are 10 years newer, and I&#8217;m not actually shuffling that many strings around. So maybe it won&#8217;t be a nightmare this time around.) <\/p>\n<p>And now that I&#8217;m thinking about it, do you need Unicode if you just want European languages? Do Dutch, French, German, and Portuguese require Unicode? Or is it only needed for stuff like Arabic or Chinese? I honestly don&#8217;t know.  <\/p>\n<p>See what I mean about needing research? I need to study just to figure out what to study.<\/p>\n<p>Having said that: Is this step needed? If the game is going to reach some wider audience then I&#8217;ll need multi-language support. But if the sales end up limited to people who already read the blog, then it&#8217;s pointless. I mean, you people already read English. <\/p>\n<li>Need to do some profiling. How fast is the game? Need to figure out what system specs are required to hit the 60fps target. None of my testers have reported problems, even with my un-optimized alpha version. That&#8217;s encouraging because it means the system specs should be fairly broad. But I still have to grope around and figure out what the limits are.\n<li>Maybe Linux.\n<li>Maybe Steam \/ Steamworks \/ achievements \/ high score lists \/ Greenlight.\n<li>Just so you don&#8217;t think I&#8217;m forgetting: Bug hunting. The thing is amazingly stable and polished for an alpha, but Josh did manage to crash it and find a bug nobody else is getting because he&#8217;s Josh.\n<\/ol>\n<p><table width='600'  cellpadding='0' cellspacing='0' border='0' align='center'><tr><td><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/gr17_screen3.jpg' class='insetimage' width='600' alt='Here&#8217;s an example of the player running out of energy. The rainbow coloring is due to the way it&#8217;s stepping down through the power levels. ' title='Here&#8217;s an example of the player running out of energy. The rainbow coloring is due to the way it&#8217;s stepping down through the power levels. '\/><\/td><\/tr><tr><td class='insetcaption'>Here&#8217;s an example of the player running out of energy. The rainbow coloring is due to the way it&#8217;s stepping down through the power levels. <\/td><\/tr><\/table><\/p>\n<p>The takeaway from all of this is that once you&#8217;ve got a playable, stable, fun game, you&#8217;re only halfway done. The difference between &#8220;this is offered as-is&#8221; and &#8220;this is a thing people will pay for&#8221; is pretty drastic.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tomorrow will mark the 8 week point of this project. I&#8217;ve been coy about where I&#8217;m going with this all along. Am I going to sell this game? Will it be on Steam? Linux? Will it support [esoteric thing]? Will I do a Kickstarter? Humble bundle? Mobile port? So far I haven&#8217;t answered these questions [&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-21146","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\/21146","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=21146"}],"version-history":[{"count":0,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/21146\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}