<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>ShaunInman.com // plus Elsewhere</title>
<link>http://www.shauninman.com/</link>
<description></description>
<copyright>Copyright 2001-2012 Shaun Inman</copyright>
<generator>Shaun Inman&#8217;s Bookend</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<lastBuildDate>Tue, 07 Feb 2012 08:14:24 GMT</lastBuildDate>

<item>
	<title>Detox</title>
	<description><![CDATA[<p>This is an intervention. <a href="/assets/downloads/Detox.safariextz">Detox</a> is a tiny Safari extension that automatically expands shortened t.co links on the Twitter site (third-party desktop app users <del>are out of luck, sorry</del> should see the 1.1 update below). </p>

<p>Ever wonder why links you find via Twitter don&#8217;t show up in your browser history and aren&#8217;t suggested by autocomplete in the url bar? The t.co link shortener serves known browser user agents an HTML page containing a JavaScript or meta refresh redirect (instead of the standard <code>Location</code> header) so that Twitter can stake itself out as the referrer when coming from third-party clients. This confuses Safari.</p>

<p><a href="http://haveamint.com/">Stats are cool and all</a> but only when they don&#8217;t break the experience for your users. </p>

<p><a href="/assets/downloads/Detox.safariextz">Download Detox</a>.</p>

<p>(<a href="http://zackarycorbett.com/">Zackary Corbett</a> made a <a href="http://zyber17.com/detox/">Chrome version</a> too, which may or may not be necessary. Firefox and Opera also appear to be unaffected.)</p>

<h2 id="h2-detox-">Detox 1.1</h2>

<p>Now when you hit a t.co redirect page (from a native client or a direct message from Mail.app) the destination url is added to the document title making the destination url appear in your history and url autocomplete suggestions.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2012%2F01%2F19%2Fdetox&amp;seed_title=Detox</link>
	<guid isPermaLink="false">1560@http://www.shauninman.com/</guid>
	<category>Apple</category><category>JavaScript</category>
	<pubDate>Thu, 19 Jan 2012 21:35:00 GMT</pubDate>
</item>
<item>
	<title>Stock</title>
	<description><![CDATA[<p>These things I produced in 2011:</p>

<ul>
<li><a href="/lastrocket/">The Last Rocket</a> Though not released until mid-August I started work on what I consider to be my first proper game in early January. The development of this game, more than anything else, shaped the past year. It was critically well received, responsible for a quarter of the year&#8217;s income, and even made <a href="https://twitter.com/matthewdkenyon/status/149484341154680833">Edge</a>, <a href="http://toucharcade.com/2011/12/23/best-ios-games-2011-buyers-guide/">Touch Arcade</a> and <a href="http://www.iphonealley.com/news/iphone-alleys-10-6-best-reviewed-games-of-2011">iPhone Alley</a>&#8217;s year end lists.</li>
<li><a href="/archive/2011/04/18/unplayed">Unplayed</a> I&#8217;d been privately maintaining a list of games I&#8217;ve played or want to play since getting a DS Lite in June of 2006. After briefly dabbling with a Tumblr to maintain the list I wrote this trifle of a web app.</li>
<li><a href="/archive/2011/05/02/breathing_room_postmortem">Breathing Room</a> My first Ludum Dare. Also, an early study from my thinking about level design.</li>
<li><a href="/archive/2011/07/25/cssfrag">CSSFrag</a> A Safari extension for targeting specific DOM elements by url. Passed the torch to <a href="http://karanlyons.com/pinpoint/">Pinpoint</a>.</li>
<li><a href="/archive/2011/06/02/reply_reach">Reply Reach</a>  &amp; <a href="/archive/2011/08/26/past_ats">Past @s</a> Two little JavaScript bookmarklets for use on Twitter.com.</li>
<li><a href="/archive/2011/08/22/data_entry_sentry_postmortem">Data Entry Sentry</a> My second Ludum Dare and my first attempts at a JavaScript/Canvas game. The genesis of the <a href="http://www.ludumdare.com/compo/2011/12/16/si2d-js/">JavaScript port</a> of the Objective-C framework I use for all of my iOS games, SI2d.</li>
<li><a href="/archive/2011/10/20/day_o_mac_menu_bar_clock">Day-O</a> A simple menubar calendar replacement for OS X.</li>
<li><a href="/archive/2011/12/05/chunks">Chunks</a> A native iOS port of my second Ludum Dare game, Data Entry Sentry. I didn&#8217;t promote this as much as I probably should have but a more vocal release might have set expectations too high for this modest little falling block game.</li>
<li><a href="/archive/2011/12/21/sinkhole_postmortem">Sinkhole</a> My third Ludum Dare. A tense little exploration game that I&#8217;m still actively developing. SI2d.js was updated significantly for this game. I even ported it from Canvas to DOM sprites to compare performance (pretty much head to head by the numbers but the Canvas version feels smoother in play and is easier to extend).</li>
<li><a href="/archive/2011/12/26/the_last_rocket_suite">The Last Rocket Suite</a> The <a href="/lastrocket/soundtrack.html">soundtrack</a> from The Last Rocket did pretty well too so I released this string quartet version of three themes from the game.</li>
</ul>

<p>In addition to these wholly new things, I also released a bunch of updates to <a href="http://haveamint.com/">Mint</a> and its <a href="http://haveamint.com/peppermill/">Pepper</a>, <a href="http://feedafever.com/">Fever</a>, <a href="http://shortwaveapp.com/">Shortwave</a>, <a href="/archive/lessn">Lessn</a> and <a href="/noisees/">NoiseES</a>. I&#8217;m also about a month or two into another all new 8-bit iOS game, inspired as much by Metroid and Super Mario Bros 2/Doki Doki Panic as it is by Studio Ghibli&#8217;s films. </p>

<p>All in all, a very productive year.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2012%2F01%2F01%2Fstock_2011&amp;seed_title=Stock</link>
	<guid isPermaLink="false">1559@http://www.shauninman.com/</guid>
	<category>Apple</category><category>CSS</category><category>Design</category><category>Flash</category><category>JavaScript</category><category>Music</category><category>Personal</category><category>Mint</category><category>Gaming</category><category>Fever</category>
	<pubDate>Sun, 01 Jan 2012 19:39:00 GMT</pubDate>
</item>
<item>
	<title>Best iOS Games 2011</title>
	<description><![CDATA[<p>Ecstatic The Last Rocket landed on Touch Arcade&#8217;s year end list. Overjoyed to find Flip and AMI in Edge magazine&#8217;s January 2012 <a href="https://twitter.com/matthewdkenyon/status/149484341154680833">issue</a>. <a href="http://www.shauninman.com/archive/2011/12/26/best_ios_games_2011">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Ftoucharcade.com%2F2011%2F12%2F23%2Fbest-ios-games-2011-buyers-guide%2F&amp;seed_title=Best+iOS+Games+2011</link>
	<guid isPermaLink="false">1558@http://www.shauninman.com/</guid>
	<category>Elsewhere</category><category>Gaming</category>
	<pubDate>Mon, 26 Dec 2011 15:50:00 GMT</pubDate>
</item>
<item>
	<title>The Last Rocket Suite</title>
	<description><![CDATA[<p>A little present for <a href="/lastrocket/">The Last Rocket</a> soundtrack fans, a (GarageBand-synthesized) string quartet version of Apprepensive, Airlock and Lost and Found. <a href="http://www.shauninman.com/archive/2011/12/26/the_last_rocket_suite">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fshauninman.com%2Flastrocket%2Fdownloads%2FThe%2520Last%2520Rocket%2520Suite.mp3&amp;seed_title=The+Last+Rocket+Suite</link>
	<guid isPermaLink="false">1557@http://www.shauninman.com/</guid>
	<category>Music</category><category>Elsewhere</category><category>Original Music</category><category>Gaming</category>
	<pubDate>Mon, 26 Dec 2011 15:49:00 GMT</pubDate>
</item>
<item>
	<title>Sinkhole Postmortem</title>
	<description><![CDATA[<p><img src="/assets/images/sinkhole-title.png" alt="" title="" /></p>

<p>This past weekend I participated in my third <a href="http://www.ludumdare.com/">Ludum Dare</a>. I created an HTML5 game called <a href="/ludumdare/alone/sinkhole/">Sinkhole</a> from scratch in 48 hours. It was an awesome experience and the game didn&#8217;t turn out half bad either. <a href="/archive/2011/08/22/data_entry_sentry_postmortem">Last time</a> I had just launched <a href="/lastrocket/">The Last Rocket</a>. This time I had just launched <a href="/chunks/">Chunks</a>, a native port of my previous Ludum Dare creation.</p>

<p>The theme this time around was <a href="http://www.ludumdare.com/compo/ludum-dare-22/">Alone</a>. Unlike the previous two Dares where I came up with three ideas and then slept on them before starting, this time I had an idea I was really excited about and after only half an hour set to work.</p>

<p>The first three lines of <a href="/ludumdare/alone/alone.txt">my notes</a> from that first night read:</p>

<ul>
<li>top-down</li>
<li>exploration by flashlight</li>
<li>something moving in the darkness</li>
</ul>

<p>I wanted there to be an urgency to the exploration. I wanted the antagonists, the stalkers, to be unseen. Let the players&#8217; imagination do the heavy lifting.</p>

<p>I also knew I didn&#8217;t want to have to worry about level design so after bootstrapping the <a href="http://www.ludumdare.com/compo/2011/12/16/si2d-js/">JavaScript framework</a> I cobbled together for the last Ludum Dare I started researching <a href="http://roguebasin.roguelikedevelopment.org/index.php?title=Cellular_Automata_Method_for_Generating_Random_Cave-Like_Levels">cellular automata</a> and <a href="http://devpro.it/javascript_id_137.html">pathfinding</a> so I could dynamically generate solvable maps to use. I managed to get the skeleton of a solution working (ported from C to JavaScript) before bed the first night.</p>

<p>While falling asleep I started imagining the stalkers&#8217; behavior. After a short delay a stalker appears and attempts to sneak up behind the player. Facing the stalker causes them to freeze. Shining a light on them causes them to flee. But every time one flees another, slightly faster, stalker spawns. The player solves their current problem at the cost of future safety. More impetus to find the exit quickly. </p>

<p>In addition to the unseen threat of the stalkers, the player&#8217;s defensive and discovery tool, light, is limited. The flashlight&#8217;s batteries drain in one minute. Matches burn out after 3 seconds. It takes time to load a new battery or strike a match. During that time visibility is nil. Or rather, you can see the stalkers approach but not the player or the walls of the level. Once the player runs out of light sources and their eyes adjust only slivers of walls are visible on the periphery of their limited cone of vision. The player must rely on these subtle hints and the minimap to find another battery or matchbook to buy them some more time to find the exit.</p>

<p>I eventually fell asleep.</p>

<p>I woke up to the realization that I had attempted (and abandoned) a very similar mechanic during my <a href="/archive/2011/05/02/breathing_room_postmortem">first Ludum Dare</a> (the original Chibi Pan &amp; Pup idea).</p>

<p>Shaking off the thought of repeat failure I quickly implemented a TileMap class in SI2d.js and a way to crop the viewport allowing the &#8220;camera&#8221; to follow the player as they moved across the map. I revisted the touch-based controls then created some rough graphic masks to start implementing the different sized beams of light that define the gameplay. Minimaps came quickly. Around this time I realized that the framerate wasn&#8217;t going to be acceptable on the iPad and implemented keyboard controls as well.</p>

<p>Power-ups, a compass to reveal the exit on the minimap, batteries and matchbooks to recharge your light supply slotted in pretty easily. Stalkers gave me a bit of trouble initially. They needed to spawn outside of the players cone of vision or else they would flee immediately.</p>

<p>The story arrived in the form of four tweets that became the prologue:</p>

<blockquote>
  <p>Tomo the Cartographer was on a routine survey mission in Central America when the earth opened up and swallowed him whole.</p>
  
  <p>Miraculously, he survived falling hundreds of feet and walked away with only a broken arm.</p>
  
  <p>Guide Tomo out of the sinkhole before he runs out of flashlight batteries or burns through all his matches.</p>
  
  <p>It will be a lonely climb back to the surface. At least, Tomo thinks he&#8217;s alone. He <em>hopes</em> he&#8217;s alone.</p>
</blockquote>

<p>Around midnight the second and final night I started on the artwork. Like all of my games to date I limited my palette to only colors the NES was <a href="http://en.wikipedia.org/wiki/File:NES_palette.png">capable of producing</a>. Tomo came together quickly, based largely on the Link sprite from the original Zelda (with a strong Mega Man influence). I used Mario from SMB3 as a referene when drawing his vine climbing animation. I had to redraw the power-ups and background tiles a few times but I eventually arrived at something I was happy with. I had a lot of fun creating the onomatopoeia bursts that represent the stalkers.</p>

<p>The remainder of the last day is a disjointed blur. Lots of revisions to stalker behavior. Persisting inventory between levels. In a remarkable moment of clarity I coded, from memory, in one go, an error-free JavaScript port of my Objective-C TextMap class. This allowed me to get some of Tomo&#8217;s internal dialog on-screen while playing.</p>

<p>The title screen graphic was a happy accident. While trying to draw grass hanging over the edge at the top of the sinkhole I accidentally turned off (or on) another layer producing the masked out, moss-clinging-to-the-sides effect you see in the finished artwork.</p>

<p>By the end of it all I couldn&#8217;t see straight, my own eyes were anti-aliasing the pixel art I had slaved over. But it was totally worth it. It&#8217;s creatively rejuvenating, knowing that you just created something, non-negligible, largely from scratch, in just 48 hours. If you participated in Ludum Dare, please play and rate <a href="http://www.ludumdare.com/compo/ludum-dare-22/?action=preview&amp;uid=4017">my entry</a> (I&#8217;d love any feedback you have as well)!</p>

<p>I&#8217;ve been continuing to develop the game in the days since submitting. Improving collision detection, softening cornering, improving keyboard responsiveness, adding <a href="https://wiki.mozilla.org/GamepadAPI">Gamepad API</a> support, refining power-up frequency and distribution, tuning stalker behavior. Maps no longer regenerate every time you die. The minimap remembers previously explored areas. Inventory reverts to its unique pre-level state rather than resetting completely. <a href="/ludumdare/alone/sinkhole/">Play the updated version of Sinkhole</a>. Who knows, maybe someday there will be an expanded native iOS version.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F12%2F21%2Fsinkhole_postmortem&amp;seed_title=Sinkhole+Postmortem</link>
	<guid isPermaLink="false">1556@http://www.shauninman.com/</guid>
	<category>JavaScript</category><category>Gaming</category>
	<pubDate>Thu, 22 Dec 2011 03:46:00 GMT</pubDate>
</item>
<item>
	<title>Meet the Developer</title>
	<description><![CDATA[<p>Nathaniel Mott of AppStorm (who you might remember gave The Last Rocket a <a href="http://iphone.appstorm.net/reviews/games-reviews/the-last-rocket-retro-gaming-at-its-best/">10 out of 10</a>) interviewed me via email over the course of the past month. AppStorm is also doing a <a href="http://iphone.appstorm.net/general/competitions/win-one-of-five-copies-of-the-last-rocket/">Last Rocket giveaway</a>. <a href="http://www.shauninman.com/archive/2011/12/14/meet_the_developer">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fiphone.appstorm.net%2Fgeneral%2Finterviews%2Fmeet-the-developer-shaun-inman-of-the-last-rocket%2F&amp;seed_title=Meet+the+Developer</link>
	<guid isPermaLink="false">1555@http://www.shauninman.com/</guid>
	<category>About</category><category>Elsewhere</category>
	<pubDate>Wed, 14 Dec 2011 13:45:00 GMT</pubDate>
</item>
<item>
	<title>Chunks</title>
	<description><![CDATA[<p><strong>Update</strong> Chunks is <a href="/chunks/">out now</a>! Grab the <a href="/chunks/chunks-osv.zip">four track OSV</a> while you&#8217;re at it.</p>

<p>Later tonight or early tomorrow I&#8217;ll have a new game in the App Store. (For real this time. Last week <a href="/horrorvacui2/">Horror Vacui 2</a> showed up on a number of App Store new release lists for no apparent reason despite being released over a year ago.) It&#8217;s a small game with more in common with Horror Vacui than <a href="/lastrocket/">The Last Rocket</a>. And it might look familiar.</p>

<p><a href="/chunks/"><img src="/assets/images/chunks.png" alt="Introducing the Chunks in Data Entry Sentry" title="" /></a></p>

<p><a href="/chunks/">Chunks</a> is a native iOS port of my most recent <a href="http://www.ludumdare.com/compo/about-ludum-dare/">Ludum Dare</a> game <em>Escape! Data Entry Sentry</em>. The core gameplay mechanic and most of the graphics were created over a <a href="/archive/2011/08/22/data_entry_sentry_postmortem">48 hour period</a> shortly after releasing The Last Rocket. While I&#8217;ve been working on a new, more ambitious 8-bit platformer for iOS (somewhere between The Last Rocket and the unreleased <a href="/archive/2010/02/23/mimeo_and_the_kleptopus_king">Mimeo and the Kleptopus King</a> in scale) I&#8217;ve also made time to rename and refine Chunks for a proper release.</p>

<p>In addition to some gameplay tweaks and instructional UI, I composed three new chiptunes, a short game over jingle plus a handful of sound effects. The themes were inspired by falling block giants Tetris and Dr. Mario (with a little The Guardian Legend thrown in for good measure). The tempo of the background music increases with the speed of the conveyor as you play. This change is imperceptible from level to level but after a while you really start to feel the frantic increase in momentum. Grab the <a href="/assets/music/nsfe/chunks.nsfe">NSFe</a> and give it a listen in <a href="/noisees/">NoiseES</a>.</p>

<p>Chunks is a universal app so you can play on your iPhone, iPod touch or iPad and includes Game Center leader boards for high score and highest level. It&#8217;s a small game with humble origins so it&#8217;s only a buck. <a href="/chunks/">Check it out tomorrow!</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F12%2F05%2Fchunks&amp;seed_title=Chunks</link>
	<guid isPermaLink="false">1554@http://www.shauninman.com/</guid>
	<category>Apple</category><category>Music</category><category>Gaming</category><category>NSF</category>
	<pubDate>Mon, 05 Dec 2011 16:47:00 GMT</pubDate>
</item>
<item>
	<title>Interviewed by Kevin Dees</title>
	<description><![CDATA[<p>I met Kevin at SXSW a few years ago and ran into him recently at Web Afternoon in Atlanta. Last week we talked about web and game development in a quick video interview. <a href="http://www.shauninman.com/archive/2011/11/07/interviewed_by_kevin_dees">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fkevindees.cc%2F2011%2F11%2Finterview-with-shaun-inman%2F&amp;seed_title=Interviewed+by+Kevin+Dees</link>
	<guid isPermaLink="false">1553@http://www.shauninman.com/</guid>
	<category>About</category><category>Elsewhere</category>
	<pubDate>Mon, 07 Nov 2011 12:54:00 GMT</pubDate>
</item>
<item>
	<title>Day-O</title>
	<description><![CDATA[<p><img src="/assets/images/day-o.png" alt="Day-O" title="" /></p>

<p><a href="http://shauninman.com/assets/downloads/Day-O.zip">Day-O</a> is a simple menu bar clock replacement with a simple calendar for your Mac. It&#8217;s free, as-is (which means I&#8217;m not providing support, taking feature requests, addressing perceived inadequacies or releasing the source code). Here&#8217;s how it came to be:</p>

<p>My late upgrade to Lion was relatively painless. The only casualty was <a href="http://www.objectpark.net/mcc.html">MenuCalendarClock</a>. It somehow clobbers the Dictionary shortcut key command <em>and gesture</em> which I use daily (if not hourly). I thought I could live without MMC. I don&#8217;t use any calendar apps so I was just using the free version for the simple date icon and convenient fly-out calendar. I thought the system menu clock would suffice. Really, how frequently did I use the fly-out calendar?</p>

<p>Turns out, quite a bit. I tried a few replacements but couldn&#8217;t stand any of their date icons. MMC developer Objectpark seems to have gone quiet. Fortunately, as I <a href="https://twitter.com/shauninman/status/126767392633270272">quipped on Twitter</a>, I&#8217;ve &#8220;never met a wheel I didn&#8217;t want to reinvent.&#8221;</p>

<p>I was able to piece something together from <a href="http://undefinedvalue.com/2009/07/07/adding-custom-view-nsstatusitem">various</a> <a href="http://files.semaja2.net/NSStatusItem%20-%20ObjC.html">NSStatusItem</a> <a href="http://cocoatutorial.grapewave.com/2010/01/creating-a-status-bar-application/">tutorials</a>, the <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDatePicker_Class/Reference/Reference.html">NSDatePicker Class Reference</a>, <a href="http://stackoverflow.com/questions/5143117/how-can-i-reload-the-com-apple-systemuiserver-preferences-into-the-systemuiserve">Stack Overflow</a> <a href="http://stackoverflow.com/questions/1857603/lsuielement-behaves-inconsistently-with-activateignoringotherapps/7823173#7823173">answers</a> and <a href="https://github.com/carpeaqua/Shared-File-List-Example">GitHub repositories</a>. </p>

<p>I may or may not have had this <a href="http://www.youtube.com/watch?v=Euc9MMRtuSg">YouTube video</a> on repeat in the background the entire time.</p>

<p><a href="http://shauninman.com/assets/downloads/Day-O.zip">Download Day-O</a>.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F10%2F20%2Fday_o_mac_menu_bar_clock&amp;seed_title=Day-O</link>
	<guid isPermaLink="false">1552@http://www.shauninman.com/</guid>
	<category>About</category>
	<pubDate>Thu, 20 Oct 2011 19:42:00 GMT</pubDate>
</item>
<item>
	<title>Pixels and Rocket Science</title>
	<description><![CDATA[<p>I was interviewed by Horrible Night about game design and development and <a href="/lastrocket/">The Last Rocket</a>. <a href="http://www.shauninman.com/archive/2011/09/08/pixels_and_rocket_science">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.horriblenight.com%2F18749%2Fpixels-and-rocket-science-an-interview-with-the-last-rocket-creator-shaun-inman&amp;seed_title=Pixels+and+Rocket+Science</link>
	<guid isPermaLink="false">1551@http://www.shauninman.com/</guid>
	<category>About</category><category>Apple</category><category>Design</category><category>Elsewhere</category><category>Original Music</category><category>Gaming</category><category>Objective-C</category>
	<pubDate>Thu, 08 Sep 2011 13:37:00 GMT</pubDate>
</item>
<item>
	<title>The Last Rocket 1.1</title>
	<description><![CDATA[<p>Adds Game Center Leaderboards and Achievements plus a new &#8220;tap to cancel exit&#8221; mechanic. <a href="http://www.shauninman.com/archive/2011/08/31/the_last_rocket_1_1">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fitunes.apple.com%2Fus%2Fapp%2Fthe-last-rocket%2Fid429747672&amp;seed_title=The+Last+Rocket+1.1</link>
	<guid isPermaLink="false">1550@http://www.shauninman.com/</guid>
	<category>Apple</category><category>Elsewhere</category><category>Gaming</category>
	<pubDate>Wed, 31 Aug 2011 14:08:00 GMT</pubDate>
</item>
<item>
	<title>Past Ats</title>
	<description><![CDATA[<p>Have you ever had deja who? You know, when the name or avatar of someone who just mentioned you on Twitter looks familiar and unfamiliar at the same time? Have they tweeted you before?</p>

<p>Drag this <a href="javascript:(function(){var%20f=$.trim($('div.focused-stream-item%20a.tweet-screen-name').text());var%20t=$.trim($('#screen-name').text());$('#search-query').val('from:'+f+'%20to:'+t)[0].form.submit();})();" onclick="alert('Drag me to your bookmarks bar!'); return false;">Past @s</a> link to your bookmarks bar. Then the next time this happens select the tweet and click the bookmarklet to perform a quick Twitter search for recent tweets from this person to you.</p>

<p>Think that&#8217;s useful? You might also like my <a href="/archive/2011/06/02/reply_reach">Reply Reach</a> bookmarklet.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F08%2F26%2Fpast_ats&amp;seed_title=Past+Ats</link>
	<guid isPermaLink="false">1549@http://www.shauninman.com/</guid>
	<category>JavaScript</category><category>Web</category>
	<pubDate>Fri, 26 Aug 2011 13:09:00 GMT</pubDate>
</item>
<item>
	<title>Take a Chance</title>
	<description><![CDATA[<p>Recently (and four years ago when I first wrote the draft for this post in November 2007), I needed a function that had an <code>x</code> in <code>y</code> chance of returning true. Some quick googling turned up nothing (I don&#8217;t even know what you would call this). After some trial and error I came up with this:</p>

<pre><code>function chance(x, y)
{
    // return Math.ceil(Math.random() * y) &lt;= x;
    return Math.random() &lt;= x/y;
};
</code></pre>

<p>Which in my testing behaves as intended. <code>chance(1, 32);</code> has an approximately 3% chance of returning <code>true</code>. <code>chance(99, 100);</code> has an approximately 99% chance of returning <code>true</code>.</p>

<p>Hopefully this will save someone else some unnecessary head-scratching.</p>

<p><strong>Update</strong> K.M. <a href="https://twitter.com/twirp/status/106432792509952001">points out</a> that <code>Math.random()</code> returns a number between 0 (inclusive) and 1 (exclusive) so the <code>Math.ceil()</code> is <a href="https://twitter.com!/twirp/status/106420254577655808">unnecessary</a>.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F08%2F24%2F1_in_x_chance_javascript_function&amp;seed_title=Take+a+Chance</link>
	<guid isPermaLink="false">1158@http://www.shauninman.com/</guid>
	<category>JavaScript</category>
	<pubDate>Wed, 24 Aug 2011 16:31:00 GMT</pubDate>
</item>
<item>
	<title>A Treatise on Touch</title>
	<description><![CDATA[<p>With the recent release of <a href="/lastrocket/">The Last Rocket</a> and this past weekend&#8217;s <a href="/archive/2011/08/22/data_entry_sentry_postmortem">Ludum Dare</a> I&#8217;ve been thinking a lot about touch screen controls in platformers. </p>

<p>I&#8217;m increasingly of the opinion that onscreen buttons are not the way forward. Overlays are a poor substitute for a physical d-pad or buttons; it&#8217;s too easy for fingers to drift while attention is focused elsewhere onscreen or to obstruct immediate threats to the player resulting in unfair deaths.</p>

<p>They create the expectation of familiar behaviors that they can&#8217;t deliver. When you use a gamepad your fingers don&#8217;t hover over the buttons waiting to touch each individually. Your thumbs rest on the buttons, then depress and/or pivot to adjacent buttons as needed. On a touch screen it is impossible to distinguish between a resting touch and a touch with intention. (Hold and slide might effectively simulate an analog stick but I&#8217;m primarily interested in 2D games where an analog stick offers little benefit.)</p>

<h2 id="h2-deferred-gratification">Deferred Gratification</h2>

<p>If an action is triggered immediately at the beginning of a touch (the press) that&#8217;s the only action that touch can trigger leaving you to rely on separate onscreen buttons to provide multiple distinct actions. But, if you delay triggering the primary action to the release, a single touch can be overloaded with at least three distinct actions.</p>

<p>In The Last Rocket, the press triggers a crouching state. From there the player can release to launch (like releasing a spring) or swipe to step in the direction of the swipe. Three distinct actions, zero buttons. While airborne, the press prepares to land in a crouching state, release reverses direction, and when snared by a fan or vent, a swipe chooses a direction. Again, three distinct actions, no buttons. </p>

<p>If Flip launched or reversed on the press then additional onscreen buttons would be required to support the additional actions. This new approach may at first seem contrary to past experience with gamepads and their physical buttons but is intuitive and easily grasped in the new context of a touch screen.</p>

<h2 id="h2-potential-application">Potential Application</h2>

<p>I can imagine a fairly traditional platformer that uses this buttonless approach (there may already be one, I&#8217;m not the most voracious iOS gamer): The screen is split down the middle into two equal, invisible regions representing left and right. A press starts the character running in one direction or the other, depeding on which side of the screen is touched (which the player intuitively understands as run towards the touch). A release triggers a jump that maintains the previous forward momentum. A quick tap from a standstill would be a straight jump up. A release after a period of running would be a leap forward. Maybe another touch on the same side cancels vertical momentum, limiting the height of the jump (which the player intuitively understands as the duration their finger is off the screen). A tap in the opposite direction could cease forward momentum without triggering a forward jump.</p>

<p>Definitely something I plan to explore further after submitting The Last Rocket 1.1 to the App Store and porting Data Entry Sentry to iOS.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F08%2F23%2Fa_treatise_on_touch&amp;seed_title=A+Treatise+on+Touch</link>
	<guid isPermaLink="false">1548@http://www.shauninman.com/</guid>
	<category>Apple</category><category>Gaming</category>
	<pubDate>Wed, 24 Aug 2011 00:35:00 GMT</pubDate>
</item>
<item>
	<title>Data Entry Sentry Postmortem</title>
	<description><![CDATA[<p>Having just released <a href="/lastrocket/">The Last Rocket</a> I wasn&#8217;t sure I had the energy to participate in this weekend&#8217;s <a href="http://www.ludumdare.com/compo/">Ludum Dare</a>. But <a href="/archive/2011/05/02/breathing_room_postmortem">looking back</a> on the last one I remembered what an enjoyable (grueling) and reinvigorating (exhausting) experience it was. So about an hour an a half before they announced the theme I decided to do it. You can play the result, <a href="http://www.ludumdare.com/compo/ludum-dare-21/?action=preview&amp;uid=4017">Data Entry Sentry</a> (looks best in browsers that support the CSS3 image-rendering property, like the <a href="http://nightly.webkit.org/">Webkit Nightly</a>, but plays best on the iPad), or continue reading for the postmortem.</p>

<p>This time the theme was <a href="http://www.ludumdare.com/compo/ludum-dare-21/">Escape!</a>. Like last time I came up with three ideas and slept on them before starting any work:</p>

<ul>
<li>Farmbreak!: You place obstacles to prevent animals from escaping their pens. Different animals have different abilities (ram, jump, burrow, fly) and each requires a different type of barrier to contain. Yawn.</li>
<li>Escape from Zombie Hall: Sort of a Space Invaders/Smash TV mashup. A first-year dorm resident of Zombinski Hall is trapped in a zombie outbreak. In the first part of each stage the player moves left and right blasting back the oncoming zombie horde with a shotgun (Space Invaders). One zombie is holding the key to the exit which is behind the player. When that zombie is blasted the key pops out and the player must rush in with a 360 chainsaw attack (Smash TV), collect the key and make it back to the exit in one piece. The only thing less inventive than a clone plus zombies is a clone plus ninjas.</li>
<li>Data Entry Sentry: Can you make a game about escaping data? Can you make it fun? You can certainly try. Chunks of data slide down multiple conveyors towards a parser and buffer. Some of the data chunks are gremlins. If a gremlin hits the parser it eats all the data between it and its pair. The goal is to fill the buffer without overflowing.</li>
</ul>

<p>Waking up Saturday morning, Data Entry Sentry seemed the most interesting, unique option. So where do I start? For my first Ludum Dare entry, <a href="/breathingroom/levels/">Breathing Room</a>, I used <a href="http://flixel.org/">Flixel</a>. I&#8217;m really not a fan of keyboard and mouse games and really enjoyed the simplicity of tapping in The Last Rocket. I wanted to make a game that I could play on the iPad. So Flash was out.</p>

<p>After doing some <a href="https://gist.github.com/768272">quick research</a> on HMTL5 game engines I decide to roll my own. Using John Resig&#8217;s <a href="http://ejohn.org/blog/simple-javascript-inheritance/">Simple JavaScript Inheritance</a> I put together a streamlined JavaScript approximation of the iOS framework I used for <a href="/hv2/">Horror Vacui 2</a> and The Last Rocket. </p>

<p>The framework is pretty simple (view source on <a href="/ludumdare/escape/">the game</a>). The primary class is Surface which can have a parent and children Surfaces, has a rectangle for size and position and knows how to render and update itself. Surface is meant to be extended but is also useful for grouping elements at a given zIndex. The GameSystem class extends Surface and is responsible for creating the canvas element and is used as the System singleton so that the Texture and Rectangle classes can draw to the screen. An InputManager class is used by other objects to register to receive input events. Everything else extends Surface. State automatically takes the dimensions defined when initializing GameSystem. Rectangle draws colored rectangles. Tile draws individual tiles in a tilesheet. Wallpaper repeats a single image. SurfaceY is just a Surface that sorts (and renders) its children by y coordinate instead of zIndex.</p>

<p>By the end of the first day I had an ugly, <a href="/ludumdare/escape/prototype.html">playable prototype</a>.
By noon on Sunday I had a design and simple animations I was happy with:</p>

<p><img src="/assets/images/data-entry-sentry.png" alt="" title="" /></p>

<p>One of the trickier elements of the design was the level numbers. Because of the perspective, the tens and ones columns require two different sets of numbers. I created a special LevelNumber class to properly render the text from a tilesheet containing numbers drawn in both perspectives.</p>

<p>The remainder of Sunday was spent rewriting PlayState to use the new Chunk class and integrate the graphics and complicated zIndexing and stacking behavior. The bulk of the game logic lives in the PlayState update method. Chunks, a subclass of Surface, are moved between different Surfaces (conveyor, stack, Chomplies and dying) and behave differently depending on which Surface they inhabit. Initially this was done as an easy way to manage Chunk zIndexes but ended up being really useful for implementing the behaviors unique to each section of the game board.</p>

<p>As an aside, in The Last Rocket, instead of subclassing subclasses of Surfaces and adding behavior I have an Entity class (which has a little less overhead than a Surface) that has one or more Surfaces. States then iterate over entities which are responsible for the behavior of their Surfaces.</p>

<p>If I had more time I would have liked to create some 8-bit tunes and sound effects to complement the graphics but HTML5 audio still seems to be a tricky proposition on iOS. </p>

<p>Ultimately, Ludum Dare was, again, a rewarding experience. Maybe once <a href="http://dribbble.com/shots/240136-8-bit-Game-Center">The Last Rocket</a> and <a href="http://dribbble.com/shots/233680-Noisiest-Entertainment-System">NoiseES</a> updates are done I&#8217;ll port <a href="/ludumdare/escape/">Data Entry Sentry</a> back to iOS and finish it up properly.</p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fwww.shauninman.com%2Farchive%2F2011%2F08%2F22%2Fdata_entry_sentry_postmortem&amp;seed_title=Data+Entry+Sentry+Postmortem</link>
	<guid isPermaLink="false">1547@http://www.shauninman.com/</guid>
	<category>Apple</category><category>Design</category><category>JavaScript</category><category>Gaming</category>
	<pubDate>Mon, 22 Aug 2011 14:29:00 GMT</pubDate>
</item>
<item>
	<title>The Last Rocket Original Sound Version</title>
	<description><![CDATA[<p>This pay-what-you-want soundtrack has all twelve tracks from The Last Rocket (plus a bonus vocal version of Silent SOS) encoded as 320kbps MP3s and includes an NSFE that&#8217;s perfect for looping in <a href="/noisees/">NoiseES</a>. <a href="http://www.shauninman.com/archive/2011/08/15/the_last_rocket_original_sound_version">&#x25CF;</a></p>]]></description>
	<link>http://shauninman.com/feeder/?FeederAction=clicked&amp;feed=Complete+Plus&amp;seed=http%3A%2F%2Fshauninman.com%2Flastrocket%2Fsoundtrack.html&amp;seed_title=The+Last+Rocket+Original+Sound+Version</link>
	<guid isPermaLink="false">1546@http://www.shauninman.com/</guid>
	<category>Elsewhere</category><category>Original Music</category><category>Gaming</category><category>NSF</category>
	<pubDate>Mon, 15 Aug 2011 17:17:00 GMT</pubDate>
</item>
</channel>
</rss>
