<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Andy Moore &#187; Protonaut</title>
	<atom:link href="http://www.andymoore.ca/category/gamedesign/protonaut/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andymoore.ca</link>
	<description>Game Design and Programming</description>
	<lastBuildDate>Mon, 06 Sep 2010 15:57:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Protonaut is Up for Bidding</title>
		<link>http://www.andymoore.ca/2010/05/protonaut-is-up-for-bidding/</link>
		<comments>http://www.andymoore.ca/2010/05/protonaut-is-up-for-bidding/#comments</comments>
		<pubDate>Sun, 02 May 2010 16:34:49 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Monetization]]></category>
		<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/?p=396</guid>
		<description><![CDATA[Protonaut has been suffering a slow death. Ever since the first beta, it hasn&#8217;t generated a single sale and is suffering from a severe lack of traffic. No traffic means no new levels, which means there&#8217;s no reason for traffic to keep coming back&#8230; One of those old Chicken-and-the-Egg problems. Of course, since I last [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.flashgamelicense.com/thumbs/thumb_3bxpn38i10868.jpg" alt="" width="100" height="101" />Protonaut has been suffering a slow death. Ever since the first beta, it hasn&#8217;t generated a single sale and is suffering from a severe lack of traffic. No traffic means no new levels, which means there&#8217;s no reason for traffic to keep coming back&#8230; One of those old Chicken-and-the-Egg problems.</p>
<p>Of course, since I last really worked on Protonaut, Greg Wohlwend has been off making <a href="http://4fourths.com/">fantastic trailers</a> and <a href="http://www.intuitiongames.com/tetraform/">new games</a>, and I&#8217;ve been working on <a href="http://www.andymoore.ca/steambirds/">SteamBirds</a>. We haven&#8217;t had a lot of time or desire to work on something that <em>isn&#8217;t </em>being successful.</p>
<p>Greg and I decided that Protonaut wasn&#8217;t really working; it&#8217;s missing a key nugget of user-retention-fun, and the effort required to fix it is exceeding our desire to continue work. We pretty much decided to write off the game and put it to rest, but I decided to give it one last push.</p>
<p>In the <a href="http://www.protonaut.net">latest update</a>, I added some character-building signposts and rewrote a bunch of the tutorial levels. Fixed replays and made the controls keyboard-and-mouse, which is a whole lot easier to master than the old keyboard-only layout. And then I did the crazy: I posted it <a href="http://www.flashgamelicense.com/view_game.php?game_id=10868">up for bidding on FlashGameLicense</a>.</p>
<p>Bidding is probably a week or three away from closing, but it&#8217;s looking good so far! The game is already exceeding average sponsorship rates, despite the fact that the game has been out for a while (albeit with no traffic) and has a few external links in it. Exclusive sponsorships probably won&#8217;t work without a fancy non-standard deal with a sponsor, and yet we still have a lot of interest!</p>
<p>If the sponsorship gives the game the boost of traffic it needs to jumpstart the engines, I&#8217;ll be able to continue developing it. But if it fizzles out over a month or two, I won&#8217;t put in much more effort than bugfixes. Crossing my fingers!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2010/05/protonaut-is-up-for-bidding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bayesian Ratings: Your Salvation for User-Generated Content</title>
		<link>http://www.andymoore.ca/2010/02/bayesian-ratings-your-salvation-for-user-generated-content/</link>
		<comments>http://www.andymoore.ca/2010/02/bayesian-ratings-your-salvation-for-user-generated-content/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 01:34:05 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/?p=336</guid>
		<description><![CDATA[I&#8217;ve been meaning to write this article for about 6 months now, and it&#8217;s about time I got it off my chest. I&#8217;ll preface this by saying I don&#8217;t &#8220;know the lingo&#8221; of statistics and might get a few phrasings incorrect, but the article should otherwise stand on it&#8217;s own. The Problem Protonaut is a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been meaning to write this article for about 6 months now, and it&#8217;s about time I got it off my chest. I&#8217;ll preface this by saying I don&#8217;t &#8220;know the lingo&#8221; of statistics and might get a few phrasings incorrect, but the article should otherwise stand on it&#8217;s own.</p>
<h1>The Problem</h1>
<p><a href="http://protonaut.net">Protonaut</a> is a game that <em>relies </em>(in a very hard way) on user-generated content, and I wasn&#8217;t sure how to approach the presentation of it. As Community Manager for <a href="http://fantasticcontraption.com">Fantastic Contraption</a>, I&#8217;ve watched the community struggle with content management. Common questions or feature requests would revolve around a few key issues:</p>
<ul>
<li>How do I find the latest <em>good </em>levels to play?</li>
<li>How do I find the best <em>all-time </em>content?</li>
<li>How do I know which of my levels were the most popular.. in the last week?</li>
<li>What are some promising newly-created levels?</li>
<li>What new levels are complete crap?</li>
<li>What authors produce the best levels?</li>
<li>How can we deal with people who always down-vote content other than their own?</li>
<li>And conversely, how do we deal with people who only up-vote their own content?</li>
</ul>
<p>Even with me diving into <a href="http://analytics.google.com">Google Analytics</a> for the whole domain (or using some t<a href="http://fc.tetsunosuke.co.cc/">hird-party applications</a>), most of these questions are impossible to answer; even those that came close were very difficult to deal with in an in-game setting.</p>
<h1>The Common Solution</h1>
<p>Most games implement the most basic ranking systems: offering a choice of (usually) 0 to 5 stars, and allowing you to sort the resultant list of median scores. This, unfortunately, has dozens of problems. The only real value in such systems is finding the &#8220;best score of all time,&#8221; and even then it does it poorly (not accounting for chronic upvoters or downvoters). Not to say that it isn&#8217;t easy to implement; indeed, it could hardly get simpler, and any lazy programmer such as myself will argue that &#8220;good enough is perfect.&#8221; But is it?</p>
<p>Each ranking system has several components; the voting system, the ranking system, the sorting system, and an optional adjustment system. There are various pros and cons to consider in the foundation &#8212; the ranking portion &#8212; of your system: Should you simply have a &#8220;like&#8221; button, as in your Facebook feed? Should you have upvote/downvote system? Should you have a scale of 3 stars? 5 stars? 9 chainsaws? 10 stars?</p>
<p>Each choice you make in the construction of your content-feedback system ads to a layer of complexity and results in a whack of cascading consequences, that will likely change your subsequent decisions. What looks simple on the surface can ruin your community-friendly ecosystem, and what looks dauntingly complex is shied-away from by most developers.</p>
<p>Thankfully, many people have done the thinking for us, and this will be one more article for the mix.</p>
<h1>Understanding the Consequences</h1>
<p>There are dozens of research papers out there on some of the different voting styles. I&#8217;m too lazy to make it convenient for you by linking some here; it&#8217;s been 6 months since I&#8217;ve read up on them, but feel free to Google them for yourself. Some of the key takeaways from actual research have been:</p>
<ul>
<li>Given a neutral choice in addition to a positive/negative choice, neutral will be chosen way more often than the others. Since neutral is a non-vote that hardly effects the statistics, it&#8217;s just giving someone an &#8220;out&#8221; from making a decision.</li>
<li>Given a large-scale choice (such as 1-10 stars), people will either vote to the extremes (1 or 10) to game the system, or vote 7. &#8220;7&#8243;  votes are so statistically huge that any 10-star system skews towards it; it becomes the new &#8220;neutral&#8221; and is the &#8220;safe vote&#8221; that makes everyone feel happy. There&#8217;s even a running joke that game magazines only ever rank video games &#8220;7/10&#8243;.</li>
<li>Given a &#8220;like&#8221; button with no alternative, or only positive-scale responses, it&#8217;s hard to generate true statistics (there&#8217;s no way to differentiate between &#8220;all-right&#8221; and &#8220;this content is so horrible nobody should ever see it&#8221;).</li>
<li>After your user base reaches a large enough size, more and more people will take to &#8220;strategic voting&#8221;; voting the maximum on things you like and minimum on things you dislike.</li>
<li>Giving an incentive to voting will drastically increase your response rate, but also predictably produce spam votes, or votes &#8220;just for the reward&#8221; without any thought. It will also amplify any of the above listed effects.</li>
</ul>
<p>I strongly recommend you take a look at your planned voting style and do a full bout of research on it. Check out Google Scholar and find some actual results, instead of going from what your heart says. Or better yet, build a system however you want and observe the results, and change them to suit your needs.</p>
<h1>How Bayesian Sets Up The Stage</h1>
<p>A Bayesian Rating system tackles most of our problems head-on. Let&#8217;s step through how it works.</p>
<p>Let&#8217;s say we&#8217;re dealing with user-generated levels in a video game. A brand new level shouldn&#8217;t be rated at 0; users will never find your new content, as it would be buried under all your crap content. Likewise, it&#8217;s unfair to make new levels with the maximum possible score, as people will spam bad levels just to remain at the top of the list. Most often, people will set the Bayesian rating to be somewhere in the middle &#8211; say, 50%. This way, every level starts off with a &#8220;fair chance&#8221;.</p>
<p>As more and more people vote on your level, the score will start to normalize towards the actual statistical median instead of the artifically-engineered 50% rating. This way, if a single user-made level gets 10 up-votes in a row, it&#8217;s ranking will appear as such:</p>
<ul>
<li>50% with 0 votes</li>
<li>60% with 1 vote</li>
<li>80% with 4 votes</li>
<li>90% with 8 votes</li>
<li>100% with 10 votes</li>
</ul>
<p>The magic behind the Bayesian system is this weighting (or dampening) system. It&#8217;s influenced by what is referred to as a &#8220;magic number&#8221;; this figure tells you how many votes need to be cast before the Bayesian weighting is no longer in effect, and the score truly is a median of all the other scores.</p>
<p>The weighting system actually takes into account the variety of scores, as well. If you only have two levels, one gets a 75% score and the other gets a 30% score, one will show up as 0 and the other as 10 stars. There is always a minimum and a maximum represented, and everything in between is taken as a scale of those two figures. This solves a great deal of weighting and balancing problems with large-range systems, and compensates for situations where nobody has ever voted 100% or 0% (or where everybody votes for a narrow range of percentages).</p>
<p>Essentially, what the weighting mechanic is doing is &#8220;making up&#8221; votes for things that don&#8217;t have enough votes to get real meaningful data to start with.</p>
<h1>How We Can Take It To The Next Level</h1>
<p>It&#8217;s not just that simple though! We can crank this baby up to the next level so you never need to tune it yourself ever again.</p>
<p>For example; who says 50% is the optimal &#8220;starting value&#8221;? Isn&#8217;t it more fair to make the entry-level rating the median of all current scores? Why not! You can calculate your new starting value on-the-fly by looking at all your current content. This means that every user-contributed piece of content will have it&#8217;s relative scores affected by every single vote cast.</p>
<p>And the magic doesn&#8217;t stop there; why hard-code your magic-number to something like &#8220;10 votes&#8221; when you can make it a variable as well? Make the magic number equivalent to the median number of votes across all your content. This again will make the scores of everything change with a single vote cast, but it helps corral fringe cases and unexpected userbase expansion (or contraction) as well. Imagine you run an online store where almost everything gets a 60% vote. Then all of a sudden, one particular item you have for sale attracts a huge bag of traffic and everyone votes 100% on this new product (without casting votes on all your older stuff).</p>
<p>As each vote is cast, your older products would normally be scaled farther and farther down the &#8220;top&#8221; lists. However, they are also sinking deeper and deeper into the &#8220;magic number&#8221; and the score is being balanced more towards your 0-vote figure. This figure in turn is going upwards, as the new product is heavily increasing your median score!</p>
<p>The system is amazingly resilient and self-balancing. If a lot of levels are made and nobody votes, the system compensates. If a single item gets a lot of votes, the system compensates. If you have a thousand votes on every item, the system compensates.</p>
<p>Protonaut uses all of these tweaks for it&#8217;s level ranking and system generation. To keep my database from being fried, I recalculate my Bayesian constants once per day (instead of on every vote being cast), so as the clock turns over at midnight you will often see levels rise or drop in ranking to reflect the day&#8217;s votes.</p>
<p>Furthermore, Protonaut looks at your average vote cast and uses that as a weight against how much your vote should be &#8220;worth&#8221; in the first place. This makes everyone&#8217;s vote count, but chronic upvoters (or downvoters!) will be technically <em>punished</em> for their preference.</p>
<p>This also helps stem runaway-voting on levels; a popular level floats to the top of the list, everyone plays it, and everyone votes it upward because it&#8217;s good &#8212; well if you only ever vote up, the system knows this and scales your votes back a bit. Players that explore the deep content of the game (as opposed to just browsing the top ten list) get a heftier vote. If that wasn&#8217;t fancy enough, the average-user-vote value is bayesian-ranked itself!</p>
<p>And BAM &#8212; there we have it! A benefit for voting, that self-regulates and balances as well. It&#8217;s a whole lot harder to game this system, and it rewards the true fans of the game.</p>
<p><strong>Furthermore, </strong>I optionally artificially reduce each Bayesian-generated score by how many level IDs precede it, thus making it an excellent adjustable time-based system (a truly epic level <em>could</em> stay at the top of the list, but most levels will disappear in the natural &#8220;churn&#8221; of things).</p>
<p>It really is a beautiful system. And easy to implement, too. Taken from the link below, this is the basic bayesian formula:</p>
<blockquote><p><em>Use this equation:</em></p>
<p><em>br = ( (avg_num_votes * avg_rating) + (this_num_votes * this_rating) ) / (avg_num_votes + this_num_votes)</em></p>
<p><em>Legend:</em></p>
<ul>
<li><em>avg_num_votes: The average number of votes of all items that have num_votes&gt;0</em></li>
<li><em>avg_rating: The average rating of each item (again, of those that have num_votes&gt;0)</em></li>
<li><em>this_num_votes: number of votes for this item</em></li>
<li><em>this_rating: the rating of this item</em></li>
</ul>
</blockquote>
<h1>Some links for further reading</h1>
<ul>
<li><a href="http://www.thebroth.com/blog/118/bayesian-rating">How to make a Bayesian Rating system</a></li>
<li><a href="http://www.stat.columbia.edu/~cook/movabletype/archives/2007/03/bayesian_sortin.html">Bayesian Sorting by Rank</a></li>
</ul>
<p>Have any questions about Bayesian ratings? Used them yourself? Success story? Horror story? Post it to the comments! I&#8217;d love to hear about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2010/02/bayesian-ratings-your-salvation-for-user-generated-content/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Protonaut gets Goombas</title>
		<link>http://www.andymoore.ca/2009/10/protonaut-gets-goombas/</link>
		<comments>http://www.andymoore.ca/2009/10/protonaut-gets-goombas/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 01:16:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/10/protonaut-gets-goombas/</guid>
		<description><![CDATA[Protonaut has gotten universal praise on one thing, and one thing only: Shooting. There isn&#8217;t much to shoot in the game, and the feature is one almost stripped several times throughout development &#8211; but it&#8217;s hard to scrap the one feature that makes people squeal with delight. With some recent upgrades to the sound files, [...]]]></description>
			<content:encoded><![CDATA[<p>Protonaut has gotten universal praise on one thing, and one thing only: Shooting.</p>
<div>There isn&#8217;t much to shoot in the game, and the feature is one almost stripped several times throughout development &#8211; but it&#8217;s hard to scrap the one feature that makes people squeal with delight.</div>
<div>With some recent upgrades to the sound files, shooting is just getting more and more delicious &#8211; firing that cannon truly is an enjoyable experience. But I needed something a bit more to shoot at than the occasional Nitrogen atom.</div>
<div><img id="BLOGGER_PHOTO_ID_5397455083897046930" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 257px; height: 204px;" src="http://2.bp.blogspot.com/_zNluNJRRhjI/SueczUbPR5I/AAAAAAAAAF0/U7CAaMwVH7I/s400/shootex.png" border="0" alt="" /></div>
<div>Enter stage right: Goombas. Can you tell Greg has been busy for the last few weeks? :) My art isn&#8217;t exactly befitting of the game :P</div>
<div>Goombas just walk left and right, and have pretty decent detection for obstacles and pits &#8211; and try to avoid them. I&#8217;m planning on make a jumper and a flyer of some sort eventually, but I&#8217;ll see how this plays out in the next few builds. They kill you on touch and don&#8217;t yet have any sort of projectile capacity.</div>
<div>Enemies might not end up in the final game. This production causes some fairly obvious problems, most obviously: the theme of the game is completely off with them. I&#8217;ll see how things work out in terms of gameplay and see if I need to rework the whole thing.</div>
<div>It&#8217;s too bad the Level Editor hasn&#8217;t gotten more attention. I really feel like the level editor is a standalone work of art, and making things is incredibly easy and seamless &#8211; with tons of tools at your disposal. It&#8217;s almost a direct correlary to my programming work not getting any notice, and the more artistic stuff getting the attention &#8211; nobody cares about the backend or the tools! It&#8217;s like I made the best hammer in the world but I haven&#8217;t found a carpenter to use it yet.</div>
<div>But such is the path of a programmer, I don&#8217;t really have the ability to complain about that one. :)</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/10/protonaut-gets-goombas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Signposts: New feature on Probation</title>
		<link>http://www.andymoore.ca/2009/10/signposts-new-feature-on-probation/</link>
		<comments>http://www.andymoore.ca/2009/10/signposts-new-feature-on-probation/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 20:06:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/10/signposts-new-feature-on-probation/</guid>
		<description><![CDATA[Protonaut seriously needs a tutorial overhaul, and I&#8217;ve been thinking about how to best accomplish this. I originally envisioned putting &#8220;signposts&#8221; in the game, with static text on them &#8211; then the tutorial would be one big level with a lot of help along the way. Before I had a chance to put in the [...]]]></description>
			<content:encoded><![CDATA[<p>Protonaut seriously needs a tutorial overhaul, and I&#8217;ve been thinking about how to best accomplish this. I originally envisioned putting &#8220;signposts&#8221; in the game, with static text on them &#8211; then the tutorial would be one big level with a lot of help along the way.</p>
<div>Before I had a chance to put in the signposts, I did a few tests &#8211; some people couldn&#8217;t beat my tutorial level! It was long, too difficult, and not very rewarding. An utter failure!</p>
<div>The signposts never made it in (instead opting for an &#8220;introduction&#8221; paragraph), and I broke the levels up into 10 easier (and more fulfilling) chunks. After launch, the complaints I get were &#8211; retrospectively &#8211; obvious: You now only get tutorial text at level launch, before it becomes relevant or obvious as to what it means. You cannot recall the tutorial text except by dying or restarting. A lot of folks took the tutorial text box as a &#8220;standard dialogue&#8221; and simply closed it.</div>
<div>One thing that really irks me is when players don&#8217;t read, and close the box that says &#8220;PRESS Z TO JUMP &#8211; THIS IS CONFIGURABLE IN OPTIONS&#8221; then complain that they can&#8217;t figure out how to jump or that Z is a stupid choice. Of course, I would do the same thing if it wasn&#8217;t <em>my </em>game, so yes: You, Sir Kettle, are black.</div>
<div>So, here is my proposed solution: an in-game signpost. <a href="http://www.protonaut.net/dev/Main.swf?level=988">You can test it here</a>, though the text isn&#8217;t modifiable at this point (I need Greg to whip me up an interface to do so). I&#8217;m really interested to know what you think! Chime in with any thoughts or ideas. Here are some features:</div>
<div>
<ul>
<li>The intro-box will remain for two reasons: Need the Click-on-level-load to capture keyboard focus, and it gives level designers a place to put a little backstory up if they so desire it.</li>
<li>The signpost text appears on touch only &#8211; thereby not &#8220;giving away&#8221; level elements or cluttering the screen.</li>
<li>The signpost trigger box is sizeable any way the level designer wishes. As the text appears from the center of the box, this allows for some creative control on where text appears.</li>
<li>The text fades out at a variable length, dependent on the 200WPM average that people read at.</li>
<li>Linebreaks work and the resultant text box auto-resizes to fit.</li>
<li>The signposts keep track of how often they have been touched, which can be recalled with the %COUNT% variable. This can eventually tie into a badge or victory condition (in the distant future) &#8211; allowing for laps counters or other more creative ventures.</li>
<li>The signposts respect your keyboard control configuration with the %LEFT%, %JUMP%, %RESET%, etc. variables.</li>
<li>The signpost trigger box is not yet art-ed up, art is not final :)</li>
</ul>
<div>Again, <a href="http://www.protonaut.net/dev/Main.swf?level=988">try it out here</a>, and let me know what you think!</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/10/signposts-new-feature-on-probation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Protonaut Beta Launch: A Retrospective</title>
		<link>http://www.andymoore.ca/2009/10/protonaut-beta-launch-a-retrospective/</link>
		<comments>http://www.andymoore.ca/2009/10/protonaut-beta-launch-a-retrospective/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 03:16:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/10/protonaut-beta-launch-a-retrospective/</guid>
		<description><![CDATA[It&#8217;s been nearly a month since launch, and it&#8217;s time for a retrospective on Protonaut! First up, I should explain away my absence for the last 30-odd days. I&#8217;d like to say I&#8217;m busy attending GDC and other business stuffs (which is partially true), but the actual reason has been crushing disappointment. I really shouldn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been nearly a month since launch, and it&#8217;s time for a retrospective on Protonaut!</p>
<div>First up, I should explain away my absence for the last 30-odd days. I&#8217;d like to say I&#8217;m busy attending GDC and other business stuffs (which is partially true), but the actual reason has been <em>crushing disappointment</em>.</div>
<div><img id="BLOGGER_PHOTO_ID_5389708381028683106" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 326px; height: 300px;" src="http://3.bp.blogspot.com/_zNluNJRRhjI/SswXN3YpDWI/AAAAAAAAAE8/lCaqphvl9RA/s400/086.gif" border="0" alt="" /></div>
<div>I really shouldn&#8217;t be disappointed. My brain is telling me that everything is allright, and I know things will work out in the end &#8211; as I believe I do have a viable product here. The problem is, my heart doesn&#8217;t handle disappointment well, and it&#8217;s screwing up how my brain is responding. Just today I&#8217;ve managed to bundle up all the emotion and kick it out the door, and I&#8217;m finally ready to move forward.</div>
<div>Let&#8217;s rewind a bit and explore what went wrong.</div>
<div>When I launched Protonaut, I knew I had a serious content problem. It&#8217;s the classic chicken-and-the-egg scenario; I have a game that heavily relies on user-made-content to generate traffic, and contained very little user-made-content. All of my fancy level promotion and ranking tools are useless until I have mass traffic. I decided to launch an &#8220;open beta&#8221; of sorts, and get some traffic flowing.</div>
<div>Colin had a tremendous amount of luck with JayIsGames in the past, for his game Fantastic Contraption. The traffic was of the perfect demographic and seemed to fit with what I wanted my userbase to be, so I got a review up on there &#8211; then halted all media interaction immediately. I didn&#8217;t want this to get out; it is still a beta, after all. The big release is yet to come!</div>
<p><img id="BLOGGER_PHOTO_ID_5389709643181302402" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 400px; height: 92px;" src="http://1.bp.blogspot.com/_zNluNJRRhjI/SswYXVRRooI/AAAAAAAAAFE/9eE5xMss08A/s400/pntraffic.png" border="0" alt="" /></p>
<div>And that&#8217;s the traffic graph that pretty much overlays over the week I was at GDC. What&#8217;s funny is I actually garnered more traffic than Fantastic Contraption did in it&#8217;s first week, and I got more traffic from JayIsGames than FC did after the review went online. My entire problem lies in retention.</div>
<div><a href="http://4.bp.blogspot.com/_zNluNJRRhjI/SswZokAvZ0I/AAAAAAAAAFU/bkpGifvcjVc/s1600-h/exitpages.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5389711038707885890" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 332px; height: 238px;" src="http://4.bp.blogspot.com/_zNluNJRRhjI/SswZokAvZ0I/AAAAAAAAAFU/bkpGifvcjVc/s400/exitpages.png" border="0" alt="" /></a>That there is a delicious pie chart of where people left my game for good, their IP address never to grace my website again. 45% of my visitors were lost completely before even loading a level. I then proceeded to lose around 20% of my traffic at each stop in the tutorial, to the point where less than 1% of total traffic finished the tutorial in it&#8217;s entirety.</div>
<div>What&#8217;s interesting, though, is that the average user spent over 10 minutes on the site, and loaded (or retried) levels on average 6 times each. A bit more digging shows me that quite a few people abandoned the tutorial partway through to get them to the user content. That&#8217;s a lesson learned right there. Another lesson learned is that most of those people were restarting tutorial 1 over and over again &#8211; a sign that it&#8217;s too hard, even in it&#8217;s simplicity.</div>
<div><a href="http://3.bp.blogspot.com/_zNluNJRRhjI/SswayGmoKqI/AAAAAAAAAFc/aeCzkSCUk5A/s1600-h/leveldistrib.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5389712302124051106" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 304px; height: 221px;" src="http://3.bp.blogspot.com/_zNluNJRRhjI/SswayGmoKqI/AAAAAAAAAFc/aeCzkSCUk5A/s400/leveldistrib.png" border="0" alt="" /></a>Sorry this one is unlabelled, but it is how many times each level was played &#8211; and essentially goes in order around the wheel &#8211; Tutorial 1, tutorial 2, tutorial 3, tutorial 4, etc&#8230;</div>
<div>Half the people that played #1 never got to #2. It could mean tutorial 1 is too hard, but it could also mean that the player has already decided &#8220;nope! this game isn&#8217;t for me.&#8221; A more engaging first-user-experience could correct this.</div>
<div>I&#8217;m a real slut when it comes to charts, graphs, and analytics. The average user only viewed/tried 6 levels, but sent me 15 hits to Analytics for clicking in various places on the screen. But the real blow to my pride was this graph right here &#8211; the one that everyone gets excited about, TOTAL CONVERSIONS:</div>
<div><a href="http://4.bp.blogspot.com/_zNluNJRRhjI/Sswb4okP0WI/AAAAAAAAAFk/bWDVni_IdrQ/s1600-h/conversionrate.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5389713513831715170" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 400px; height: 125px;" src="http://4.bp.blogspot.com/_zNluNJRRhjI/Sswb4okP0WI/AAAAAAAAAFk/bWDVni_IdrQ/s400/conversionrate.png" border="0" alt="" /></a></div>
<p>Yes, that&#8217;s right. I&#8217;m seeing a THREE PERCENT CONVERSION RATE! *balloons fall from ceiling, cue dance music*</p>
<div>Well, I did on that one day, anyway. If you average out the conversion rate since launch, it&#8217;s at a still-respectable 0.4%.</div>
<div>Thing is, my traffic has been so low, that the numbers are heavily skewed. On top of that, I made 5 test purchases during development, and this graph is nothing but smoke and mirrors; I actually have made a grand total of ZERO sales of Protonaut after launch (except the one I paid my girlfriend to make).</div>
<div>Anyway, I&#8217;m putting my emotions aside now and gearing up to kick some ass. I&#8217;m going to rewrite the entire tutorial system and make the whole experience more engaging for a new user; I really want to ramp up my retention figures.</div>
<div>At least I&#8217;m getting &#8220;SSSL Unblocking&#8221; traffic from google!</div>
<div><a href="http://2.bp.blogspot.com/_zNluNJRRhjI/Sswcsx2YSgI/AAAAAAAAAFs/7G3pz9ZKTC8/s1600-h/keywords.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5389714409676884482" style="display: block; margin: 0px auto 10px; text-align: center; cursor: hand; width: 308px; height: 181px;" src="http://2.bp.blogspot.com/_zNluNJRRhjI/Sswcsx2YSgI/AAAAAAAAAFs/7G3pz9ZKTC8/s400/keywords.png" border="0" alt="" /></a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/10/protonaut-beta-launch-a-retrospective/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Protonaut: LAUNCH!</title>
		<link>http://www.andymoore.ca/2009/09/protonaut-launch/</link>
		<comments>http://www.andymoore.ca/2009/09/protonaut-launch/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 04:42:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/09/protonaut-launch/</guid>
		<description><![CDATA[That&#8217;s right, after months of hard work Protonaut is finally LIVE! We&#8217;ve decided to launch the game in a sort-of open-beta format so we can continue improving it and adding features as we get more and more feedback. We have a lot of big updates and features planned in the future and we fully expect [...]]]></description>
			<content:encoded><![CDATA[<p>That&#8217;s right, after months of hard work Protonaut is finally LIVE!</p>
<div>We&#8217;ve decided to launch the game in a sort-of open-beta format so we can continue improving it and adding features as we get more and more feedback. We have a lot of big updates and features planned in the future and we fully expect Protonaut to become an even better product as time goes on.</div>
<div>I have to give a big heaping helping thankyou to our Alphanauts, the earliest testers of our game and invaluable sources of feedback. Also big thanks to Greg Wohlwend, without whom I probably would have cancelled the project a month in.</div>
<div>I&#8217;d love to go on a big rambly launch wrap-up post, but this is just the beginning! (and it&#8217;s also beerfest weekend here in Victoria, BC).</div>
<div>Don&#8217;t melt my servers while I&#8217;m away at GDC! :D</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/09/protonaut-launch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protonaut: Launch Day?</title>
		<link>http://www.andymoore.ca/2009/09/protonaut-launch-day/</link>
		<comments>http://www.andymoore.ca/2009/09/protonaut-launch-day/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 20:46:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/09/protonaut-launch-day/</guid>
		<description><![CDATA[Protonaut is on-schedule for release later today, likely sometime around midnight PST. Still waiting on some music/sound effects, and we have some shuffling of levels to do in the Trials, but otherwise the game is gold. There will be one final build (before launch), so if you want to do us a favour and do [...]]]></description>
			<content:encoded><![CDATA[<p>Protonaut is on-schedule for release later today, likely sometime around midnight PST. Still waiting on some music/sound effects, and we have some shuffling of levels to do in the Trials, but otherwise the game is gold.</p>
<div>There will be one final build (before launch), so if you want to do us a favour and do some playtesting.. now&#8217;s the time to do it!</div>
<div><a href="http://www.protonaut.net">Click here to play Protonaut</a>.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/09/protonaut-launch-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One Week to Go</title>
		<link>http://www.andymoore.ca/2009/08/one-week-to-go/</link>
		<comments>http://www.andymoore.ca/2009/08/one-week-to-go/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 07:01:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/08/one-week-to-go/</guid>
		<description><![CDATA[Though technically launch date is somewhere around September 10th, I&#8217;ve got so much going on there&#8217;s only around 6 days of actual work left for me to finish Protonaut. That means I don&#8217;t have a lot of time to post here :) Just launched Build 44 on the site which contains a very new introduction [...]]]></description>
			<content:encoded><![CDATA[<p>Though technically launch date is somewhere around September 10th, I&#8217;ve got so much going on there&#8217;s only around 6 days of actual work left for me to finish Protonaut. That means I don&#8217;t have a lot of time to post here :)</p>
<div>Just launched Build 44 on the site which contains a very new introduction made by Greg. It&#8217;s pretty wicked.</div>
<div>Other than that &#8211; polish, polish, polish! Now that gameplay is finalized it&#8217;s just bug fixing and pretty-making. I&#8217;m about 95% finalized on the set of tutorial levels (now numbering ten), and I&#8217;m.. well, maybe only 10% done the actual game levels. I&#8217;ll get there soon enough. <em>I&#8217;d better.</em></div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/08/one-week-to-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working out Replays</title>
		<link>http://www.andymoore.ca/2009/08/working-out-replays/</link>
		<comments>http://www.andymoore.ca/2009/08/working-out-replays/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 17:22:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/08/working-out-replays/</guid>
		<description><![CDATA[My current project, Protonaut, somewhat recently got a &#8220;Replay&#8221; feature. You can save your victories and share them with your friends! But how to execute the replay feature is really tricky, especially when you only have finite space and bandwidth to dish them out with. Protonaut uses a level editor and a collection of Box2D [...]]]></description>
			<content:encoded><![CDATA[<p>My current project, <a href="http://www.protonaut.net/">Protonaut</a>, somewhat recently got a &#8220;Replay&#8221; feature. You can save your victories and share them with your friends! But how to execute the replay feature is really tricky, especially when you only have finite space and bandwidth to dish them out with.</p>
<div>Protonaut uses a level editor and a collection of Box2D parts &#8211; somewhat similar to <a href="http://www.fantastic-contraption.com/">Fantastic Contraption</a>. Replays in FC are called designs, and all it is is a snapshot of the starting conditions. Since there is now way to interact with FC mid-design, you can safely let the simulation &#8220;play out&#8221; on your computer, and it will turn out the same. It&#8217;s as if the fate of your contraption has been pre-determined.</div>
<div>I&#8217;m not able to do this obviously. You control the player character throughout, and you can change your mind halfway through playing a level &#8211; what with having a brain and free will and all.</div>
<div>After looking at a few options (taking a snapshot of all the objects in the level and tweening them for example), I decided to go with recording keypresses. While a replay is running, it&#8217;s as if one of those automatic-piano-playing-rollers is over your keyboard. The game otherwise thinks it&#8217;s you controlling it yourself!</div>
<div>Building the data structure was simple at first. I just wanted to get it done, and I wasn&#8217;t thinking about storage requirements. Here&#8217;s an example clip of the replay file:</div>
<blockquote>
<div>[...] ,,1,1,0,0,0,0,0,0<strong>,,2,2,0,0,0,-1,10,0</strong>,,3,3,0,0,0,23,0,0 [...]</div>
<div>I used comma deliminators and the data is broken down as:</div>
<div>,,Array Index, Tick#, jumpstate, firestate, (other keys)&#8230;</div>
<div>Keystates could be <em>At Rest</em> (0), <em>Just Released</em> (-1), or <em>Held Down</em> (length).</div>
</blockquote>
<div>There was several problems with this setup, mostly structural, but all my fault. It was possible to hold down, say, the fire button for millions of ticks &#8211; throwing huge numbers into the mix and making it a very big and clunky bit of code. To help smooth things over, I did ZIP the file &#8211; which shrunk things down nicely.</div>
<div>Yesterday I decided to clean things up. I realized that &#8220;just released&#8221; and &#8220;held length&#8221; could be programatically determined; If the last frame was &gt; 0 and this frame == 0, then it means the key was down last tick.. but not this tick. -1 for release. So it was no longer necessary to store the actual keystate, but just an up/down 0/1 representation.</div>
<div>That means that the keystate could be summarized in a single 6-bit number, that has 64 possible combinations. From there it was easy to find a spot on the ASCII Character table that had 64 human-readable characters in a row, and just mapped the key value to that.</div>
<div>Then I stripped out the commas and dropped recording of null frames (where you aren&#8217;t pressing any keys). Then I dropped the array indexes, because they were completely unused. Now the replay data looks like this:</div>
<div>
<blockquote><p>&#8230;191J192Q200p201&#8217;202&#8217;203&#8217;204&#8217;205W300L&#8230;</p></blockquote>
</div>
<div>Quite a bit shorter! All it is is &#8220;Tick#&#8221; followed by a character that represents the keypresses.</div>
<div>After running this through the ZIP algorythm, total space on the database was <strong>reduced to 1/20th of it&#8217;s original size</strong> (using a speedrun on Tutorial #1 as a basepoint)!! I&#8217;m so very happy with this&#8230; I&#8217;m sure my database will agree with me. And my bandwidth bill.</div>
<div>Special thanks go out to Aubrey for helping me out with BitShifting and Ryan for writing me out a psuedocode Binary-to-String function.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/08/working-out-replays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Pressure to Release on-Time</title>
		<link>http://www.andymoore.ca/2009/08/the-pressure-to-release-on-time/</link>
		<comments>http://www.andymoore.ca/2009/08/the-pressure-to-release-on-time/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 06:41:00 +0000</pubDate>
		<dc:creator>Andy Moore</dc:creator>
				<category><![CDATA[Monetization]]></category>
		<category><![CDATA[Protonaut]]></category>

		<guid isPermaLink="false">http://www.andymoore.ca/2009/08/the-pressure-to-release-on-time/</guid>
		<description><![CDATA[I am starting to wonder if I can get Protonaut out the door on time. Greg and I set a goal to have the game in releasable form by September 14th &#8211; the date I&#8217;ll be flying down to GDC Austin. I figured this was a good a date as any &#8211; might as well [...]]]></description>
			<content:encoded><![CDATA[<p>I am starting to wonder if I can get Protonaut out the door on time.</p>
<div>Greg and I set a goal to have the game in releasable form by September 14th &#8211; the date I&#8217;ll be flying down to GDC Austin. I figured this was a good a date as any &#8211; might as well have your <em>game done </em>before going to a <em>game conference</em>. As of this posting, there is just about 3 weeks left. It seemed far enough away, at the time &#8211; and our progress on the game appears to be maintaining a steady pace. But then real life steps in.</div>
<div>I could start with the small complaints &#8211; tonight&#8217;s programming timeslot was instead wasted fighting the first-ever porn-spammer on the <a href="http://fantasticcontraption.com/forum/">Fantastic Contraption forums</a>. I am still very proud of how the community held together and stayed sane for over a year before this happened, and I&#8217;m pretty sure this will blow over as well &#8211; but due to some technical difficulties my entire night was consumed.</div>
<div>I have bigger fish to fry than a single night, though. Some old chums I used to work with have roped me into covering some shifts at their new office next week. Sure, it&#8217;s part time; I can work most (if not all) of it from home; and the workload is likely light. But it&#8217;ll harm my train of thought fairly hardcore, and code will progress at a halting pace at best.</div>
<div>Then there is the last-minute ticket purchase for PAX. I&#8217;ve never been to the Penny Arcade Expo, but I hear it is a blast &#8211; and that&#8217;s going to consume a hearty 4-day weekend, plus some recovery time.</div>
<div>Then there is the Great Canadian Beer Festival, for which I am not only attending both days &#8211; but am also volunteering for, doing the volunteer orientation, and doing the afterparty. The recovery time for this is going to be even longer.</div>
<div>Let&#8217;s not forget that <a href="http://colinnorthway.com">Colin Northway</a>, old chum of mine and writer of <a href="http://fantasticcontraption.com">Fantastic Contraption</a>, is in town and we will likely hang out at least a tiny bit.</div>
<div>That isn&#8217;t to mention my regular routines (Aikido, getting exercise on my bike, chores, harvest season in the garden, etc.) that pretty much slims my remaining working time down to just about 7 days worth of solid effort. It&#8217;s suddenly gotten dark in here, what with all the foreboding-ness. I&#8217;m officially <em>daunted</em>.</div>
<div>It&#8217;s not all doom-and-gloom, though. We&#8217;ve hit <a href="http://www.protonaut.net">Build 35 in Protonaut</a> now, which sports the first incarnation of music and sound effects, not to mention a few key tweaks and the usual barrage of new menu interfaces &#8211; which has really got me excited. For the first time, Protonaut feels like an <em>unfinished game</em> instead of a <em>collection of parts that might amount to something someday</em>. Roger Levy is now on board with Greg and I to do our music, and he produced a great 8-bit Russian folk-tune to fit the Red-theme of the game today. It reminds me of Monkey Island music, it&#8217;s really sweet.</div>
<div>For more external influences, Greg posted to his blog about the success of his latest game, <a href="http://www.intuitiongames.com/fig8/">Fig. 8</a>, and <a href="http://mile222.com/2009/08/breaking-down-the-fig-8-bidding-timeline/">how the bidding war went down</a>. It&#8217;s a very interesting timeline and I think it does a good job at representing the value behind proper marketing, and putting your game in the correct (bidding) spotlight. Congrats to Greg &amp; the others at <a href="http://www.intuitiongames.com/">Intuition</a>. It&#8217;s very motivating reading about other&#8217;s success.</div>
<div>I suppose I just have to keep my chin high and my nose down to the grindstone. I guess I&#8217;ll be coding inverted.</div>
<div><a href="http://greyaliengames.com/blog/do-you-ever-feel-overwhelmed/">Thanks for listening</a>. :)</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andymoore.ca/2009/08/the-pressure-to-release-on-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
